From 7b9584193881e73ab737eb924db6b9ae3f4fcb98 Mon Sep 17 00:00:00 2001 From: bearcode-dev Date: Tue, 6 Jan 2026 05:22:02 -0500 Subject: [PATCH 1/5] feat: Complete technical challenge solution - Implemented required functionality - Added unit tests - Updated documentation - Configured application --- .biomeignore | 58 + .dockerignore | 10 + .env.example | 33 + .gitignore | 13 + README.md | 283 +- apps/anti-fraud-service/Dockerfile | 36 + .../scripts/seed-default-rules.ts | 78 + apps/anti-fraud-service/scripts/tsconfig.json | 8 + .../src/anti-fraud.module.ts | 88 + .../validate-transaction.use-case.spec.ts | 456 + .../validate-transaction.use-case.ts | 88 + .../src/config/instrument.ts | 30 + .../domain/entities/fraud-rule.entity.spec.ts | 63 + .../src/domain/entities/fraud-rule.entity.ts | 16 + ...validate-transaction.use-case.interface.ts | 13 + .../ports/output/event-publisher.interface.ts | 12 + .../fraud-rule.repository.interface.ts | 9 + .../services/rules-engine.service.spec.ts | 724 + .../domain/services/rules-engine.service.ts | 274 + .../domain/types/fraud-rule-execution.type.ts | 9 + .../database/fraud-rules.schema.ts | 31 + .../mappers/fraud-rule.mapper.spec.ts | 290 + .../mappers/fraud-rule.mapper.ts | 20 + .../messaging/kafka-event-publisher.spec.ts | 467 + .../messaging/kafka-event-publisher.ts | 37 + .../transaction-created.consumer.spec.ts | 612 + .../messaging/transaction-created.consumer.ts | 41 + .../fraud-rule.repository.spec.ts | 322 + .../repositories/fraud-rule.repository.ts | 38 + apps/anti-fraud-service/src/main.ts | 45 + apps/anti-fraud-service/tsconfig.app.json | 9 + apps/transaction-service/Dockerfile | 38 + .../create-transaction.use-case.spec.ts | 262 + .../use-cases/create-transaction.use-case.ts | 67 + .../get-transaction.use-case.spec.ts | 263 + .../use-cases/get-transaction.use-case.ts | 40 + ...update-transaction-status.use-case.spec.ts | 296 + .../update-transaction-status.use-case.ts | 47 + .../src/config/instrument.ts | 30 + .../entities/transaction.entity.spec.ts | 178 + .../src/domain/entities/transaction.entity.ts | 37 + .../create-transaction.use-case.interface.ts | 15 + .../get-transaction.use-case.interface.ts | 8 + ...e-transaction-status.use-case.interface.ts | 9 + .../ports/output/event-publisher.interface.ts | 24 + .../transaction.repository.interface.ts | 9 + .../transaction-status.vo.spec.ts | 17 + .../value-objects/transaction-status.vo.ts | 5 + .../value-objects/transaction-type.vo.spec.ts | 42 + .../value-objects/transaction-type.vo.ts | 16 + .../database/database.module.ts | 24 + .../infrastructure/database/drizzle.config.ts | 10 + .../src/infrastructure/database/schema.ts | 15 + .../messaging/anti-fraud.service.ts | 78 + .../messaging/kafka-consumer.service.ts | 63 + .../messaging/kafka-event-publisher.ts | 58 + .../transaction-event.service.spec.ts | 282 + .../messaging/transaction-event.service.ts | 63 + .../transaction-status.consumer.spec.ts | 486 + .../messaging/transaction-status.consumer.ts | 64 + .../transaction.repository.spec.ts | 365 + .../repositories/transaction.repository.ts | 70 + apps/transaction-service/src/main.ts | 46 + .../transaction.controller.spec.ts | 364 + .../controllers/transaction.controller.ts | 85 + .../dtos/create-transaction.dto.ts | 18 + .../dtos/transaction-response.dto.ts | 11 + .../src/transaction.module.ts | 98 + apps/transaction-service/tsconfig.app.json | 9 + biome.json | 71 + config/database/drizzle.config.ts | 13 + config/jest.config.js | 51 + docker-compose.yml | 172 +- docs/API-TESTING.md | 96 + docs/FRAUD_RULES.md | 232 + docs/GUIDE.md | 226 + docs/INDEX.md | 28 + .../architecture-overview-jsoncrack.jpeg | Bin 0 -> 634967 bytes docs/diagrams/microservices-flow-diagram.jpeg | Bin 0 -> 139245 bytes libs/common/src/database/database.config.ts | 17 + .../common/src/database/database.constants.ts | 2 + libs/common/src/database/database.module.ts | 66 + libs/common/src/events/transaction.events.ts | 29 + .../filters/global-exception.filter.ts | 45 + libs/common/src/index.ts | 16 + .../correlation-id.interceptor.ts | 34 + libs/common/src/kafka/kafka.config.ts | 22 + libs/common/src/kafka/kafka.constants.ts | 9 + libs/common/src/kafka/kafka.consumer.spec.ts | 286 + libs/common/src/kafka/kafka.consumer.ts | 66 + libs/common/src/kafka/kafka.module.ts | 48 + libs/common/src/kafka/kafka.producer.spec.ts | 132 + libs/common/src/kafka/kafka.producer.ts | 43 + libs/common/src/redis/redis.module.ts | 11 + libs/common/src/redis/redis.service.spec.ts | 183 + libs/common/src/redis/redis.service.ts | 36 + libs/common/src/types/fraud-rules.types.ts | 70 + libs/common/src/types/tracing.types.ts | 28 + libs/common/src/types/transaction.types.ts | 17 + libs/common/tsconfig.lib.json | 10 + .../src/adapters/composite-logger.adapter.ts | 58 + .../src/adapters/console-logger.adapter.ts | 60 + .../src/adapters/sentry-logger.adapter.ts | 80 + libs/observability/src/index.ts | 36 + .../src/kafka/kafka-tracing.helper.ts | 116 + libs/observability/src/logger.service.ts | 28 + .../src/logging/http-logger.interceptor.ts | 83 + .../src/logging/logging.module.ts | 39 + .../src/logging/pino-logger.service.ts | 98 + .../observability/src/observability.module.ts | 66 + libs/observability/src/ports/logger.port.ts | 11 + libs/observability/src/tracing/otel.ts | 146 + .../src/tracing/span.decorator.ts | 93 + .../src/tracing/tracing.module.ts | 36 + libs/observability/tsconfig.lib.json | 10 + nest-cli.json | 50 + .../provisioning/dashboards/dashboard.yaml | 11 + .../datasources/datasources-minimal.yaml | 20 + .../provisioning/datasources/datasources.yaml | 55 + observability/tempo/tempo.yaml | 31 + package-lock.json | 14828 ++++++++++++++++ package.json | 100 + test/api/test-transaction-api.sh | 92 + test/setup.ts | 42 + tsconfig.json | 33 + 125 files changed, 26091 insertions(+), 15 deletions(-) create mode 100644 .biomeignore create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 apps/anti-fraud-service/Dockerfile create mode 100644 apps/anti-fraud-service/scripts/seed-default-rules.ts create mode 100644 apps/anti-fraud-service/scripts/tsconfig.json create mode 100644 apps/anti-fraud-service/src/anti-fraud.module.ts create mode 100644 apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.spec.ts create mode 100644 apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.ts create mode 100644 apps/anti-fraud-service/src/config/instrument.ts create mode 100644 apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.spec.ts create mode 100644 apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.ts create mode 100644 apps/anti-fraud-service/src/domain/ports/input/validate-transaction.use-case.interface.ts create mode 100644 apps/anti-fraud-service/src/domain/ports/output/event-publisher.interface.ts create mode 100644 apps/anti-fraud-service/src/domain/repositories/fraud-rule.repository.interface.ts create mode 100644 apps/anti-fraud-service/src/domain/services/rules-engine.service.spec.ts create mode 100644 apps/anti-fraud-service/src/domain/services/rules-engine.service.ts create mode 100644 apps/anti-fraud-service/src/domain/types/fraud-rule-execution.type.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/database/fraud-rules.schema.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.spec.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.spec.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.spec.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.spec.ts create mode 100644 apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.ts create mode 100644 apps/anti-fraud-service/src/main.ts create mode 100644 apps/anti-fraud-service/tsconfig.app.json create mode 100644 apps/transaction-service/Dockerfile create mode 100644 apps/transaction-service/src/application/use-cases/create-transaction.use-case.spec.ts create mode 100644 apps/transaction-service/src/application/use-cases/create-transaction.use-case.ts create mode 100644 apps/transaction-service/src/application/use-cases/get-transaction.use-case.spec.ts create mode 100644 apps/transaction-service/src/application/use-cases/get-transaction.use-case.ts create mode 100644 apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.spec.ts create mode 100644 apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.ts create mode 100644 apps/transaction-service/src/config/instrument.ts create mode 100644 apps/transaction-service/src/domain/entities/transaction.entity.spec.ts create mode 100644 apps/transaction-service/src/domain/entities/transaction.entity.ts create mode 100644 apps/transaction-service/src/domain/ports/input/create-transaction.use-case.interface.ts create mode 100644 apps/transaction-service/src/domain/ports/input/get-transaction.use-case.interface.ts create mode 100644 apps/transaction-service/src/domain/ports/input/update-transaction-status.use-case.interface.ts create mode 100644 apps/transaction-service/src/domain/ports/output/event-publisher.interface.ts create mode 100644 apps/transaction-service/src/domain/repositories/transaction.repository.interface.ts create mode 100644 apps/transaction-service/src/domain/value-objects/transaction-status.vo.spec.ts create mode 100644 apps/transaction-service/src/domain/value-objects/transaction-status.vo.ts create mode 100644 apps/transaction-service/src/domain/value-objects/transaction-type.vo.spec.ts create mode 100644 apps/transaction-service/src/domain/value-objects/transaction-type.vo.ts create mode 100644 apps/transaction-service/src/infrastructure/database/database.module.ts create mode 100644 apps/transaction-service/src/infrastructure/database/drizzle.config.ts create mode 100644 apps/transaction-service/src/infrastructure/database/schema.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/anti-fraud.service.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/kafka-consumer.service.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/kafka-event-publisher.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/transaction-event.service.spec.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/transaction-event.service.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.spec.ts create mode 100644 apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.ts create mode 100644 apps/transaction-service/src/infrastructure/repositories/transaction.repository.spec.ts create mode 100644 apps/transaction-service/src/infrastructure/repositories/transaction.repository.ts create mode 100644 apps/transaction-service/src/main.ts create mode 100644 apps/transaction-service/src/presentation/controllers/transaction.controller.spec.ts create mode 100644 apps/transaction-service/src/presentation/controllers/transaction.controller.ts create mode 100644 apps/transaction-service/src/presentation/dtos/create-transaction.dto.ts create mode 100644 apps/transaction-service/src/presentation/dtos/transaction-response.dto.ts create mode 100644 apps/transaction-service/src/transaction.module.ts create mode 100644 apps/transaction-service/tsconfig.app.json create mode 100644 biome.json create mode 100644 config/database/drizzle.config.ts create mode 100644 config/jest.config.js create mode 100644 docs/API-TESTING.md create mode 100644 docs/FRAUD_RULES.md create mode 100644 docs/GUIDE.md create mode 100644 docs/INDEX.md create mode 100644 docs/diagrams/architecture-overview-jsoncrack.jpeg create mode 100644 docs/diagrams/microservices-flow-diagram.jpeg create mode 100644 libs/common/src/database/database.config.ts create mode 100644 libs/common/src/database/database.constants.ts create mode 100644 libs/common/src/database/database.module.ts create mode 100644 libs/common/src/events/transaction.events.ts create mode 100644 libs/common/src/exceptions/filters/global-exception.filter.ts create mode 100644 libs/common/src/index.ts create mode 100644 libs/common/src/interceptors/correlation-id.interceptor.ts create mode 100644 libs/common/src/kafka/kafka.config.ts create mode 100644 libs/common/src/kafka/kafka.constants.ts create mode 100644 libs/common/src/kafka/kafka.consumer.spec.ts create mode 100644 libs/common/src/kafka/kafka.consumer.ts create mode 100644 libs/common/src/kafka/kafka.module.ts create mode 100644 libs/common/src/kafka/kafka.producer.spec.ts create mode 100644 libs/common/src/kafka/kafka.producer.ts create mode 100644 libs/common/src/redis/redis.module.ts create mode 100644 libs/common/src/redis/redis.service.spec.ts create mode 100644 libs/common/src/redis/redis.service.ts create mode 100644 libs/common/src/types/fraud-rules.types.ts create mode 100644 libs/common/src/types/tracing.types.ts create mode 100644 libs/common/src/types/transaction.types.ts create mode 100644 libs/common/tsconfig.lib.json create mode 100644 libs/observability/src/adapters/composite-logger.adapter.ts create mode 100644 libs/observability/src/adapters/console-logger.adapter.ts create mode 100644 libs/observability/src/adapters/sentry-logger.adapter.ts create mode 100644 libs/observability/src/index.ts create mode 100644 libs/observability/src/kafka/kafka-tracing.helper.ts create mode 100644 libs/observability/src/logger.service.ts create mode 100644 libs/observability/src/logging/http-logger.interceptor.ts create mode 100644 libs/observability/src/logging/logging.module.ts create mode 100644 libs/observability/src/logging/pino-logger.service.ts create mode 100644 libs/observability/src/observability.module.ts create mode 100644 libs/observability/src/ports/logger.port.ts create mode 100644 libs/observability/src/tracing/otel.ts create mode 100644 libs/observability/src/tracing/span.decorator.ts create mode 100644 libs/observability/src/tracing/tracing.module.ts create mode 100644 libs/observability/tsconfig.lib.json create mode 100644 nest-cli.json create mode 100644 observability/grafana/provisioning/dashboards/dashboard.yaml create mode 100644 observability/grafana/provisioning/datasources/datasources-minimal.yaml create mode 100644 observability/grafana/provisioning/datasources/datasources.yaml create mode 100644 observability/tempo/tempo.yaml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 test/api/test-transaction-api.sh create mode 100644 test/setup.ts create mode 100644 tsconfig.json diff --git a/.biomeignore b/.biomeignore new file mode 100644 index 0000000000..41a49ce016 --- /dev/null +++ b/.biomeignore @@ -0,0 +1,58 @@ +# Archivos y carpetas que Biome debe ignorar + +# (adicionales a los del .gitignore que ya respeta automáticamente) + +# Build outputs + +dist/ +build/ +.next/ +out/ + +# Dependencies + +node_modules/ +.pnp/ +.pnp.js + +# Testing + +coverage/ +.nyc_output/ + +# Database & migrations + +drizzle/ +migrations/ + +# Logs + +\*.log +logs/ + +# Environment files + +.env +.env.local +.env.\*.local + +# Editor + +.vscode/ +.idea/ +_.swp +_.swo + +# OS + +.DS_Store +Thumbs.db + +# Observability configs + +observability/ + +# Generated files + +**/\*.generated.ts +**/\*.generated.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..caee196ac7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +node_modules +npm-debug.log +dist +.git +.gitignore +.env +.vscode +.idea +*.md +drizzle diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000..336abe3938 --- /dev/null +++ b/.env.example @@ -0,0 +1,33 @@ +# Environment Variables +# Copy this file to .env and update with your values + +# Database +TRANSACTION_DB_URL=postgresql://postgres:postgres@localhost:5432/postgres +ANTIFRAUD_DB_URL=postgresql://postgres:postgres@localhost:5432/postgres + +# Kafka +KAFKA_BROKER=localhost:9092 + +# Services +PORT=3000 +ANTI_FRAUD_PORT=3001 + +# Application +SERVICE_NAME=transaction-service +SERVICE_VERSION=1.0.0 +NODE_ENV=development + +# Redis (optional) +REDIS_URL=redis://localhost:6379 + +# OpenTelemetry (optional) +OTEL_ENABLED=false +OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 +OTEL_SAMPLING_RATIO=1.0 + +# Logging +LOG_LEVEL=info + +# Sentry (optional) +SENTRY_ENABLED=false +SENTRY_DSN= diff --git a/.gitignore b/.gitignore index 67045665db..afdf1b0364 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,7 @@ typings/ # dotenv environment variables file .env .env.test +docker/.env # parcel-bundler cache (https://parceljs.org/) .cache @@ -102,3 +103,15 @@ dist # TernJS port file .tern-port + +# Drizzle +drizzle/ + +# IDE +.vscode/ +.idea/ + +# AI Tools +.claude/ +.cursor/ +.ai/ diff --git a/README.md b/README.md index b067a71026..16e8c27330 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,233 @@ -# Yape Code Challenge :rocket: +# Sistema de Transacciones - Yape Code Challenge -Our code challenge will let you marvel us with your Jedi coding skills :smile:. +Sistema de procesamiento de transacciones con validación anti-fraude usando microservicios, arquitectura hexagonal y comunicación event-driven. -Don't forget that the proper way to submit your work is to fork the repo and create a PR :wink: ... have fun !! +[![Node.js](https://img.shields.io/badge/Node.js-18+-green.svg)](https://nodejs.org/) +[![NestJS](https://img.shields.io/badge/NestJS-11-red.svg)](https://nestjs.com/) +[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-14-blue.svg)](https://www.postgresql.org/) +[![Kafka](https://img.shields.io/badge/Apache%20Kafka-2.8-orange.svg)](https://kafka.apache.org/) +[![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) +## Índice + +- [Inicio Rápido](#inicio-rápido) +- [Arquitectura](#arquitectura) +- [Documentación](#documentación) +- [Testing](#testing) +- [Comandos](#comandos-principales) - [Problem](#problem) -- [Tech Stack](#tech_stack) -- [Send us your challenge](#send_us_your_challenge) +- [Tech Stack](#tech-stack) +- [Send us your challenge](#send-us-your-challenge) + +--- + +## Inicio Rápido + +### Prerrequisitos +- **Node.js 18+** +- **Docker & Docker Compose** +- **PostgreSQL** (opcional, se puede usar Docker) + +### Instalación y Ejecución + +```bash +# 1. Clonar el repositorio +git clone +cd app-nodejs-codechallenge + +# 2. Instalar dependencias +npm install + +# 3. Configurar variables de entorno +cp .env.example .env +# Editar .env con tus configuraciones + +# 4. Levantar infraestructura externa (Docker) +docker-compose up -d + +# 5. Inicializar base de datos +npm run db:push + +# 6. Cargar reglas de anti-fraude por defecto +npm run seed:fraud-rules + +# 7. Iniciar servicios +npm run start:dev +``` + +### Verificar Instalación +```bash +# Health checks +curl http://localhost:3000/health # Transaction Service +curl http://localhost:3001/health # Anti-Fraud Service + +# Crear una transacción de prueba +curl -X POST http://localhost:3000/transactions \ + -H "Content-Type: application/json" \ + -d '{ + "accountExternalIdDebit": "550e8400-e29b-41d4-a716-446655440000", + "accountExternalIdCredit": "550e8400-e29b-41d4-a716-446655440001", + "tranferTypeId": 1, + "value": 500 + }' +``` + +### Servicios Disponibles +| Servicio | URL | Descripción | +|----------|-----|-------------| +| **Transaction Service** | http://localhost:3000 | API de transacciones | +| **Anti-Fraud Service** | http://localhost:3001 | Validación anti-fraude | +| **Kafka UI** | http://localhost:9000 | Monitor de mensajes | +| **Grafana** | http://localhost:3002 | Dashboards (admin/admin) | + +--- + +## Arquitectura + +### Vista General +![Arquitectura](docs/diagrams/architecture-overview-jsoncrack.jpeg) + +### Microservicios +- **Transaction Service** (3000): Gestión de transacciones (CRUD + eventos Kafka) +- **Anti-Fraud Service** (3001): Motor de reglas configurables + auditoría + +### Patrones Implementados +- **Hexagonal Architecture**: Domain, Application, Infrastructure, Presentation +- **Domain-Driven Design**: Bounded contexts y ubiquitous language +- **Event-Driven**: Kafka para comunicación asíncrona +- **Repository Pattern**: Abstracción de persistencia + +### Stack Técnico +| Categoría | Tecnología | +|-----------|-----------| +| Framework | NestJS 11 + TypeScript | +| Base de Datos | PostgreSQL 14 + Drizzle ORM | +| Mensajería | Apache Kafka 2.8 | +| Cache | Redis | +| Observabilidad | OpenTelemetry + Grafana + Tempo | +| DevOps | Docker + Docker Compose | + +**Ver:** [Arquitectura detallada en docs/GUIDE.md](docs/GUIDE.md) + +--- + +## Documentación + +| Documento | Descripción | +|-----------|-------------| +| **[INDEX.md](docs/INDEX.md)** | Índice de documentación técnica | +| **[GUIDE.md](docs/GUIDE.md)** | Arquitectura hexagonal y patrones de diseño | +| **[FRAUD_RULES.md](docs/FRAUD_RULES.md)** | Motor de reglas anti-fraude configurables | +| **[API-TESTING.md](docs/API-TESTING.md)** | Guía de testing con curl y scripts | + +--- + +## Testing + +```bash +# Tests unitarios +npm test # Ejecutar todos los tests +npm run test:cov # Con coverage +npm run test:watch # Modo watch + +# Test de integración (API) +npm run test:api # Script bash para probar APIs + +# Tests E2E +npm run test:e2e +``` + +**Pruebas manuales con curl:** +```bash +# Health check +curl http://localhost:3000/health + +# Crear transacción +curl -X POST http://localhost:3000/transactions \ + -H "Content-Type: application/json" \ + -d '{"accountExternalIdDebit": "acc-001", "accountExternalIdCredit": "acc-002", "tranferTypeId": 1, "value": 500}' +``` + +--- + +## Comandos Principales +```bash +# Desarrollo +npm run start:dev # Iniciar ambos servicios +npm run start:transaction:dev # Solo Transaction Service +npm run start:anti-fraud:dev # Solo Anti-Fraud Service + +# Base de datos +npm run db:push # Aplicar schema +npm run db:studio # GUI de base de datos +npm run seed:fraud-rules # Cargar reglas anti-fraude + +# Calidad de código +npm run check:fix # Lint + format (automático) +``` + +### Estructura del Proyecto +``` +app-nodejs-codechallenge/ +├── apps/ +│ ├── transaction-service/ # Servicio principal de transacciones +│ │ └── src/ +│ │ ├── domain/ # Entidades y lógica de negocio +│ │ │ ├── entities/ # Transaction, TransactionStatus +│ │ │ ├── repositories/ # Interfaces de repositorios +│ │ │ └── value-objects/ # Objetos de valor inmutables +│ │ ├── application/ # Casos de uso +│ │ │ ├── use-cases/ # CreateTransaction, GetTransaction +│ │ │ └── dto/ # Data Transfer Objects +│ │ ├── infrastructure/ # Implementaciones técnicas +│ │ │ ├── database/ # Drizzle ORM, schemas, repositories +│ │ │ ├── kafka/ # Producers, consumers, eventos +│ │ │ └── cache/ # Redis adapter +│ │ ├── presentation/ # Capa de API +│ │ │ ├── controllers/ # REST endpoints +│ │ │ └── dto/ # Request/Response DTOs +│ │ └── config/ # Configuración de NestJS +│ │ +│ └── anti-fraud-service/ # Servicio de validación anti-fraude +│ └── src/ +│ ├── domain/ # Motor de reglas +│ │ ├── entities/ # FraudRule, RuleExecution +│ │ ├── services/ # FraudEvaluator +│ │ └── repositories/ # Interfaces +│ ├── application/ # Evaluación de transacciones +│ │ └── use-cases/ # EvaluateTransaction +│ ├── infrastructure/ # Implementaciones +│ │ ├── database/ # Schemas, repositories +│ │ └── kafka/ # Consumers, producers +│ └── config/ # Configuración +│ +├── libs/ +│ ├── common/ # Código compartido +│ │ ├── utils/ # Helpers y utilidades +│ │ ├── exceptions/ # Excepciones personalizadas +│ │ └── interfaces/ # Interfaces comunes +│ └── observability/ # Telemetría y monitoreo +│ ├── logging/ # Pino logger configurado +│ ├── tracing/ # OpenTelemetry setup +│ └── metrics/ # Métricas de aplicación +│ +├── config/ # Configuración global +│ ├── drizzle.config.ts # ORM configuration +│ └── jest.config.js # Test configuration +│ +├── test/ +│ └── api/ # Tests de integración +│ └── test-transaction-api.sh +│ +├── docs/ # Documentación técnica +├── observability/ # Dashboards y configuración +└── docker-compose.yml # Infraestructura local +``` + +### Variables de Entorno +Ver [.env.example](.env.example) para configuración completa. + +--- # Problem @@ -32,13 +253,27 @@ Every transaction with a value greater than 1000 should be rejected. # Tech Stack -
    -
  1. Node. You can use any framework you want (i.e. Nestjs with an ORM like TypeOrm or Prisma)
  2. -
  3. Any database
  4. -
  5. Kafka
  6. -
+| Categoría | Tecnología | +|-----------|-----------| +| **Backend** | Node.js 18+ · NestJS 11 · TypeScript | +| **Base de Datos** | PostgreSQL 14 · Drizzle ORM | +| **Mensajería** | Apache Kafka 2.8 · Redis | +| **Observabilidad** | OpenTelemetry · Grafana · Tempo · Pino · Sentry | +| **Testing** | Jest · Supertest · Biome | +| **DevOps** | Docker · Docker Compose | + +## APIs -We do provide a `Dockerfile` to help you get started with a dev environment. +**Transaction Service (3000):** +- `POST /transactions` - Crear transacción +- `GET /transactions/:id` - Obtener transacción por ID +- `GET /health` - Health check + +**Anti-Fraud Service (3001):** +- `GET /health` - Health check + +**Eventos Kafka:** +- `transaction-created` → `transaction-approved/rejected` You must have two resources: @@ -71,12 +306,34 @@ You must have two resources: ## Optional -You can use any approach to store transaction data but you should consider that we may deal with high volume scenarios where we have a huge amount of writes and reads for the same data at the same time. How would you tackle this requirement? +**High Volume Scenarios:** +- **Write optimization**: Kafka para ingesta asíncrona, PostgreSQL con índices optimizados +- **Read optimization**: Redis cache, read replicas, CQRS pattern +- **Escalabilidad**: Microservicios independientes, stateless design -You can use Graphql; +**GraphQL**: No implementado en esta versión (REST API) + +--- # Send us your challenge When you finish your challenge, after forking a repository, you **must** open a pull request to our repository. There are no limitations to the implementation, you can follow the programming paradigm, modularization, and style that you feel is the most appropriate solution. If you have any questions, please let us know. + +--- + +## Notas de Implementación + +Implementación: +- Cumple todos los requerimientos del challenge +- Arquitectura hexagonal + DDD +- Sistema de reglas anti-fraude extensible +- Observabilidad con OpenTelemetry +- Tests unitarios e integración +- Documentación técnica + +**Próximos pasos:** +1. Revisar [docs/INDEX.md](docs/INDEX.md) para documentación completa +2. Ejecutar `npm run test:api` para probar las APIs +3. Explorar Grafana en http://localhost:3002 diff --git a/apps/anti-fraud-service/Dockerfile b/apps/anti-fraud-service/Dockerfile new file mode 100644 index 0000000000..afc8e1817a --- /dev/null +++ b/apps/anti-fraud-service/Dockerfile @@ -0,0 +1,36 @@ +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +COPY tsconfig*.json ./ +COPY nest-cli.json ./ + +# Install dependencies +RUN npm ci + +# Copy source code +COPY apps/anti-fraud-service ./apps/anti-fraud-service +COPY libs ./libs + +# Build application +RUN npm run build:anti-fraud + +# Production image +FROM node:20-alpine + +WORKDIR /app + +# Copy package files and install production dependencies only +COPY package*.json ./ +RUN npm ci --only=production && npm cache clean --force + +# Copy built application from builder (maintain directory structure) +COPY --from=builder /app/dist ./dist + +# Expose port +EXPOSE 3001 + +# Start application +CMD ["node", "dist/apps/anti-fraud-service/apps/anti-fraud-service/src/main.js"] diff --git a/apps/anti-fraud-service/scripts/seed-default-rules.ts b/apps/anti-fraud-service/scripts/seed-default-rules.ts new file mode 100644 index 0000000000..31d0e9a73d --- /dev/null +++ b/apps/anti-fraud-service/scripts/seed-default-rules.ts @@ -0,0 +1,78 @@ +import 'dotenv/config'; +import { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { drizzle } from 'drizzle-orm/postgres-js'; +import postgres from 'postgres'; +import { fraudRules } from '../src/infrastructure/database/fraud-rules.schema'; + +const DATABASE_URL = process.env.ANTIFRAUD_DB_URL || 'postgresql://postgres:postgres@localhost:5432/postgres'; + +async function seedDefaultRules() { + const client = postgres(DATABASE_URL); + const db = drizzle(client); + + console.log('🌱 Seeding default fraud rules...'); + + const defaultRules = [ + { + name: 'High Amount Transaction', + description: 'Reject transactions greater than 1000', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { + operator: 'gt', + value: 1000, + }, + action: FraudAction.REJECT, + priority: 100, + isActive: true, + }, + { + name: 'Very High Amount - Review', + description: 'Flag transactions greater than 5000 for review', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { + operator: 'gt', + value: 5000, + }, + action: FraudAction.REVIEW, + priority: 50, + isActive: false, // Desactivada por defecto + }, + { + name: 'Weekend Transfer Limit', + description: 'Restrict high-value transfers on weekends', + ruleType: FraudRuleType.TIME_BASED, + condition: { + allowedHours: { start: 0, end: 23 }, + allowedDays: [1, 2, 3, 4, 5], // Lunes a viernes + }, + action: FraudAction.REJECT, + priority: 200, + isActive: false, // Desactivada por defecto + }, + { + name: 'Payment Type Limit', + description: 'Limit payment type transactions to 500', + ruleType: FraudRuleType.TRANSFER_TYPE_LIMIT, + condition: { + transferTypeId: 2, // PAYMENT + maxAmount: 500, + }, + action: FraudAction.REJECT, + priority: 150, + isActive: false, // Desactivada por defecto + }, + ]; + + for (const rule of defaultRules) { + await db.insert(fraudRules).values(rule); + console.log(`✅ Created rule: ${rule.name}`); + } + + console.log('🎉 Default rules seeded successfully!'); + await client.end(); +} + +seedDefaultRules().catch((error) => { + console.error('❌ Error seeding rules:', error); + process.exit(1); +}); diff --git a/apps/anti-fraud-service/scripts/tsconfig.json b/apps/anti-fraud-service/scripts/tsconfig.json new file mode 100644 index 0000000000..d57dc46593 --- /dev/null +++ b/apps/anti-fraud-service/scripts/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "../../../dist/apps/anti-fraud-service/scripts" + }, + "include": ["./**/*", "../src/**/*"] +} diff --git a/apps/anti-fraud-service/src/anti-fraud.module.ts b/apps/anti-fraud-service/src/anti-fraud.module.ts new file mode 100644 index 0000000000..9ea6437ff3 --- /dev/null +++ b/apps/anti-fraud-service/src/anti-fraud.module.ts @@ -0,0 +1,88 @@ +import { DatabaseModule, KafkaModule } from '@app/common'; +import { LoggingModule, ObservabilityModule, TracingModule } from '@app/observability'; +import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ValidateTransactionUseCase } from './application/use-cases/validate-transaction.use-case'; +import { VALIDATE_TRANSACTION_USE_CASE } from './domain/ports/input/validate-transaction.use-case.interface'; +import { EVENT_PUBLISHER } from './domain/ports/output/event-publisher.interface'; +import { FRAUD_RULE_REPOSITORY } from './domain/repositories/fraud-rule.repository.interface'; +import { RulesEngineService } from './domain/services/rules-engine.service'; +import { KafkaEventPublisher } from './infrastructure/messaging/kafka-event-publisher'; +import { TransactionCreatedConsumer } from './infrastructure/messaging/transaction-created.consumer'; +import { FraudRuleRepository } from './infrastructure/repositories/fraud-rule.repository'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + envFilePath: '.env', + }), + DatabaseModule.forRootAsync({ + isGlobal: true, + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + const url = configService.get('ANTIFRAUD_DB_URL'); + if (!url) { + throw new Error('ANTIFRAUD_DB_URL environment variable is required'); + } + return { url }; + }, + }), + ObservabilityModule.forRoot({ + serviceName: 'anti-fraud-service', + enableSentry: process.env.SENTRY_ENABLED === 'true', + sentryDsn: process.env.SENTRY_DSN, + environment: process.env.NODE_ENV || 'development', + }), + TracingModule.forRootAsync({ + inject: [ConfigService], + useFactory: (config: ConfigService) => ({ + serviceName: 'anti-fraud-service', + serviceVersion: '1.0.0', + otlpEndpoint: config.get('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4318'), + environment: config.get('NODE_ENV', 'development'), + sampling: parseFloat(config.get('OTEL_SAMPLING_RATIO', '1.0')), + enabled: config.get('OTEL_ENABLED', 'true') !== 'false', + }), + }), + + LoggingModule.forRoot('anti-fraud-service'), + KafkaModule.forRootAsync({ + isGlobal: true, + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + const kafkaBroker = configService.get('KAFKA_BROKER'); + if (!kafkaBroker) { + throw new Error('KAFKA_BROKER environment variable is required'); + } + return { + clientId: 'anti-fraud-service', + brokers: [kafkaBroker], + consumerConfig: { + groupId: 'anti-fraud-service-group-v2', + }, + }; + }, + }), + ], + controllers: [], + providers: [ + { + provide: VALIDATE_TRANSACTION_USE_CASE, + useClass: ValidateTransactionUseCase, + }, + + RulesEngineService, + { + provide: FRAUD_RULE_REPOSITORY, + useClass: FraudRuleRepository, + }, + + TransactionCreatedConsumer, + { + provide: EVENT_PUBLISHER, + useClass: KafkaEventPublisher, + }, + ], +}) +export class AntiFraudModule {} diff --git a/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.spec.ts b/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.spec.ts new file mode 100644 index 0000000000..31756068d7 --- /dev/null +++ b/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.spec.ts @@ -0,0 +1,456 @@ +import { FraudAction, type FraudRuleEvaluationResult } from '@app/common/types/fraud-rules.types'; +import type { LoggerService } from '@app/observability'; +import type { IEventPublisher } from '../../domain/ports/output/event-publisher.interface'; +import type { RulesEngineService } from '../../domain/services/rules-engine.service'; +import { ValidateTransactionUseCase } from './validate-transaction.use-case'; + +describe('ValidateTransactionUseCase', () => { + let useCase: ValidateTransactionUseCase; + let mockRulesEngine: jest.Mocked; + let mockLogger: jest.Mocked; + let mockEventPublisher: jest.Mocked; + + beforeEach(() => { + mockRulesEngine = { + evaluateTransaction: jest.fn(), + determineFinalAction: jest.fn(), + } as any; + + mockLogger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + verbose: jest.fn(), + } as unknown as jest.Mocked; + + mockEventPublisher = { + publishResult: jest.fn(), + } as jest.Mocked; + + useCase = new ValidateTransactionUseCase(mockRulesEngine, mockLogger, mockEventPublisher); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('execute', () => { + const transactionData = { + transactionId: 'txn-123', + value: 500, + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + createdAt: new Date('2024-01-01T00:00:00Z'), + metadata: { + correlationId: 'correlation-123', + causationId: 'causation-456', + service: 'TransactionService', + }, + }; + + describe('when transaction is approved', () => { + beforeEach(() => { + const ruleResults: FraudRuleEvaluationResult[] = []; + mockRulesEngine.evaluateTransaction.mockResolvedValue(ruleResults); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.APPROVE, + matchedRules: [], + reasons: ['No fraud rules matched'], + }); + }); + + it('should evaluate transaction with rules engine', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockRulesEngine.evaluateTransaction).toHaveBeenCalledWith({ + transactionExternalId: transactionData.transactionId, + accountExternalIdDebit: transactionData.accountExternalIdDebit, + accountExternalIdCredit: transactionData.accountExternalIdCredit, + transferTypeId: transactionData.transferTypeId, + value: transactionData.value, + createdAt: transactionData.createdAt, + }); + }); + + it('should publish approved status', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockEventPublisher.publishResult).toHaveBeenCalledWith( + transactionData.transactionId, + 'approved', + ['No fraud rules matched'], + [], + transactionData.metadata.correlationId, + transactionData.metadata.causationId, + ); + }); + + it('should log approved transaction with log level', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockLogger.log).toHaveBeenCalledWith( + 'Transaction approve', + expect.objectContaining({ + correlationId: transactionData.metadata.correlationId, + requestId: transactionData.metadata.causationId, + }), + expect.objectContaining({ + transactionId: transactionData.transactionId, + action: FraudAction.APPROVE, + value: transactionData.value, + }), + ); + }); + }); + + describe('when transaction is rejected', () => { + const matchedRules: FraudRuleEvaluationResult[] = [ + { + ruleId: 'rule-1', + ruleName: 'High Value Reject', + matched: true, + action: FraudAction.REJECT, + reason: 'Amount exceeds threshold', + }, + ]; + + beforeEach(() => { + mockRulesEngine.evaluateTransaction.mockResolvedValue(matchedRules); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.REJECT, + matchedRules, + reasons: ['High Value Reject: Amount exceeds threshold'], + }); + }); + + it('should publish rejected status', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockEventPublisher.publishResult).toHaveBeenCalledWith( + transactionData.transactionId, + 'rejected', + ['High Value Reject: Amount exceeds threshold'], + ['High Value Reject'], + transactionData.metadata.correlationId, + transactionData.metadata.causationId, + ); + }); + + it('should log rejected transaction with warn level', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Transaction reject', + expect.objectContaining({ + correlationId: transactionData.metadata.correlationId, + }), + expect.objectContaining({ + transactionId: transactionData.transactionId, + action: FraudAction.REJECT, + matchedRules: ['High Value Reject'], + }), + ); + }); + }); + + describe('when transaction is flagged', () => { + const matchedRules: FraudRuleEvaluationResult[] = [ + { + ruleId: 'rule-2', + ruleName: 'Suspicious Pattern', + matched: true, + action: FraudAction.FLAG, + reason: 'Pattern detected', + }, + ]; + + beforeEach(() => { + mockRulesEngine.evaluateTransaction.mockResolvedValue(matchedRules); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.FLAG, + matchedRules, + reasons: ['Suspicious Pattern: Pattern detected'], + }); + }); + + it('should publish rejected status for FLAG action', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockEventPublisher.publishResult).toHaveBeenCalledWith( + transactionData.transactionId, + 'rejected', + ['Suspicious Pattern: Pattern detected'], + ['Suspicious Pattern'], + transactionData.metadata.correlationId, + transactionData.metadata.causationId, + ); + }); + + it('should log flagged transaction with log level', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockLogger.log).toHaveBeenCalledWith( + 'Transaction flag', + expect.any(Object), + expect.objectContaining({ + action: FraudAction.FLAG, + matchedRules: ['Suspicious Pattern'], + }), + ); + }); + }); + + describe('when transaction requires review', () => { + const matchedRules: FraudRuleEvaluationResult[] = [ + { + ruleId: 'rule-3', + ruleName: 'Manual Review Required', + matched: true, + action: FraudAction.REVIEW, + reason: 'Complex transaction', + }, + ]; + + beforeEach(() => { + mockRulesEngine.evaluateTransaction.mockResolvedValue(matchedRules); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.REVIEW, + matchedRules, + reasons: ['Manual Review Required: Complex transaction'], + }); + }); + + it('should publish rejected status for REVIEW action', async () => { + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockEventPublisher.publishResult).toHaveBeenCalledWith( + transactionData.transactionId, + 'rejected', + ['Manual Review Required: Complex transaction'], + ['Manual Review Required'], + transactionData.metadata.correlationId, + transactionData.metadata.causationId, + ); + }); + }); + + describe('logging', () => { + it('should log validation start', async () => { + mockRulesEngine.evaluateTransaction.mockResolvedValue([]); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.APPROVE, + matchedRules: [], + reasons: [], + }); + + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockLogger.log).toHaveBeenCalledWith( + 'Validating transaction', + expect.objectContaining({ + correlationId: transactionData.metadata.correlationId, + requestId: transactionData.metadata.causationId, + service: transactionData.metadata.service, + }), + { + transactionId: transactionData.transactionId, + value: transactionData.value, + transferTypeId: transactionData.transferTypeId, + }, + ); + }); + }); + + describe('context building', () => { + it('should build correct fraud evaluation context', async () => { + mockRulesEngine.evaluateTransaction.mockResolvedValue([]); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.APPROVE, + matchedRules: [], + reasons: [], + }); + + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockRulesEngine.evaluateTransaction).toHaveBeenCalledWith({ + transactionExternalId: transactionData.transactionId, + accountExternalIdDebit: transactionData.accountExternalIdDebit, + accountExternalIdCredit: transactionData.accountExternalIdCredit, + transferTypeId: transactionData.transferTypeId, + value: transactionData.value, + createdAt: transactionData.createdAt, + }); + }); + }); + + describe('error propagation', () => { + it('should propagate rules engine evaluation errors', async () => { + const error = new Error('Rules engine error'); + mockRulesEngine.evaluateTransaction.mockRejectedValue(error); + + await expect( + useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ), + ).rejects.toThrow('Rules engine error'); + }); + + it('should propagate event publisher errors', async () => { + mockRulesEngine.evaluateTransaction.mockResolvedValue([]); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.APPROVE, + matchedRules: [], + reasons: [], + }); + mockEventPublisher.publishResult.mockRejectedValue(new Error('Kafka error')); + + await expect( + useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ), + ).rejects.toThrow('Kafka error'); + }); + }); + + describe('multiple matched rules', () => { + it('should handle multiple matched rules correctly', async () => { + const matchedRules: FraudRuleEvaluationResult[] = [ + { + ruleId: 'rule-1', + ruleName: 'Rule 1', + matched: true, + action: FraudAction.FLAG, + reason: 'Reason 1', + }, + { + ruleId: 'rule-2', + ruleName: 'Rule 2', + matched: true, + action: FraudAction.REJECT, + reason: 'Reason 2', + }, + ]; + + mockRulesEngine.evaluateTransaction.mockResolvedValue(matchedRules); + mockRulesEngine.determineFinalAction.mockReturnValue({ + action: FraudAction.REJECT, + matchedRules, + reasons: ['Rule 1: Reason 1', 'Rule 2: Reason 2'], + }); + + await useCase.execute( + transactionData.transactionId, + transactionData.value, + transactionData.accountExternalIdDebit, + transactionData.accountExternalIdCredit, + transactionData.transferTypeId, + transactionData.createdAt, + transactionData.metadata, + ); + + expect(mockEventPublisher.publishResult).toHaveBeenCalledWith( + transactionData.transactionId, + 'rejected', + ['Rule 1: Reason 1', 'Rule 2: Reason 2'], + ['Rule 1', 'Rule 2'], + transactionData.metadata.correlationId, + transactionData.metadata.causationId, + ); + }); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.ts b/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.ts new file mode 100644 index 0000000000..7eb28a3297 --- /dev/null +++ b/apps/anti-fraud-service/src/application/use-cases/validate-transaction.use-case.ts @@ -0,0 +1,88 @@ +import { FraudAction, type FraudEvaluationContext } from '@app/common/types/fraud-rules.types'; +import { LoggerService } from '@app/observability'; +import { Inject, Injectable } from '@nestjs/common'; +import type { IValidateTransactionUseCase } from '../../domain/ports/input/validate-transaction.use-case.interface'; +import { EVENT_PUBLISHER, type IEventPublisher } from '../../domain/ports/output/event-publisher.interface'; +import { RulesEngineService } from '../../domain/services/rules-engine.service'; + +@Injectable() +export class ValidateTransactionUseCase implements IValidateTransactionUseCase { + constructor( + private readonly rulesEngine: RulesEngineService, + private readonly logger: LoggerService, + @Inject(EVENT_PUBLISHER) + private readonly eventPublisher: IEventPublisher, + ) {} + + async execute( + transactionId: string, + value: number, + accountExternalIdDebit: string, + accountExternalIdCredit: string, + transferTypeId: number, + createdAt: Date, + metadata: { correlationId: string; causationId: string; service: string }, + ): Promise { + const requestContext = { + correlationId: metadata.correlationId, + requestId: metadata.causationId, + service: metadata.service, + }; + + this.logger.log('Validating transaction', requestContext, { + transactionId, + value, + transferTypeId, + }); + + const context: FraudEvaluationContext = { + transactionExternalId: transactionId, + accountExternalIdDebit, + accountExternalIdCredit, + transferTypeId, + value, + createdAt, + }; + + const ruleResults = await this.rulesEngine.evaluateTransaction(context); + const { action, matchedRules, reasons } = this.rulesEngine.determineFinalAction(ruleResults); + + let status: string; + switch (action) { + case FraudAction.REJECT: + case FraudAction.REVIEW: + case FraudAction.FLAG: + status = 'rejected'; + break; + default: + status = 'approved'; + } + + await this.eventPublisher.publishResult( + transactionId, + status, + reasons, + matchedRules.map((r) => r.ruleName), + metadata.correlationId, + metadata.causationId, + ); + + if (action === FraudAction.REJECT) { + this.logger.warn(`Transaction ${action.toLowerCase()}`, requestContext, { + transactionId, + action, + value, + matchedRules: matchedRules.map((r) => r.ruleName), + reasons, + }); + } else { + this.logger.log(`Transaction ${action.toLowerCase()}`, requestContext, { + transactionId, + action, + value, + matchedRules: matchedRules.map((r) => r.ruleName), + reasons, + }); + } + } +} diff --git a/apps/anti-fraud-service/src/config/instrument.ts b/apps/anti-fraud-service/src/config/instrument.ts new file mode 100644 index 0000000000..f3aeae11ee --- /dev/null +++ b/apps/anti-fraud-service/src/config/instrument.ts @@ -0,0 +1,30 @@ +require('dotenv').config(); + +import { initializeTelemetry } from '@app/observability'; + +initializeTelemetry({ + serviceName: 'anti-fraud-service', + serviceVersion: '1.0.0', + otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318', + environment: process.env.NODE_ENV || 'development', + sampling: Number.parseFloat(process.env.OTEL_SAMPLING_RATIO || '1.0'), + enabled: process.env.OTEL_ENABLED !== 'false', +}); + +console.log('✅ OpenTelemetry initialized for anti-fraud-service'); + +import * as Sentry from '@sentry/nestjs'; + +if (process.env.SENTRY_ENABLED === 'true') { + Sentry.init({ + dsn: + process.env.SENTRY_DSN || + 'https://355fd73ebe31d920ebd6c57263a8c28f@o4507779425435648.ingest.us.sentry.io/4510643730579456', + environment: process.env.NODE_ENV || 'development', + sendDefaultPii: true, + tracesSampleRate: 1, + integrations: [Sentry.captureConsoleIntegration()], + }); + + console.log('✅ Sentry initialized for anti-fraud-service'); +} diff --git a/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.spec.ts b/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.spec.ts new file mode 100644 index 0000000000..e88cdd007a --- /dev/null +++ b/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.spec.ts @@ -0,0 +1,63 @@ +import { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { FraudRule } from './fraud-rule.entity'; + +describe('FraudRule', () => { + describe('constructor', () => { + it('should create a fraud rule with all required properties', () => { + const rule = new FraudRule( + '1', + 'High Value Transaction', + 'Flag transactions over $1000', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: '>', value: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date('2024-01-01'), + new Date('2024-01-01'), + ); + + expect(rule.id).toBe('1'); + expect(rule.name).toBe('High Value Transaction'); + expect(rule.description).toBe('Flag transactions over $1000'); + expect(rule.ruleType).toBe(FraudRuleType.AMOUNT_THRESHOLD); + expect(rule.condition).toEqual({ operator: '>', value: 1000 }); + expect(rule.action).toBe(FraudAction.FLAG); + expect(rule.priority).toBe(1); + expect(rule.isActive).toBe(true); + expect(rule.createdAt).toEqual(new Date('2024-01-01')); + expect(rule.updatedAt).toEqual(new Date('2024-01-01')); + }); + }); + + describe('business methods', () => { + let rule: FraudRule; + + beforeEach(() => { + rule = new FraudRule( + '1', + 'Test Rule', + 'Test description', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: '>', value: 500 }, + FraudAction.REVIEW, + 1, + true, + new Date(), + new Date(), + ); + }); + + it('should be active', () => { + expect(rule.isActive).toBe(true); + }); + + it('should have correct priority', () => { + expect(rule.priority).toBe(1); + }); + + it('should have correct action', () => { + expect(rule.action).toBe(FraudAction.REVIEW); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.ts b/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.ts new file mode 100644 index 0000000000..8d655f2a9d --- /dev/null +++ b/apps/anti-fraud-service/src/domain/entities/fraud-rule.entity.ts @@ -0,0 +1,16 @@ +import type { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; + +export class FraudRule { + constructor( + public readonly id: string, + public readonly name: string, + public readonly description: string | null, + public readonly ruleType: FraudRuleType, + public readonly condition: any, + public readonly action: FraudAction, + public readonly priority: number, + public readonly isActive: boolean, + public readonly createdAt: Date, + public readonly updatedAt: Date, + ) {} +} diff --git a/apps/anti-fraud-service/src/domain/ports/input/validate-transaction.use-case.interface.ts b/apps/anti-fraud-service/src/domain/ports/input/validate-transaction.use-case.interface.ts new file mode 100644 index 0000000000..be37ad8266 --- /dev/null +++ b/apps/anti-fraud-service/src/domain/ports/input/validate-transaction.use-case.interface.ts @@ -0,0 +1,13 @@ +export interface IValidateTransactionUseCase { + execute( + transactionId: string, + value: number, + accountExternalIdDebit: string, + accountExternalIdCredit: string, + transferTypeId: number, + createdAt: Date, + metadata: { correlationId: string; causationId: string; service: string }, + ): Promise; +} + +export const VALIDATE_TRANSACTION_USE_CASE = 'VALIDATE_TRANSACTION_USE_CASE'; diff --git a/apps/anti-fraud-service/src/domain/ports/output/event-publisher.interface.ts b/apps/anti-fraud-service/src/domain/ports/output/event-publisher.interface.ts new file mode 100644 index 0000000000..da5fa339d7 --- /dev/null +++ b/apps/anti-fraud-service/src/domain/ports/output/event-publisher.interface.ts @@ -0,0 +1,12 @@ +export interface IEventPublisher { + publishResult( + transactionId: string, + status: string, + reasons: string[], + matchedRules: string[], + correlationId: string, + causationId: string, + ): Promise; +} + +export const EVENT_PUBLISHER = 'EVENT_PUBLISHER'; diff --git a/apps/anti-fraud-service/src/domain/repositories/fraud-rule.repository.interface.ts b/apps/anti-fraud-service/src/domain/repositories/fraud-rule.repository.interface.ts new file mode 100644 index 0000000000..2c62fb9846 --- /dev/null +++ b/apps/anti-fraud-service/src/domain/repositories/fraud-rule.repository.interface.ts @@ -0,0 +1,9 @@ +import type { FraudRule } from '../entities/fraud-rule.entity'; +import type { FraudRuleExecution } from '../types/fraud-rule-execution.type'; + +export interface IFraudRuleRepository { + findActiveRules(): Promise; + logExecution(execution: FraudRuleExecution): Promise; +} + +export const FRAUD_RULE_REPOSITORY = 'FRAUD_RULE_REPOSITORY'; diff --git a/apps/anti-fraud-service/src/domain/services/rules-engine.service.spec.ts b/apps/anti-fraud-service/src/domain/services/rules-engine.service.spec.ts new file mode 100644 index 0000000000..5b75904d22 --- /dev/null +++ b/apps/anti-fraud-service/src/domain/services/rules-engine.service.spec.ts @@ -0,0 +1,724 @@ +import { FraudAction, type FraudRuleEvaluationResult, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { FraudRule } from '../entities/fraud-rule.entity'; +import { RulesEngineService } from './rules-engine.service'; + +describe('RulesEngineService', () => { + let service: RulesEngineService; + let mockRepository: any; + let mockRules: FraudRule[]; + + beforeEach(() => { + mockRules = [ + new FraudRule( + '1', + 'High Value Rule', + 'Flag transactions over $1000', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'gt', value: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ), + new FraudRule( + '2', + 'Reject Rule', + 'Reject transactions over $5000', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'gt', value: 5000 }, + FraudAction.REJECT, + 2, + true, + new Date(), + new Date(), + ), + ]; + + mockRepository = { + findActiveRules: jest.fn().mockResolvedValue(mockRules), + logExecution: jest.fn().mockResolvedValue(undefined), + }; + + service = new RulesEngineService(mockRepository); + }); + + describe('evaluateTransaction', () => { + it('should return evaluation results for all active rules', async () => { + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 100, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results).toHaveLength(2); + expect(results[0]).toHaveProperty('ruleId'); + expect(results[0]).toHaveProperty('ruleName'); + expect(results[0]).toHaveProperty('matched'); + expect(results[0]).toHaveProperty('action'); + }); + + it('should match rules when conditions are met', async () => { + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 1500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + const matchedResult = results.find((r) => r.ruleId === '1'); + expect(matchedResult?.matched).toBe(true); + expect(matchedResult?.reason).toContain('1500 gt 1000'); + }); + }); + + describe('determineFinalAction', () => { + it('should return APPROVE when no rules match', () => { + const ruleResults: FraudRuleEvaluationResult[] = []; + + const result = service.determineFinalAction(ruleResults); + + expect(result.action).toBe(FraudAction.APPROVE); + expect(result.matchedRules).toHaveLength(0); + expect(result.reasons).toEqual(['No fraud rules matched']); + }); + + it('should return REJECT when highest priority rule rejects', () => { + const ruleResults: FraudRuleEvaluationResult[] = [ + { + ruleId: '1', + ruleName: 'High Value Rule', + action: FraudAction.FLAG, + matched: true, + reason: 'Amount exceeds threshold', + }, + { + ruleId: '2', + ruleName: 'Reject Rule', + action: FraudAction.REJECT, + matched: true, + reason: 'Amount too high', + }, + ]; + + const result = service.determineFinalAction(ruleResults); + + expect(result.action).toBe(FraudAction.REJECT); + expect(result.matchedRules).toHaveLength(2); + expect(result.reasons).toContain('Reject Rule: Amount too high'); + }); + + it('should return FLAG when highest priority rule flags', () => { + const ruleResults: FraudRuleEvaluationResult[] = [ + { + ruleId: '1', + ruleName: 'High Value Rule', + action: FraudAction.FLAG, + matched: true, + reason: 'Amount exceeds threshold', + }, + ]; + + const result = service.determineFinalAction(ruleResults); + + expect(result.action).toBe(FraudAction.FLAG); + expect(result.matchedRules).toHaveLength(1); + expect(result.reasons).toContain('High Value Rule: Amount exceeds threshold'); + }); + + it('should return REVIEW when REVIEW has higher priority than FLAG', () => { + const ruleResults: FraudRuleEvaluationResult[] = [ + { + ruleId: '1', + ruleName: 'Flag Rule', + action: FraudAction.FLAG, + matched: true, + reason: 'Flagged for review', + }, + { + ruleId: '2', + ruleName: 'Review Rule', + action: FraudAction.REVIEW, + matched: true, + reason: 'Requires manual review', + }, + ]; + + const result = service.determineFinalAction(ruleResults); + + expect(result.action).toBe(FraudAction.REVIEW); + expect(result.matchedRules).toHaveLength(2); + }); + + it('should filter out non-matched rules', () => { + const ruleResults: FraudRuleEvaluationResult[] = [ + { + ruleId: '1', + ruleName: 'Matched Rule', + action: FraudAction.FLAG, + matched: true, + reason: 'Matched', + }, + { + ruleId: '2', + ruleName: 'Non-matched Rule', + action: FraudAction.REJECT, + matched: false, + }, + ]; + + const result = service.determineFinalAction(ruleResults); + + expect(result.action).toBe(FraudAction.FLAG); + expect(result.matchedRules).toHaveLength(1); + expect(result.matchedRules[0].ruleId).toBe('1'); + }); + }); + + describe('AMOUNT_THRESHOLD operators', () => { + it('should evaluate gte operator correctly', async () => { + const gteRule = new FraudRule( + 'gte-1', + 'GTE Rule', + 'Greater than or equal', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'gte', value: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([gteRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 1000, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + + it('should evaluate lt operator correctly', async () => { + const ltRule = new FraudRule( + 'lt-1', + 'LT Rule', + 'Less than', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'lt', value: 100 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([ltRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 50, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + + it('should evaluate lte operator correctly', async () => { + const lteRule = new FraudRule( + 'lte-1', + 'LTE Rule', + 'Less than or equal', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'lte', value: 100 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([lteRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 100, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + + it('should evaluate eq operator correctly', async () => { + const eqRule = new FraudRule( + 'eq-1', + 'EQ Rule', + 'Equals', + FraudRuleType.AMOUNT_THRESHOLD, + { operator: 'eq', value: 999.99 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([eqRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 999.99, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + }); + + describe('ACCOUNT_BLACKLIST rule type', () => { + it('should match when debit account is blacklisted', async () => { + const blacklistRule = new FraudRule( + 'blacklist-1', + 'Account Blacklist', + 'Reject blacklisted accounts', + FraudRuleType.ACCOUNT_BLACKLIST, + { accounts: ['blacklisted-account-123'] }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([blacklistRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'blacklisted-account-123', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + expect(results[0].reason).toBe('Account is in blacklist'); + }); + + it('should match when credit account is blacklisted', async () => { + const blacklistRule = new FraudRule( + 'blacklist-1', + 'Account Blacklist', + 'Reject blacklisted accounts', + FraudRuleType.ACCOUNT_BLACKLIST, + { accounts: ['blacklisted-credit-456'] }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([blacklistRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'blacklisted-credit-456', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + + it('should not match when accounts are not blacklisted', async () => { + const blacklistRule = new FraudRule( + 'blacklist-1', + 'Account Blacklist', + 'Reject blacklisted accounts', + FraudRuleType.ACCOUNT_BLACKLIST, + { accounts: ['blacklisted-account-999'] }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([blacklistRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + }); + }); + + describe('TRANSFER_TYPE_LIMIT rule type', () => { + it('should match when transfer type matches and exceeds limit', async () => { + const typeLimitRule = new FraudRule( + 'type-limit-1', + 'Transfer Type Limit', + 'Limit transfers', + FraudRuleType.TRANSFER_TYPE_LIMIT, + { transferTypeId: 1, maxAmount: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([typeLimitRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 1500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + expect(results[0].reason).toBe('Transfer type 1 exceeds limit of 1000'); + }); + + it('should not match when transfer type is different', async () => { + const typeLimitRule = new FraudRule( + 'type-limit-1', + 'Transfer Type Limit', + 'Limit transfers', + FraudRuleType.TRANSFER_TYPE_LIMIT, + { transferTypeId: 2, maxAmount: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([typeLimitRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 1500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + }); + + it('should not match when amount is within limit', async () => { + const typeLimitRule = new FraudRule( + 'type-limit-1', + 'Transfer Type Limit', + 'Limit transfers', + FraudRuleType.TRANSFER_TYPE_LIMIT, + { transferTypeId: 1, maxAmount: 1000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([typeLimitRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + }); + }); + + describe('TIME_BASED rule type', () => { + it('should match when transaction is outside allowed hours', async () => { + const timeRule = new FraudRule( + 'time-1', + 'Business Hours Only', + 'Only allow transactions during business hours', + FraudRuleType.TIME_BASED, + { + allowedHours: { start: 9, end: 17 }, + allowedDays: [1, 2, 3, 4, 5], + }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([timeRule]); + + const testDate = new Date('2024-01-08T00:00:00'); + testDate.setHours(22, 0, 0, 0); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: testDate, + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + expect(results[0].reason).toBe('Transaction outside allowed time window'); + }); + + it('should match when transaction is on disallowed day', async () => { + const timeRule = new FraudRule( + 'time-1', + 'Weekdays Only', + 'Only allow transactions on weekdays', + FraudRuleType.TIME_BASED, + { + allowedHours: { start: 0, end: 23 }, + allowedDays: [1, 2, 3, 4, 5], + }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([timeRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date('2024-01-07T12:00:00Z'), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(true); + }); + + it('should not match when transaction is within allowed time window', async () => { + const timeRule = new FraudRule( + 'time-1', + 'Business Hours', + 'Allow during business hours', + FraudRuleType.TIME_BASED, + { + allowedHours: { start: 9, end: 17 }, + allowedDays: [1, 2, 3, 4, 5], + }, + FraudAction.REJECT, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([timeRule]); + + const testDate = new Date('2024-01-08T00:00:00'); + testDate.setHours(12, 0, 0, 0); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: testDate, + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + }); + }); + + describe('DAILY_LIMIT rule type', () => { + it('should return not matched with pending implementation message', async () => { + const dailyLimitRule = new FraudRule( + 'daily-1', + 'Daily Limit', + 'Limit daily transactions', + FraudRuleType.DAILY_LIMIT, + { maxCount: 10, maxAmount: 5000 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([dailyLimitRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + expect(results[0].reason).toBe('Daily limit check - implementation pending'); + }); + }); + + describe('VELOCITY_CHECK rule type', () => { + it('should return not matched with pending implementation message', async () => { + const velocityRule = new FraudRule( + 'velocity-1', + 'Velocity Check', + 'Check transaction velocity', + FraudRuleType.VELOCITY_CHECK, + { maxTransactions: 5, windowMinutes: 60 }, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([velocityRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + expect(results[0].reason).toBe('Velocity check - implementation pending'); + }); + }); + + describe('error handling', () => { + it('should handle unknown rule types gracefully', async () => { + const unknownRule = new FraudRule( + 'unknown-1', + 'Unknown Rule', + 'Test unknown type', + 'UNKNOWN_TYPE' as any, + {}, + FraudAction.FLAG, + 1, + true, + new Date(), + new Date(), + ); + + mockRepository.findActiveRules.mockResolvedValue([unknownRule]); + + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 500, + createdAt: new Date(), + }; + + const results = await service.evaluateTransaction(context); + + expect(results[0].matched).toBe(false); + expect(results[0].reason).toBe('Unknown rule type: UNKNOWN_TYPE'); + }); + + it('should log rule executions', async () => { + const context = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'acc-debit', + accountExternalIdCredit: 'acc-credit', + transferTypeId: 1, + value: 1500, + createdAt: new Date(), + }; + + await service.evaluateTransaction(context); + + expect(mockRepository.logExecution).toHaveBeenCalledTimes(2); + expect(mockRepository.logExecution).toHaveBeenCalledWith( + expect.objectContaining({ + ruleId: expect.any(String), + transactionExternalId: 'txn-123', + matched: expect.any(Boolean), + action: expect.any(String), + }), + ); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/domain/services/rules-engine.service.ts b/apps/anti-fraud-service/src/domain/services/rules-engine.service.ts new file mode 100644 index 0000000000..1b50caae66 --- /dev/null +++ b/apps/anti-fraud-service/src/domain/services/rules-engine.service.ts @@ -0,0 +1,274 @@ +import { + type AccountBlacklistCondition, + type AmountThresholdCondition, + type DailyLimitCondition, + FraudAction, + type FraudEvaluationContext, + type FraudRuleEvaluationResult, + FraudRuleType, + type TimeBasedCondition, + type TransferTypeLimitCondition, + type VelocityCheckCondition, +} from '@app/common/types/fraud-rules.types'; +import { Inject, Injectable } from '@nestjs/common'; +import type { FraudRule } from '../entities/fraud-rule.entity'; +import { FRAUD_RULE_REPOSITORY, type IFraudRuleRepository } from '../repositories/fraud-rule.repository.interface'; + +@Injectable() +export class RulesEngineService { + constructor( + @Inject(FRAUD_RULE_REPOSITORY) + private readonly fraudRuleRepository: IFraudRuleRepository, + ) {} + + async evaluateTransaction(context: FraudEvaluationContext): Promise { + const activeRules = await this.fraudRuleRepository.findActiveRules(); + + const results: FraudRuleEvaluationResult[] = []; + + for (const rule of activeRules) { + const result = await this.evaluateRule(rule, context); + results.push(result); + + await this.logRuleExecution(rule.id, context.transactionExternalId, result); + } + + return results; + } + + private async evaluateRule(rule: FraudRule, context: FraudEvaluationContext): Promise { + const baseResult: FraudRuleEvaluationResult = { + ruleId: rule.id, + ruleName: rule.name, + matched: false, + action: rule.action as FraudAction, + }; + + try { + switch (rule.ruleType as FraudRuleType) { + case FraudRuleType.AMOUNT_THRESHOLD: + return this.evaluateAmountThreshold(rule, context, baseResult); + + case FraudRuleType.DAILY_LIMIT: + return await this.evaluateDailyLimit(rule, context, baseResult); + + case FraudRuleType.VELOCITY_CHECK: + return await this.evaluateVelocityCheck(rule, context, baseResult); + + case FraudRuleType.ACCOUNT_BLACKLIST: + return this.evaluateAccountBlacklist(rule, context, baseResult); + + case FraudRuleType.TRANSFER_TYPE_LIMIT: + return this.evaluateTransferTypeLimit(rule, context, baseResult); + + case FraudRuleType.TIME_BASED: + return this.evaluateTimeBased(rule, context, baseResult); + + default: + return { + ...baseResult, + reason: `Unknown rule type: ${rule.ruleType}`, + }; + } + } catch (error) { + console.error(`Error evaluating rule ${rule.name}:`, error); + return { + ...baseResult, + reason: `Evaluation error: ${error.message}`, + }; + } + } + + private evaluateAmountThreshold( + rule: FraudRule, + context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): FraudRuleEvaluationResult { + const condition = rule.condition as AmountThresholdCondition; + let matched = false; + + switch (condition.operator) { + case 'gt': + matched = context.value > condition.value; + break; + case 'gte': + matched = context.value >= condition.value; + break; + case 'lt': + matched = context.value < condition.value; + break; + case 'lte': + matched = context.value <= condition.value; + break; + case 'eq': + matched = context.value === condition.value; + break; + } + + return { + ...baseResult, + matched, + reason: matched + ? `Transaction amount ${context.value} ${condition.operator} ${condition.value}` + : undefined, + details: { value: context.value, threshold: condition.value }, + }; + } + + private async evaluateDailyLimit( + rule: FraudRule, + _context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): Promise { + const _condition = rule.condition as DailyLimitCondition; + + return { + ...baseResult, + matched: false, + reason: 'Daily limit check - implementation pending', + }; + } + + private async evaluateVelocityCheck( + rule: FraudRule, + _context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): Promise { + const _condition = rule.condition as VelocityCheckCondition; + + return { + ...baseResult, + matched: false, + reason: 'Velocity check - implementation pending', + }; + } + + private evaluateAccountBlacklist( + rule: FraudRule, + context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): FraudRuleEvaluationResult { + const condition = rule.condition as AccountBlacklistCondition; + + const isBlacklisted = + condition.accounts.includes(context.accountExternalIdDebit) || + condition.accounts.includes(context.accountExternalIdCredit); + + return { + ...baseResult, + matched: isBlacklisted, + reason: isBlacklisted ? 'Account is in blacklist' : undefined, + details: { + debitAccount: context.accountExternalIdDebit, + creditAccount: context.accountExternalIdCredit, + }, + }; + } + + private evaluateTransferTypeLimit( + rule: FraudRule, + context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): FraudRuleEvaluationResult { + const condition = rule.condition as TransferTypeLimitCondition; + + const matched = context.transferTypeId === condition.transferTypeId && context.value > condition.maxAmount; + + return { + ...baseResult, + matched, + reason: matched + ? `Transfer type ${context.transferTypeId} exceeds limit of ${condition.maxAmount}` + : undefined, + details: { + transferTypeId: context.transferTypeId, + value: context.value, + maxAmount: condition.maxAmount, + }, + }; + } + + private evaluateTimeBased( + rule: FraudRule, + context: FraudEvaluationContext, + baseResult: FraudRuleEvaluationResult, + ): FraudRuleEvaluationResult { + const condition = rule.condition as TimeBasedCondition; + const date = new Date(context.createdAt); + const hour = date.getHours(); + const day = date.getDay(); + + const hourAllowed = hour >= condition.allowedHours.start && hour <= condition.allowedHours.end; + const dayAllowed = condition.allowedDays.includes(day); + + const matched = !hourAllowed || !dayAllowed; + + return { + ...baseResult, + matched, + reason: matched ? 'Transaction outside allowed time window' : undefined, + details: { + hour, + day, + allowedHours: condition.allowedHours, + allowedDays: condition.allowedDays, + }, + }; + } + + private async logRuleExecution( + ruleId: string, + transactionId: string, + result: FraudRuleEvaluationResult, + ): Promise { + await this.fraudRuleRepository.logExecution({ + ruleId, + transactionExternalId: transactionId, + matched: result.matched, + action: result.action, + details: result.details || {}, + }); + } + + determineFinalAction(results: FraudRuleEvaluationResult[]): { + action: FraudAction; + matchedRules: FraudRuleEvaluationResult[]; + reasons: string[]; + } { + const matchedRules = results.filter((r) => r.matched); + + if (matchedRules.length === 0) { + return { + action: FraudAction.APPROVE, + matchedRules: [], + reasons: ['No fraud rules matched'], + }; + } + + const actionPriority = { + [FraudAction.REJECT]: 4, + [FraudAction.REVIEW]: 3, + [FraudAction.FLAG]: 2, + [FraudAction.APPROVE]: 1, + }; + + let finalAction = FraudAction.APPROVE; + let maxPriority = 0; + + for (const rule of matchedRules) { + const priority = actionPriority[rule.action]; + if (priority > maxPriority) { + maxPriority = priority; + finalAction = rule.action; + } + } + + const reasons = matchedRules.filter((r) => r.reason).map((r) => `${r.ruleName}: ${r.reason}`); + + return { + action: finalAction, + matchedRules, + reasons, + }; + } +} diff --git a/apps/anti-fraud-service/src/domain/types/fraud-rule-execution.type.ts b/apps/anti-fraud-service/src/domain/types/fraud-rule-execution.type.ts new file mode 100644 index 0000000000..76f87f66ec --- /dev/null +++ b/apps/anti-fraud-service/src/domain/types/fraud-rule-execution.type.ts @@ -0,0 +1,9 @@ +import type { FraudAction } from '@app/common/types/fraud-rules.types'; + +export interface FraudRuleExecution { + ruleId: string; + transactionExternalId: string; + matched: boolean; + action: FraudAction; + details?: Record; +} diff --git a/apps/anti-fraud-service/src/infrastructure/database/fraud-rules.schema.ts b/apps/anti-fraud-service/src/infrastructure/database/fraud-rules.schema.ts new file mode 100644 index 0000000000..26a81aec37 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/database/fraud-rules.schema.ts @@ -0,0 +1,31 @@ +import { boolean, integer, jsonb, pgTable, text, timestamp, uuid, varchar } from 'drizzle-orm/pg-core'; + +export const fraudRules = pgTable('fraud_rules', { + id: uuid('id').primaryKey().defaultRandom(), + name: varchar('name', { length: 100 }).notNull(), + description: text('description'), + ruleType: varchar('rule_type', { length: 50 }).notNull(), + condition: jsonb('condition').notNull(), + action: varchar('action', { length: 20 }).notNull().default('REJECT'), + priority: integer('priority').notNull().default(100), + isActive: boolean('is_active').notNull().default(true), + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().defaultNow(), +}); + +export const fraudRuleExecutions = pgTable('fraud_rule_executions', { + id: uuid('id').primaryKey().defaultRandom(), + ruleId: uuid('rule_id') + .notNull() + .references(() => fraudRules.id), + transactionExternalId: uuid('transaction_external_id').notNull(), + matched: boolean('matched').notNull(), + action: varchar('action', { length: 20 }).notNull(), + details: jsonb('details'), + executedAt: timestamp('executed_at').notNull().defaultNow(), +}); + +export type FraudRule = typeof fraudRules.$inferSelect; +export type NewFraudRule = typeof fraudRules.$inferInsert; +export type FraudRuleExecution = typeof fraudRuleExecutions.$inferSelect; +export type NewFraudRuleExecution = typeof fraudRuleExecutions.$inferInsert; diff --git a/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.spec.ts b/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.spec.ts new file mode 100644 index 0000000000..d424b0090b --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.spec.ts @@ -0,0 +1,290 @@ +import { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { FraudRule } from '../../domain/entities/fraud-rule.entity'; +import type { FraudRule as FraudRuleSchema } from '../database/fraud-rules.schema'; +import { FraudRuleMapper } from './fraud-rule.mapper'; + +describe('FraudRuleMapper', () => { + describe('toDomain', () => { + it('should map schema to domain entity with all fields', () => { + const schema: FraudRuleSchema = { + id: 'rule-123', + name: 'High Value Rule', + description: 'Flag high value transactions', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 1000 }, + action: FraudAction.FLAG, + priority: 1, + isActive: true, + createdAt: new Date('2024-01-01T00:00:00Z'), + updatedAt: new Date('2024-01-02T00:00:00Z'), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result).toBeInstanceOf(FraudRule); + expect(result.id).toBe('rule-123'); + expect(result.name).toBe('High Value Rule'); + expect(result.description).toBe('Flag high value transactions'); + expect(result.ruleType).toBe(FraudRuleType.AMOUNT_THRESHOLD); + expect(result.condition).toEqual({ operator: 'gt', value: 1000 }); + expect(result.action).toBe(FraudAction.FLAG); + expect(result.priority).toBe(1); + expect(result.isActive).toBe(true); + expect(result.createdAt).toEqual(new Date('2024-01-01T00:00:00Z')); + expect(result.updatedAt).toEqual(new Date('2024-01-02T00:00:00Z')); + }); + + it('should map ACCOUNT_BLACKLIST rule type', () => { + const schema: FraudRuleSchema = { + id: 'rule-blacklist', + name: 'Blacklist Rule', + description: 'Block blacklisted accounts', + ruleType: FraudRuleType.ACCOUNT_BLACKLIST, + condition: { accounts: ['acc-123', 'acc-456'] }, + action: FraudAction.REJECT, + priority: 2, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.ruleType).toBe(FraudRuleType.ACCOUNT_BLACKLIST); + expect(result.condition).toEqual({ accounts: ['acc-123', 'acc-456'] }); + }); + + it('should map TRANSFER_TYPE_LIMIT rule type', () => { + const schema: FraudRuleSchema = { + id: 'rule-transfer-limit', + name: 'Transfer Limit', + description: 'Limit transfer amounts', + ruleType: FraudRuleType.TRANSFER_TYPE_LIMIT, + condition: { transferTypeId: 1, maxAmount: 5000 }, + action: FraudAction.FLAG, + priority: 3, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.ruleType).toBe(FraudRuleType.TRANSFER_TYPE_LIMIT); + expect(result.condition).toEqual({ transferTypeId: 1, maxAmount: 5000 }); + }); + + it('should map TIME_BASED rule type', () => { + const schema: FraudRuleSchema = { + id: 'rule-time', + name: 'Business Hours', + description: 'Only allow during business hours', + ruleType: FraudRuleType.TIME_BASED, + condition: { + allowedHours: { start: 9, end: 17 }, + allowedDays: [1, 2, 3, 4, 5], + }, + action: FraudAction.REJECT, + priority: 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.ruleType).toBe(FraudRuleType.TIME_BASED); + expect(result.condition).toEqual({ + allowedHours: { start: 9, end: 17 }, + allowedDays: [1, 2, 3, 4, 5], + }); + }); + + it('should map DAILY_LIMIT rule type', () => { + const schema: FraudRuleSchema = { + id: 'rule-daily', + name: 'Daily Limit', + description: 'Limit daily transactions', + ruleType: FraudRuleType.DAILY_LIMIT, + condition: { maxCount: 10, maxAmount: 10000 }, + action: FraudAction.REVIEW, + priority: 4, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.ruleType).toBe(FraudRuleType.DAILY_LIMIT); + expect(result.condition).toEqual({ maxCount: 10, maxAmount: 10000 }); + }); + + it('should map VELOCITY_CHECK rule type', () => { + const schema: FraudRuleSchema = { + id: 'rule-velocity', + name: 'Velocity Check', + description: 'Check transaction velocity', + ruleType: FraudRuleType.VELOCITY_CHECK, + condition: { maxTransactions: 5, windowMinutes: 60 }, + action: FraudAction.FLAG, + priority: 5, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.ruleType).toBe(FraudRuleType.VELOCITY_CHECK); + expect(result.condition).toEqual({ maxTransactions: 5, windowMinutes: 60 }); + }); + + it('should map REJECT action', () => { + const schema: FraudRuleSchema = { + id: 'rule-reject', + name: 'Reject Rule', + description: 'Reject transaction', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 10000 }, + action: FraudAction.REJECT, + priority: 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.action).toBe(FraudAction.REJECT); + }); + + it('should map REVIEW action', () => { + const schema: FraudRuleSchema = { + id: 'rule-review', + name: 'Review Rule', + description: 'Requires review', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 5000 }, + action: FraudAction.REVIEW, + priority: 2, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.action).toBe(FraudAction.REVIEW); + }); + + it('should map APPROVE action', () => { + const schema: FraudRuleSchema = { + id: 'rule-approve', + name: 'Approve Rule', + description: 'Auto approve', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'lt', value: 100 }, + action: FraudAction.APPROVE, + priority: 10, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.action).toBe(FraudAction.APPROVE); + }); + + it('should map inactive rules', () => { + const schema: FraudRuleSchema = { + id: 'rule-inactive', + name: 'Inactive Rule', + description: 'This rule is inactive', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 1000 }, + action: FraudAction.FLAG, + priority: 1, + isActive: false, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.isActive).toBe(false); + }); + + it('should preserve priority values', () => { + const schema: FraudRuleSchema = { + id: 'rule-priority', + name: 'Priority Rule', + description: 'Test priority', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 1000 }, + action: FraudAction.FLAG, + priority: 99, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.priority).toBe(99); + }); + + it('should handle complex JSONB conditions', () => { + const complexCondition = { + operator: 'gte', + value: 1000, + currency: 'USD', + metadata: { + threshold: 'high', + category: 'suspicious', + }, + }; + + const schema: FraudRuleSchema = { + id: 'rule-complex', + name: 'Complex Rule', + description: 'Complex condition', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: complexCondition, + action: FraudAction.FLAG, + priority: 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.condition).toEqual(complexCondition); + }); + + it('should preserve timestamps', () => { + const createdAt = new Date('2024-01-01T10:00:00Z'); + const updatedAt = new Date('2024-01-15T15:30:00Z'); + + const schema: FraudRuleSchema = { + id: 'rule-timestamps', + name: 'Timestamp Rule', + description: 'Test timestamps', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 1000 }, + action: FraudAction.FLAG, + priority: 1, + isActive: true, + createdAt, + updatedAt, + }; + + const result = FraudRuleMapper.toDomain(schema); + + expect(result.createdAt).toEqual(createdAt); + expect(result.updatedAt).toEqual(updatedAt); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.ts b/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.ts new file mode 100644 index 0000000000..c86e4ab163 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/mappers/fraud-rule.mapper.ts @@ -0,0 +1,20 @@ +import type { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { FraudRule } from '../../domain/entities/fraud-rule.entity'; +import type { FraudRule as FraudRuleSchema } from '../../infrastructure/database/fraud-rules.schema'; + +export class FraudRuleMapper { + static toDomain(schema: FraudRuleSchema): FraudRule { + return new FraudRule( + schema.id, + schema.name, + schema.description, + schema.ruleType as FraudRuleType, + schema.condition, + schema.action as FraudAction, + schema.priority, + schema.isActive, + schema.createdAt, + schema.updatedAt, + ); + } +} diff --git a/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.spec.ts b/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.spec.ts new file mode 100644 index 0000000000..ac83049780 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.spec.ts @@ -0,0 +1,467 @@ +import type { KafkaProducerService } from '@app/common'; +import { KafkaTopics, TransactionStatus } from '@app/common'; +import { KafkaEventPublisher } from './kafka-event-publisher'; + +describe('KafkaEventPublisher', () => { + let publisher: KafkaEventPublisher; + let mockKafkaProducer: jest.Mocked; + + beforeEach(() => { + mockKafkaProducer = { + sendMessage: jest.fn().mockResolvedValue(undefined), + } as any; + + publisher = new KafkaEventPublisher(mockKafkaProducer); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('publishResult', () => { + describe('when status is approved', () => { + it('should publish to TRANSACTION_APPROVED topic', async () => { + await publisher.publishResult( + 'txn-123', + TransactionStatus.APPROVED, + ['No fraud detected'], + [], + 'correlation-123', + 'causation-456', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_APPROVED, + 'txn-123', + expect.any(Object), + ); + }); + + it('should include transaction details in event', async () => { + await publisher.publishResult( + 'txn-approved', + TransactionStatus.APPROVED, + ['All checks passed'], + [], + 'correlation-approved', + 'causation-approved', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + 'txn-approved', + expect.objectContaining({ + transactionExternalId: 'txn-approved', + transactionStatus: TransactionStatus.APPROVED, + }), + ); + }); + + it('should include reason from reasons array', async () => { + await publisher.publishResult( + 'txn-reason', + TransactionStatus.APPROVED, + ['Reason 1', 'Reason 2', 'Reason 3'], + [], + 'correlation-reason', + 'causation-reason', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + reason: 'Reason 1; Reason 2; Reason 3', + }), + ); + }); + + it('should use default reason when reasons array is empty', async () => { + await publisher.publishResult( + 'txn-default', + TransactionStatus.APPROVED, + [], + [], + 'correlation-default', + 'causation-default', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + reason: 'Transaction validated successfully', + }), + ); + }); + + it('should include matched rules array', async () => { + await publisher.publishResult( + 'txn-rules', + TransactionStatus.APPROVED, + ['No rules matched'], + [], + 'correlation-rules', + 'causation-rules', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + matchedRules: [], + }), + ); + }); + + it('should include validatedAt timestamp', async () => { + const beforeCall = new Date().toISOString(); + + await publisher.publishResult( + 'txn-timestamp', + TransactionStatus.APPROVED, + [], + [], + 'correlation-timestamp', + 'causation-timestamp', + ); + + const afterCall = new Date().toISOString(); + + const callArgs = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + expect(callArgs.validatedAt).toBeDefined(); + expect(callArgs.validatedAt).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/); + expect(callArgs.validatedAt >= beforeCall).toBe(true); + expect(callArgs.validatedAt <= afterCall).toBe(true); + }); + + it('should include metadata with correlationId and causationId', async () => { + await publisher.publishResult( + 'txn-metadata', + TransactionStatus.APPROVED, + [], + [], + 'correlation-metadata', + 'causation-metadata', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'correlation-metadata', + causationId: 'causation-metadata', + }), + }), + ); + }); + + it('should include metadata with service name and version', async () => { + await publisher.publishResult( + 'txn-service', + TransactionStatus.APPROVED, + [], + [], + 'correlation-service', + 'causation-service', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + service: 'AntiFraudService', + version: '1.0.0', + }), + }), + ); + }); + + it('should include metadata timestamp', async () => { + await publisher.publishResult( + 'txn-meta-timestamp', + TransactionStatus.APPROVED, + [], + [], + 'correlation-meta', + 'causation-meta', + ); + + const callArgs = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + expect(callArgs.metadata.timestamp).toBeDefined(); + expect(typeof callArgs.metadata.timestamp).toBe('string'); + }); + }); + + describe('when status is rejected', () => { + it('should publish to TRANSACTION_REJECTED topic', async () => { + await publisher.publishResult( + 'txn-rejected', + TransactionStatus.REJECTED, + ['Fraud detected'], + ['High Value Rule'], + 'correlation-rejected', + 'causation-rejected', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_REJECTED, + 'txn-rejected', + expect.any(Object), + ); + }); + + it('should include rejection reason', async () => { + await publisher.publishResult( + 'txn-fraud', + TransactionStatus.REJECTED, + ['Amount exceeds threshold', 'Suspicious pattern detected'], + ['Rule 1', 'Rule 2'], + 'correlation-fraud', + 'causation-fraud', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + reason: 'Amount exceeds threshold; Suspicious pattern detected', + transactionStatus: TransactionStatus.REJECTED, + }), + ); + }); + + it('should include matched rule names', async () => { + await publisher.publishResult( + 'txn-matched', + TransactionStatus.REJECTED, + ['Blacklisted account'], + ['Account Blacklist Rule', 'Velocity Check'], + 'correlation-matched', + 'causation-matched', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + matchedRules: ['Account Blacklist Rule', 'Velocity Check'], + }), + ); + }); + + it('should include transaction external ID', async () => { + await publisher.publishResult( + 'txn-external-123', + TransactionStatus.REJECTED, + ['Fraud'], + ['Rule'], + 'correlation-ext', + 'causation-ext', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + 'txn-external-123', + expect.objectContaining({ + transactionExternalId: 'txn-external-123', + }), + ); + }); + + it('should include metadata with correct correlation chain', async () => { + await publisher.publishResult( + 'txn-chain', + TransactionStatus.REJECTED, + ['Rejected'], + [], + 'original-correlation-id', + 'original-request-id', + ); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'original-correlation-id', + causationId: 'original-request-id', + }), + }), + ); + }); + }); + + describe('topic routing', () => { + it('should route to approved topic for APPROVED status', async () => { + await publisher.publishResult( + 'txn-route-approved', + TransactionStatus.APPROVED, + [], + [], + 'correlation', + 'causation', + ); + + const topic = mockKafkaProducer.sendMessage.mock.calls[0][0]; + expect(topic).toBe(KafkaTopics.TRANSACTION_APPROVED); + }); + + it('should route to rejected topic for REJECTED status', async () => { + await publisher.publishResult( + 'txn-route-rejected', + TransactionStatus.REJECTED, + [], + [], + 'correlation', + 'causation', + ); + + const topic = mockKafkaProducer.sendMessage.mock.calls[0][0]; + expect(topic).toBe(KafkaTopics.TRANSACTION_REJECTED); + }); + + it('should use transaction ID as message key', async () => { + await publisher.publishResult( + 'txn-key-123', + TransactionStatus.APPROVED, + [], + [], + 'correlation', + 'causation', + ); + + const messageKey = mockKafkaProducer.sendMessage.mock.calls[0][1]; + expect(messageKey).toBe('txn-key-123'); + }); + }); + + describe('reason formatting', () => { + it('should join multiple reasons with semicolon and space', async () => { + await publisher.publishResult( + 'txn-join', + TransactionStatus.REJECTED, + ['Reason A', 'Reason B', 'Reason C', 'Reason D'], + [], + 'correlation', + 'causation', + ); + + const event = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + expect(event.reason).toBe('Reason A; Reason B; Reason C; Reason D'); + }); + + it('should handle single reason', async () => { + await publisher.publishResult( + 'txn-single', + TransactionStatus.APPROVED, + ['Single reason'], + [], + 'correlation', + 'causation', + ); + + const event = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + expect(event.reason).toBe('Single reason'); + }); + + it('should use default message for empty reasons array', async () => { + await publisher.publishResult( + 'txn-empty', + TransactionStatus.APPROVED, + [], + [], + 'correlation', + 'causation', + ); + + const event = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + expect(event.reason).toBe('Transaction validated successfully'); + }); + }); + + describe('error handling', () => { + it('should propagate Kafka producer errors', async () => { + mockKafkaProducer.sendMessage.mockRejectedValue(new Error('Kafka connection error')); + + await expect( + publisher.publishResult( + 'txn-error', + TransactionStatus.APPROVED, + [], + [], + 'correlation', + 'causation', + ), + ).rejects.toThrow('Kafka connection error'); + }); + + it('should not catch producer errors', async () => { + mockKafkaProducer.sendMessage.mockRejectedValue(new Error('Network timeout')); + + await expect( + publisher.publishResult( + 'txn-timeout', + TransactionStatus.REJECTED, + ['Fraud'], + [], + 'correlation', + 'causation', + ), + ).rejects.toThrow('Network timeout'); + }); + }); + + describe('event structure completeness', () => { + it('should include all required fields in approved event', async () => { + await publisher.publishResult( + 'txn-complete', + TransactionStatus.APPROVED, + ['Complete check'], + ['Rule A', 'Rule B'], + 'correlation-complete', + 'causation-complete', + ); + + const event = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + + expect(event).toHaveProperty('transactionExternalId'); + expect(event).toHaveProperty('transactionStatus'); + expect(event).toHaveProperty('reason'); + expect(event).toHaveProperty('matchedRules'); + expect(event).toHaveProperty('validatedAt'); + expect(event).toHaveProperty('metadata'); + expect(event.metadata).toHaveProperty('correlationId'); + expect(event.metadata).toHaveProperty('causationId'); + expect(event.metadata).toHaveProperty('timestamp'); + expect(event.metadata).toHaveProperty('service'); + expect(event.metadata).toHaveProperty('version'); + }); + + it('should include all required fields in rejected event', async () => { + await publisher.publishResult( + 'txn-complete-reject', + TransactionStatus.REJECTED, + ['Fraud detected'], + ['Blacklist'], + 'correlation-reject-complete', + 'causation-reject-complete', + ); + + const event = mockKafkaProducer.sendMessage.mock.calls[0][2] as any; + + expect(event.transactionExternalId).toBe('txn-complete-reject'); + expect(event.transactionStatus).toBe(TransactionStatus.REJECTED); + expect(event.reason).toBe('Fraud detected'); + expect(event.matchedRules).toEqual(['Blacklist']); + expect(event.validatedAt).toBeDefined(); + expect(event.metadata.correlationId).toBe('correlation-reject-complete'); + expect(event.metadata.causationId).toBe('causation-reject-complete'); + expect(event.metadata.service).toBe('AntiFraudService'); + expect(event.metadata.version).toBe('1.0.0'); + }); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.ts b/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.ts new file mode 100644 index 0000000000..82f87ccc24 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/messaging/kafka-event-publisher.ts @@ -0,0 +1,37 @@ +import { KafkaProducerService, KafkaTopics, TransactionStatus } from '@app/common'; +import { Injectable } from '@nestjs/common'; +import type { IEventPublisher } from '../../domain/ports/output/event-publisher.interface'; + +@Injectable() +export class KafkaEventPublisher implements IEventPublisher { + constructor(private readonly kafkaProducer: KafkaProducerService) {} + + async publishResult( + transactionId: string, + status: TransactionStatus, + reasons: string[], + matchedRules: string[], + correlationId: string, + causationId: string, + ): Promise { + const topic = + status === TransactionStatus.APPROVED ? KafkaTopics.TRANSACTION_APPROVED : KafkaTopics.TRANSACTION_REJECTED; + + const event = { + transactionExternalId: transactionId, + transactionStatus: status, + reason: reasons.join('; ') || 'Transaction validated successfully', + matchedRules: matchedRules, + validatedAt: new Date().toISOString(), + metadata: { + correlationId, + causationId, + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + version: '1.0.0', + }, + }; + + await this.kafkaProducer.sendMessage(topic, transactionId, event); + } +} diff --git a/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.spec.ts b/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.spec.ts new file mode 100644 index 0000000000..500c28a2b9 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.spec.ts @@ -0,0 +1,612 @@ +import type { KafkaConsumerService, TransactionCreatedEvent } from '@app/common'; +import { KafkaTopics, TransactionStatus } from '@app/common'; +import type { EachMessagePayload } from 'kafkajs'; +import type { IValidateTransactionUseCase } from '../../domain/ports/input/validate-transaction.use-case.interface'; +import { TransactionCreatedConsumer } from './transaction-created.consumer'; + +describe('TransactionCreatedConsumer', () => { + let consumer: TransactionCreatedConsumer; + let mockKafkaConsumer: jest.Mocked; + let mockValidateUseCase: jest.Mocked; + let consoleErrorSpy: jest.SpyInstance; + + beforeEach(() => { + mockKafkaConsumer = { + registerHandler: jest.fn(), + subscribeAndRun: jest.fn().mockResolvedValue(undefined), + } as any; + + mockValidateUseCase = { + execute: jest.fn().mockResolvedValue(undefined), + } as jest.Mocked; + + consumer = new TransactionCreatedConsumer(mockKafkaConsumer, mockValidateUseCase); + consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); + }); + + afterEach(() => { + jest.clearAllMocks(); + consoleErrorSpy.mockRestore(); + }); + + describe('onModuleInit', () => { + it('should register handler for transaction-created topic', async () => { + await consumer.onModuleInit(); + + expect(mockKafkaConsumer.registerHandler).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_CREATED, + expect.any(Function), + ); + }); + + it('should subscribe to transaction-created topic', async () => { + await consumer.onModuleInit(); + + expect(mockKafkaConsumer.subscribeAndRun).toHaveBeenCalledWith([KafkaTopics.TRANSACTION_CREATED]); + }); + + it('should subscribe after registering handler', async () => { + const callOrder: string[] = []; + + mockKafkaConsumer.registerHandler.mockImplementation(() => { + callOrder.push('registerHandler'); + }); + + mockKafkaConsumer.subscribeAndRun.mockImplementation(async () => { + callOrder.push('subscribeAndRun'); + }); + + await consumer.onModuleInit(); + + expect(callOrder).toEqual(['registerHandler', 'subscribeAndRun']); + }); + }); + + describe('handleTransactionCreated', () => { + const createPayload = (event: TransactionCreatedEvent): EachMessagePayload => { + return { + topic: KafkaTopics.TRANSACTION_CREATED, + partition: 0, + message: { + key: Buffer.from(event.transactionExternalId), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + }; + + it('should parse transaction event and call validate use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + expect(registeredHandler).toBeDefined(); + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-123', + accountExternalIdCredit: 'credit-456', + transferTypeId: 1, + value: 500, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation-123', + causationId: 'causation-456', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + version: '1.0.0', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledTimes(1); + }); + + it('should pass correct transaction ID to use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-external-id', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 1000, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + 'txn-external-id', + expect.any(Number), + expect.any(String), + expect.any(String), + expect.any(Number), + expect.any(Date), + expect.any(Object), + ); + }); + + it('should pass transaction value to use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-value', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 2, + value: 750.5, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + 750.5, + expect.any(String), + expect.any(String), + expect.any(Number), + expect.any(Date), + expect.any(Object), + ); + }); + + it('should pass account IDs to use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-accounts', + accountExternalIdDebit: 'debit-account-789', + accountExternalIdCredit: 'credit-account-012', + transferTypeId: 1, + value: 200, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + expect.any(Number), + 'debit-account-789', + 'credit-account-012', + expect.any(Number), + expect.any(Date), + expect.any(Object), + ); + }); + + it('should pass transfer type ID to use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-type', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 3, + value: 150, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + expect.any(Number), + expect.any(String), + expect.any(String), + 3, + expect.any(Date), + expect.any(Object), + ); + }); + + it('should convert createdAt string to Date object', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-date', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 100, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-06-15T14:30:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-06-15T14:30:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + const callArgs = mockValidateUseCase.execute.mock.calls[0]; + const passedDate = callArgs[5]; + + expect(passedDate).toBeInstanceOf(Date); + expect(passedDate.toISOString()).toBe('2024-06-15T14:30:00.000Z'); + }); + + it('should pass metadata to use case', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-metadata', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 100, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation-abc', + causationId: 'causation-xyz', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + version: '1.0.0', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + expect.any(Number), + expect.any(String), + expect.any(String), + expect.any(Number), + expect.any(Date), + { + correlationId: 'correlation-abc', + causationId: 'causation-xyz', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + version: '1.0.0', + }, + ); + }); + + it('should handle all parameters correctly', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-complete', + accountExternalIdDebit: 'debit-complete', + accountExternalIdCredit: 'credit-complete', + transferTypeId: 2, + value: 999.99, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-03-20T12:00:00.000Z', + metadata: { + correlationId: 'correlation-complete', + causationId: 'causation-complete', + timestamp: '2024-03-20T12:00:00.000Z', + service: 'TransactionService', + version: '1.0.0', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + 'txn-complete', + 999.99, + 'debit-complete', + 'credit-complete', + 2, + new Date('2024-03-20T12:00:00.000Z'), + event.metadata, + ); + }); + + it('should handle integer values', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-integer', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 1000, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + 1000, + expect.any(String), + expect.any(String), + expect.any(Number), + expect.any(Date), + expect.any(Object), + ); + }); + + it('should handle decimal values', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-decimal', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 123.45, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + 123.45, + expect.any(String), + expect.any(String), + expect.any(Number), + expect.any(Date), + expect.any(Object), + ); + }); + + it('should handle different transfer types', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const transferTypes = [1, 2, 3]; + + for (const typeId of transferTypes) { + const event: TransactionCreatedEvent = { + transactionExternalId: `txn-type-${typeId}`, + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: typeId, + value: 100, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload = createPayload(event); + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + expect.any(String), + expect.any(Number), + expect.any(String), + expect.any(String), + typeId, + expect.any(Date), + expect.any(Object), + ); + } + }); + + it('should parse JSON message correctly', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-json', + accountExternalIdDebit: 'debit-json', + accountExternalIdCredit: 'credit-json', + transferTypeId: 1, + value: 555, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation-json', + causationId: 'causation-json', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const messageValue = Buffer.from(JSON.stringify(event)); + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_CREATED, + partition: 0, + message: { + key: Buffer.from('txn-json'), + value: messageValue, + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler(payload); + + expect(mockValidateUseCase.execute).toHaveBeenCalledWith( + 'txn-json', + 555, + 'debit-json', + 'credit-json', + 1, + expect.any(Date), + event.metadata, + ); + }); + }); + + describe('error propagation', () => { + it('should propagate use case errors', async () => { + mockValidateUseCase.execute.mockRejectedValue(new Error('Validation error')); + + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-error', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 100, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T10:00:00.000Z', + metadata: { + correlationId: 'correlation', + causationId: 'causation', + timestamp: '2024-01-01T10:00:00.000Z', + service: 'TransactionService', + }, + }; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_CREATED, + partition: 0, + message: { + key: Buffer.from('txn-error'), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await expect(registeredHandler(payload)).rejects.toThrow('Validation error'); + }); + + it('should handle null message value gracefully', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_CREATED, + partition: 0, + message: { + key: Buffer.from('txn-null'), + value: null as any, + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler(payload); + + expect(consoleErrorSpy).toHaveBeenCalledWith('Received message with null value'); + expect(mockValidateUseCase.execute).not.toHaveBeenCalled(); + }); + + it('should propagate JSON parse errors', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls[0][1]; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_CREATED, + partition: 0, + message: { + key: Buffer.from('txn-invalid'), + value: Buffer.from('invalid json{'), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await expect(registeredHandler(payload)).rejects.toThrow(); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.ts b/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.ts new file mode 100644 index 0000000000..5a27390ae4 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/messaging/transaction-created.consumer.ts @@ -0,0 +1,41 @@ +import { KafkaConsumerService, KafkaTopics, type TransactionCreatedEvent } from '@app/common'; +import { Inject, Injectable, type OnModuleInit } from '@nestjs/common'; +import type { EachMessagePayload } from 'kafkajs'; +import { + type IValidateTransactionUseCase, + VALIDATE_TRANSACTION_USE_CASE, +} from '../../domain/ports/input/validate-transaction.use-case.interface'; + +@Injectable() +export class TransactionCreatedConsumer implements OnModuleInit { + constructor( + private readonly kafkaConsumer: KafkaConsumerService, + @Inject(VALIDATE_TRANSACTION_USE_CASE) + private readonly validateTransactionUseCase: IValidateTransactionUseCase, + ) {} + + async onModuleInit() { + this.kafkaConsumer.registerHandler(KafkaTopics.TRANSACTION_CREATED, this.handleTransactionCreated.bind(this)); + + await this.kafkaConsumer.subscribeAndRun([KafkaTopics.TRANSACTION_CREATED]); + } + + private async handleTransactionCreated(payload: EachMessagePayload) { + const { message } = payload; + if (!message.value) { + console.error('Received message with null value'); + return; + } + const transaction: TransactionCreatedEvent = JSON.parse(message.value.toString()); + + await this.validateTransactionUseCase.execute( + transaction.transactionExternalId, + transaction.value, + transaction.accountExternalIdDebit, + transaction.accountExternalIdCredit, + transaction.transferTypeId, + new Date(transaction.createdAt), + transaction.metadata, + ); + } +} diff --git a/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.spec.ts b/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.spec.ts new file mode 100644 index 0000000000..2e867b41eb --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.spec.ts @@ -0,0 +1,322 @@ +import type { DrizzleClient } from '@app/common'; +import { FraudAction, FraudRuleType } from '@app/common/types/fraud-rules.types'; +import { FraudRule } from '../../domain/entities/fraud-rule.entity'; +import type { FraudRuleExecution } from '../../domain/types/fraud-rule-execution.type'; +import { FraudRuleRepository } from './fraud-rule.repository'; + +describe('FraudRuleRepository', () => { + let repository: FraudRuleRepository; + let mockDb: jest.Mocked; + + beforeEach(() => { + const mockOrderBy = jest.fn().mockResolvedValue([]); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + const mockValues = jest.fn().mockResolvedValue(undefined); + + mockDb = { + select: jest.fn().mockReturnValue({ from: mockFrom }), + insert: jest.fn().mockReturnValue({ values: mockValues }), + } as any; + + repository = new FraudRuleRepository(mockDb); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('findActiveRules', () => { + it('should return all active rules ordered by priority', async () => { + const dbRules = [ + { + id: 'rule-1', + name: 'High Priority Rule', + description: 'First rule', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 1000 }, + action: FraudAction.REJECT, + priority: 1, + isActive: true, + createdAt: new Date('2024-01-01'), + updatedAt: new Date('2024-01-01'), + }, + { + id: 'rule-2', + name: 'Low Priority Rule', + description: 'Second rule', + ruleType: FraudRuleType.ACCOUNT_BLACKLIST, + condition: { accounts: ['acc-123'] }, + action: FraudAction.FLAG, + priority: 2, + isActive: true, + createdAt: new Date('2024-01-02'), + updatedAt: new Date('2024-01-02'), + }, + ]; + + const mockOrderBy = jest.fn().mockResolvedValue(dbRules); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findActiveRules(); + + expect(mockDb.select).toHaveBeenCalled(); + expect(mockFrom).toHaveBeenCalled(); + expect(mockWhere).toHaveBeenCalled(); + expect(mockOrderBy).toHaveBeenCalled(); + expect(result).toHaveLength(2); + expect(result[0]).toBeInstanceOf(FraudRule); + expect(result[0].id).toBe('rule-1'); + expect(result[0].priority).toBe(1); + expect(result[1].id).toBe('rule-2'); + expect(result[1].priority).toBe(2); + }); + + it('should return empty array when no active rules exist', async () => { + const mockOrderBy = jest.fn().mockResolvedValue([]); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findActiveRules(); + + expect(result).toEqual([]); + }); + + it('should filter by isActive = true', async () => { + const mockOrderBy = jest.fn().mockResolvedValue([]); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + await repository.findActiveRules(); + + expect(mockWhere).toHaveBeenCalled(); + }); + + it('should map all rule types correctly', async () => { + const ruleTypes = [ + FraudRuleType.AMOUNT_THRESHOLD, + FraudRuleType.ACCOUNT_BLACKLIST, + FraudRuleType.TRANSFER_TYPE_LIMIT, + FraudRuleType.TIME_BASED, + FraudRuleType.DAILY_LIMIT, + FraudRuleType.VELOCITY_CHECK, + ]; + + const dbRules = ruleTypes.map((ruleType, index) => ({ + id: `rule-${index}`, + name: `Rule ${index}`, + description: `Description ${index}`, + ruleType, + condition: {}, + action: FraudAction.FLAG, + priority: index + 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + })); + + const mockOrderBy = jest.fn().mockResolvedValue(dbRules); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findActiveRules(); + + expect(result).toHaveLength(6); + result.forEach((rule, index) => { + expect(rule.ruleType).toBe(ruleTypes[index]); + }); + }); + + it('should map all fraud actions correctly', async () => { + const actions = [FraudAction.APPROVE, FraudAction.FLAG, FraudAction.REVIEW, FraudAction.REJECT]; + + const dbRules = actions.map((action, index) => ({ + id: `rule-${index}`, + name: `Rule ${index}`, + description: `Description ${index}`, + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: { operator: 'gt', value: 100 }, + action, + priority: index + 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + })); + + const mockOrderBy = jest.fn().mockResolvedValue(dbRules); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findActiveRules(); + + expect(result).toHaveLength(4); + result.forEach((rule, index) => { + expect(rule.action).toBe(actions[index]); + }); + }); + + it('should preserve complex JSONB conditions', async () => { + const complexCondition = { + operator: 'gte', + value: 5000, + metadata: { risk: 'high', region: 'LATAM' }, + }; + + const dbRules = [ + { + id: 'rule-complex', + name: 'Complex Rule', + description: 'With complex condition', + ruleType: FraudRuleType.AMOUNT_THRESHOLD, + condition: complexCondition, + action: FraudAction.REVIEW, + priority: 1, + isActive: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + ]; + + const mockOrderBy = jest.fn().mockResolvedValue(dbRules); + const mockWhere = jest.fn().mockReturnValue({ orderBy: mockOrderBy }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findActiveRules(); + + expect(result[0].condition).toEqual(complexCondition); + }); + }); + + describe('logExecution', () => { + it('should log a matched fraud rule execution', async () => { + const execution: FraudRuleExecution = { + ruleId: 'rule-123', + transactionExternalId: 'txn-456', + matched: true, + action: FraudAction.REJECT, + details: { amount: 5000, threshold: 1000 }, + }; + + const mockValues = jest.fn().mockResolvedValue(undefined); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.logExecution(execution); + + expect(mockDb.insert).toHaveBeenCalled(); + expect(mockValues).toHaveBeenCalledWith({ + ruleId: 'rule-123', + transactionExternalId: 'txn-456', + matched: true, + action: FraudAction.REJECT, + details: { amount: 5000, threshold: 1000 }, + }); + }); + + it('should log a non-matched fraud rule execution', async () => { + const execution: FraudRuleExecution = { + ruleId: 'rule-789', + transactionExternalId: 'txn-999', + matched: false, + action: FraudAction.APPROVE, + details: {}, + }; + + const mockValues = jest.fn().mockResolvedValue(undefined); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.logExecution(execution); + + expect(mockValues).toHaveBeenCalledWith({ + ruleId: 'rule-789', + transactionExternalId: 'txn-999', + matched: false, + action: FraudAction.APPROVE, + details: {}, + }); + }); + + it('should handle executions with complex details', async () => { + const execution: FraudRuleExecution = { + ruleId: 'rule-complex', + transactionExternalId: 'txn-complex', + matched: true, + action: FraudAction.FLAG, + details: { + value: 2500, + threshold: 1000, + debitAccount: 'acc-debit', + creditAccount: 'acc-credit', + transferTypeId: 1, + metadata: { + risk: 'medium', + confidence: 0.85, + }, + }, + }; + + const mockValues = jest.fn().mockResolvedValue(undefined); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.logExecution(execution); + + expect(mockValues).toHaveBeenCalledWith( + expect.objectContaining({ + details: execution.details, + }), + ); + }); + + it('should log executions for all action types', async () => { + const actions = [FraudAction.APPROVE, FraudAction.FLAG, FraudAction.REVIEW, FraudAction.REJECT]; + + for (const action of actions) { + const execution: FraudRuleExecution = { + ruleId: `rule-${action}`, + transactionExternalId: 'txn-test', + matched: true, + action, + details: {}, + }; + + const mockValues = jest.fn().mockResolvedValue(undefined); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.logExecution(execution); + + expect(mockValues).toHaveBeenCalledWith( + expect.objectContaining({ + action, + }), + ); + } + }); + + it('should handle empty details object', async () => { + const execution: FraudRuleExecution = { + ruleId: 'rule-empty', + transactionExternalId: 'txn-empty', + matched: false, + action: FraudAction.APPROVE, + details: {}, + }; + + const mockValues = jest.fn().mockResolvedValue(undefined); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.logExecution(execution); + + expect(mockValues).toHaveBeenCalledWith( + expect.objectContaining({ + details: {}, + }), + ); + }); + }); +}); diff --git a/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.ts b/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.ts new file mode 100644 index 0000000000..4769a28651 --- /dev/null +++ b/apps/anti-fraud-service/src/infrastructure/repositories/fraud-rule.repository.ts @@ -0,0 +1,38 @@ +import { DRIZZLE_CLIENT, type DrizzleClient } from '@app/common'; +import { Inject, Injectable } from '@nestjs/common'; +import { eq } from 'drizzle-orm'; +import type { FraudRule } from '../../domain/entities/fraud-rule.entity'; +import type { IFraudRuleRepository } from '../../domain/repositories/fraud-rule.repository.interface'; +import type { FraudRuleExecution } from '../../domain/types/fraud-rule-execution.type'; +import { fraudRuleExecutions, fraudRules, type NewFraudRuleExecution } from '../database/fraud-rules.schema'; +import { FraudRuleMapper } from '../mappers/fraud-rule.mapper'; + +@Injectable() +export class FraudRuleRepository implements IFraudRuleRepository { + constructor( + @Inject(DRIZZLE_CLIENT) + private readonly db: DrizzleClient, + ) {} + + async findActiveRules(): Promise { + const rules = await this.db + .select() + .from(fraudRules) + .where(eq(fraudRules.isActive, true)) + .orderBy(fraudRules.priority); + + return rules.map(FraudRuleMapper.toDomain); + } + + async logExecution(execution: FraudRuleExecution): Promise { + const schemaExecution: NewFraudRuleExecution = { + ruleId: execution.ruleId, + transactionExternalId: execution.transactionExternalId, + matched: execution.matched, + action: execution.action, + details: execution.details, + }; + + await this.db.insert(fraudRuleExecutions).values(schemaExecution); + } +} diff --git a/apps/anti-fraud-service/src/main.ts b/apps/anti-fraud-service/src/main.ts new file mode 100644 index 0000000000..c511fca75a --- /dev/null +++ b/apps/anti-fraud-service/src/main.ts @@ -0,0 +1,45 @@ +import 'reflect-metadata'; +import './config/instrument'; +import { CorrelationIdInterceptor } from '@app/common'; +import { HttpLoggerInterceptor, PinoLoggerService, shutdownTelemetry } from '@app/observability'; +import { ValidationPipe } from '@nestjs/common'; +import { NestFactory } from '@nestjs/core'; +import { AntiFraudModule } from './anti-fraud.module'; + +async function bootstrap() { + const app = await NestFactory.create(AntiFraudModule, { + bufferLogs: true, + }); + const logger = app.get(PinoLoggerService); + app.useLogger(logger); + app.useGlobalInterceptors(new CorrelationIdInterceptor()); + app.useGlobalInterceptors(new HttpLoggerInterceptor(logger)); + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + }), + ); + app.enableCors(); + const port = process.env.ANTI_FRAUD_PORT || 3001; + await app.listen(port); + logger.log(`🛡️ Anti-Fraud Service running on http://localhost:${port}`, { + port, + environment: process.env.NODE_ENV, + }); + process.on('SIGTERM', async () => { + logger.log('SIGTERM signal received: closing HTTP server'); + await app.close(); + await shutdownTelemetry(); + process.exit(0); + }); + process.on('SIGINT', async () => { + logger.log('SIGINT signal received: closing HTTP server'); + await app.close(); + await shutdownTelemetry(); + process.exit(0); + }); +} + +bootstrap(); diff --git a/apps/anti-fraud-service/tsconfig.app.json b/apps/anti-fraud-service/tsconfig.app.json new file mode 100644 index 0000000000..625a5fbfec --- /dev/null +++ b/apps/anti-fraud-service/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/anti-fraud-service" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts", "scripts"] +} diff --git a/apps/transaction-service/Dockerfile b/apps/transaction-service/Dockerfile new file mode 100644 index 0000000000..30e94e8767 --- /dev/null +++ b/apps/transaction-service/Dockerfile @@ -0,0 +1,38 @@ +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +COPY tsconfig*.json ./ +COPY nest-cli.json ./ + +# Install dependencies +RUN npm ci + +# Copy source code +COPY apps/transaction-service ./apps/transaction-service +COPY libs ./libs +COPY config/database/drizzle.config.ts ./config/database/ + +# Build application +RUN npm run build:transaction + +# Production image +FROM node:20-alpine + +WORKDIR /app + +# Copy package files and install production dependencies only +COPY package*.json ./ +RUN npm ci --only=production && npm cache clean --force + +# Copy built application from builder (maintain directory structure) +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/config/database/drizzle.config.ts ./config/database/ + +# Expose port +EXPOSE 3000 + +# Start application +CMD ["node", "dist/apps/transaction-service/apps/transaction-service/src/main.js"] diff --git a/apps/transaction-service/src/application/use-cases/create-transaction.use-case.spec.ts b/apps/transaction-service/src/application/use-cases/create-transaction.use-case.spec.ts new file mode 100644 index 0000000000..81df0fb78b --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/create-transaction.use-case.spec.ts @@ -0,0 +1,262 @@ +import type { RequestContext } from '@app/common'; +import type { LoggerService } from '@app/observability'; +import { Transaction } from '@domain/entities/transaction.entity'; +import type { ITransactionRepository } from '@domain/repositories/transaction.repository.interface'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import type { IEventPublisher } from '../../domain/ports/output/event-publisher.interface'; +import { CreateTransactionUseCase } from './create-transaction.use-case'; + +jest.mock('uuid', () => ({ + v4: jest.fn(() => '123e4567-e89b-12d3-a456-426614174000'), +})); + +describe('CreateTransactionUseCase', () => { + let useCase: CreateTransactionUseCase; + let mockRepository: jest.Mocked; + let mockEventPublisher: jest.Mocked; + let mockLogger: jest.Mocked; + + beforeEach(() => { + mockRepository = { + save: jest.fn(), + findByExternalId: jest.fn(), + update: jest.fn(), + } as jest.Mocked; + + mockEventPublisher = { + publishTransactionCreated: jest.fn(), + publishTransactionStatusUpdated: jest.fn(), + } as jest.Mocked; + + mockLogger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + verbose: jest.fn(), + } as unknown as jest.Mocked; + + useCase = new CreateTransactionUseCase(mockRepository, mockEventPublisher, mockLogger); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('execute', () => { + const createDto = { + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + tranferTypeId: 1, + value: 500, + }; + + const context: Partial = { + correlationId: 'correlation-123', + requestId: 'request-456', + service: 'TransactionService', + }; + + it('should create a transaction with PENDING status', async () => { + const expectedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + expect.any(Date), + ); + + mockRepository.save.mockResolvedValue(expectedTransaction); + + const result = await useCase.execute(createDto, context); + + expect(result).toEqual(expectedTransaction); + expect(result.transactionStatus).toBe(TransactionStatus.PENDING); + }); + + it('should generate a UUID for transactionExternalId', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + const result = await useCase.execute(createDto, context); + + expect(result.transactionExternalId).toBe('123e4567-e89b-12d3-a456-426614174000'); + }); + + it('should save transaction via repository', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + expect.any(Date), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + await useCase.execute(createDto, context); + + expect(mockRepository.save).toHaveBeenCalledTimes(1); + expect(mockRepository.save).toHaveBeenCalledWith( + expect.objectContaining({ + transactionExternalId: '123e4567-e89b-12d3-a456-426614174000', + accountExternalIdDebit: createDto.accountExternalIdDebit, + accountExternalIdCredit: createDto.accountExternalIdCredit, + transferTypeId: createDto.tranferTypeId, + value: createDto.value, + transactionStatus: TransactionStatus.PENDING, + }), + ); + }); + + it('should publish transaction created event with correct payload', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + await useCase.execute(createDto, context); + + expect(mockEventPublisher.publishTransactionCreated).toHaveBeenCalledTimes(1); + expect(mockEventPublisher.publishTransactionCreated).toHaveBeenCalledWith( + { + transactionExternalId: '123e4567-e89b-12d3-a456-426614174000', + accountExternalIdDebit: createDto.accountExternalIdDebit, + accountExternalIdCredit: createDto.accountExternalIdCredit, + transferTypeId: createDto.tranferTypeId, + value: createDto.value, + transactionStatus: TransactionStatus.PENDING, + createdAt: savedTransaction.createdAt, + }, + context, + ); + }); + + it('should log transaction creation with context', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + await useCase.execute(createDto, context); + + expect(mockLogger.log).toHaveBeenCalledWith('Creating transaction', context, { dto: createDto }); + expect(mockLogger.log).toHaveBeenCalledWith( + `Transaction created: ${savedTransaction.transactionExternalId}`, + context, + { + transactionId: savedTransaction.transactionExternalId, + value: savedTransaction.value, + }, + ); + }); + + it('should work without context', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + const result = await useCase.execute(createDto); + + expect(result).toEqual(savedTransaction); + expect(mockEventPublisher.publishTransactionCreated).toHaveBeenCalledWith(expect.any(Object), undefined); + }); + + it('should propagate repository errors', async () => { + const error = new Error('Database error'); + mockRepository.save.mockRejectedValue(error); + + await expect(useCase.execute(createDto, context)).rejects.toThrow('Database error'); + }); + + it('should propagate event publisher errors', async () => { + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + mockEventPublisher.publishTransactionCreated.mockRejectedValue(new Error('Kafka error')); + + await expect(useCase.execute(createDto, context)).rejects.toThrow('Kafka error'); + }); + + it('should handle zero value transactions', async () => { + const zeroValueDto = { ...createDto, value: 0 }; + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + zeroValueDto.accountExternalIdDebit, + zeroValueDto.accountExternalIdCredit, + zeroValueDto.tranferTypeId, + 0, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + const result = await useCase.execute(zeroValueDto, context); + + expect(result.value).toBe(0); + }); + + it('should handle large value transactions', async () => { + const largeValueDto = { ...createDto, value: 999999.99 }; + const savedTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + largeValueDto.accountExternalIdDebit, + largeValueDto.accountExternalIdCredit, + largeValueDto.tranferTypeId, + 999999.99, + TransactionStatus.PENDING, + new Date(), + ); + + mockRepository.save.mockResolvedValue(savedTransaction); + + const result = await useCase.execute(largeValueDto, context); + + expect(result.value).toBe(999999.99); + }); + }); +}); diff --git a/apps/transaction-service/src/application/use-cases/create-transaction.use-case.ts b/apps/transaction-service/src/application/use-cases/create-transaction.use-case.ts new file mode 100644 index 0000000000..eec0de1783 --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/create-transaction.use-case.ts @@ -0,0 +1,67 @@ +import type { RequestContext } from '@app/common'; +import { LoggerService } from '@app/observability'; +import { Transaction } from '@domain/entities/transaction.entity'; +import { + type ITransactionRepository, + TRANSACTION_REPOSITORY, +} from '@domain/repositories/transaction.repository.interface'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { Inject, Injectable } from '@nestjs/common'; +import { v4 as uuidv4 } from 'uuid'; +import type { ICreateTransactionUseCase } from '../../domain/ports/input/create-transaction.use-case.interface'; +import { EVENT_PUBLISHER, type IEventPublisher } from '../../domain/ports/output/event-publisher.interface'; + +export interface CreateTransactionDto { + accountExternalIdDebit: string; + accountExternalIdCredit: string; + tranferTypeId: number; + value: number; +} + +@Injectable() +export class CreateTransactionUseCase implements ICreateTransactionUseCase { + constructor( + @Inject(TRANSACTION_REPOSITORY) + private readonly transactionRepository: ITransactionRepository, + @Inject(EVENT_PUBLISHER) + private readonly eventPublisher: IEventPublisher, + private readonly logger: LoggerService, + ) {} + + async execute(dto: CreateTransactionDto, context?: Partial): Promise { + this.logger.log('Creating transaction', context, { dto }); + const transactionExternalId = uuidv4(); + + const transaction = new Transaction( + transactionExternalId, + dto.accountExternalIdDebit, + dto.accountExternalIdCredit, + dto.tranferTypeId, + dto.value, + TransactionStatus.PENDING, + new Date(), + ); + + const savedTransaction = await this.transactionRepository.save(transaction); + + await this.eventPublisher.publishTransactionCreated( + { + transactionExternalId: savedTransaction.transactionExternalId, + accountExternalIdDebit: savedTransaction.accountExternalIdDebit, + accountExternalIdCredit: savedTransaction.accountExternalIdCredit, + transferTypeId: savedTransaction.transferTypeId, + value: savedTransaction.value, + transactionStatus: savedTransaction.transactionStatus, + createdAt: savedTransaction.createdAt, + }, + context, + ); + + this.logger.log(`Transaction created: ${savedTransaction.transactionExternalId}`, context, { + transactionId: savedTransaction.transactionExternalId, + value: savedTransaction.value, + }); + + return savedTransaction; + } +} diff --git a/apps/transaction-service/src/application/use-cases/get-transaction.use-case.spec.ts b/apps/transaction-service/src/application/use-cases/get-transaction.use-case.spec.ts new file mode 100644 index 0000000000..d526299518 --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/get-transaction.use-case.spec.ts @@ -0,0 +1,263 @@ +import type { RedisService } from '@app/common'; +import { Transaction } from '@domain/entities/transaction.entity'; +import type { ITransactionRepository } from '@domain/repositories/transaction.repository.interface'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { NotFoundException } from '@nestjs/common'; +import { GetTransactionUseCase } from './get-transaction.use-case'; + +describe('GetTransactionUseCase', () => { + let useCase: GetTransactionUseCase; + let mockRepository: jest.Mocked; + let mockRedisService: jest.Mocked; + + beforeEach(() => { + mockRepository = { + save: jest.fn(), + findByExternalId: jest.fn(), + update: jest.fn(), + } as jest.Mocked; + + mockRedisService = { + get: jest.fn(), + set: jest.fn(), + del: jest.fn(), + exists: jest.fn(), + ttl: jest.fn(), + } as unknown as jest.Mocked; + + useCase = new GetTransactionUseCase(mockRepository, mockRedisService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('execute', () => { + const transactionId = '123e4567-e89b-12d3-a456-426614174000'; + const cacheKey = `transaction:${transactionId}`; + + const mockTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + + describe('cache hit scenarios', () => { + it('should return transaction from cache when available', async () => { + const cachedData = { + transactionExternalId: transactionId, + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: 500, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T00:00:00.000Z', + }; + + mockRedisService.get.mockResolvedValue(cachedData); + + const result = await useCase.execute(transactionId); + + expect(mockRedisService.get).toHaveBeenCalledWith(cacheKey); + expect(mockRedisService.get).toHaveBeenCalledTimes(1); + expect(mockRepository.findByExternalId).not.toHaveBeenCalled(); + expect(result.transactionExternalId).toBe(transactionId); + }); + + it('should re-hydrate Date object from cached string', async () => { + const cachedData = { + transactionExternalId: transactionId, + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: 500, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T00:00:00.000Z', + }; + + mockRedisService.get.mockResolvedValue(cachedData); + + const result = await useCase.execute(transactionId); + + expect(result.createdAt).toBeInstanceOf(Date); + expect(result.createdAt.toISOString()).toBe('2024-01-01T00:00:00.000Z'); + }); + + it('should not call repository when cache hit', async () => { + const cachedData = { + transactionExternalId: transactionId, + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: 500, + transactionStatus: TransactionStatus.PENDING, + createdAt: '2024-01-01T00:00:00.000Z', + }; + + mockRedisService.get.mockResolvedValue(cachedData); + + await useCase.execute(transactionId); + + expect(mockRepository.findByExternalId).not.toHaveBeenCalled(); + }); + }); + + describe('cache miss scenarios', () => { + it('should fetch from repository when cache misses', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId); + + expect(mockRedisService.get).toHaveBeenCalledWith(cacheKey); + expect(mockRepository.findByExternalId).toHaveBeenCalledWith(transactionId); + expect(result).toEqual(mockTransaction); + }); + + it('should cache transaction after fetching from repository', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId); + + expect(mockRedisService.set).toHaveBeenCalledWith(cacheKey, mockTransaction, 600); + }); + + it('should set 10 minutes (600 seconds) TTL when caching', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId); + + expect(mockRedisService.set).toHaveBeenCalledWith(expect.any(String), expect.any(Object), 600); + }); + + it('should throw NotFoundException when transaction not found in repository', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(null); + + await expect(useCase.execute(transactionId)).rejects.toThrow(NotFoundException); + await expect(useCase.execute(transactionId)).rejects.toThrow( + `Transaction with id ${transactionId} not found`, + ); + }); + + it('should not cache when transaction not found', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(null); + + await expect(useCase.execute(transactionId)).rejects.toThrow(NotFoundException); + + expect(mockRedisService.set).not.toHaveBeenCalled(); + }); + }); + + describe('error handling', () => { + it('should propagate Redis get errors', async () => { + const redisError = new Error('Redis connection error'); + mockRedisService.get.mockRejectedValue(redisError); + + await expect(useCase.execute(transactionId)).rejects.toThrow('Redis connection error'); + }); + + it('should propagate repository errors', async () => { + mockRedisService.get.mockResolvedValue(null); + const dbError = new Error('Database error'); + mockRepository.findByExternalId.mockRejectedValue(dbError); + + await expect(useCase.execute(transactionId)).rejects.toThrow('Database error'); + }); + + it('should continue execution even if Redis set fails', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRedisService.set.mockRejectedValue(new Error('Redis set error')); + + await expect(useCase.execute(transactionId)).rejects.toThrow('Redis set error'); + expect(mockRepository.findByExternalId).toHaveBeenCalled(); + }); + }); + + describe('cache key generation', () => { + it('should use correct cache key format', async () => { + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId); + + expect(mockRedisService.get).toHaveBeenCalledWith(`transaction:${transactionId}`); + }); + + it('should handle different transaction IDs', async () => { + const differentId = '987e6543-e89b-12d3-a456-999999999999'; + const differentTransaction = new Transaction( + differentId, + 'debit-account-999', + 'credit-account-999', + 2, + 1000, + TransactionStatus.APPROVED, + new Date(), + ); + + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(differentTransaction); + + await useCase.execute(differentId); + + expect(mockRedisService.get).toHaveBeenCalledWith(`transaction:${differentId}`); + expect(mockRedisService.set).toHaveBeenCalledWith( + `transaction:${differentId}`, + differentTransaction, + 600, + ); + }); + }); + + describe('transaction status scenarios', () => { + it('should cache and return APPROVED transaction', async () => { + const approvedTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.APPROVED, + new Date(), + ); + + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(approvedTransaction); + + const result = await useCase.execute(transactionId); + + expect(result.transactionStatus).toBe(TransactionStatus.APPROVED); + expect(mockRedisService.set).toHaveBeenCalled(); + }); + + it('should cache and return REJECTED transaction', async () => { + const rejectedTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.REJECTED, + new Date(), + ); + + mockRedisService.get.mockResolvedValue(null); + mockRepository.findByExternalId.mockResolvedValue(rejectedTransaction); + + const result = await useCase.execute(transactionId); + + expect(result.transactionStatus).toBe(TransactionStatus.REJECTED); + expect(mockRedisService.set).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/apps/transaction-service/src/application/use-cases/get-transaction.use-case.ts b/apps/transaction-service/src/application/use-cases/get-transaction.use-case.ts new file mode 100644 index 0000000000..9f2f2f1329 --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/get-transaction.use-case.ts @@ -0,0 +1,40 @@ +import { RedisService } from '@app/common'; +import type { Transaction } from '@domain/entities/transaction.entity'; +import { + type ITransactionRepository, + TRANSACTION_REPOSITORY, +} from '@domain/repositories/transaction.repository.interface'; +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; + +import type { IGetTransactionUseCase } from '../../domain/ports/input/get-transaction.use-case.interface'; + +@Injectable() +export class GetTransactionUseCase implements IGetTransactionUseCase { + constructor( + @Inject(TRANSACTION_REPOSITORY) + private readonly transactionRepository: ITransactionRepository, + private readonly redisService: RedisService, + ) {} + + async execute(transactionExternalId: string): Promise { + const cacheKey = `transaction:${transactionExternalId}`; + const cached = await this.redisService.get(cacheKey); + + if (cached) { + return { + ...cached, + createdAt: new Date(cached.createdAt), + } as Transaction; + } + + const transaction = await this.transactionRepository.findByExternalId(transactionExternalId); + + if (!transaction) { + throw new NotFoundException(`Transaction with id ${transactionExternalId} not found`); + } + + await this.redisService.set(cacheKey, transaction, 600); + + return transaction; + } +} diff --git a/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.spec.ts b/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.spec.ts new file mode 100644 index 0000000000..f6e4db9657 --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.spec.ts @@ -0,0 +1,296 @@ +import type { RedisService } from '@app/common'; +import type { LoggerService } from '@app/observability'; +import { Transaction } from '@domain/entities/transaction.entity'; +import type { ITransactionRepository } from '@domain/repositories/transaction.repository.interface'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { NotFoundException } from '@nestjs/common'; +import { UpdateTransactionStatusUseCase } from './update-transaction-status.use-case'; + +describe('UpdateTransactionStatusUseCase', () => { + let useCase: UpdateTransactionStatusUseCase; + let mockRepository: jest.Mocked; + let mockLogger: jest.Mocked; + let mockRedisService: jest.Mocked; + + beforeEach(() => { + mockRepository = { + save: jest.fn(), + findByExternalId: jest.fn(), + update: jest.fn(), + } as jest.Mocked; + + mockLogger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + verbose: jest.fn(), + } as unknown as jest.Mocked; + + mockRedisService = { + get: jest.fn(), + set: jest.fn(), + del: jest.fn(), + exists: jest.fn(), + ttl: jest.fn(), + } as unknown as jest.Mocked; + + useCase = new UpdateTransactionStatusUseCase(mockRepository, mockLogger, mockRedisService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('execute', () => { + const transactionId = '123e4567-e89b-12d3-a456-426614174000'; + const cacheKey = `transaction:${transactionId}`; + + let mockTransaction: Transaction; + + beforeEach(() => { + mockTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + }); + + describe('successful status updates', () => { + it('should update transaction status to APPROVED', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(result.transactionStatus).toBe(TransactionStatus.APPROVED); + expect(mockRepository.update).toHaveBeenCalledWith(mockTransaction); + }); + + it('should update transaction status to REJECTED', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.REJECTED); + + expect(result.transactionStatus).toBe(TransactionStatus.REJECTED); + expect(mockRepository.update).toHaveBeenCalledWith(mockTransaction); + }); + + it('should call approve() method when status is APPROVED', async () => { + const approveSpy = jest.spyOn(mockTransaction, 'approve'); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(approveSpy).toHaveBeenCalledTimes(1); + }); + + it('should call reject() method when status is REJECTED', async () => { + const rejectSpy = jest.spyOn(mockTransaction, 'reject'); + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.REJECTED); + + expect(rejectSpy).toHaveBeenCalledTimes(1); + }); + }); + + describe('repository interactions', () => { + it('should fetch transaction by external ID', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockRepository.findByExternalId).toHaveBeenCalledWith(transactionId); + expect(mockRepository.findByExternalId).toHaveBeenCalledTimes(1); + }); + + it('should throw NotFoundException when transaction not found', async () => { + mockRepository.findByExternalId.mockResolvedValue(null); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow( + NotFoundException, + ); + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow( + `Transaction with id ${transactionId} not found`, + ); + }); + + it('should not update repository when transaction not found', async () => { + mockRepository.findByExternalId.mockResolvedValue(null); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow(); + + expect(mockRepository.update).not.toHaveBeenCalled(); + }); + + it('should update transaction in repository', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockRepository.update).toHaveBeenCalledWith(mockTransaction); + expect(mockRepository.update).toHaveBeenCalledTimes(1); + }); + }); + + describe('cache updates', () => { + it('should update cache after successful status update', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockRedisService.set).toHaveBeenCalledWith(cacheKey, mockTransaction, 600); + }); + + it('should set 10 minutes (600 seconds) TTL for cache', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockRedisService.set).toHaveBeenCalledWith(expect.any(String), expect.any(Object), 600); + }); + + it('should use correct cache key format', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockRedisService.set).toHaveBeenCalledWith( + `transaction:${transactionId}`, + expect.any(Object), + 600, + ); + }); + + it('should not update cache when transaction not found', async () => { + mockRepository.findByExternalId.mockResolvedValue(null); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow(); + + expect(mockRedisService.set).not.toHaveBeenCalled(); + }); + }); + + describe('logging', () => { + it('should log APPROVED status update', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(mockLogger.log).toHaveBeenCalledWith(`Transaction approved: ${transactionId}`, undefined, { + transactionId, + status: TransactionStatus.APPROVED, + }); + }); + + it('should log REJECTED status update', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + await useCase.execute(transactionId, TransactionStatus.REJECTED); + + expect(mockLogger.log).toHaveBeenCalledWith(`Transaction rejected: ${transactionId}`, undefined, { + transactionId, + status: TransactionStatus.REJECTED, + }); + }); + }); + + describe('error handling', () => { + it('should propagate repository findByExternalId errors', async () => { + const error = new Error('Database connection error'); + mockRepository.findByExternalId.mockRejectedValue(error); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow( + 'Database connection error', + ); + }); + + it('should propagate repository update errors', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + const error = new Error('Update failed'); + mockRepository.update.mockRejectedValue(error); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow( + 'Update failed', + ); + }); + + it('should propagate Redis errors', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + mockRedisService.set.mockRejectedValue(new Error('Redis error')); + + await expect(useCase.execute(transactionId, TransactionStatus.APPROVED)).rejects.toThrow('Redis error'); + }); + }); + + describe('edge cases', () => { + it('should handle PENDING status (no-op)', async () => { + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.PENDING); + + expect(result.transactionStatus).toBe(TransactionStatus.PENDING); + expect(mockRepository.update).toHaveBeenCalled(); + }); + + it('should handle updating from APPROVED to REJECTED', async () => { + mockTransaction.transactionStatus = TransactionStatus.APPROVED; + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.REJECTED); + + expect(result.transactionStatus).toBe(TransactionStatus.REJECTED); + }); + + it('should handle updating from REJECTED to APPROVED', async () => { + mockTransaction.transactionStatus = TransactionStatus.REJECTED; + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(result.transactionStatus).toBe(TransactionStatus.APPROVED); + }); + + it('should handle idempotent APPROVED updates', async () => { + mockTransaction.transactionStatus = TransactionStatus.APPROVED; + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.APPROVED); + + expect(result.transactionStatus).toBe(TransactionStatus.APPROVED); + expect(mockRepository.update).toHaveBeenCalled(); + }); + + it('should handle idempotent REJECTED updates', async () => { + mockTransaction.transactionStatus = TransactionStatus.REJECTED; + mockRepository.findByExternalId.mockResolvedValue(mockTransaction); + mockRepository.update.mockResolvedValue(mockTransaction); + + const result = await useCase.execute(transactionId, TransactionStatus.REJECTED); + + expect(result.transactionStatus).toBe(TransactionStatus.REJECTED); + expect(mockRepository.update).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.ts b/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.ts new file mode 100644 index 0000000000..03b134fdeb --- /dev/null +++ b/apps/transaction-service/src/application/use-cases/update-transaction-status.use-case.ts @@ -0,0 +1,47 @@ +import { RedisService } from '@app/common'; +import { LoggerService } from '@app/observability'; +import type { Transaction } from '@domain/entities/transaction.entity'; +import { + type ITransactionRepository, + TRANSACTION_REPOSITORY, +} from '@domain/repositories/transaction.repository.interface'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; + +import type { IUpdateTransactionStatusUseCase } from '../../domain/ports/input/update-transaction-status.use-case.interface'; + +@Injectable() +export class UpdateTransactionStatusUseCase implements IUpdateTransactionStatusUseCase { + constructor( + @Inject(TRANSACTION_REPOSITORY) + private readonly transactionRepository: ITransactionRepository, + private readonly logger: LoggerService, + private readonly redisService: RedisService, + ) {} + + async execute(transactionExternalId: string, status: TransactionStatus): Promise { + const transaction = await this.transactionRepository.findByExternalId(transactionExternalId); + + if (!transaction) { + throw new NotFoundException(`Transaction with id ${transactionExternalId} not found`); + } + + if (status === TransactionStatus.APPROVED) { + transaction.approve(); + } else if (status === TransactionStatus.REJECTED) { + transaction.reject(); + } + + const updatedTransaction = await this.transactionRepository.update(transaction); + + const cacheKey = `transaction:${transactionExternalId}`; + await this.redisService.set(cacheKey, updatedTransaction, 600); + + this.logger.log(`Transaction ${status}: ${transactionExternalId}`, undefined, { + transactionId: transactionExternalId, + status, + }); + + return updatedTransaction; + } +} diff --git a/apps/transaction-service/src/config/instrument.ts b/apps/transaction-service/src/config/instrument.ts new file mode 100644 index 0000000000..c1eede980a --- /dev/null +++ b/apps/transaction-service/src/config/instrument.ts @@ -0,0 +1,30 @@ +require('dotenv').config(); + +import { initializeTelemetry } from '@app/observability'; + +initializeTelemetry({ + serviceName: 'transaction-service', + serviceVersion: '1.0.0', + otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318', + environment: process.env.NODE_ENV || 'development', + sampling: Number.parseFloat(process.env.OTEL_SAMPLING_RATIO || '1.0'), + enabled: process.env.OTEL_ENABLED !== 'false', +}); + +console.log('✅ OpenTelemetry initialized for transaction-service'); + +import * as Sentry from '@sentry/nestjs'; + +if (process.env.SENTRY_ENABLED === 'true') { + Sentry.init({ + dsn: + process.env.SENTRY_DSN || + 'https://355fd73ebe31d920ebd6c57263a8c28f@o4507779425435648.ingest.us.sentry.io/4510643730579456', + environment: process.env.NODE_ENV || 'development', + sendDefaultPii: true, + tracesSampleRate: 1, + integrations: [Sentry.captureConsoleIntegration()], + }); + + console.log('✅ Sentry initialized for transaction-service'); +} diff --git a/apps/transaction-service/src/domain/entities/transaction.entity.spec.ts b/apps/transaction-service/src/domain/entities/transaction.entity.spec.ts new file mode 100644 index 0000000000..35dedc68e9 --- /dev/null +++ b/apps/transaction-service/src/domain/entities/transaction.entity.spec.ts @@ -0,0 +1,178 @@ +import { TransactionStatus } from '../value-objects/transaction-status.vo'; +import { Transaction } from './transaction.entity'; + +describe('Transaction Entity', () => { + let transaction: Transaction; + + beforeEach(() => { + transaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + 'account-debit-123', + 'account-credit-456', + 1, + 500, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + }); + + describe('constructor', () => { + it('should create a transaction with all properties', () => { + expect(transaction.transactionExternalId).toBe('123e4567-e89b-12d3-a456-426614174000'); + expect(transaction.accountExternalIdDebit).toBe('account-debit-123'); + expect(transaction.accountExternalIdCredit).toBe('account-credit-456'); + expect(transaction.transferTypeId).toBe(1); + expect(transaction.value).toBe(500); + expect(transaction.transactionStatus).toBe(TransactionStatus.PENDING); + expect(transaction.createdAt).toEqual(new Date('2024-01-01T00:00:00Z')); + }); + + it('should set default createdAt to current date when not provided', () => { + const now = new Date(); + const txn = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + 'account-debit-123', + 'account-credit-456', + 1, + 500, + TransactionStatus.PENDING, + ); + + expect(txn.createdAt.getTime()).toBeGreaterThanOrEqual(now.getTime()); + }); + }); + + describe('approve', () => { + it('should change status to APPROVED', () => { + transaction.approve(); + expect(transaction.transactionStatus).toBe(TransactionStatus.APPROVED); + }); + + it('should allow approving from PENDING status', () => { + transaction.transactionStatus = TransactionStatus.PENDING; + transaction.approve(); + expect(transaction.transactionStatus).toBe(TransactionStatus.APPROVED); + }); + + it('should allow approving from REJECTED status', () => { + transaction.transactionStatus = TransactionStatus.REJECTED; + transaction.approve(); + expect(transaction.transactionStatus).toBe(TransactionStatus.APPROVED); + }); + }); + + describe('reject', () => { + it('should change status to REJECTED', () => { + transaction.reject(); + expect(transaction.transactionStatus).toBe(TransactionStatus.REJECTED); + }); + + it('should allow rejecting from PENDING status', () => { + transaction.transactionStatus = TransactionStatus.PENDING; + transaction.reject(); + expect(transaction.transactionStatus).toBe(TransactionStatus.REJECTED); + }); + + it('should allow rejecting from APPROVED status', () => { + transaction.transactionStatus = TransactionStatus.APPROVED; + transaction.reject(); + expect(transaction.transactionStatus).toBe(TransactionStatus.REJECTED); + }); + }); + + describe('isPending', () => { + it('should return true when status is PENDING', () => { + transaction.transactionStatus = TransactionStatus.PENDING; + expect(transaction.isPending()).toBe(true); + }); + + it('should return false when status is APPROVED', () => { + transaction.transactionStatus = TransactionStatus.APPROVED; + expect(transaction.isPending()).toBe(false); + }); + + it('should return false when status is REJECTED', () => { + transaction.transactionStatus = TransactionStatus.REJECTED; + expect(transaction.isPending()).toBe(false); + }); + }); + + describe('isApproved', () => { + it('should return true when status is APPROVED', () => { + transaction.transactionStatus = TransactionStatus.APPROVED; + expect(transaction.isApproved()).toBe(true); + }); + + it('should return false when status is PENDING', () => { + transaction.transactionStatus = TransactionStatus.PENDING; + expect(transaction.isApproved()).toBe(false); + }); + + it('should return false when status is REJECTED', () => { + transaction.transactionStatus = TransactionStatus.REJECTED; + expect(transaction.isApproved()).toBe(false); + }); + }); + + describe('isRejected', () => { + it('should return true when status is REJECTED', () => { + transaction.transactionStatus = TransactionStatus.REJECTED; + expect(transaction.isRejected()).toBe(true); + }); + + it('should return false when status is PENDING', () => { + transaction.transactionStatus = TransactionStatus.PENDING; + expect(transaction.isRejected()).toBe(false); + }); + + it('should return false when status is APPROVED', () => { + transaction.transactionStatus = TransactionStatus.APPROVED; + expect(transaction.isRejected()).toBe(false); + }); + }); + + describe('shouldBeRejected', () => { + it('should return true when value is greater than 1000', () => { + const highValueTxn = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + 'account-debit-123', + 'account-credit-456', + 1, + 1001, + TransactionStatus.PENDING, + ); + + expect(highValueTxn.shouldBeRejected()).toBe(true); + }); + + it('should return false when value equals 1000', () => { + const exactValueTxn = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + 'account-debit-123', + 'account-credit-456', + 1, + 1000, + TransactionStatus.PENDING, + ); + + expect(exactValueTxn.shouldBeRejected()).toBe(false); + }); + + it('should return false when value is less than 1000', () => { + expect(transaction.shouldBeRejected()).toBe(false); + }); + + it('should return false for zero value', () => { + const zeroValueTxn = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + 'account-debit-123', + 'account-credit-456', + 1, + 0, + TransactionStatus.PENDING, + ); + + expect(zeroValueTxn.shouldBeRejected()).toBe(false); + }); + }); +}); diff --git a/apps/transaction-service/src/domain/entities/transaction.entity.ts b/apps/transaction-service/src/domain/entities/transaction.entity.ts new file mode 100644 index 0000000000..a53055ae75 --- /dev/null +++ b/apps/transaction-service/src/domain/entities/transaction.entity.ts @@ -0,0 +1,37 @@ +import { TransactionStatus } from '../value-objects/transaction-status.vo'; + +export class Transaction { + constructor( + public readonly transactionExternalId: string, + public readonly accountExternalIdDebit: string, + public readonly accountExternalIdCredit: string, + public readonly transferTypeId: number, + public readonly value: number, + public transactionStatus: TransactionStatus, + public readonly createdAt: Date = new Date(), + ) {} + + approve(): void { + this.transactionStatus = TransactionStatus.APPROVED; + } + + reject(): void { + this.transactionStatus = TransactionStatus.REJECTED; + } + + isPending(): boolean { + return this.transactionStatus === TransactionStatus.PENDING; + } + + isApproved(): boolean { + return this.transactionStatus === TransactionStatus.APPROVED; + } + + isRejected(): boolean { + return this.transactionStatus === TransactionStatus.REJECTED; + } + + shouldBeRejected(): boolean { + return this.value > 1000; + } +} diff --git a/apps/transaction-service/src/domain/ports/input/create-transaction.use-case.interface.ts b/apps/transaction-service/src/domain/ports/input/create-transaction.use-case.interface.ts new file mode 100644 index 0000000000..45bda994ce --- /dev/null +++ b/apps/transaction-service/src/domain/ports/input/create-transaction.use-case.interface.ts @@ -0,0 +1,15 @@ +import type { RequestContext } from '@app/common'; +import type { Transaction } from '@domain/entities/transaction.entity'; + +export interface CreateTransactionDto { + accountExternalIdDebit: string; + accountExternalIdCredit: string; + tranferTypeId: number; + value: number; +} + +export interface ICreateTransactionUseCase { + execute(dto: CreateTransactionDto, context?: Partial): Promise; +} + +export const CREATE_TRANSACTION_USE_CASE = 'CREATE_TRANSACTION_USE_CASE'; diff --git a/apps/transaction-service/src/domain/ports/input/get-transaction.use-case.interface.ts b/apps/transaction-service/src/domain/ports/input/get-transaction.use-case.interface.ts new file mode 100644 index 0000000000..3bee7b12ca --- /dev/null +++ b/apps/transaction-service/src/domain/ports/input/get-transaction.use-case.interface.ts @@ -0,0 +1,8 @@ +import type { RequestContext } from '@app/common'; +import type { Transaction } from '@domain/entities/transaction.entity'; + +export interface IGetTransactionUseCase { + execute(transactionId: string, context?: Partial): Promise; +} + +export const GET_TRANSACTION_USE_CASE = 'GET_TRANSACTION_USE_CASE'; diff --git a/apps/transaction-service/src/domain/ports/input/update-transaction-status.use-case.interface.ts b/apps/transaction-service/src/domain/ports/input/update-transaction-status.use-case.interface.ts new file mode 100644 index 0000000000..d027ee04c1 --- /dev/null +++ b/apps/transaction-service/src/domain/ports/input/update-transaction-status.use-case.interface.ts @@ -0,0 +1,9 @@ +import type { RequestContext } from '@app/common'; +import type { Transaction } from '@domain/entities/transaction.entity'; +import type { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; + +export interface IUpdateTransactionStatusUseCase { + execute(transactionId: string, status: TransactionStatus, context?: Partial): Promise; +} + +export const UPDATE_TRANSACTION_STATUS_USE_CASE = 'UPDATE_TRANSACTION_STATUS_USE_CASE'; diff --git a/apps/transaction-service/src/domain/ports/output/event-publisher.interface.ts b/apps/transaction-service/src/domain/ports/output/event-publisher.interface.ts new file mode 100644 index 0000000000..8484355f06 --- /dev/null +++ b/apps/transaction-service/src/domain/ports/output/event-publisher.interface.ts @@ -0,0 +1,24 @@ +import type { RequestContext } from '@app/common'; +import type { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; + +export interface TransactionCreatedEvent { + transactionExternalId: string; + accountExternalIdDebit: string; + accountExternalIdCredit: string; + transferTypeId: number; + value: number; + transactionStatus: TransactionStatus; + createdAt: Date; +} + +export interface TransactionStatusUpdatedEvent { + transactionExternalId: string; + transactionStatus: TransactionStatus; +} + +export interface IEventPublisher { + publishTransactionCreated(event: TransactionCreatedEvent, context?: Partial): Promise; + publishTransactionStatusUpdated(event: TransactionStatusUpdatedEvent): Promise; +} + +export const EVENT_PUBLISHER = Symbol('EVENT_PUBLISHER'); diff --git a/apps/transaction-service/src/domain/repositories/transaction.repository.interface.ts b/apps/transaction-service/src/domain/repositories/transaction.repository.interface.ts new file mode 100644 index 0000000000..0c7b8d118a --- /dev/null +++ b/apps/transaction-service/src/domain/repositories/transaction.repository.interface.ts @@ -0,0 +1,9 @@ +import type { Transaction } from '../entities/transaction.entity'; + +export interface ITransactionRepository { + save(transaction: Transaction): Promise; + findByExternalId(externalId: string): Promise; + update(transaction: Transaction): Promise; +} + +export const TRANSACTION_REPOSITORY = Symbol('TRANSACTION_REPOSITORY'); diff --git a/apps/transaction-service/src/domain/value-objects/transaction-status.vo.spec.ts b/apps/transaction-service/src/domain/value-objects/transaction-status.vo.spec.ts new file mode 100644 index 0000000000..20f6599395 --- /dev/null +++ b/apps/transaction-service/src/domain/value-objects/transaction-status.vo.spec.ts @@ -0,0 +1,17 @@ +import { TransactionStatus } from './transaction-status.vo'; + +describe('TransactionStatus', () => { + it('should have correct status values', () => { + expect(TransactionStatus.PENDING).toBe('pending'); + expect(TransactionStatus.APPROVED).toBe('approved'); + expect(TransactionStatus.REJECTED).toBe('rejected'); + }); + + it('should export all required status values', () => { + const expectedStatuses = ['pending', 'approved', 'rejected']; + const actualStatuses = Object.values(TransactionStatus); + + expect(actualStatuses).toEqual(expect.arrayContaining(expectedStatuses)); + expect(actualStatuses.length).toBe(expectedStatuses.length); + }); +}); diff --git a/apps/transaction-service/src/domain/value-objects/transaction-status.vo.ts b/apps/transaction-service/src/domain/value-objects/transaction-status.vo.ts new file mode 100644 index 0000000000..1c3016ab55 --- /dev/null +++ b/apps/transaction-service/src/domain/value-objects/transaction-status.vo.ts @@ -0,0 +1,5 @@ +export enum TransactionStatus { + PENDING = 'pending', + APPROVED = 'approved', + REJECTED = 'rejected', +} diff --git a/apps/transaction-service/src/domain/value-objects/transaction-type.vo.spec.ts b/apps/transaction-service/src/domain/value-objects/transaction-type.vo.spec.ts new file mode 100644 index 0000000000..bfab788c32 --- /dev/null +++ b/apps/transaction-service/src/domain/value-objects/transaction-type.vo.spec.ts @@ -0,0 +1,42 @@ +import { TransactionType } from './transaction-type.vo'; + +describe('TransactionType', () => { + describe('create', () => { + it('should create a valid transaction type for TRANSFER', () => { + const transactionType = TransactionType.create(1); + + expect(transactionType.id).toBe(1); + expect(transactionType.name).toBe('Transfer'); + }); + + it('should create a valid transaction type for PAYMENT', () => { + const transactionType = TransactionType.create(2); + + expect(transactionType.id).toBe(2); + expect(transactionType.name).toBe('Payment'); + }); + + it('should create a valid transaction type for WITHDRAWAL', () => { + const transactionType = TransactionType.create(3); + + expect(transactionType.id).toBe(3); + expect(transactionType.name).toBe('Withdrawal'); + }); + + it('should return "Unknown" for invalid transaction type id', () => { + const transactionType = TransactionType.create(999); + + expect(transactionType.id).toBe(999); + expect(transactionType.name).toBe('Unknown'); + }); + }); + + describe('constructor', () => { + it('should create transaction type with provided values', () => { + const transactionType = new TransactionType(1, 'Test Type'); + + expect(transactionType.id).toBe(1); + expect(transactionType.name).toBe('Test Type'); + }); + }); +}); diff --git a/apps/transaction-service/src/domain/value-objects/transaction-type.vo.ts b/apps/transaction-service/src/domain/value-objects/transaction-type.vo.ts new file mode 100644 index 0000000000..49925316fa --- /dev/null +++ b/apps/transaction-service/src/domain/value-objects/transaction-type.vo.ts @@ -0,0 +1,16 @@ +export class TransactionType { + constructor( + public readonly id: number, + public readonly name: string, + ) {} + + static create(id: number): TransactionType { + const types: Record = { + 1: 'Transfer', + 2: 'Payment', + 3: 'Withdrawal', + }; + + return new TransactionType(id, types[id] || 'Unknown'); + } +} diff --git a/apps/transaction-service/src/infrastructure/database/database.module.ts b/apps/transaction-service/src/infrastructure/database/database.module.ts new file mode 100644 index 0000000000..72c0ec7a36 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/database/database.module.ts @@ -0,0 +1,24 @@ +import { Global, Module } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { createDrizzleClient, type DrizzleClient } from './drizzle.config'; + +export const DRIZZLE_CLIENT = Symbol('DRIZZLE_CLIENT'); + +@Global() +@Module({ + providers: [ + { + provide: DRIZZLE_CLIENT, + inject: [ConfigService], + useFactory: (configService: ConfigService): DrizzleClient => { + const connectionString = configService.get('DATABASE_URL'); + if (!connectionString) { + throw new Error('DATABASE_URL environment variable is required'); + } + return createDrizzleClient(connectionString); + }, + }, + ], + exports: [DRIZZLE_CLIENT], +}) +export class DatabaseModule {} diff --git a/apps/transaction-service/src/infrastructure/database/drizzle.config.ts b/apps/transaction-service/src/infrastructure/database/drizzle.config.ts new file mode 100644 index 0000000000..b03c8a45c0 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/database/drizzle.config.ts @@ -0,0 +1,10 @@ +import { drizzle } from 'drizzle-orm/postgres-js'; +import postgres from 'postgres'; +import * as schema from './schema'; + +export const createDrizzleClient = (connectionString: string) => { + const client = postgres(connectionString); + return drizzle(client, { schema }); +}; + +export type DrizzleClient = ReturnType; diff --git a/apps/transaction-service/src/infrastructure/database/schema.ts b/apps/transaction-service/src/infrastructure/database/schema.ts new file mode 100644 index 0000000000..3d666756ed --- /dev/null +++ b/apps/transaction-service/src/infrastructure/database/schema.ts @@ -0,0 +1,15 @@ +import { decimal, integer, pgTable, timestamp, uuid, varchar } from 'drizzle-orm/pg-core'; + +export const transactions = pgTable('transactions', { + id: uuid('id').primaryKey().defaultRandom(), + transactionExternalId: uuid('transaction_external_id').notNull().unique(), + accountExternalIdDebit: uuid('account_external_id_debit').notNull(), + accountExternalIdCredit: uuid('account_external_id_credit').notNull(), + transferTypeId: integer('transfer_type_id').notNull(), + value: decimal('value', { precision: 10, scale: 2 }).notNull(), + transactionStatus: varchar('transaction_status', { length: 20 }).notNull().default('pending'), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export type TransactionSchema = typeof transactions.$inferSelect; +export type NewTransactionSchema = typeof transactions.$inferInsert; diff --git a/apps/transaction-service/src/infrastructure/messaging/anti-fraud.service.ts b/apps/transaction-service/src/infrastructure/messaging/anti-fraud.service.ts new file mode 100644 index 0000000000..b7ee2b8341 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/anti-fraud.service.ts @@ -0,0 +1,78 @@ +import { Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import type { ConfigService } from '@nestjs/config'; +import { type Consumer, type EachMessagePayload, Kafka, type Producer } from 'kafkajs'; + +@Injectable() +export class AntiFraudService implements OnModuleInit, OnModuleDestroy { + private kafka: Kafka; + private consumer: Consumer; + private producer: Producer; + + constructor(private readonly configService: ConfigService) { + const kafkaBroker = this.configService.get('KAFKA_BROKER'); + if (!kafkaBroker) { + throw new Error('KAFKA_BROKER environment variable is required'); + } + this.kafka = new Kafka({ + clientId: 'anti-fraud-service', + brokers: [kafkaBroker], + }); + this.consumer = this.kafka.consumer({ + groupId: 'anti-fraud-service-group', + }); + this.producer = this.kafka.producer(); + } + + async onModuleInit() { + await this.consumer.connect(); + await this.producer.connect(); + + await this.consumer.subscribe({ + topics: ['transaction-created'], + fromBeginning: false, + }); + + await this.consumer.run({ + eachMessage: this.validateTransaction.bind(this), + }); + + console.log('Anti-Fraud Service started and listening for transactions'); + } + + async onModuleDestroy() { + await this.consumer.disconnect(); + await this.producer.disconnect(); + } + + private async validateTransaction(payload: EachMessagePayload) { + const { message } = payload; + if (!message.value) { + console.error('Received message with null value'); + return; + } + const transaction = JSON.parse(message.value.toString()); + + console.log('Anti-Fraud validating transaction:', transaction); + + const shouldReject = transaction.value > 1000; + + const resultTopic = shouldReject ? 'transaction-rejected' : 'transaction-approved'; + + await this.producer.send({ + topic: resultTopic, + messages: [ + { + key: transaction.transactionExternalId, + value: JSON.stringify({ + transactionExternalId: transaction.transactionExternalId, + reason: shouldReject ? 'Value exceeds maximum allowed (1000)' : 'Approved', + }), + }, + ], + }); + + console.log( + `Transaction ${transaction.transactionExternalId} ${shouldReject ? 'REJECTED' : 'APPROVED'} by Anti-Fraud`, + ); + } +} diff --git a/apps/transaction-service/src/infrastructure/messaging/kafka-consumer.service.ts b/apps/transaction-service/src/infrastructure/messaging/kafka-consumer.service.ts new file mode 100644 index 0000000000..0add0ebacc --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/kafka-consumer.service.ts @@ -0,0 +1,63 @@ +import type { UpdateTransactionStatusUseCase } from '@application/use-cases/update-transaction-status.use-case'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import type { ConfigService } from '@nestjs/config'; +import { type Consumer, type EachMessagePayload, Kafka } from 'kafkajs'; + +@Injectable() +export class KafkaConsumerService implements OnModuleInit, OnModuleDestroy { + private kafka: Kafka; + private consumer: Consumer; + + constructor( + private readonly configService: ConfigService, + private readonly updateTransactionStatusUseCase: UpdateTransactionStatusUseCase, + ) { + const kafkaBroker = this.configService.get('KAFKA_BROKER'); + if (!kafkaBroker) { + throw new Error('KAFKA_BROKER environment variable is required'); + } + this.kafka = new Kafka({ + clientId: 'transaction-service-consumer', + brokers: [kafkaBroker], + }); + this.consumer = this.kafka.consumer({ + groupId: 'transaction-service-group', + }); + } + + async onModuleInit() { + await this.consumer.connect(); + await this.consumer.subscribe({ + topics: ['transaction-approved', 'transaction-rejected'], + fromBeginning: false, + }); + + await this.consumer.run({ + eachMessage: this.handleMessage.bind(this), + }); + } + + async onModuleDestroy() { + await this.consumer.disconnect(); + } + + private async handleMessage(payload: EachMessagePayload) { + const { topic, message } = payload; + if (!message.value) { + console.error('Received message with null value'); + return; + } + const event = JSON.parse(message.value.toString()); + + console.log(`Received event from topic ${topic}:`, event); + + if (topic === 'transaction-approved') { + await this.updateTransactionStatusUseCase.execute(event.transactionExternalId, TransactionStatus.APPROVED); + console.log(`Transaction ${event.transactionExternalId} approved successfully`); + } else if (topic === 'transaction-rejected') { + await this.updateTransactionStatusUseCase.execute(event.transactionExternalId, TransactionStatus.REJECTED); + console.log(`Transaction ${event.transactionExternalId} rejected successfully`); + } + } +} diff --git a/apps/transaction-service/src/infrastructure/messaging/kafka-event-publisher.ts b/apps/transaction-service/src/infrastructure/messaging/kafka-event-publisher.ts new file mode 100644 index 0000000000..11ee04051c --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/kafka-event-publisher.ts @@ -0,0 +1,58 @@ +import { Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import type { ConfigService } from '@nestjs/config'; +import { Kafka, type Producer } from 'kafkajs'; +import type { + IEventPublisher, + TransactionCreatedEvent, + TransactionStatusUpdatedEvent, +} from '../../domain/ports/output/event-publisher.interface'; + +@Injectable() +export class KafkaEventPublisher implements IEventPublisher, OnModuleInit, OnModuleDestroy { + private kafka: Kafka; + private producer: Producer; + + constructor(private readonly configService: ConfigService) { + const kafkaBroker = this.configService.get('KAFKA_BROKER'); + if (!kafkaBroker) { + throw new Error('KAFKA_BROKER environment variable is required'); + } + this.kafka = new Kafka({ + clientId: 'transaction-service', + brokers: [kafkaBroker], + }); + this.producer = this.kafka.producer(); + } + + async onModuleInit() { + await this.producer.connect(); + } + + async onModuleDestroy() { + await this.producer.disconnect(); + } + + async publishTransactionCreated(event: TransactionCreatedEvent): Promise { + await this.producer.send({ + topic: 'transaction-created', + messages: [ + { + key: event.transactionExternalId, + value: JSON.stringify(event), + }, + ], + }); + } + + async publishTransactionStatusUpdated(event: TransactionStatusUpdatedEvent): Promise { + await this.producer.send({ + topic: 'transaction-status-updated', + messages: [ + { + key: event.transactionExternalId, + value: JSON.stringify(event), + }, + ], + }); + } +} diff --git a/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.spec.ts b/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.spec.ts new file mode 100644 index 0000000000..73c1df56eb --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.spec.ts @@ -0,0 +1,282 @@ +import type { KafkaProducerService, RequestContext } from '@app/common'; +import { KafkaTopics, TransactionStatus } from '@app/common'; +import type { + TransactionCreatedEvent, + TransactionStatusUpdatedEvent, +} from '../../domain/ports/output/event-publisher.interface'; +import { TransactionEventService } from './transaction-event.service'; + +jest.mock('node:crypto', () => ({ + randomUUID: jest.fn(() => 'mocked-uuid-12345'), +})); + +describe('TransactionEventService', () => { + let service: TransactionEventService; + let mockKafkaProducer: jest.Mocked; + let consoleLogSpy: jest.SpyInstance; + + beforeEach(() => { + mockKafkaProducer = { + sendMessage: jest.fn().mockResolvedValue(undefined), + } as any; + + service = new TransactionEventService(mockKafkaProducer); + consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(); + }); + + afterEach(() => { + jest.clearAllMocks(); + consoleLogSpy.mockRestore(); + }); + + describe('publishTransactionCreated', () => { + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: 500.5, + transactionStatus: TransactionStatus.PENDING, + createdAt: new Date('2024-01-01T10:00:00Z'), + }; + + it('should publish transaction created event to Kafka', async () => { + await service.publishTransactionCreated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledTimes(1); + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_CREATED, + 'txn-123', + expect.objectContaining({ + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: 500.5, + transactionStatus: TransactionStatus.PENDING, + }), + ); + }); + + it('should convert createdAt Date to ISO string', async () => { + await service.publishTransactionCreated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_CREATED, + 'txn-123', + expect.objectContaining({ + createdAt: '2024-01-01T10:00:00.000Z', + }), + ); + }); + + it('should include event metadata with correlationId from context', async () => { + const context: Partial = { + correlationId: 'correlation-123', + requestId: 'request-456', + }; + + await service.publishTransactionCreated(event, context); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_CREATED, + 'txn-123', + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'correlation-123', + causationId: 'request-456', + service: 'TransactionService', + version: '1.0.0', + }), + }), + ); + }); + + it('should generate UUID for correlationId when context not provided', async () => { + await service.publishTransactionCreated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_CREATED, + 'txn-123', + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'mocked-uuid-12345', + causationId: 'mocked-uuid-12345', + }), + }), + ); + }); + + it('should include timestamp in metadata', async () => { + await service.publishTransactionCreated(event); + + const calls = mockKafkaProducer.sendMessage.mock.calls[0]; + const kafkaEvent = calls[2] as any; + + expect(kafkaEvent.metadata.timestamp).toBeDefined(); + expect(typeof kafkaEvent.metadata.timestamp).toBe('string'); + }); + + it('should log published event', async () => { + const context: Partial = { + correlationId: 'test-correlation', + }; + + await service.publishTransactionCreated(event, context); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('📤 Published transaction-created')); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('txn-123')); + }); + + it('should handle partial context', async () => { + const context: Partial = { + correlationId: 'correlation-only', + }; + + await service.publishTransactionCreated(event, context); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'correlation-only', + causationId: 'mocked-uuid-12345', + }), + }), + ); + }); + }); + + describe('publishTransactionStatusUpdated', () => { + it('should publish to TRANSACTION_APPROVED topic when status is approved', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-456', + transactionStatus: TransactionStatus.APPROVED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_APPROVED, + 'txn-456', + expect.objectContaining({ + transactionExternalId: 'txn-456', + transactionStatus: TransactionStatus.APPROVED, + }), + ); + }); + + it('should publish to TRANSACTION_REJECTED topic when status is rejected', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-789', + transactionStatus: TransactionStatus.REJECTED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_REJECTED, + 'txn-789', + expect.objectContaining({ + transactionExternalId: 'txn-789', + transactionStatus: TransactionStatus.REJECTED, + }), + ); + }); + + it('should include metadata for approved status', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-approved', + transactionStatus: TransactionStatus.APPROVED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + correlationId: 'mocked-uuid-12345', + causationId: 'mocked-uuid-12345', + service: 'TransactionService', + version: '1.0.0', + }), + }), + ); + }); + + it('should include metadata for rejected status', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-rejected', + transactionStatus: TransactionStatus.REJECTED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(mockKafkaProducer.sendMessage).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + expect.objectContaining({ + metadata: expect.objectContaining({ + timestamp: expect.any(String), + }), + }), + ); + }); + + it('should log published approved event', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-log-test', + transactionStatus: TransactionStatus.APPROVED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('📤 Published')); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('txn-log-test')); + }); + + it('should log published rejected event', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-log-reject', + transactionStatus: TransactionStatus.REJECTED, + }; + + await service.publishTransactionStatusUpdated(event); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('📤 Published')); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('txn-log-reject')); + }); + }); + + describe('error handling', () => { + it('should propagate Kafka producer errors for transaction created', async () => { + const event: TransactionCreatedEvent = { + transactionExternalId: 'txn-error', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: 100, + transactionStatus: TransactionStatus.PENDING, + createdAt: new Date(), + }; + + mockKafkaProducer.sendMessage.mockRejectedValue(new Error('Kafka connection error')); + + await expect(service.publishTransactionCreated(event)).rejects.toThrow('Kafka connection error'); + }); + + it('should propagate Kafka producer errors for status updated', async () => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-error-status', + transactionStatus: TransactionStatus.APPROVED, + }; + + mockKafkaProducer.sendMessage.mockRejectedValue(new Error('Kafka timeout')); + + await expect(service.publishTransactionStatusUpdated(event)).rejects.toThrow('Kafka timeout'); + }); + }); +}); diff --git a/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.ts b/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.ts new file mode 100644 index 0000000000..39e5cff182 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/transaction-event.service.ts @@ -0,0 +1,63 @@ +import { randomUUID } from 'node:crypto'; +import { + type EventMetadata, + KafkaProducerService, + KafkaTopics, + type TransactionCreatedEvent as KafkaTransactionCreatedEvent, + type TransactionStatusUpdatedEvent as KafkaTransactionStatusUpdatedEvent, + type RequestContext, +} from '@app/common'; +import { Injectable } from '@nestjs/common'; +import type { + IEventPublisher, + TransactionCreatedEvent, + TransactionStatusUpdatedEvent, +} from '../../domain/ports/output/event-publisher.interface'; + +@Injectable() +export class TransactionEventService implements IEventPublisher { + constructor(private readonly kafkaProducer: KafkaProducerService) {} + + async publishTransactionCreated(event: TransactionCreatedEvent, context?: Partial): Promise { + const metadata: EventMetadata = { + correlationId: context?.correlationId || randomUUID(), + causationId: context?.requestId || randomUUID(), + timestamp: new Date().toISOString(), + service: 'TransactionService', + version: '1.0.0', + }; + + const kafkaEvent: KafkaTransactionCreatedEvent = { + ...event, + createdAt: event.createdAt.toISOString(), + metadata, + }; + + await this.kafkaProducer.sendMessage(KafkaTopics.TRANSACTION_CREATED, event.transactionExternalId, kafkaEvent); + console.log( + `📤 Published transaction-created: ${event.transactionExternalId} [correlationId: ${metadata.correlationId}]`, + ); + } + + async publishTransactionStatusUpdated(event: TransactionStatusUpdatedEvent): Promise { + const topic = + event.transactionStatus === 'approved' + ? KafkaTopics.TRANSACTION_APPROVED + : KafkaTopics.TRANSACTION_REJECTED; + + const kafkaEvent: KafkaTransactionStatusUpdatedEvent = { + ...event, + transactionStatus: event.transactionStatus as 'approved' | 'rejected', + metadata: { + correlationId: randomUUID(), + causationId: randomUUID(), + timestamp: new Date().toISOString(), + service: 'TransactionService', + version: '1.0.0', + }, + }; + + await this.kafkaProducer.sendMessage(topic, event.transactionExternalId, kafkaEvent); + console.log(`📤 Published ${topic}: ${event.transactionExternalId}`); + } +} diff --git a/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.spec.ts b/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.spec.ts new file mode 100644 index 0000000000..8d2d7c2139 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.spec.ts @@ -0,0 +1,486 @@ +import type { KafkaConsumerService, TransactionStatusUpdatedEvent } from '@app/common'; +import { KafkaTopics, TransactionStatus } from '@app/common'; +import type { LoggerService } from '@app/observability'; +import type { EachMessagePayload } from 'kafkajs'; +import type { IUpdateTransactionStatusUseCase } from '../../domain/ports/input/update-transaction-status.use-case.interface'; +import { TransactionStatusConsumer } from './transaction-status.consumer'; + +describe('TransactionStatusConsumer', () => { + let consumer: TransactionStatusConsumer; + let mockKafkaConsumer: jest.Mocked; + let mockUpdateUseCase: jest.Mocked; + let mockLogger: jest.Mocked; + let consoleErrorSpy: jest.SpyInstance; + + beforeEach(() => { + mockKafkaConsumer = { + registerHandler: jest.fn(), + subscribeAndRun: jest.fn().mockResolvedValue(undefined), + } as any; + + mockUpdateUseCase = { + execute: jest.fn().mockResolvedValue(undefined), + } as jest.Mocked; + + mockLogger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + verbose: jest.fn(), + } as unknown as jest.Mocked; + + consumer = new TransactionStatusConsumer(mockKafkaConsumer, mockUpdateUseCase, mockLogger); + consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); + }); + + afterEach(() => { + jest.clearAllMocks(); + consoleErrorSpy.mockRestore(); + }); + + describe('onModuleInit', () => { + it('should register handlers for approved and rejected topics', async () => { + await consumer.onModuleInit(); + + expect(mockKafkaConsumer.registerHandler).toHaveBeenCalledTimes(2); + expect(mockKafkaConsumer.registerHandler).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_APPROVED, + expect.any(Function), + ); + expect(mockKafkaConsumer.registerHandler).toHaveBeenCalledWith( + KafkaTopics.TRANSACTION_REJECTED, + expect.any(Function), + ); + }); + + it('should subscribe to approved and rejected topics', async () => { + await consumer.onModuleInit(); + + expect(mockKafkaConsumer.subscribeAndRun).toHaveBeenCalledWith([ + KafkaTopics.TRANSACTION_APPROVED, + KafkaTopics.TRANSACTION_REJECTED, + ]); + }); + + it('should subscribe to topics after registering handlers', async () => { + const callOrder: string[] = []; + + mockKafkaConsumer.registerHandler.mockImplementation(() => { + callOrder.push('registerHandler'); + }); + + mockKafkaConsumer.subscribeAndRun.mockImplementation(async () => { + callOrder.push('subscribeAndRun'); + }); + + await consumer.onModuleInit(); + + expect(callOrder).toEqual(['registerHandler', 'registerHandler', 'subscribeAndRun']); + }); + }); + + describe('handleApproved', () => { + const createApprovedPayload = (transactionId: string, correlationId: string): EachMessagePayload => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: transactionId, + transactionStatus: TransactionStatus.APPROVED, + metadata: { + correlationId, + causationId: 'causation-123', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + version: '1.0.0', + }, + }; + + return { + topic: KafkaTopics.TRANSACTION_APPROVED, + partition: 0, + message: { + key: Buffer.from(transactionId), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + }; + + it('should process approved transaction event', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + expect(registeredHandler).toBeDefined(); + + const payload = createApprovedPayload('txn-123', 'correlation-123'); + await registeredHandler?.(payload); + + expect(mockUpdateUseCase.execute).toHaveBeenCalledWith('txn-123', TransactionStatus.APPROVED); + }); + + it('should log received approved event', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const payload = createApprovedPayload('txn-456', 'correlation-456'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith('Received transaction-approved: txn-456', { + correlationId: 'correlation-456', + requestId: 'causation-123', + }); + }); + + it('should log successful update after approval', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const payload = createApprovedPayload('txn-789', 'correlation-789'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith('Transaction txn-789 marked as approved', { + correlationId: 'correlation-789', + requestId: 'causation-123', + }); + }); + + it('should extract context from event metadata', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const payload = createApprovedPayload('txn-context', 'context-correlation'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith( + expect.any(String), + expect.objectContaining({ + correlationId: 'context-correlation', + requestId: 'causation-123', + }), + ); + }); + + it('should handle null message value', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_APPROVED, + partition: 0, + message: { + key: Buffer.from('txn-null'), + value: null as any, + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler?.(payload); + + expect(consoleErrorSpy).toHaveBeenCalledWith('Received message with null value'); + expect(mockUpdateUseCase.execute).not.toHaveBeenCalled(); + }); + + it('should parse JSON message correctly', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-parse', + transactionStatus: TransactionStatus.APPROVED, + metadata: { + correlationId: 'parse-correlation', + causationId: 'parse-causation', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + }, + }; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_APPROVED, + partition: 0, + message: { + key: Buffer.from('txn-parse'), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler?.(payload); + + expect(mockUpdateUseCase.execute).toHaveBeenCalledWith('txn-parse', TransactionStatus.APPROVED); + }); + }); + + describe('handleRejected', () => { + const createRejectedPayload = (transactionId: string, correlationId: string): EachMessagePayload => { + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: transactionId, + transactionStatus: TransactionStatus.REJECTED, + metadata: { + correlationId, + causationId: 'causation-456', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + version: '1.0.0', + }, + }; + + return { + topic: KafkaTopics.TRANSACTION_REJECTED, + partition: 0, + message: { + key: Buffer.from(transactionId), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + }; + + it('should process rejected transaction event', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + expect(registeredHandler).toBeDefined(); + + const payload = createRejectedPayload('txn-rejected-1', 'correlation-rejected'); + await registeredHandler?.(payload); + + expect(mockUpdateUseCase.execute).toHaveBeenCalledWith('txn-rejected-1', TransactionStatus.REJECTED); + }); + + it('should log received rejected event', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const payload = createRejectedPayload('txn-rejected-2', 'correlation-reject-2'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith('Received transaction-rejected: txn-rejected-2', { + correlationId: 'correlation-reject-2', + requestId: 'causation-456', + }); + }); + + it('should log successful update after rejection', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const payload = createRejectedPayload('txn-rejected-3', 'correlation-reject-3'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith('Transaction txn-rejected-3 marked as rejected', { + correlationId: 'correlation-reject-3', + requestId: 'causation-456', + }); + }); + + it('should extract context from event metadata', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const payload = createRejectedPayload('txn-reject-context', 'reject-correlation'); + await registeredHandler?.(payload); + + expect(mockLogger.log).toHaveBeenCalledWith( + expect.any(String), + expect.objectContaining({ + correlationId: 'reject-correlation', + requestId: 'causation-456', + }), + ); + }); + + it('should handle null message value', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_REJECTED, + partition: 0, + message: { + key: Buffer.from('txn-null-reject'), + value: null as any, + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler?.(payload); + + expect(consoleErrorSpy).toHaveBeenCalledWith('Received message with null value'); + expect(mockUpdateUseCase.execute).not.toHaveBeenCalled(); + }); + + it('should parse JSON message correctly', async () => { + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-parse-reject', + transactionStatus: TransactionStatus.REJECTED, + metadata: { + correlationId: 'parse-reject-correlation', + causationId: 'parse-reject-causation', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + }, + }; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_REJECTED, + partition: 0, + message: { + key: Buffer.from('txn-parse-reject'), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await registeredHandler?.(payload); + + expect(mockUpdateUseCase.execute).toHaveBeenCalledWith('txn-parse-reject', TransactionStatus.REJECTED); + }); + }); + + describe('error propagation', () => { + it('should propagate use case errors for approved transactions', async () => { + mockUpdateUseCase.execute.mockRejectedValue(new Error('Database error')); + + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_APPROVED, + )?.[1]; + + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-error', + transactionStatus: TransactionStatus.APPROVED, + metadata: { + correlationId: 'error-correlation', + causationId: 'error-causation', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + }, + }; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_APPROVED, + partition: 0, + message: { + key: Buffer.from('txn-error'), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await expect(registeredHandler?.(payload)).rejects.toThrow('Database error'); + }); + + it('should propagate use case errors for rejected transactions', async () => { + mockUpdateUseCase.execute.mockRejectedValue(new Error('Repository error')); + + await consumer.onModuleInit(); + + const registeredHandler = mockKafkaConsumer.registerHandler.mock.calls.find( + (call) => call[0] === KafkaTopics.TRANSACTION_REJECTED, + )?.[1]; + + const event: TransactionStatusUpdatedEvent = { + transactionExternalId: 'txn-error-reject', + transactionStatus: TransactionStatus.REJECTED, + metadata: { + correlationId: 'error-reject-correlation', + causationId: 'error-reject-causation', + timestamp: new Date().toISOString(), + service: 'AntiFraudService', + }, + }; + + const payload: EachMessagePayload = { + topic: KafkaTopics.TRANSACTION_REJECTED, + partition: 0, + message: { + key: Buffer.from('txn-error-reject'), + value: Buffer.from(JSON.stringify(event)), + timestamp: '1234567890', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await expect(registeredHandler?.(payload)).rejects.toThrow('Repository error'); + }); + }); +}); diff --git a/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.ts b/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.ts new file mode 100644 index 0000000000..681fc449f0 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/messaging/transaction-status.consumer.ts @@ -0,0 +1,64 @@ +import { KafkaConsumerService, KafkaTopics, TransactionStatus, type TransactionStatusUpdatedEvent } from '@app/common'; +import { LoggerService } from '@app/observability'; +import { Inject, Injectable, type OnModuleInit } from '@nestjs/common'; +import type { EachMessagePayload } from 'kafkajs'; +import { + type IUpdateTransactionStatusUseCase, + UPDATE_TRANSACTION_STATUS_USE_CASE, +} from '../../domain/ports/input/update-transaction-status.use-case.interface'; + +@Injectable() +export class TransactionStatusConsumer implements OnModuleInit { + constructor( + private readonly kafkaConsumer: KafkaConsumerService, + @Inject(UPDATE_TRANSACTION_STATUS_USE_CASE) + private readonly updateTransactionStatusUseCase: IUpdateTransactionStatusUseCase, + private readonly logger: LoggerService, + ) {} + + async onModuleInit() { + this.kafkaConsumer.registerHandler(KafkaTopics.TRANSACTION_APPROVED, this.handleApproved.bind(this)); + + this.kafkaConsumer.registerHandler(KafkaTopics.TRANSACTION_REJECTED, this.handleRejected.bind(this)); + + await this.kafkaConsumer.subscribeAndRun([KafkaTopics.TRANSACTION_APPROVED, KafkaTopics.TRANSACTION_REJECTED]); + } + + private async handleApproved(payload: EachMessagePayload): Promise { + if (!payload.message.value) { + console.error('Received message with null value'); + return; + } + const event: TransactionStatusUpdatedEvent = JSON.parse(payload.message.value.toString()); + + const requestContext = { + correlationId: event.metadata.correlationId, + requestId: event.metadata.causationId, + }; + + this.logger.log(`Received transaction-approved: ${event.transactionExternalId}`, requestContext); + + await this.updateTransactionStatusUseCase.execute(event.transactionExternalId, TransactionStatus.APPROVED); + + this.logger.log(`Transaction ${event.transactionExternalId} marked as approved`, requestContext); + } + + private async handleRejected(payload: EachMessagePayload): Promise { + if (!payload.message.value) { + console.error('Received message with null value'); + return; + } + const event: TransactionStatusUpdatedEvent = JSON.parse(payload.message.value.toString()); + + const requestContext = { + correlationId: event.metadata.correlationId, + requestId: event.metadata.causationId, + }; + + this.logger.log(`Received transaction-rejected: ${event.transactionExternalId}`, requestContext); + + await this.updateTransactionStatusUseCase.execute(event.transactionExternalId, TransactionStatus.REJECTED); + + this.logger.log(`Transaction ${event.transactionExternalId} marked as rejected`, requestContext); + } +} diff --git a/apps/transaction-service/src/infrastructure/repositories/transaction.repository.spec.ts b/apps/transaction-service/src/infrastructure/repositories/transaction.repository.spec.ts new file mode 100644 index 0000000000..f17bb20e55 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/repositories/transaction.repository.spec.ts @@ -0,0 +1,365 @@ +import type { DrizzleClient } from '@app/common'; +import { Transaction } from '@domain/entities/transaction.entity'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { TransactionRepository } from './transaction.repository'; + +describe('TransactionRepository', () => { + let repository: TransactionRepository; + let mockDb: jest.Mocked; + + beforeEach(() => { + const mockReturning = jest.fn(); + const mockWhere = jest + .fn() + .mockReturnValue({ returning: mockReturning, limit: jest.fn().mockResolvedValue([]) }); + const mockSet = jest.fn().mockReturnValue({ where: mockWhere }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + const mockValues = jest.fn().mockReturnValue({ returning: mockReturning }); + + mockDb = { + insert: jest.fn().mockReturnValue({ values: mockValues }), + select: jest.fn().mockReturnValue({ from: mockFrom }), + update: jest.fn().mockReturnValue({ set: mockSet }), + } as any; + + repository = new TransactionRepository(mockDb); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('save', () => { + it('should save a transaction and return the saved entity', async () => { + const transaction = new Transaction( + 'txn-123', + 'debit-account-123', + 'credit-account-456', + 1, + 500.5, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + + const dbResult = { + id: 1, + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: '500.50', + transactionStatus: 'pending', + createdAt: new Date('2024-01-01T00:00:00Z'), + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockValues = jest.fn().mockReturnValue({ returning: mockReturning }); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + const result = await repository.save(transaction); + + expect(mockDb.insert).toHaveBeenCalled(); + expect(mockValues).toHaveBeenCalledWith({ + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: '500.5', + transactionStatus: 'pending', + createdAt: transaction.createdAt, + }); + expect(result).toBeInstanceOf(Transaction); + expect(result.transactionExternalId).toBe('txn-123'); + expect(result.value).toBe(500.5); + }); + + it('should convert number value to string for database', async () => { + const transaction = new Transaction( + 'txn-456', + 'debit-account', + 'credit-account', + 2, + 1000, + TransactionStatus.PENDING, + new Date(), + ); + + const dbResult = { + transactionExternalId: 'txn-456', + accountExternalIdDebit: 'debit-account', + accountExternalIdCredit: 'credit-account', + transferTypeId: 2, + value: '1000', + transactionStatus: 'pending', + createdAt: new Date(), + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockValues = jest.fn().mockReturnValue({ returning: mockReturning }); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + await repository.save(transaction); + + expect(mockValues).toHaveBeenCalledWith( + expect.objectContaining({ + value: '1000', + }), + ); + }); + + it('should handle decimal values correctly', async () => { + const transaction = new Transaction( + 'txn-789', + 'debit-account', + 'credit-account', + 1, + 123.45, + TransactionStatus.PENDING, + new Date(), + ); + + const dbResult = { + transactionExternalId: 'txn-789', + accountExternalIdDebit: 'debit-account', + accountExternalIdCredit: 'credit-account', + transferTypeId: 1, + value: '123.45', + transactionStatus: 'pending', + createdAt: new Date(), + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockValues = jest.fn().mockReturnValue({ returning: mockReturning }); + mockDb.insert = jest.fn().mockReturnValue({ values: mockValues }); + + const result = await repository.save(transaction); + + expect(result.value).toBe(123.45); + }); + }); + + describe('findByExternalId', () => { + it('should find and return a transaction by external ID', async () => { + const dbResult = { + id: 1, + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: '750.25', + transactionStatus: 'approved', + createdAt: new Date('2024-01-01T00:00:00Z'), + }; + + const mockLimit = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ limit: mockLimit }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findByExternalId('txn-123'); + + expect(mockDb.select).toHaveBeenCalled(); + expect(mockFrom).toHaveBeenCalled(); + expect(mockWhere).toHaveBeenCalled(); + expect(mockLimit).toHaveBeenCalledWith(1); + expect(result).toBeInstanceOf(Transaction); + expect(result?.transactionExternalId).toBe('txn-123'); + expect(result?.transactionStatus).toBe('approved'); + expect(result?.value).toBe(750.25); + }); + + it('should return null when transaction not found', async () => { + const mockLimit = jest.fn().mockResolvedValue([]); + const mockWhere = jest.fn().mockReturnValue({ limit: mockLimit }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findByExternalId('non-existent-id'); + + expect(result).toBeNull(); + }); + + it('should parse string value to float', async () => { + const dbResult = { + transactionExternalId: 'txn-999', + accountExternalIdDebit: 'debit-account', + accountExternalIdCredit: 'credit-account', + transferTypeId: 3, + value: '999.99', + transactionStatus: 'pending', + createdAt: new Date(), + }; + + const mockLimit = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ limit: mockLimit }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findByExternalId('txn-999'); + + expect(result?.value).toBe(999.99); + expect(typeof result?.value).toBe('number'); + }); + }); + + describe('update', () => { + it('should update transaction status and return updated entity', async () => { + const transaction = new Transaction( + 'txn-123', + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.APPROVED, + new Date('2024-01-01T00:00:00Z'), + ); + + const dbResult = { + transactionExternalId: 'txn-123', + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + transferTypeId: 1, + value: '500', + transactionStatus: 'approved', + createdAt: new Date('2024-01-01T00:00:00Z'), + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ returning: mockReturning }); + const mockSet = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.update = jest.fn().mockReturnValue({ set: mockSet }); + + const result = await repository.update(transaction); + + expect(mockDb.update).toHaveBeenCalled(); + expect(mockSet).toHaveBeenCalledWith({ + transactionStatus: 'approved', + }); + expect(mockWhere).toHaveBeenCalled(); + expect(result).toBeInstanceOf(Transaction); + expect(result.transactionStatus).toBe('approved'); + }); + + it('should update to REJECTED status', async () => { + const transaction = new Transaction( + 'txn-456', + 'debit-account', + 'credit-account', + 2, + 1500, + TransactionStatus.REJECTED, + new Date(), + ); + + const dbResult = { + transactionExternalId: 'txn-456', + accountExternalIdDebit: 'debit-account', + accountExternalIdCredit: 'credit-account', + transferTypeId: 2, + value: '1500', + transactionStatus: 'rejected', + createdAt: new Date(), + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ returning: mockReturning }); + const mockSet = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.update = jest.fn().mockReturnValue({ set: mockSet }); + + const result = await repository.update(transaction); + + expect(mockSet).toHaveBeenCalledWith({ + transactionStatus: 'rejected', + }); + expect(result.transactionStatus).toBe('rejected'); + }); + + it('should preserve other fields during update', async () => { + const originalDate = new Date('2024-01-01T00:00:00Z'); + const transaction = new Transaction( + 'txn-789', + 'debit-original', + 'credit-original', + 1, + 250.75, + TransactionStatus.APPROVED, + originalDate, + ); + + const dbResult = { + transactionExternalId: 'txn-789', + accountExternalIdDebit: 'debit-original', + accountExternalIdCredit: 'credit-original', + transferTypeId: 1, + value: '250.75', + transactionStatus: 'approved', + createdAt: originalDate, + }; + + const mockReturning = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ returning: mockReturning }); + const mockSet = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.update = jest.fn().mockReturnValue({ set: mockSet }); + + const result = await repository.update(transaction); + + expect(result.transactionExternalId).toBe('txn-789'); + expect(result.accountExternalIdDebit).toBe('debit-original'); + expect(result.accountExternalIdCredit).toBe('credit-original'); + expect(result.value).toBe(250.75); + expect(result.createdAt).toEqual(originalDate); + }); + }); + + describe('mapToDomain', () => { + it('should map all transaction statuses correctly', async () => { + const statuses = [TransactionStatus.PENDING, TransactionStatus.APPROVED, TransactionStatus.REJECTED]; + + for (const status of statuses) { + const dbResult = { + transactionExternalId: 'txn-test', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: 1, + value: '100', + transactionStatus: status, + createdAt: new Date(), + }; + + const mockLimit = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ limit: mockLimit }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findByExternalId('txn-test'); + + expect(result?.transactionStatus).toBe(status); + } + }); + + it('should handle all transfer type IDs', async () => { + const transferTypes = [1, 2, 3]; + + for (const typeId of transferTypes) { + const dbResult = { + transactionExternalId: 'txn-test', + accountExternalIdDebit: 'debit', + accountExternalIdCredit: 'credit', + transferTypeId: typeId, + value: '100', + transactionStatus: 'pending', + createdAt: new Date(), + }; + + const mockLimit = jest.fn().mockResolvedValue([dbResult]); + const mockWhere = jest.fn().mockReturnValue({ limit: mockLimit }); + const mockFrom = jest.fn().mockReturnValue({ where: mockWhere }); + mockDb.select = jest.fn().mockReturnValue({ from: mockFrom }); + + const result = await repository.findByExternalId('txn-test'); + + expect(result?.transferTypeId).toBe(typeId); + } + }); + }); +}); diff --git a/apps/transaction-service/src/infrastructure/repositories/transaction.repository.ts b/apps/transaction-service/src/infrastructure/repositories/transaction.repository.ts new file mode 100644 index 0000000000..44230bb449 --- /dev/null +++ b/apps/transaction-service/src/infrastructure/repositories/transaction.repository.ts @@ -0,0 +1,70 @@ +import { DRIZZLE_CLIENT, type DrizzleClient } from '@app/common'; +import { Transaction } from '@domain/entities/transaction.entity'; +import type { ITransactionRepository } from '@domain/repositories/transaction.repository.interface'; +import type { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { Inject, Injectable } from '@nestjs/common'; +import { eq } from 'drizzle-orm'; +import { transactions } from '../database/schema'; + +@Injectable() +export class TransactionRepository implements ITransactionRepository { + constructor( + @Inject(DRIZZLE_CLIENT) + private readonly db: DrizzleClient, + ) {} + + async save(transaction: Transaction): Promise { + const [result] = await this.db + .insert(transactions) + .values({ + transactionExternalId: transaction.transactionExternalId, + accountExternalIdDebit: transaction.accountExternalIdDebit, + accountExternalIdCredit: transaction.accountExternalIdCredit, + transferTypeId: transaction.transferTypeId, + value: transaction.value.toString(), + transactionStatus: transaction.transactionStatus, + createdAt: transaction.createdAt, + }) + .returning(); + + return this.mapToDomain(result); + } + + async findByExternalId(externalId: string): Promise { + const [result] = await this.db + .select() + .from(transactions) + .where(eq(transactions.transactionExternalId, externalId)) + .limit(1); + + if (!result) { + return null; + } + + return this.mapToDomain(result); + } + + async update(transaction: Transaction): Promise { + const [result] = await this.db + .update(transactions) + .set({ + transactionStatus: transaction.transactionStatus, + }) + .where(eq(transactions.transactionExternalId, transaction.transactionExternalId)) + .returning(); + + return this.mapToDomain(result); + } + + private mapToDomain(data: any): Transaction { + return new Transaction( + data.transactionExternalId, + data.accountExternalIdDebit, + data.accountExternalIdCredit, + data.transferTypeId, + parseFloat(data.value), + data.transactionStatus as TransactionStatus, + data.createdAt, + ); + } +} diff --git a/apps/transaction-service/src/main.ts b/apps/transaction-service/src/main.ts new file mode 100644 index 0000000000..7163fb8723 --- /dev/null +++ b/apps/transaction-service/src/main.ts @@ -0,0 +1,46 @@ +import 'reflect-metadata'; +import './config/instrument'; +import { CorrelationIdInterceptor } from '@app/common'; +import { HttpLoggerInterceptor, PinoLoggerService, shutdownTelemetry } from '@app/observability'; +import { ValidationPipe } from '@nestjs/common'; +import { NestFactory } from '@nestjs/core'; +import { TransactionModule } from './transaction.module'; + +async function bootstrap() { + const app = await NestFactory.create(TransactionModule, { + bufferLogs: true, + }); + + const logger = app.get(PinoLoggerService); + app.useLogger(logger); + app.useGlobalInterceptors(new CorrelationIdInterceptor()); + app.useGlobalInterceptors(new HttpLoggerInterceptor(logger)); + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + }), + ); + app.enableCors(); + const port = process.env.PORT || 3000; + await app.listen(port); + logger.log(`🚀 Transaction Service running on http://localhost:${port}`, { + port, + environment: process.env.NODE_ENV, + }); + process.on('SIGTERM', async () => { + logger.log('SIGTERM signal received: closing HTTP server'); + await app.close(); + await shutdownTelemetry(); + process.exit(0); + }); + process.on('SIGINT', async () => { + logger.log('SIGINT signal received: closing HTTP server'); + await app.close(); + await shutdownTelemetry(); + process.exit(0); + }); +} + +bootstrap(); diff --git a/apps/transaction-service/src/presentation/controllers/transaction.controller.spec.ts b/apps/transaction-service/src/presentation/controllers/transaction.controller.spec.ts new file mode 100644 index 0000000000..a165c1885e --- /dev/null +++ b/apps/transaction-service/src/presentation/controllers/transaction.controller.spec.ts @@ -0,0 +1,364 @@ +import type { LoggerService } from '@app/observability'; +import { Transaction } from '@domain/entities/transaction.entity'; +import { TransactionStatus } from '@domain/value-objects/transaction-status.vo'; +import { NotFoundException } from '@nestjs/common'; +import type { Request } from 'express'; +import type { ICreateTransactionUseCase } from '../../domain/ports/input/create-transaction.use-case.interface'; +import type { IGetTransactionUseCase } from '../../domain/ports/input/get-transaction.use-case.interface'; +import type { CreateTransactionDto } from '../dtos/create-transaction.dto'; +import { TransactionController } from './transaction.controller'; + +describe('TransactionController', () => { + let controller: TransactionController; + let mockCreateUseCase: jest.Mocked; + let mockGetUseCase: jest.Mocked; + let mockLogger: jest.Mocked; + + beforeEach(() => { + mockCreateUseCase = { + execute: jest.fn(), + } as jest.Mocked; + + mockGetUseCase = { + execute: jest.fn(), + } as jest.Mocked; + + mockLogger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + verbose: jest.fn(), + } as unknown as jest.Mocked; + + controller = new TransactionController(mockCreateUseCase, mockGetUseCase, mockLogger); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('createTransaction', () => { + const createDto: CreateTransactionDto = { + accountExternalIdDebit: 'debit-account-123', + accountExternalIdCredit: 'credit-account-456', + tranferTypeId: 1, + value: 500, + }; + + const mockRequest = { + correlationId: 'correlation-123', + requestId: 'request-456', + ip: '127.0.0.1', + headers: { + 'user-agent': 'Jest Test Agent', + }, + } as any as Request; + + const mockTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + createDto.tranferTypeId, + createDto.value, + TransactionStatus.PENDING, + new Date('2024-01-01T00:00:00Z'), + ); + + it('should create a transaction and return response DTO', async () => { + mockCreateUseCase.execute.mockResolvedValue(mockTransaction); + + const result = await controller.createTransaction(createDto, mockRequest); + + expect(result).toEqual({ + transactionExternalId: '123e4567-e89b-12d3-a456-426614174000', + transactionType: { name: 'Transfer' }, + transactionStatus: { name: 'pending' }, + value: 500, + createdAt: mockTransaction.createdAt, + }); + }); + + it('should extract context from request', async () => { + mockCreateUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.createTransaction(createDto, mockRequest); + + expect(mockCreateUseCase.execute).toHaveBeenCalledWith(createDto, { + correlationId: 'correlation-123', + requestId: 'request-456', + ipAddress: '127.0.0.1', + userAgent: 'Jest Test Agent', + }); + }); + + it('should log transaction creation', async () => { + mockCreateUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.createTransaction(createDto, mockRequest); + + expect(mockLogger.log).toHaveBeenCalledWith( + 'Creating transaction', + expect.objectContaining({ + correlationId: 'correlation-123', + requestId: 'request-456', + }), + { + accountDebit: createDto.accountExternalIdDebit, + accountCredit: createDto.accountExternalIdCredit, + value: createDto.value, + }, + ); + }); + + it('should log successful transaction creation', async () => { + mockCreateUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.createTransaction(createDto, mockRequest); + + expect(mockLogger.log).toHaveBeenCalledWith('Transaction created successfully', expect.any(Object), { + transactionId: '123e4567-e89b-12d3-a456-426614174000', + }); + }); + + it('should map transfer type 1 to Transfer', async () => { + const transferTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + createDto.accountExternalIdDebit, + createDto.accountExternalIdCredit, + 1, + createDto.value, + TransactionStatus.PENDING, + new Date(), + ); + mockCreateUseCase.execute.mockResolvedValue(transferTransaction); + + const result = await controller.createTransaction(createDto, mockRequest); + + expect(result.transactionType.name).toBe('Transfer'); + }); + + it('should map transfer type 2 to Payment', async () => { + const paymentDto = { ...createDto, tranferTypeId: 2 }; + const paymentTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + paymentDto.accountExternalIdDebit, + paymentDto.accountExternalIdCredit, + 2, + paymentDto.value, + TransactionStatus.PENDING, + new Date(), + ); + mockCreateUseCase.execute.mockResolvedValue(paymentTransaction); + + const result = await controller.createTransaction(paymentDto, mockRequest); + + expect(result.transactionType.name).toBe('Payment'); + }); + + it('should map transfer type 3 to Withdrawal', async () => { + const withdrawalDto = { ...createDto, tranferTypeId: 3 }; + const withdrawalTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + withdrawalDto.accountExternalIdDebit, + withdrawalDto.accountExternalIdCredit, + 3, + withdrawalDto.value, + TransactionStatus.PENDING, + new Date(), + ); + mockCreateUseCase.execute.mockResolvedValue(withdrawalTransaction); + + const result = await controller.createTransaction(withdrawalDto, mockRequest); + + expect(result.transactionType.name).toBe('Withdrawal'); + }); + + it('should handle unknown transfer types', async () => { + const unknownDto = { ...createDto, tranferTypeId: 999 }; + const unknownTransaction = new Transaction( + '123e4567-e89b-12d3-a456-426614174000', + unknownDto.accountExternalIdDebit, + unknownDto.accountExternalIdCredit, + 999, + unknownDto.value, + TransactionStatus.PENDING, + new Date(), + ); + mockCreateUseCase.execute.mockResolvedValue(unknownTransaction); + + const result = await controller.createTransaction(unknownDto, mockRequest); + + expect(result.transactionType.name).toBe('Unknown'); + }); + + it('should handle requests without correlationId', async () => { + const requestWithoutIds = { + ip: '127.0.0.1', + headers: { 'user-agent': 'Test' }, + } as any as Request; + + mockCreateUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.createTransaction(createDto, requestWithoutIds); + + expect(mockCreateUseCase.execute).toHaveBeenCalledWith(createDto, { + correlationId: undefined, + requestId: undefined, + ipAddress: '127.0.0.1', + userAgent: 'Test', + }); + }); + + it('should propagate use case errors', async () => { + const error = new Error('Use case error'); + mockCreateUseCase.execute.mockRejectedValue(error); + + await expect(controller.createTransaction(createDto, mockRequest)).rejects.toThrow('Use case error'); + }); + }); + + describe('getTransaction', () => { + const transactionId = '123e4567-e89b-12d3-a456-426614174000'; + + const mockRequest = { + correlationId: 'correlation-123', + requestId: 'request-456', + ip: '127.0.0.1', + headers: { + 'user-agent': 'Jest Test Agent', + }, + } as any as Request; + + const mockTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.APPROVED, + new Date('2024-01-01T00:00:00Z'), + ); + + it('should get transaction and return response DTO', async () => { + mockGetUseCase.execute.mockResolvedValue(mockTransaction); + + const result = await controller.getTransaction(transactionId, mockRequest); + + expect(result).toEqual({ + transactionExternalId: transactionId, + transactionType: { name: 'Transfer' }, + transactionStatus: { name: 'approved' }, + value: 500, + createdAt: mockTransaction.createdAt, + }); + }); + + it('should call use case with transaction ID', async () => { + mockGetUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.getTransaction(transactionId, mockRequest); + + expect(mockGetUseCase.execute).toHaveBeenCalledWith(transactionId); + }); + + it('should log transaction fetch', async () => { + mockGetUseCase.execute.mockResolvedValue(mockTransaction); + + await controller.getTransaction(transactionId, mockRequest); + + expect(mockLogger.log).toHaveBeenCalledWith( + 'Fetching transaction', + expect.objectContaining({ + correlationId: 'correlation-123', + requestId: 'request-456', + }), + { + transactionId, + }, + ); + }); + + it('should map PENDING status correctly', async () => { + const pendingTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.PENDING, + new Date(), + ); + mockGetUseCase.execute.mockResolvedValue(pendingTransaction); + + const result = await controller.getTransaction(transactionId, mockRequest); + + expect(result.transactionStatus.name).toBe('pending'); + }); + + it('should map REJECTED status correctly', async () => { + const rejectedTransaction = new Transaction( + transactionId, + 'debit-account-123', + 'credit-account-456', + 1, + 500, + TransactionStatus.REJECTED, + new Date(), + ); + mockGetUseCase.execute.mockResolvedValue(rejectedTransaction); + + const result = await controller.getTransaction(transactionId, mockRequest); + + expect(result.transactionStatus.name).toBe('rejected'); + }); + + it('should propagate NotFoundException from use case', async () => { + mockGetUseCase.execute.mockRejectedValue(new NotFoundException('Transaction not found')); + + await expect(controller.getTransaction(transactionId, mockRequest)).rejects.toThrow(NotFoundException); + }); + + it('should propagate use case errors', async () => { + const error = new Error('Database error'); + mockGetUseCase.execute.mockRejectedValue(error); + + await expect(controller.getTransaction(transactionId, mockRequest)).rejects.toThrow('Database error'); + }); + }); + + describe('mapToResponse (private method)', () => { + it('should map all transaction fields correctly', async () => { + const transaction = new Transaction( + 'txn-123', + 'debit-123', + 'credit-456', + 2, + 1000, + TransactionStatus.APPROVED, + new Date('2024-06-15T12:00:00Z'), + ); + + mockGetUseCase.execute.mockResolvedValue(transaction); + + const mockReq = { + correlationId: 'correlation-123', + requestId: 'request-456', + ip: '127.0.0.1', + headers: { + 'user-agent': 'Jest Test Agent', + }, + } as any as Request; + + const result = await controller.getTransaction('txn-123', mockReq); + + expect(result).toEqual({ + transactionExternalId: 'txn-123', + transactionType: { name: 'Payment' }, + transactionStatus: { name: 'approved' }, + value: 1000, + createdAt: transaction.createdAt, + }); + }); + }); +}); diff --git a/apps/transaction-service/src/presentation/controllers/transaction.controller.ts b/apps/transaction-service/src/presentation/controllers/transaction.controller.ts new file mode 100644 index 0000000000..5f0130d5cc --- /dev/null +++ b/apps/transaction-service/src/presentation/controllers/transaction.controller.ts @@ -0,0 +1,85 @@ +import { type TransactionType, TransactionTypeNames } from '@app/common'; +import { LoggerService } from '@app/observability'; +import { Body, Controller, Get, HttpCode, HttpStatus, Inject, Param, Post, Req } from '@nestjs/common'; +import type { Request } from 'express'; +import { + CREATE_TRANSACTION_USE_CASE, + type ICreateTransactionUseCase, +} from '../../domain/ports/input/create-transaction.use-case.interface'; +import { + GET_TRANSACTION_USE_CASE, + type IGetTransactionUseCase, +} from '../../domain/ports/input/get-transaction.use-case.interface'; +import { CreateTransactionDto } from '../dtos/create-transaction.dto'; +import type { TransactionResponseDto } from '../dtos/transaction-response.dto'; + +@Controller('transactions') +export class TransactionController { + constructor( + @Inject(CREATE_TRANSACTION_USE_CASE) + private readonly createTransactionUseCase: ICreateTransactionUseCase, + @Inject(GET_TRANSACTION_USE_CASE) + private readonly getTransactionUseCase: IGetTransactionUseCase, + private readonly logger: LoggerService, + ) {} + + @Post() + @HttpCode(HttpStatus.CREATED) + async createTransaction(@Body() dto: CreateTransactionDto, @Req() req: Request): Promise { + const context = { + correlationId: (req as any).correlationId, + requestId: (req as any).requestId, + ipAddress: req.ip, + userAgent: req.headers['user-agent'], + }; + + this.logger.log('Creating transaction', context, { + accountDebit: dto.accountExternalIdDebit, + accountCredit: dto.accountExternalIdCredit, + value: dto.value, + }); + + const transaction = await this.createTransactionUseCase.execute(dto, context); + + this.logger.log('Transaction created successfully', context, { + transactionId: transaction.transactionExternalId, + }); + + return this.mapToResponse(transaction); + } + + @Get(':transactionExternalId') + async getTransaction( + @Param('transactionExternalId') transactionExternalId: string, + @Req() req: Request, + ): Promise { + const context = { + correlationId: (req as any).correlationId, + requestId: (req as any).requestId, + ipAddress: req.ip, + userAgent: req.headers['user-agent'], + }; + + this.logger.log('Fetching transaction', context, { + transactionId: transactionExternalId, + }); + + const transaction = await this.getTransactionUseCase.execute(transactionExternalId); + + return this.mapToResponse(transaction); + } + + private mapToResponse(transaction: any): TransactionResponseDto { + return { + transactionExternalId: transaction.transactionExternalId, + transactionType: { + name: TransactionTypeNames[transaction.transferTypeId as TransactionType] || 'Unknown', + }, + transactionStatus: { + name: transaction.transactionStatus, + }, + value: transaction.value, + createdAt: transaction.createdAt, + }; + } +} diff --git a/apps/transaction-service/src/presentation/dtos/create-transaction.dto.ts b/apps/transaction-service/src/presentation/dtos/create-transaction.dto.ts new file mode 100644 index 0000000000..b2478ae717 --- /dev/null +++ b/apps/transaction-service/src/presentation/dtos/create-transaction.dto.ts @@ -0,0 +1,18 @@ +import { TransactionType } from '@app/common'; +import { IsEnum, IsNumber, IsUUID, Min } from 'class-validator'; + +export class CreateTransactionDto { + @IsUUID() + accountExternalIdDebit: string; + + @IsUUID() + accountExternalIdCredit: string; + + @IsNumber() + @IsEnum(TransactionType) + tranferTypeId: number; + + @IsNumber() + @Min(0) + value: number; +} diff --git a/apps/transaction-service/src/presentation/dtos/transaction-response.dto.ts b/apps/transaction-service/src/presentation/dtos/transaction-response.dto.ts new file mode 100644 index 0000000000..19f5a53c02 --- /dev/null +++ b/apps/transaction-service/src/presentation/dtos/transaction-response.dto.ts @@ -0,0 +1,11 @@ +export class TransactionResponseDto { + transactionExternalId: string; + transactionType: { + name: string; + }; + transactionStatus: { + name: string; + }; + value: number; + createdAt: Date; +} diff --git a/apps/transaction-service/src/transaction.module.ts b/apps/transaction-service/src/transaction.module.ts new file mode 100644 index 0000000000..58e496dbec --- /dev/null +++ b/apps/transaction-service/src/transaction.module.ts @@ -0,0 +1,98 @@ +import { DatabaseModule, KafkaModule, RedisModule } from '@app/common'; +import { LoggingModule, ObservabilityModule, TracingModule } from '@app/observability'; +import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { CreateTransactionUseCase } from './application/use-cases/create-transaction.use-case'; +import { GetTransactionUseCase } from './application/use-cases/get-transaction.use-case'; +import { UpdateTransactionStatusUseCase } from './application/use-cases/update-transaction-status.use-case'; +import { CREATE_TRANSACTION_USE_CASE } from './domain/ports/input/create-transaction.use-case.interface'; +import { GET_TRANSACTION_USE_CASE } from './domain/ports/input/get-transaction.use-case.interface'; +import { UPDATE_TRANSACTION_STATUS_USE_CASE } from './domain/ports/input/update-transaction-status.use-case.interface'; +import { EVENT_PUBLISHER } from './domain/ports/output/event-publisher.interface'; +import { TRANSACTION_REPOSITORY } from './domain/repositories/transaction.repository.interface'; +import { TransactionEventService } from './infrastructure/messaging/transaction-event.service'; +import { TransactionStatusConsumer } from './infrastructure/messaging/transaction-status.consumer'; +import { TransactionRepository } from './infrastructure/repositories/transaction.repository'; +import { TransactionController } from './presentation/controllers/transaction.controller'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + envFilePath: '.env', + }), + DatabaseModule.forRootAsync({ + isGlobal: true, + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + const url = configService.get('TRANSACTION_DB_URL'); + if (!url) { + throw new Error('TRANSACTION_DB_URL environment variable is required'); + } + return { url }; + }, + }), + RedisModule, + ObservabilityModule.forRoot({ + serviceName: 'transaction-service', + enableSentry: process.env.SENTRY_ENABLED === 'true', + sentryDsn: process.env.SENTRY_DSN, + environment: process.env.NODE_ENV || 'development', + }), + TracingModule.forRootAsync({ + inject: [ConfigService], + useFactory: (config: ConfigService) => ({ + serviceName: 'transaction-service', + serviceVersion: '1.0.0', + otlpEndpoint: config.get('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4318'), + environment: config.get('NODE_ENV', 'development'), + sampling: Number.parseFloat(config.get('OTEL_SAMPLING_RATIO', '1.0')), + enabled: config.get('OTEL_ENABLED', 'true') !== 'false', + }), + }), + + LoggingModule.forRoot('transaction-service'), + KafkaModule.forRootAsync({ + isGlobal: true, + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + const kafkaBroker = configService.get('KAFKA_BROKER'); + if (!kafkaBroker) { + throw new Error('KAFKA_BROKER environment variable is required'); + } + return { + clientId: 'transaction-service', + brokers: [kafkaBroker], + consumerConfig: { + groupId: 'transaction-service-group', + }, + }; + }, + }), + ], + controllers: [TransactionController], + providers: [ + { + provide: CREATE_TRANSACTION_USE_CASE, + useClass: CreateTransactionUseCase, + }, + { + provide: GET_TRANSACTION_USE_CASE, + useClass: GetTransactionUseCase, + }, + { + provide: UPDATE_TRANSACTION_STATUS_USE_CASE, + useClass: UpdateTransactionStatusUseCase, + }, + { + provide: TRANSACTION_REPOSITORY, + useClass: TransactionRepository, + }, + { + provide: EVENT_PUBLISHER, + useClass: TransactionEventService, + }, + TransactionStatusConsumer, + ], +}) +export class TransactionModule {} diff --git a/apps/transaction-service/tsconfig.app.json b/apps/transaction-service/tsconfig.app.json new file mode 100644 index 0000000000..b29b969386 --- /dev/null +++ b/apps/transaction-service/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/transaction-service" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000000..fb2c590207 --- /dev/null +++ b/biome.json @@ -0,0 +1,71 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.10/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "includes": ["apps/**", "libs/**", "*.ts", "*.js", "*.json"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 4, + "lineEnding": "lf", + "lineWidth": 120 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "complexity": { + "noStaticOnlyClass": "off" + }, + "correctness": { + "noUnusedVariables": "warn" + }, + "suspicious": { + "noExplicitAny": "off", + "noDebugger": "warn" + }, + "style": { + "useConst": "warn", + "useImportType": "off" + } + } + }, + "javascript": { + "parser": { + "unsafeParameterDecoratorsEnabled": true + }, + "formatter": { + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "trailingCommas": "all", + "semicolons": "always", + "arrowParentheses": "always", + "bracketSpacing": true, + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto" + } + }, + "json": { + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/config/database/drizzle.config.ts b/config/database/drizzle.config.ts new file mode 100644 index 0000000000..40b016bc4d --- /dev/null +++ b/config/database/drizzle.config.ts @@ -0,0 +1,13 @@ +import type { Config } from 'drizzle-kit'; + +export default { + schema: [ + './apps/transaction-service/src/infrastructure/database/schema.ts', + './apps/anti-fraud-service/src/infrastructure/database/fraud-rules.schema.ts', + ], + out: './drizzle', + dialect: 'postgresql', + dbCredentials: { + url: process.env.TRANSACTION_DB_URL || process.env.ANTIFRAUD_DB_URL || '', + }, +} satisfies Config; diff --git a/config/jest.config.js b/config/jest.config.js new file mode 100644 index 0000000000..3269fe9d94 --- /dev/null +++ b/config/jest.config.js @@ -0,0 +1,51 @@ +module.exports = { + moduleFileExtensions: ['js', 'json', 'ts'], + rootDir: '..', + testRegex: String.raw`.*\.spec\.ts$`, + transform: { + '^.+\\.(t|j)s$': ['ts-jest', { + tsconfig: { + esModuleInterop: true, + allowSyntheticDefaultImports: true, + }, + }], + }, + maxWorkers: 2, + workerIdleMemoryLimit: '512MB', + collectCoverageFrom: [ + 'apps/**/*.ts', + 'libs/**/*.ts', + '!apps/**/*.module.ts', + '!libs/**/*.module.ts', + '!apps/**/main.ts', + '!apps/**/config/instrument.ts', + '!apps/**/migrations/**', + '!apps/**/dto/**', + '!apps/**/dtos/**', + '!libs/**/index.ts', + '!**/*.config.ts', + '!**/*.d.ts', + '!**/*.spec.ts', + '!**/node_modules/**', + '!apps/**/scripts/**', + '!libs/observability/**', + '!libs/common/src/exceptions/**', + '!libs/common/src/interceptors/**', + '!apps/**/database/schema.ts', + '!apps/**/database/*.schema.ts', + ], + coverageDirectory: './coverage', + testEnvironment: 'node', + moduleNameMapper: { + '^@app/common$': '/libs/common/src', + '^@app/common/(.*)$': '/libs/common/src/$1', + '^@app/observability$': '/libs/observability/src', + '^@app/observability/(.*)$': '/libs/observability/src/$1', + '^@domain/(.*)$': '/apps/transaction-service/src/domain/$1', + '^@application/(.*)$': '/apps/transaction-service/src/application/$1', + '^@infrastructure/(.*)$': '/apps/transaction-service/src/infrastructure/$1', + '^@presentation/(.*)$': '/apps/transaction-service/src/presentation/$1', + }, + setupFilesAfterEnv: ['/test/setup.ts'], + testTimeout: 10000, +}; diff --git a/docker-compose.yml b/docker-compose.yml index 0e8807f21c..371c946f64 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,18 +2,34 @@ version: "3.7" services: postgres: image: postgres:14 + container_name: postgres ports: - "5432:5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=postgres + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - yape-network + zookeeper: image: confluentinc/cp-zookeeper:5.5.3 + container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 + networks: + - yape-network + kafka: image: confluentinc/cp-enterprise-kafka:5.5.3 - depends_on: [zookeeper] + container_name: kafka + depends_on: + - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 @@ -21,5 +37,157 @@ services: KAFKA_BROKER_ID: 1 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_JMX_PORT: 9991 + KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" ports: - - 9092:9092 + - "9092:9092" + healthcheck: + test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:9092"] + interval: 10s + timeout: 10s + retries: 5 + networks: + - yape-network + + transaction-service: + build: + context: . + dockerfile: apps/transaction-service/Dockerfile + container_name: transaction-service + ports: + - "3000:3000" + environment: + # Database + - TRANSACTION_DB_URL=${TRANSACTION_DB_URL} + # Kafka + - KAFKA_BROKER=${KAFKA_BROKER:-kafka:29092} + # Redis + - REDIS_URL=${REDIS_URL} + # Service + - PORT=3000 + - SERVICE_NAME=transaction-service + - NODE_ENV=${NODE_ENV:-development} + # OpenTelemetry + - OTEL_ENABLED=${OTEL_ENABLED:-true} + - OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4318 + - OTEL_SAMPLING_RATIO=${OTEL_SAMPLING_RATIO:-1.0} + # Logging + - LOG_LEVEL=${LOG_LEVEL:-info} + # Sentry (optional) + - SENTRY_ENABLED=${SENTRY_ENABLED:-false} + depends_on: + postgres: + condition: service_healthy + kafka: + condition: service_healthy + networks: + - yape-network + restart: unless-stopped + + anti-fraud-service: + build: + context: . + dockerfile: apps/anti-fraud-service/Dockerfile + container_name: anti-fraud-service + ports: + - "3001:3001" + environment: + # Database + - ANTIFRAUD_DB_URL=${ANTIFRAUD_DB_URL} + # Kafka + - KAFKA_BROKER=${KAFKA_BROKER:-kafka:29092} + # Redis + - REDIS_URL=${REDIS_URL} + # Service + - ANTI_FRAUD_PORT=3001 + - SERVICE_NAME=anti-fraud-service + - NODE_ENV=${NODE_ENV:-development} + # OpenTelemetry + - OTEL_ENABLED=${OTEL_ENABLED:-true} + - OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4318 + - OTEL_SAMPLING_RATIO=${OTEL_SAMPLING_RATIO:-1.0} + # Logging + - LOG_LEVEL=${LOG_LEVEL:-info} + # Sentry (optional) + - SENTRY_ENABLED=${SENTRY_ENABLED:-false} + depends_on: + postgres: + condition: service_healthy + kafka: + condition: service_healthy + networks: + - yape-network + restart: unless-stopped + + kafka-ui: + image: provectuslabs/kafka-ui:v0.7.2 + container_name: kafka-ui + ports: + - "9000:8080" + environment: + - KAFKA_CLUSTERS_0_NAME=local + - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:29092 + - KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181 + depends_on: + kafka: + condition: service_healthy + networks: + - yape-network + restart: unless-stopped + + redis: + image: redis:alpine + container_name: redis + ports: + - "6379:6379" + networks: + - yape-network + restart: unless-stopped + + # ============================================================================ + # Observability Stack (Minimal: Tempo + Grafana for traces visualization) + # ============================================================================ + + # Grafana Tempo - Distributed Tracing Backend + tempo: + image: grafana/tempo:latest + container_name: tempo + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - ./observability/tempo/tempo.yaml:/etc/tempo.yaml + - tempo-data:/tmp/tempo + ports: + - "3200:3200" # Tempo API + - "4317:4317" # OTLP gRPC + - "4318:4318" # OTLP HTTP + networks: + - yape-network + restart: unless-stopped + + # Grafana - Visualization Dashboard + grafana: + image: grafana/grafana:latest + container_name: grafana + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor + volumes: + - ./observability/grafana/provisioning:/etc/grafana/provisioning + - ./observability/grafana/dashboards:/var/lib/grafana/dashboards + - grafana-data:/var/lib/grafana + ports: + - "3002:3000" + networks: + - yape-network + restart: unless-stopped + depends_on: + - tempo + +networks: + yape-network: + driver: bridge + +volumes: + tempo-data: + grafana-data: diff --git a/docs/API-TESTING.md b/docs/API-TESTING.md new file mode 100644 index 0000000000..e718ae3de5 --- /dev/null +++ b/docs/API-TESTING.md @@ -0,0 +1,96 @@ +# API Testing Guide + +## Overview + +Guía para probar las APIs del Transaction Service y Anti-Fraud Service. + +## Quick Start + +### 1. Iniciar Servicios + +```bash +# Opción A: Docker (Recomendado) +docker-compose up -d + +# Opción B: Local +npm run start:dev +``` + +### 2. Verificar Servicios + +```bash +curl http://localhost:3000/health # Transaction Service +curl http://localhost:3001/health # Anti-Fraud Service +``` + +### 3. Ejecutar Test Automatizado + +```bash +npm run test:api +``` + +## Escenarios de Testing + +El script `test/api/test-transaction-api.sh` cubre: + +1. Health check del servicio +2. Crear transacción válida (< 1000) +3. Consultar transacción por ID +4. Crear transacción de alto valor (> 1000) para verificar anti-fraude + +## Reglas de Anti-Fraude + +| Valor de Transacción | Status Esperado | Acción | +|----------------------|----------------|---------| +| < 1000 | PENDING → APPROVED | Normal | +| 1001 - 5000 | PENDING → REJECTED | Alto riesgo | +| > 5000 | PENDING → REVIEW | Muy alto - requiere revisión | + +## Pruebas Manuales con curl + +### Crear Transacción + +```bash +curl -X POST http://localhost:3000/transactions \ + -H "Content-Type: application/json" \ + -d '{ + "accountExternalIdDebit": "acc-001", + "accountExternalIdCredit": "acc-002", + "tranferTypeId": 1, + "value": 500 + }' +``` + +### Obtener Transacción + +```bash +curl http://localhost:3000/transactions/{transaction-id} +``` + +### Debugging + +```bash +# Ver logs +docker logs transaction-service -f +docker logs anti-fraud-service -f + +# Curl verbose +curl -v http://localhost:3000/health +``` + +## Troubleshooting + +### Servicios no responden +```bash +# Verificar estado +docker ps + +# Reiniciar servicios +docker-compose restart +``` + +### Ver logs de errores +```bash +docker logs transaction-service +docker logs anti-fraud-service +``` diff --git a/docs/FRAUD_RULES.md b/docs/FRAUD_RULES.md new file mode 100644 index 0000000000..850529fbb8 --- /dev/null +++ b/docs/FRAUD_RULES.md @@ -0,0 +1,232 @@ +# 🛡️ Sistema de Reglas Anti-Fraude + +Sistema configurable para validar transacciones dinámicamente sin código hardcodeado. + +## 🎯 Características Principales + +- **Sistema extensible** de reglas configurables +- **AMOUNT_THRESHOLD** (único requerido por el reto) +- **5 tipos adicionales** demostrativos de extensibilidad +- **Sistema de prioridades** para resolución de conflictos +- **Gestión vía base de datos** (sin APIs REST) +- **Auditoría completa** de todas las evaluaciones + +## 🔧 Tipos de Reglas + +| Tipo | Descripción | Estado | Ejemplo de Condición | +|------|-------------|--------|----------------------| +| `AMOUNT_THRESHOLD` | **Umbral de monto (REQUERIDO)** | ✅ Configurable | `{"operator": "gt", "value": 1000}` | +| `DAILY_LIMIT` | Límite diario | 🚧 Demo (pendiente) | `{"maxAmount": 5000, "maxTransactions": 10}` | +| `VELOCITY_CHECK` | Detección de velocidad | 🚧 Demo (pendiente) | `{"maxTransactions": 5, "timeWindowMinutes": 30}` | +| `ACCOUNT_BLACKLIST` | Lista negra | ✅ Implementado | `{"accounts": ["uuid1", "uuid2"]}` | +| `TRANSFER_TYPE_LIMIT` | Límite por tipo | ✅ Implementado | `{"transferTypeId": 2, "maxAmount": 500}` | +| `TIME_BASED` | Restricción horaria | ✅ Implementado | `{"allowedHours": {"start": 8, "end": 18}}` | + +## 🎬 Acciones + +- **`REJECT`**: Rechaza inmediatamente (prioridad máxima) +- **`REVIEW`**: Marca para revisión manual +- **`FLAG`**: Solo marca sin bloquear +- **`APPROVE`**: Aprueba (prioridad mínima) + +## 📊 Esquema de Base de Datos + +### fraud_rules +```sql +CREATE TABLE fraud_rules ( + id UUID PRIMARY KEY, + name VARCHAR(100) NOT NULL, + description TEXT, + rule_type VARCHAR(50) NOT NULL, + condition JSONB NOT NULL, + action VARCHAR(20) NOT NULL DEFAULT 'REJECT', + priority INTEGER NOT NULL DEFAULT 100, + is_active BOOLEAN NOT NULL DEFAULT true, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP NOT NULL DEFAULT NOW() +); +``` + +### fraud_rule_executions +```sql +CREATE TABLE fraud_rule_executions ( + id UUID PRIMARY KEY, + rule_id UUID NOT NULL REFERENCES fraud_rules(id), + transaction_external_id UUID NOT NULL, + matched BOOLEAN NOT NULL, + action VARCHAR(20) NOT NULL, + details JSONB, + executed_at TIMESTAMP NOT NULL DEFAULT NOW() +); +``` + +## 🗄️ Gestión de Reglas + +### Gestión Actual +Las reglas de fraude se gestionan directamente a través de la base de datos. No hay APIs REST disponibles para gestión en tiempo real. + +### Métodos de Gestión +1. **Script de seeding**: `npm run seed:fraud-rules` +2. **Migraciones de base de datos**: Actualizaciones vía SQL/scripts +3. **Acceso directo a BD**: Consultas y modificaciones directas + +### Recomendación +Para entornos de producción, considere implementar APIs de gestión o una interfaz administrativa separada. + +## 🎯 Flujo de Evaluación + +```mermaid +sequenceDiagram + participant T as Transaction + participant AF as AntiFraudService + participant RE as RulesEngine + participant DB as Database + participant K as Kafka + + T->>AF: Transaction Created Event + AF->>RE: evaluateTransaction(context) + RE->>DB: Get Active Rules (ordered by priority) + + loop For each rule + RE->>RE: evaluateRule() + RE->>DB: Log execution + end + + RE->>RE: determineFinalAction() + RE-->>AF: {action, matchedRules, reasons} + + alt REJECT + AF->>K: Publish TRANSACTION_REJECTED + else APPROVE + AF->>K: Publish TRANSACTION_APPROVED + else REVIEW/FLAG + AF->>K: Publish TRANSACTION_REJECTED (or custom topic) + end +``` + +## 🔄 Sistema de Prioridades + +- **Menor número = Mayor prioridad** +- Las reglas se evalúan en orden de prioridad +- Todas las reglas se evalúan (no hay short-circuit) +- La acción final se determina con la siguiente prioridad: + 1. `REJECT` (prioridad máxima) + 2. `REVIEW` + 3. `FLAG` + 4. `APPROVE` (prioridad mínima) + +## 📝 Configuración Inicial + +### 1. Crear las tablas +```bash +npm run db:push +``` + +### 2. Seed de reglas por defecto +```bash +npm run seed:fraud-rules +``` + +Esto creará las siguientes reglas: + +1. **High Amount Transaction** (Activa) + - Rechaza transacciones > 1000 + - Prioridad: 100 + +2. **Very High Amount - Review** (Inactiva) + - Marca para revisión transacciones > 5000 + - Prioridad: 50 + +3. **Weekend Transfer Limit** (Inactiva) + - Rechaza transferencias en fin de semana + - Prioridad: 200 + +4. **Payment Type Limit** (Inactiva) + - Limita pagos (tipo 2) a 500 + - Prioridad: 150 + +## 💡 Ejemplos de Uso + +### Ejemplo 1: Cambiar el umbral de monto + +1. Consultar regla actual en base de datos: +```sql +SELECT id, name, condition FROM fraud_rules +WHERE rule_type = 'AMOUNT_THRESHOLD' AND is_active = true; +``` + +2. Actualizar la condición: +```sql +UPDATE fraud_rules +SET condition = '{"operator": "gt", "value": 2000}', + updated_at = NOW() +WHERE id = 'rule-id-here'; +``` + +### Ejemplo 2: Habilitar restricción de fin de semana + +```sql +UPDATE fraud_rules +SET is_active = true, + updated_at = NOW() +WHERE name LIKE '%weekend%'; +``` + +### Ejemplo 3: Crear nueva regla de blacklist + +```sql +INSERT INTO fraud_rules ( + id, name, description, rule_type, condition, action, priority, is_active +) VALUES ( + gen_random_uuid(), + 'Blocked Accounts', + 'Accounts reported for fraud', + 'ACCOUNT_BLACKLIST', + '{"accounts": ["550e8400-e29b-41d4-a716-446655440000", "550e8400-e29b-41d4-a716-446655440001"]}', + 'REJECT', + 10, + true +); +``` + +## 🔍 Auditoría y Monitoreo + +### Ver qué reglas se activaron para una transacción + +Las ejecuciones se registran automáticamente en `fraud_rule_executions`: + +```sql +SELECT + fr.name, + fre.matched, + fre.action, + fre.details, + fre.executed_at +FROM fraud_rule_executions fre +JOIN fraud_rules fr ON fre.rule_id = fr.id +WHERE fre.transaction_external_id = '{transaction-id}' +ORDER BY fre.executed_at; +``` + +### Estadísticas de una regla + +```sql +SELECT + COUNT(*) as total_executions, + COUNT(CASE WHEN matched = true THEN 1 END) as matches, + COUNT(CASE WHEN matched = true AND action = 'REJECT' THEN 1 END) as rejections +FROM fraud_rule_executions +WHERE rule_id = 'rule-id-here' + AND executed_at >= NOW() - INTERVAL '30 days'; +``` + +## 🛠️ Extensión del Sistema + +Para agregar un nuevo tipo de regla: + +1. **Agregar al enum** en `fraud-rules.types.ts` +2. **Crear interfaz de condición** +3. **Implementar método evaluador** en `RulesEngineService` +4. **Agregar case al switch** + +**Nota**: Actualmente `DAILY_LIMIT` y `VELOCITY_CHECK` están marcados como "implementación pendiente" en el código. diff --git a/docs/GUIDE.md b/docs/GUIDE.md new file mode 100644 index 0000000000..9bd11bd3a9 --- /dev/null +++ b/docs/GUIDE.md @@ -0,0 +1,226 @@ +# Guía de Arquitectura + +Documentación técnica profunda sobre la arquitectura hexagonal, decisiones de diseño y patrones implementados. + +> **Nota:** Para instalación y comandos básicos, ver [README.md](../README.md) + +--- + +## Arquitectura Hexagonal - Visión General + +### Principios Fundamentales + +La **Arquitectura Hexagonal** (también conocida como **Ports & Adapters**) separa la lógica de negocio de las preocupaciones externas, creando un sistema modular y testeable. + +#### 🎯 **Núcleo Independiente** +- **Domain Layer**: Reglas de negocio puras, independientes de frameworks +- **Application Layer**: Casos de uso que coordinan el flujo de la aplicación +- **Ports**: Interfaces que definen contratos para comunicación externa +- **Adapters**: Implementaciones concretas de las interfaces + +#### 🔄 **Capas de Adaptación** +- **Infrastructure Layer**: Adaptadores para bases de datos, mensajería, APIs externas +- **Presentation Layer**: Adaptadores para interfaces de usuario (REST APIs, GraphQL, etc.) + +### Beneficios Arquitectónicos + +| Beneficio | Descripción | +|-----------|-------------| +| **Testabilidad** | Lógica de dominio pura, fácil de testear unitariamente | +| **Mantenibilidad** | Cambios en infraestructura no afectan el dominio | +| **Flexibilidad** | Fácil cambiar tecnologías (DB, mensajería, frameworks) | +| **Escalabilidad** | Servicios independientes, deployment separado | +| **Evolución** | Nuevo comportamiento sin modificar código existente | + +--- + +## Domain-Driven Design (DDD) + +### Bounded Contexts + +El sistema está dividido en **dos bounded contexts principales**: + +#### 1. **Transaction Management** (Contexto Principal) +- **Responsabilidades**: Crear, consultar y gestionar el ciclo de vida de transacciones +- **Entidades**: `Transaction` con estados (PENDING → APPROVED/REJECTED) +- **Value Objects**: `TransactionStatus`, montos, IDs externos +- **Reglas de negocio**: Validaciones básicas, estado de transacciones + +#### 2. **Anti-Fraud Validation** (Contexto de Soporte) +- **Responsabilidades**: Evaluación de riesgo basada en reglas configurables +- **Entidades**: `FraudRule`, `FraudRuleExecution` +- **Motor de reglas**: Sistema extensible de validación +- **Auditoría**: Registro completo de todas las evaluaciones + +### Strategic Design Patterns + +- **Ubiquitous Language**: Terminología consistente (Transaction, FraudRule, etc.) +- **Context Mapping**: Comunicación clara entre bounded contexts vía eventos +- **Aggregate Design**: Entidades con límites claros de consistencia +- **Domain Events**: Comunicación interna dentro de bounded contexts + +--- + +## Event-Driven Architecture + +### Patrón de Comunicación Asíncrona + +El sistema utiliza **Event-Driven Architecture** para desacoplar servicios y mejorar la resiliencia: + +#### 🎯 **Ventajas del Approach** +- **Desacoplamiento**: Servicios no necesitan conocerse mutuamente +- **Escalabilidad**: Procesamiento asíncrono permite manejar picos de carga +- **Resiliencia**: Fallos en un servicio no afectan inmediatamente a otros +- **Evolución**: Nuevos consumidores pueden suscribirse sin modificar productores + +#### 📋 **Flujo de Eventos Principal** + +```mermaid +graph TD + A[Cliente] --> B[POST /transactions] + B --> C[Transaction Service] + C --> D[(DB: PENDING)] + C --> E[Kafka: TransactionCreated] + E --> F[Anti-Fraud Service] + F --> G[Rules Engine] + G --> H[(DB: Rules Log)] + G --> I{Kafka: Approved/Rejected} + I --> J[Transaction Service] + J --> K[(DB: Status Update)] +``` + +#### 🔄 **Eventos del Sistema** +- **`TransactionCreated`**: Nueva transacción requiere validación +- **`TransactionApproved`**: Validación exitosa, transacción aprobada +- **`TransactionRejected`**: Validación fallida, transacción rechazada + +### Decisiones de Diseño + +#### **Kafka como Message Broker** +- **Durabilidad**: Mensajes persistentes con replicas +- **Orden**: Garantía de orden por partición +- **Escalabilidad**: Consumer groups permiten múltiples instancias +- **Ecosistema**: Amplio soporte y herramientas (Kafka UI, Streams, etc.) + +#### **Event Sourcing Considerations** +- **Audit Trail**: Todos los cambios quedan registrados +- **Debugging**: Posibilidad de reconstruir estado desde eventos +- **Analytics**: Eventos pueden alimentar sistemas de BI + +--- + +## Estrategia de Persistencia + +### PostgreSQL como Base de Datos Principal + +#### **Decisiones de Diseño** +- **Relacional vs NoSQL**: PostgreSQL para consistencia y transacciones ACID +- **Type Safety**: Drizzle ORM para schemas type-safe en TypeScript +- **Migrations**: Schema definido como código, migraciones automáticas + +#### **Esquemas Principales** +- **Transacciones**: Entidad principal con estados y metadatos +- **Reglas de Fraude**: Configuración dinámica de reglas de validación +- **Auditoría**: Log completo de evaluaciones para compliance + +#### **Patrones de Acceso** +- **Repository Pattern**: Abstracción de acceso a datos +- **Transaction Management**: Operaciones atómicas en base de datos +- **Query Optimization**: Índices y estrategias de consulta eficientes + +--- + +## Observabilidad y Monitoreo + +### OpenTelemetry como Estándar + +#### **Pilares de Observabilidad** +- **Logs**: Eventos estructurados con contexto (Pino + JSON) +- **Metrics**: Métricas de aplicación y sistema (OpenTelemetry) +- **Traces**: Seguimiento distribuido de requests (Tempo) + +#### **Dashboards y Visualización** +- **Grafana**: Métricas en tiempo real y dashboards customizables +- **Tempo**: Tracing distribuido para debugging de requests complejos +- **Health Checks**: Endpoints dedicados para monitoreo de servicios + +#### **Alerting y Error Tracking** +- **Sentry**: Captura automática de errores en producción +- **Log Aggregation**: Centralización de logs para análisis + +--- + +## Pirámide de Testing + +### Estrategia Multi-Capa + +#### **Unit Tests (Base de la Pirámide)** +- **Domain Layer**: Lógica de negocio pura (entidades, value objects) +- **Cobertura**: 100% en reglas de negocio críticas +- **Framework**: Jest con assertions descriptivas + +#### **Integration Tests (Capa Media)** +- **Application Layer**: Casos de uso con dependencias mockeadas +- **Use Cases**: Coordinación entre repositorios y servicios externos +- **External APIs**: Contratos con sistemas de mensajería + +#### **E2E Tests (Cima de la Pirámide)** +- **API Endpoints**: Flujos completos desde HTTP hasta base de datos +- **Cross-Service**: Comunicación entre Transaction y Anti-Fraud services +- **Contract Testing**: Validación de interfaces entre servicios + +### Decisiones de Testing + +#### **Herramientas Seleccionadas** +- **Jest**: Framework moderno con TypeScript support +- **Supertest**: Testing HTTP APIs +- **TestContainers**: Base de datos real para tests de integración + +#### **Cobertura y Calidad** +- **Mutation Testing**: Validación de calidad de tests +- **Contract Tests**: Interfaces entre servicios +- **Performance Tests**: Validación de no-regression + +--- + +## Infraestructura de Desarrollo + +### Docker Compose para Desarrollo Local + +El proyecto incluye configuración completa de **Docker Compose** con todos los servicios necesarios: + +#### **Servicios Incluidos** +- **PostgreSQL**: Base de datos relacional +- **Kafka + Zookeeper**: Message broker para comunicación event-driven +- **Redis**: Cache opcional para alta performance +- **Grafana**: Dashboards de métricas +- **Tempo**: Tracing distribuido +- **Kafka UI**: Interfaz web para monitoreo de mensajes + +#### **Configuración por Entorno** +- **Desarrollo**: Servicios locales con volúmenes persistentes +- **Testing**: Base de datos efímera para tests de integración +- **Producción**: Configuración optimizada para deployment + +### Variables de Entorno + +El sistema utiliza **variables de entorno** para configuración flexible: + +#### **Grupos de Configuración** +- **Base de Datos**: Conexión PostgreSQL +- **Mensajería**: Brokers Kafka y grupos de consumidores +- **Servicios**: Puertos y URLs de servicios +- **Observabilidad**: Endpoints de Grafana, Tempo, Sentry +- **Logging**: Niveles y formatos de logs + +--- + +## Referencias Técnicas + +- [Domain-Driven Design](https://martinfowler.com/bliki/DomainDrivenDesign.html) +- [Hexagonal Architecture](https://alistair.cockburn.us/hexagonal-architecture/) +- [Event-Driven Architecture](https://martinfowler.com/articles/201701-event-driven.html) +- [Repository Pattern](https://martinfowler.com/eaaCatalog/repository.html) +- [Drizzle ORM Documentation](https://orm.drizzle.team/docs/overview) +- [NestJS Documentation](https://docs.nestjs.com/) +- [OpenTelemetry Specification](https://opentelemetry.io/docs/) diff --git a/docs/INDEX.md b/docs/INDEX.md new file mode 100644 index 0000000000..ad7fb6a42f --- /dev/null +++ b/docs/INDEX.md @@ -0,0 +1,28 @@ +# Índice de Documentación Técnica + +Documentación especializada del sistema de transacciones. Para inicio rápido, ver [README.md](../README.md). + +--- + +## Documentos Disponibles + +| Documento | Contenido | +|-----------|-----------| +| **[GUIDE.md](GUIDE.md)** | Arquitectura hexagonal, DDD, patrones de diseño | +| **[FRAUD_RULES.md](FRAUD_RULES.md)** | Motor de reglas anti-fraude y gestión | +| **[API-TESTING.md](API-TESTING.md)** | Guía completa de testing | + +## Diagramas + +| Diagrama | Descripción | +|----------|-------------| +| [architecture-overview](diagrams/architecture-overview-jsoncrack.jpeg) | Vista general del sistema | +| [microservices-flow](diagrams/microservices-flow-diagram.jpeg) | Flujo de comunicación | + +--- + +## Enlaces Rápidos + +- [README.md](../README.md) - Instalación y comandos +- [package.json](../package.json) - Scripts disponibles +- [docker-compose.yml](../docker-compose.yml) - Infraestructura diff --git a/docs/diagrams/architecture-overview-jsoncrack.jpeg b/docs/diagrams/architecture-overview-jsoncrack.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..20a5b7c3cc9ada77ce7ff065b26e4f62dd2622d5 GIT binary patch literal 634967 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

JR=wWl(_Eq^UUr3yCdmQSTF^2`c zfJf#jR-oKgbb2f0X~ssZ5WqXsmS3xC4)mudst}*=@=gix@Plj%<_$oQaJ(nmq?0?s z$wv30v3vymIhxZqeYLmaStQ!g>RD3S7jQ>DE`RERan7P$ba5{@!pJwS@FcjP!Gg^? zE3I&1VWGX)ul5Oz6Z|CD?rIx|Z0rOVng92(mdH)Rw4GRWyj-D33nOLPlpP1N-JmDG zXSXV6%D9OmLaNI2-9nkmVp7_~3tlmIGsO-g6VW564^-XvC#yoW7hb&LQK-j;OYzFQ zSD2YA>-XgiyQm706V2j=^d|k5>t5XZT)^>L4U85eO_Ep|keB2(ti1>}F}qeo#ygOGyG_0W;^YGlV_NA(qBztc z=!!ZooL)+?lF0}+X>O>x20}QKpl)%8eU0Rk{Vkmz;>r=TP&)CCE_=|TJUP?*ci5Bi z^8}Vl#OUA6PbLPah7%x-+h-L%_RUdXAxNA{rcRQt_6Eo|j<q=Y2Q}0#%L|!dkw&@yz4Y-BdJkT*2S-E zhRm?Y&7}6AejoNc$?XhN_H=@8(3$-G$ySg2jnaGq9j3mg1HqYFzoD%zhG8)dI5rPL z$^R(Y&P*CLT^Iuz3zB$NV2hm1fg{VOEXSS94oliN7c5F(;_l)SKg_yj6Z37Ph@a2A zb99NoZJfeTSMAg7>sXA`Fi|y3Mg*s+BW?~ws<(<^1ToBT<%+yyYEvcN2X}ImKb@+7KX4U408RTU&gMM zPyN@Mmoh_=>XkcYmJb}1(R|U0Buoc(VBquJl#<5@=uFtJRRa6BUackUQlHh??iN9; zM~PcyvrF;-MPQ*?VrBAor{{#?MSA0s?wdL9do0~PR@KApn;E<#(3GN35O%tD$S z1a%S{plP6r)3a`UaxG0dc7O_jB_Fg9o96H1MP8xW$MoD)YI)cYZ`7Ik4lBV zT;q-@tM$6!1V60rPUTc$58xBih@Q5qjZ!E?OA)GR_!dCa4*D*X$w~3wfg&{J>}zy~ z?&w(#bO7WMU^@>ztsHJb`URECV_4*zM>q0_{=e#3mOhD5 z$UQkIQ+oM<(jQ~LUdJMpi=1v&!0`nCqs@>AyyN* zFJu-5EYwx2l(MBwTx)mbc-K9N%gZW2}?P3Y@p?Cjk9XX~qIhUJOJ);V# z0Gu0?O%rn$Dpr~SebC#94dXunyHIqs1>Sv#DUfJm3!CwTOpqQ-k zbNto=&N2yfo&1pc3sf+_oA2? z9UJ1zGb$naxa7BgwrJpN1&Nr!J0B`D8lM-?&0*^C zy6R_{Y2dL%uHX*2U#Ta8XRc_1-kX?iAvd;-hJKZ^5yfKZKN+5yhqy0cGcmf2l5n|Qg9+5D%j zXfo8e7hJ$mYryt!Uf1(};+b96T)+JsvHn&Uty8{4-Y zed`lSc;wZZ*;|<4jOs)AWJ9)Sc=5PU{R*qIN7Q>(-yL&{rOl2 z=~_xL;fYc4D4F1CgL7EH$x%lr3_#Jqa;Wvcqy|W!?gz?S29QJIZO^vtt zjE&CMm@RYHM)ebsYa?0jZ5k+I6Cwk+f!Ns#UFb~s6#5hbmA4uh=;=_#(UmAQaF0zk z9!DnV?XVcMP^bqo0xto{jpnk8T|}@mGhIqW0QjXtDW6w!*5_Z*K1+@{e8~|i^U@ZN zwLeZscVso3L4exkIJeKqJtHnkH*N3jbUsoyQIV;8x^oN-pBTT$M28E?2dU}d+nRMY z&l17Pm|@ka9SUm-+8)m4Y>nvPo{WkEzC}!#gNA0Gi!;rKX@)MXEt-@p3NxQh;C;*W z7pq+;Hob1(B(1fJgHr*Dr|{%SAI3oWwSu@zq6oC|?bJM09YIgTs+e}gd3W*d%J~Er zo!p6kT3kPxTSTJ4q=|yk9eSZtl@N$svuO(^|D8#E3x|uSwOKuVo-cD&OVFTc-0-C9 z*vOh(R$!@fnV~rQ3Drs86w9#Lr=WzY>gc-ePF%UmVkz}46K2VJ38hCnYF5l+v6Vr1 zZ!r#<^jY5nN8&MYD4^i<^FmASl7)@EX?c{6PQY_-QJjkpm>ba^%zhNG)8C_+pg5De zPea6S>-VE1f+WVuo}s8v)=}Q-*IqR!YRbq^g_gxhv-G=GAtxW`tx3M_z|R;gYb?C& zQ&p4p9^A5wPf63B%Q%}!-ah?0mov>@JK178j~O#aDtf9=ET|>Ug4RojWATA=3yk8X z%>x2`it0Uo_)PO?&8>IVy2>Uf*JTCrnvW-6h`;>Sz6Li)-({pnSJumP1sdws*hU!$ zGIZr5OT&XjH-&mItkf*I_lL{ZHk5a{Ff9JTY)dNwOPD={(t12+U5F1vL!fK5E4*v5 zvdZleFmQApzygZ4`|;l@;*U}*cWnhRl`W`w0PFkz*7(2QWwY}VK==I;5a@gf$WFa} zpX1Ex5^%ncyYPEY{&UuJxF2E?U%kKLC_z6K#JR~$msV`BnM=rBU??%vt6pBA;rY4~ z)!Ca=`j`Ok;foCA#!9M3+XPx~X9x=3;Hubt2Z21R778YpDm`;)R4wo9>1?idCYTLd zsC@$gaqI~mP9o?u!bA(0(FGBRmeR`L71JK_Zny+6@~jhUwDe6gKCogmr4 zECW3oljt=#Wysukg5$PJhqoS(paC61J$h%D$?XvVYO>+0z2lDX+h4L-Q#T&JWr&18 z(Q5~ulif-Ky)1Px2dk*zw{yh$0;+&%zT*2|-|kJyKRnUQuWi!F5l4208%}*6znadp zPHvq97df@1$Qnt*`uE@Z?b+GL+y#5>A|+DKx1JanM1Ku9lrM2P1FlY240=@DavLTX z4c0jC>sh+E*NjtqTa^~EPV@poRTb(lLXUjVa(-s7xU=mvt-4}Fdfdf`{?C{1o^FP@ zTmqcCv`Z$K*ZaJB!#XENq)S~58^SzCy7&$)SHtinT=#w0KJT#=a+LOwX-O`y+u?ha zIwh}45%vmudW;n@6`KWlI;Arv$%>bNho184o?v@TqbPgOqgr3AUXzWR*Q&>h=<+O2 zGDAY(v8RnzoVDx#t%+yTiFpk?JFUeP@k=i%Sd-8UT{VwyUu7V!Z8lRoG^BS_rR5fi-Ipk4H`V)DVqBBjc?WUxn%oPpFrRECY3}g9U>ZKA7zt8*Nv# zg0o?gb=>pI@E&bq9t?aw?9Vprvj(Q8vTxT14F9j(pYWB#r$W64sth5Z-RoOx$Z!sjfzNjHp!| z(n&Lj0-X_*J@qy^vY?$Av*>f~lS3T6Mxd;m(i{hF$!gPKrGd8_JGbQIZG5JN`u+|G zHSvIW;7`^L_t(A27@%<;Ko41Rdft(^Zwd*~f7CEa8~+3gSUISW7h(haP4LEOwKQcC zTHR34_5;XXw7m7*A(i^)#iKKa3^x^`eDCN{P0Oo`l%K5%R2t?C`h`D_8L@~Aq%9a* z_Xhs<7p*qV8Q~jUm?;pDD!^uP6CR07C{0sV45d>->a_(x zMj3(CCMj4~!Tq9GN!lA-#|p^kDRU<|Q{?A;)1Q-9b$gt%%8v@XzCgc_rqM<<{Of^C z%mz3*ZN&XY+zXGbH*4F%e)?0>&G`LMRs|b$F?=8Iu>gyqtY&nMxp$8_;Cqp234-9X z1V&>+Yl>aU-5}LX0!^y|*<<$eo@U1Cp>LLDrfWOHH7wVw1UvlJ=FK(AIDL;#?=H4= zPZ@WNE5htcq+H!cNAvT{_>pwWeg$yFEcH?lj;m;j_S5$<5F9@;$EnX-)0&L1~l#kqRetsN0AMwc5i>L)krG` zllSx&($1dg_ih$tic?t|*jOjt3k=FNO4QJuiJ*|g!%(p5dM_Ns)A$tB%cn6p1&GAE zkEWS)`GiGz*6RJq6t`n$uq9GG1@TY4_=dI8iEhejDl!I7QHk5SO2sF4be4k=fvQIa zMO}Cor;b&Yq+dE=hcr&rmDsoV68o08aa^}14gb_WUWqrLy0-g*0kn%X6Xx%SNCNxnsvRwSElHVb^_a3ISuRfl^Pm@ ztOd^2BKI|YoEwL@5BTeKael0x&XJ70>aoV}^JNR~+nG*cA2y0QtBx{kp!iequQJQe z{S!fP;$tiXYQ89OyL#qLqtNozbJAg_>XRIk+~w)=K}XoI{lW@IR8{*bIV`;x%u}g@ z9p_nHB_%L&1t1Yy@N-6#dE1*(rzxIYWFTwvg%IM$N=)`4OiC%Rq0IF|6e`xdR-|ZO zY@?_M*Vhg-k1h*+Fk7h-oRtnnPEagYtN$2J~y$7+vGC;-R6^Pk*-ItW01iMqcKpC=ss*y)Z!atSn1?@vw}4> zH?0>>UDs#Y99uqI?GZWJdT%k#IyZA|JEueXYJKwdk^ENk4eY_u)j#SOuc7o9Zg zUX`+T7n%aj6iQVn%)W!QwBvX~+njXLw;LgK3!SbPEN&-pMcVi?Z_A*CebPz;tj?+6 z7b>vMa%P9VxmkC_x*M%Imk^c`we*_#bo9~w>il`QOMKjigm!V^SU$9<_ubj23QDQF z9Bp6~w|Pv5tB@{9wtiT_lCM5_tWSboW2>aENlzuIx|}Vb z!-tj+QIVhOl-`77SC{g(L&-S^15Ci99sC)3rrmX`tNZi9gaH1jJH2wnh+bo-Oilhq z@KiGcA-{RD2yLS7cT6Xta3e~WiDN!l0^ZrbNovX$0&CGiee91jT`r!Q90F@g78b;P z(SJnJO;f)3Fh9{7d#AN1A+v%iHAHvyBOwSJaE4={mEXLW3_3fDb{4?3yH&=K=jZ28 zm^B8A>|(BphPC&GV3I^@=ce%T8L@`ZgNu@J-#O;EglGC!vzt0N-Z8B>OfmIsha6p3 zrz+%mVR_2iPm5I<0>-nH)g$=A^9?Ww$<4IdQkWP)^wdAmJ^X5a&jncaZ1?atS|)-! z$bepHM6af-w(a;5;5S~0x}eHwLCHwcskfiJ{e7Rsql?a$B)@bB1nkd?KlT2|C?06Y z*DNvgwq~E@zU5km&S#aEq>O$X2~%#F){huw8#}(9D#GY8v$fx~T{~5vh%|W+Z8a27 zFCppPs|?8@i)9R&w&2}6&O9y8`jT-LS!YJa@iTK_4kw7JXKy?*gPj{yAc7NBqXze6 znHlS9wROolH|HZwT057r2;t<*QW(PllUbW01VS0dBv2hPlkuW?IiBz_yIB|ZtZK6` z8>wB-a3EXLHu$V8jtttK!whVcifjDeuw`NChB$Z!3Mev7TH72qj7{V_zwhCCklc)g zOge00M}VihV8xq#mW!%ML#DtvD~fevwu+n6s)F~FR9})^`Igt ze_+T|*VER-z(v{V+ZJUVXIh={Mq!*ylX~@d2%ogl0oUdt$C#SIxVYo;V5D5!3#@n0eXz8PJ znViN2JBQAkDyU1myJsW3XFwSoBwgoQzA--VO|5v|a9wg-T6$dQAj{e(GX|h4OC;#Ot!ptpNr)yS#%Jai5Va5UCw7R5J+hB}s=iG3e1^Oojbye& z9^*2eoBbg6a9ilH>Ff_3XI4_r>klyYGM0O(bdnHT(pA*GN;+94kIi}x-SuleR}(G}*2a&dzGBTFLxbd0S_aQ8Id z4qPC=+B?3Aw?ltT`h^ZsFXShM-EFhH#X(T*L+NaV zXkP*rcex0V1dHJe*CfU_NsKX0AfAn?7H{;sKtxBSJ?HsxfS`c5!)$EWeDk+SR8dgl zM25C-J$mZX&wc}CERM&nB;fquySIct$Ci~D=mhJAjBx#fnd-%#dX_7yGLWruNMjFO z=6S3%8`UH#ebY@@w5gte9EPGN;^ZxEmf72UyX&RUkPLU%F!gr(X-)mqop21=IasJD zF=maqC(#tJDEBLLT13}~yGjdF{WT>rDigQ3YsQsy(%DeGl*>kqZI zPmD|+u zzDCxyLzPux6o=d;syQ<32}!};=)(ho?^IR`(b-KT%I`4VU(;i}{$W*FdY9K~gI7by z$N{kUY00sCwts(b9vg=;wS`Az5KT#W7Bt*m!(?ofB- z3d&hIhGSw*@`>*$opn4YwyxEH_Nj7DkBYL2uyYrsX;BxhOO7~?@tY^=?_2`3H6T{t zS+|C1hlZ{%#;32>RM6QyhKyTB^+tg0!!ex!UJ*Y#Pr$8v#|ZT3S)bkj$JSP}$E(O0CLW z_HhF8NO^~F`s@4T(^-`4X)nJy`1Sw8-g`wgoxX3s{>HH@jue$X(rXZ;g*qx7LkT?u zkP=!5ozP)MnnC~}^g7aOkN_c}jvyro5b2PB2%(5TXi`F(m*2s=)_Nfgiu{IKUIZ9@?S#4p~Aw;Y9%gJL+E%L8mYc_p@ zt*MZ}KZkNvC5q3$68wvloC zm#-?QR>0n4uWdE=qt^`hl&sg(`xi>rF>iqxKRwhFqECH~`9cnWzI zc}*anMDpgq@7}PiHYv#yo~oH?(}}X6_wCHydQF6FZ9|OFw(s6g+{+zo7p_ga-|TE8;8A1+ zH&7Fff#@P|MVhl^61aPQ;aGi>VoRa7`eHwauSLgJ|51_=@z?UbS4BfMHbb`K3Aq}K zuaiO@!QrQh)BJ4?jY&(=-cJp>F1`FgB#>e2-tOm;3<8sxgg!ii9`9EcL_|$NSk@~Z zjgKj{hHZ!KR+{>Yv~yw?rdI)(=15zQ0_ECaqsebII{`KQsxfw2E;G}PZ)@H31xhtq zu3}n5IUeHI-f0_B?qNcANrvZle~y@$ZJRRU((Cbi=q)-4gzG#fILCJcPj}?X{O<1G zz^GSJ2++1YOyw`#7_&HRAxE~_3ocknD13;m zzX);wR@O4|9gO+bk1vXPXu=LI*}N&9&sH?R+0EJaW6?(|8lh0`7Y)BCpu7hsRmwY9 zwr8@bYwVywZ`H{E~VXaM>?F%1I%ifO`b~1sER|Bd)E~tgSDA$>l&waz& z=C1YzAbuR# zfE|Hx0yKO+^-*&3V)@Bz?W;1fN}+>O`6VTbd4YGzU6b709EGDY%Gk$4H&U8tA8!kC zh?w)YC#97Q3QOhLxVlM^sDrdsTi&lW^`nGw|J?;!CG>#9SHvoI44Pl1sZ4eryv zPhZO&#K=w^Jt8Fye;=kb9d=?9J_PY5rRA$k5sMn!@Y|F1p*0HQ2a@kM{s6CYVOe|5 zhu_Ev7xbtch*kIvVOQqZW9XQ5xPgQvg@8+E_zVOr%J8x3GwDT|uHbea+3HOcd!?q4 z_z_Z@K=fy3lugGUGuE=VKWWTE-h3dcTkWZBB)ioqg|}UcvETDptnv*W_CZj$zBzjP zvHIKiHEm9+Kd*J97SfFO;>O4pac`5^Zir&kLDxUy5sqGj?;4H?uO zE!T}A^K!9ZQL9zI^i*lXR8qn6zgM(q(LO;BM2WgJIG*C0UrjJ<)TKx1O1u=vtciE< z5kJ!>ubo%nkuW0k3FfdrF23BP9y@ir%wX88HrOyX?EKx7teAx}oiA7KC)#&$ca9pJ z_l%yZ!4qOUKwdZ$U2@|H7T2FDSvpshSZj}CmMV!014HLy!EjsJeKo2R{&bi zM6hBt0*3HiuBZ+2#ZT=e#lo2};dlD3`?gWNFsf20qQgh(5KF3ioQo5GZPDZW1j)DL z)M7bk_vm5B1!~sdD}UeyW6`hAe^IkooHmr*X77A(%GbJ=kSOVoUU91TsKwD|v=b0-FH+nvO^_WLW>B~ZJ1PH4eKd<{j`H?*1Xn)b(8yUws!u_bJv-P(x}40&$a7F^@0!Deikuwje~B{l zOn6k>GJBR@;&+icn0Z_+U0RoAC-|1S`7Al;b@w)77ov@%WQ&Q%|GrP=3zIJ>3-|>e634nyzD8z-U-WzE>&T%!eDhb19lCkC zzvrKbgl7#bSAChv$&(tpPF3mr6k2aYzy7&WnuL+q^Y(*u)?Y32r~|o6K%Sli!?Z|> zVPnn?Uu|hqDLul(M^P_f5w1T=>GM(EQ|*hI7nxC3hY@+jZ1U7ItUVelGlpv+?GLO) zj7WzYs0AE~754TPaho?Ep3Jo|`9Ox+e!5w*XUJKL(=762nm@NcN3UC&k5pi&7)Vlr z1~zzta9wMXFNU>Jff&W-L9eEa^mQ5)GG3$M?R%7#z3Ej43ud(Bd3e%`4Vc&q`#j`C zU6Lt!(BX&?UY6-fo3w<@#%a7{Cd`g|4c2309_s#LWM!RrW~uIU|m zsr0@;=Owgf_e0b4(fZqxHqX=7u6r?7W@M$0YLzNpvwDx|2|;X!|+Ja6OY$Y7H%~k z@16OV@-EK3M^XiFSWfRYCX&)#F z;Cnl_8`H3&Jq<$KKh6;yE_GyrGoS7qj*hQzS)2EQAq0vB?JvABln2KIr^`n;I%_Rp2w6_N0JBa)FfjCYh`!)OM3N@#Yj_+EMo$v2Nt zUi+=(fIGS#*7`ej063^6ah7ZMxY{jw5Lq}^#=>wfRpb1H_)MFY;g^LF)7A;lucWsK z10v_}m;QVm&#`h%_@{PvEU-JT9PYMM;-<83!;8-U;4-{@I{ zWy>`sCwORn8r-t&-lbmU?gq{EDCeH|&Q+-TU}30NBW;tL%bsrZ=3Qpsr=+&c8dR!T}Y%v=~MAGou|#~q=;S=fA* z+cu??%9Gnnct>q(_uH)n!y|JR%TLoHtUF0iV-2eCe2vCdUniJq=Ck{mLDesP@(K|? zgX_Z*X>w$|>AHoxb3KyC1Sc8~eY=!u2D{~>p#BSQ9%^+OOv`3SWt1}EI5pp6s14wW z+Zj|l6w1RbxjZ|XF;5xZ3gU#*?)3OI#BCBDX$M{)i|XoHW{1J8DrI(!$e%j({1(0p zN0N&(OaFC;d+0yn3*^d8VMh2$1@hTPhW*zw&1k;Q0|MUc#HxK*4eQRaK91m!zi@zv zOwO62^6UCpq>|hQR1hY9ZdqFNjE4NX#qCvZE2th!f?1;A&~oeRhJCtT_k6!K6x zez?x^UaQ>7-d5STx<`$U`{tA>$|4O)5DP_MfbdI+C@P9!AC)xICqA-}(0C|jD4^b` zer(Xt_4O;*4mpzzjHb_Nix`OE7Ny;u6?Of;T#R2!D*wF#h-7A&oof8S z`G4aPa1ju8_++SKq%AWGds1d&(BJkW&7ny%#UI@dKVUJlX`45UH8ZQR<1jV*w8Qag znV6LQQTm4MwpRz5HqL^Gbje~qCnGRx_*$*q>Ko|f%@qBK%DY;>pAajOzaCpOe;6@p zXcBR127Zx0($t8~U!YMm&%4ujYX?$&eEjtr2*w=;k>0H3hPZyYx3xoLYmc?e5Ab&A zihzHRBJq{JNxdSqV5J1b(8c~;i=J?O(l(&2+LbbaC5uad?b#0ZIz$J)Q&%F7>F>v) zqJ5CvU;1Z`u5ZuCD&^Sz+B^HUF!$paby~|0@~2b5JoDk0)L7A$m!pj&@3+>hsN$f{ zc*i>h$~(in=(2ZX2_npu)2_9x?KKLs`{N=&Ej(agoAGMa$LNozkOxDt2kNx2i^hcU zG{2*^>!q!Ku-X2h|3u-wT{sjsA^P{qGk&qjrU?<@rLQwj+r)GB;y?MJj04t+`G}$V zm`B(}%#Ax|%%iBaP(F}%KTeW2<)!DOLp8kmlc}hrKiBGCKGTxp5*w{SkUF_Z@Xu^& zzsSRmErR`vr}5QKUx;tKyMZ!@$ps4AwU<-W&hYfOfjcX-0ltgK&a=~$$)C*q{k7uh zxut>?%Z2>zF(j(%8@8hpURC^Pef+&eVoSgSj?K>ZVVe%+X9e3600zrzc zP{%8ljVT2cWkHc0=4Jzu^#TXzcfxnKpDt7B1NSO>^Z{V{a`vEaMlZb-I|pxvrXRL=aD%%?b57lwAWm)RWabUx0)M%%1AcLmHNV2Zr@Oz zcoaUg)GPQ+N^ed%tvB~g=Bgi{F2SlG=;i^UDI1@nEA*0!PfkrijA;$p*O%(7JAYdLq~hwl(ZT7ntM@uiv=|ZQy=-iHi1SS6)Yp> z4P13t3B!WoaZ0;^_(efkF~5_l)%f8`%Q=4x$E%g1lMmBRBz&{J2k&Hh=%OvyF?ky{ zUI{;m`qv-?x-C&b+K=TAUKQtraDH1*#4ph_%!8_+S$-4 zi@x_vJBV+MKO$_T4^x$v*Hg256aS0CO9!oz-6jZXNJk(%Z}w)B$BpE2h^_P59p(9m z4+^=zCg$EzA6wCgD5rLIW|Oy1_mu6Uwu_4il$2NAmeZcd-nho+xY$rz3V$a4aLk{)Y8L%>!1} zhTjrXyz1(bMExIo65GK*!N8sO@w6lQz^G8idAfs^vf;m1kP9c7?r;A1pQZl)it&-k zZa4Vn)a?bT&Bqyv|_x!=w^rl>v(- zV$M6!h1RNl%zA-FW~OzmT^yb~ZxQI|Kb&Rh4bTv7nRV{`vP-v@7lsO^-eI4ct1p0{ zBF@#7VvNmJ51`WIaGoseesAtuLx<-s&Y8*cN9D1ZoyPKpCZsRz@UL&z$tgzgIx$!pf8w_&tD8H(w{F2KbDaq6o?j8=4#P&_T{$ z%d90$!)ofWEz$QBhJ%(5P7X&mfN%3+0vEQ$?JgSWrK_eUt>Vb!SwgZgz-|70OS;fZ z{PVQ89xtk#m-i(e2|sc3IgV?an+&qCrs8!N4a5zbHZf9c*0coP0`}nG8N$%M^w&i* z<0txE{$+TBw$$GG%Lx@kABk!s5vIyr@)|4ixxl{m;VjKwt5c0De+Fnhu?2EgF3S>f zkY05mID28+XLC9?&K*BWhU@$+B4w3Z&)DVu^UwUam;2=wtJXJf2ui9`jVl?>sYFcR zI$f9vZ_rcZLiq`i`AbN&t=g%|U*3U*s_p;$kp3LZR4F(?9yl%{=(d&gpj@uuk#xN_L3Jr>3 z;{>dSQ`}`zc|*J{pP6a-+`u$M+IaAV2Tg6ht*N5r88a6;!>wDbw&6>7(RkJMZO}Do zo0u1>m!!AP;I!1jR_&E+MQ$z;2T9g&42Xkmd>w_(`cs5dpOd@I!nu}c|A=@u$Ip1eC^(J?>fhdw+OkW~DEeie%X;IsHd1}rpk z*6X&eN0GVxEMpXc?&WX|XDO=o*+4dH!s3(XU`Vw>8--OwlXx4CPS9b$xKZ#+T_qVi zT&j7H;(e3XaJj(4gX?$JsfXMkZ=)Bakaiy1HsrZbsgafie#-HOFQa6{?T%`>$c0Qt z&Mdb?OK>d}jUm9oyR2jy=AI?_e)_DMm>jeMCfH(>;J@qTkjl*OV4os*+y`WC>mcsu zN>x)|ttvUZ<=(pJ_QA|baZAiGJ}Oz+SgNfzJsftu*EYv<_oh`?|G*U8(YhLwkP54| zFbid|FU3+FdgpH#Z_1zY!YP<7#e7Xe5OUcnGSrvqW`U(pD1{k@l7cXFzHJ+MN;^mi z@y@yG#Ire7U~MfpHsz?x*Y0-vQFsskB!reo5o0`MHUTvA{oP9+Si=~Q)Wk^kP zPoY*144Lbjc5^1_WLxQ3?e>OrN_NFzZmvTABTrn|MnIt1=G1f@#{W~doF$1=Q}bwA z9A?-gAu&_VUTdIo|IVG#-IHf_?LX}7`J~gag_tIo5z8U(sU#Bl+|4xMcBvh1UPTHe z>%5R8YMzfqsz;fhJ0*&Ld!X@gP171Y1&NYl1kc$RtA}@Thyt;WqEh6Yi z(&dmij0sW%H$N$~9u7B0+zicyfT+T`MfKO$$%*BO`N%(u>eSOhg&~b*3LcCKf-lM9YBP7=k@SgHBH?9~SeOf#d=kl%&1H+R4_V z^8GQB8TXE!PeXnT+kUXzew)QA2(fXkPXm8xLL$=KnuZ~(!j;8NeXcY6+3UKEL|tt; zh@y&wLX*vQguYmxxDa0dm|k4#Q>?Lt?Mh_C7OaUsCsvAd5QOqPw1v_Q<2X1dGOIQK z4Kq-;3S2P!u=rCozHkB;Y1zx&{DV`VTE|vl zbA^+w;@dzt>lWGl=x*giRH&&(pLQkXeyZDIMczq8;+a|ma%2!cViseh*4xf3AtV{e ztd^B;ZEufg^JhNtsX^r4(X7NX-6r!zO-$s0^5HXfjrLRKyf*dA1;f)DfmcnG?y3BH zg|GHqYpU?-n%j1k;oaT=(O!a?qJDdzed#{aY22=}J6EXl%und@|8wRzDXZ zCo=mAL&x#tCf*;$Z(s--8nIsG6EhxyxA;Q7D@jURVV5k6-Vf#KDy%`uJau9Ra%1rfgr@ZpKfw{CIfM@n&7c zm?gV}Ru%l1U|s2ftnx@a!1115n=oIt{>rcO0G+DA2J#(Wi|=+V{^@Q5X==?D!(aB# zQh6%6SHU37JdgcPO_u}j60W;NGwj?&3emhz;LYlyaC+*T{~hRX)A-apzwdkS3qw2V zhUB~*nNR%M9iDtnu9d`AM-j);VwId=fCuNJ!vkSbgl=p>2)#Gy2o!JuPq@5(1c}Fiy%}}K>9wNoll=1DKiWM?NmbWWKCC-|rp^@~dW~#}vb~%bX z6;pJSR^=eY4d(LZ3NxVmC-m#lRqZ99q!0~%b1Up5`M2Tm?f)!C#9T)`ZfT8X1)CXXkd>?G< z5o><2!Oar)#ShEf%Ij5Yh(3*g%ad^Wu!G?&lvpZJ&1Sl{lWfzg)YgJgMuDL_>Cu`| zwrHOt*GI{>fCM8Vu&nH|+n!m0H@Gc1D|3goy*zmcZEfb(S!V#LEttA)&txU+)~Svh z3n`0~9PX9V_S6DZpxxu0gk8t>{|TRZFyU{Z6a>5s?#beP)q%*&mp0nIEiHofNuU%( z8OL`-6=)LBV|M$E2BsNHCDg45;em|uhlJhzmB^$TwiUTKbGJD^k@Bf9T~o7=?x+^8 z;n4b;#_$&uaI|0BvjA>qbhF;pa07OmF&_DldHU<@3%iZY8OI;k2ZPPI+8Jouuw><( zQjUjI!z@D7Hrc0mv?P`9{=|01nxsIfxDxv@R6ae{nLn^Nr@M5A8nQ7!(!_bmw?zut zZ%7Lc9GXXIJt2kI)IY!1IN72+uaC`hS)yn<(zrD}y0B&Ez@h|GbpLy&d~1A_>n*v4 z-&dc^&QSHm2HpjStS!*yTPffFz49f8-lw=CPRTnLDWea#rQUiWOQ+5I9USewP;`)A zmB|;b*r{`myi=w`MkH~!aLk4I@s6`Oh6ldhXN41`K?Lvo{zA`;p?+Bzl`&Bpo!0a) zH(tlvlV?e8zH4NLDGEkW8)#qn>F;-u^v2l$70$D!jKm*O8p}HI43wbeot{d z1EiBx27xexOcC6Tf4Bh*Fxn2wuMj61P*ra~H>>K{xO2^~TX3qXX8=+p5qj$&=pYI$ zA9}Tp0dSJG0${Ob;0V07A~PZw5be!)w3+s_x<|c+#sl6;%&s`KA}6fx9Us~aV>Gmr zn!8NzO!Yf|*uPp9XjIs;`!3T-RLe^miaS?ma(HfDvHuzs^Sq0+pvqV5;!>C8?{VXi zL1DTD-I+ISIdM`Otk%xGwIrLA+GID^(3&g%@0CDHc`?F1aM*?t0h|4t4^?71a>}&A zwG!bg>NE*GYgiSRTS^|p>a};6#?Lu01lNeo?VLNDk9O5ryY?X1ezAq&mRME`*E_rg zDQY<_9?&DUN31|!Q+Qr)o1T?E-kT`qxp2L-mvr-+<6p%k-@k2!^>|_O2A%pFD*Jxx z+Xl4|BfB}FuGmYE2T8aKS~=J|(7*BHtWvmDvFqz$^^CRce_$R*^Duv-14}E1RikN9 zz8+c5WmD5}L)AM@8?Acp9xRFOOv;C)pM510D$dX3$DyI8k>s%7F1CwSYf*or;R&3& zEl0lS!xQ=Et;G_HN1Jh%bBs$1+_knE>nbC|-qdC(|LX+j;=b`z%QqvQ@()nk76Klp;-LnK@pV($Y3Psu9TrPFt-Qq6geoDyN3T3>wY9%~i?Rx~F z24Z97#JDeMwk2Vfy3p4{<>}S?V3&0Y;5Eekk}bp;Seoqtz7c;Y!`ejE1C|_F(6jjC8w$W z`jxjfT|u=@$m+T`!IZd{m?KrTfc5za`uEC*d*zI=^H<5+I^OfPTqAC->+_WuCn0_( z+1UDR2V2hv4P~e|BaM8+2X6$_YqMuPXL}3ewapqbezWlsoh%DrrweaC>^7f1NijS0 zxLC3N{r!Kng{w-?x)}zW)JCSn*?dK>AXT;NHi7-Z8+PR4*}fK;0+4O59BG$)h_P4x z@tY=ivW>yMW2*l$3yj!7`+V>Cs5kTDbRw&@h=%(6{^vKnD_0)QS^oKT zzxixa`O=cSDt7JliIq}Ly^sI<$|X4&z#UQH{AYTw557Ih!*-7QL!Fyjay&AKnII+Q}9ipE6>sol7u6h1&Jp=m$_BtO-13}vQ=79_WpJ7y}OG|vA1y++AlJD?Kc)krwvt4U;lTB{^#fak)@!3(vr9PU|XHkS!BiKxUZ_Zr6r)3RdIkDfSNaQWr10aVH!X63WysRK!G{{ zxjrUu+rzeh7RW&sg>UNbCC>YGnDe^wRo=28o5|TXa5gM`urbNASiq@Nlcq-NAF?_~ z;=!gdEl@y^O2EcQUD3iFByOx$)h=o0@o)XT(@Pt^2N(G@VVjX6ioy^`%e0lauIMi+ z2ML)AE?9A#C5W8M@@8Gk^I2f3DYq}uCi?TUHFWMr^6aV?N8)!cf2B|$l2Jc1?&2)v z#q{EHm4W#Uv{g-C<57!WX(i5lkYYF<7=SH)772W6j!GCE<(U38s>saYS?0}pB&pKX zJdR?hu=yTK))oI!7nW?%e?Qsqq`@PtFrl&OQ3X9MhT9Po80er z-ZPQr+&aV7**y8?74K6nJ{AG5(>hF)3hdz_?+`y-^{{CY;zd zq#l)h|LQOK{@#&Hj9^mklRyJwp#~wvMoi|`+u;?y>l;?@GcyxEnm1n* zRdlGK#$gbB)m&k4!d)tDvWyDr|UxQPlpb|Je3nUr;8g`>1t5Q`PVT+pA=|_2a z74Q~Y1X)tcb%fJe`Ra6==3%o9DAAh%J8b<(o!>A6DvOV6@>u!=?Tg%;olwsRB1Y!O zbW5&zr}n0nF3KOAkN4MhfYM!B`zwwO|#G!L=QWzImF~!M#_F}6{r>V zaxVPquck{^cUf^m!wenv+GSv0v39T@*8&hKDSzCu-t<&#q^I?lb=YKTkY5e>(~R4O z+~Q3<{)GFUw~~Txg1J*+P+!03&{1?;Uf&q6#rV0{ z-VXL8>Apw>?i@79Ee#(c5gSAW<)}#Rd(C2`K`cw~nzNG{875MPH2|;XcKH;hg+UZ< zuq9tkU}Y&G6F>6`)S67mJ_y*rSgzyXKIyJSsr%07Eb)8nL@fkd`DbH_44RoEaohw|qU!nInE^{{banI8fT_?SR zF#Du09v{+_9cOcMi~q80ch1GnA}%x6L~sA*m(>Z|-d6-Zog{&=(Y>{W*5Hg4pz{%K z1RniF(c(}WHQdg{@bt)_+1_qSTDJql&dt@n;FOa_v&k6OH8b_G8Y!OZ;)BzIc)Z#xTgFHmf=|Xt;%8a>vyj57i@(9x&7aP~~gEdMCger)*Z3)9kqB(ejux z=eXI%WwU{$ot{|dNzv_+P4BBc(^yBS&YtlBNTefEl5GSc8yp1KxC4`#dC}3n?;ETd zai)f<-N10n=E7J>L6r`5f3G}j+H(t_nWMnq;om3^tXy!(Va%g2@e}mgOJ9eS|tr0M<6!Wk_x|ZA{VV3&nTFdCQiQZ|yJLe(~?s zx=m922XD2@>U2$o1$HU0H)_tpVT^LuA4(vhcf*4}Ixj5LpKCKO%I!=Gb;#lO<9bpD zThnV|VE{iw!pnJ${Tno_EHd%GL-!{ffd#uMY`Nx{YoIyWkP3|}wQf1xZj!FC?o zC?7aE7<=u(cra&S5)BhWDcX&j+i__H<)Wj6E!EYY_z%+zw$AMbbsMm%F|J^!e6+t+ zVi)wGX0!HyT#)b=oPX3bpy_D#oB>@f4wFT+r3Q3-9)G>{OhfWf<<7$)%3)14fN zsFKodzC^FVvx`V*^?WdSg8nJrY&^`4&wfMIB5sFZ_wr*nsIU7$c67g+a+vqUP(Gu9 ze=p=`qocN_rg5>5963#i&L<8-9P`|_?I(Dw403|i9e=`&*YATR9 z2W`61n0{}sRCkM~#m3yYS2fu`@8o!g8a)~6P_yTCkeyfXCw6obGK0tW;cW8P!mJpr? z1|yVcz&`y3@9+Hva_8e~t9owCzCl_flCM3maB8}A`bVRAm1^cusv5FmtEy(=;azL7 zLsjf-O@-3cfKQkCM)Gfh3-mu{|J}IF{jI!Tv4(M zAa@g1y~1@}7b;s*MJ^ZiM>`34J$=oTIYR6%o?h;PC+wYY9EXAFO#`>0<$2}`jO9PHSZg%9d@t!)4L*TKzr2GU{Az3 z>q$5lmzb*(CT=e)z{+~O_9sMV$?e_^tJ2y!N4x4;`H4h)lTFn}m zK}j8!Dh-mb@LLbp?(yo%daf!0En6)?0Jhx$zR|T*Zy>!$V=f1l`YPX>2X|V$nrHV_ zQ^_+uF*{Wn;4qx|Gg_Yc>o{~$L947E*9ETf9Sb5ovm*?ARcGY>un4nr#s^Z^h$Y^VzPyPQDx^;u;kq!TwlYX&fnwt6?uE(tb?ON zQi$68^q9zZ?+Tv(^>JLT@!n$%n>G;IF34aK$BHc|$%FcykDI2SM^yHnmh#lZE|-ln z4CBN|CJ~Xq*b?fghUxV-#(eI_?~rM0TPf+{FF#N7PwRc4ZqVB2^0ku9QhGF*Yo5)& zO4&{$Dn#>3cCY(;7t6=#%YFRo1wfVe{YykyF?KDkXP3N^WrBi<3p2}Ub4;J2$#6Ox^)h>G#`S@{!TmfJzoC@JhM{TavgeAazTUG|Ta zD8$&UEXz&~82maj>)zv4b-hV;_i#y3_VlQ)Uj?Y=+?U{8mm&X>Y64KZi=mpHF##KB z4K&ZNg&rdUD8>G)#R|ZuX$LB?v-Y=sB8jbA^AI04cg|f0#|5cGTLh91H5u@(>)>Ne zSwi4Uqs;Yzp3SsI)XcZ~M&7;MHKr}RXJ?_C%&;A;4~}wJOT3&H8**v~AMN(+k`~V$ zL@YB$?6o#%?1f{s!qr?0FbvM_E#1Yy4~@#QE0|hGpo5<&sNccXokTeu+4*~jjui9> z{>KsJW>4z02yKSks>l^KGR$fZMRY-bUyxZKC&3S+G_+LU>H0^9Wu?@*M%`GvejiBt z*gn)gDk8VgZ7+WB6#T~@)8g$mX;gEDVseae24O>5w`psF+%jun)k+l)9?pHyI{$-B z(TasvB`?(WV_)^}TbnVJK-14LlU9-<>H4P{Rua;c+a!cyx2slF4WgAluw*QwB+s5? zic0tJ#jj{6J80>8o_$+xF=OCj;4S`r_d0zriYeojo5{Krhf^I*URM6bumU@_sZ&FT zIWdJ(R*FMCnm8r-enf6oMD|!iaET6S7AFR*D2S4cWYc{%dO@Nm0(J^r1Jv=@a3{KW zzk!$Jh&OZ7=~+* zoITE4X{cQ}A1S<1P>?nSYf9v9n*X~81{c!^loTjX7(}wkQfFte^IxpR=kbFgBw)}Q9VRzr%pp#fyvQ@;iqO=>o=8b!I z9)2o2Q#Vj?`Q9u7)v$S46F{j3*sf@VtSI+Y4#XaNV8F~>qQeV}Kn7%UMY}%$m5xSW zz7zE;Xc3B|(0}$4U{+GdjaQLwDI-FRksQ@rxcX;45eOWWne1vQO*E~v`B~7Z^XH_N zVN5sdWlTLbGZd|7pcHbp=I?Ii(fT>!-0^z13%%z&U1}pqKfvuykuq-L?A)cIpnG3w zV6grWH#wu)?FdoCOf;$C7Z^U{X^k_*zxS0;3Vt7M4$vBNemEHmh2K1$dPR3yDw)Be zl9FA=G=TY*p!d&}5k%aA^ch)4HrCt;pSY8Ketw2KYh~#FtbC$)#3$nQEG&JdFw!v2 z-Vz-UpM|lIk*C$aK(Hxg)Z2+EeV0_{Te!XcEWbiyz#i?Lp1bj0z%WqkwvmR}(axDj z-ibWZ_(;p>L7stO5x;oF(zt_ySo8Qfmz3v%0`rDZlbzQA(9RJ8AXe#)BCmF)5M#u%1%g6( z6+TQ^Zji9JJ!fXn8!{YZ_h$gAmiGaM%Y0Ta^HIO4EEHhzWW+dYVIROBx7nG#yC{nJZm6_PK0y$oZ_U5RJTs2e3-_=l;FINOs;$V%XGq=J_XF=>7GUA?>5L zbs;&eIcVxvxHez7dV1FI>?<23?B6SUsM4-#J`A@{ii4U^_V>=Tke;WEEoiX*h`sG9 z_$bPjUZkF#+Bh~DZp17*U3s_dHL#Ib^L3JH`ypjO``{?} zrNOi!6&D5|w3#D0!rbf4BConl1>Z(7n$zQYq#%lp?De`IwdDUu7BF$4^%%-k3e6Gr z&YAj^lu3o&i#R(4d_Rk3);;B2aqYf_ybMTsv_|OO8P?F9`A4W>2;M|S3GUrVFuDXQ zpTxJqz33F4%}fLB(6c6S%qQEwhkgV%>y_$grn)WBR$F@XEFPD>ts&#zmR1e!ZK6GJ z`G#>rPGj~LY*3kX`m%*71gx(wF2B;3B`SipcPXDcyWH!P_LZE|Vin;1M#WyxVrW2l zeYkcF>n%z5{H0pHdC3b)fm~$)Uec1Tb~r*VdPmEGooxPT7KyBWfnSFm1POmUA*8i zd`J%o7e;~?Z1dWln*cMV&|!N2)!I_K#il=EZ6Vj;h~2R@d_ zHUBg#3Sd}CuF*IsWRhXR>E4Ty@*CG4(MS=%;hk}Wa;wM^(n0Jh1LuqC^(jDqa$Y;h&Z!hFd7;sdy@Y_RaiB4-4) z*YB&rD7P^1Y4F0gpwA*8H<(wfNfYZMJ@<32DVDRXp2V764$Lm@>c?~oee1K9bQ8ut z3!)2>s=4>_Y})7kWpV$tz^qXu{ogBntv&X0N*d0W1j2?7QXLV0&o$22N;-JkoX1$f za6y3u=H)Uj;GdYJsa98!xYW;DF0abb&<#jkeND|2e{XyrVCIK+NweIDlU1xGa6F4d z#)2xSE8z-{D=+l@yC@l!@)nOt5;8c$1WqG=`?I}_vatvz1F8|R7of^~$wV%V*KTbd zdI`Jgf*?{>$pLKI6A&|d@b4Jh)CkoE00?S%WM>t$k~j^R+@Ii`sXGYGMU`z4Z|>yS z7~i~n&G$MqtZs|@pD)}JCZDtnnww{2!z0(lfd>9)(?h#4^ra1DQ9hB+Ibthx%Tc_d zygstQ7KAuzUo~o-3u;z1noetwv&H$h*o!nASzBPy+QiTH~Z)s(jt-!U4aPm)?3m-!78yVMfO zJqK?R4Y>)o9vM|EkmN(cpPXt)DQ5_ZX#4npqs{RV$0)1fhFBDwubi^tlY`$|18Pj+ z>ACvN_(Mb5$|o)IUP73$DQ*Op)p6Knzc>4NF5lo$UtSoWyjSekwlv|?4qL0ytk@lU zHUHLtX$P%8*6M!jKgxKUdy56MN4Rh!?{sum!_3)G84*3|X%XEI=qc*QQ5rtkN5YTz zT(`I0S(i^LvUlOTnx`A(N#{mU8-FXG!)IQ>^DeZ3D)o+xiQ>sUZn-c_->17V)X6tA z@f)fSSAGheMU=_Mtg^6N9+Z3ODcmUA9VR`C0N=a}mvG{En&d5E%0RSmOPQ`3#-EyJ zn9*m;@*)&^^%&kPh`sya8`O)s*>tWvqcjtEJo{kV5m(4~Lorw|KrDm&wnib<-czDJ zFPrU&&^sP-pT(+xb48oEj!o0VLmOccvy96IZrs-A-|?5S0{rl|ir>%~;g>Npvo2_6 zfUtP;!f5m5^j)49Ou93v6N#Cv`H^SzPxH~av!3~M>5tz`r8;*+akyTaUG=~BOd^0bFXA%?fH z_gaye#Nj08-149_#NDNDH6x=hDn6CLf~6r70^gi-2}v%WO5D{whaV+a{L*F@WamPD zyu5r_{SFQf&wq7%tc#U=%iJYLU0iH+i}XP+z$va?w{gTuo5SSLkVxXMR03}L-B=r6 zqx0-&oy~ymKy?&h@*qQ@XI_Srf1Xitt1H4v5ecfuhbr`*HG)pV zn+Z|m`3&m=?Y^omCuZuieA9?lrWx8W>#Qt2T0R04Q8qXH(G2kuXxGSE_poRBZV=z6 zK$^+A*aqUrUaMEqAs#b-_^UVGBeIqC_LE@H?=E$UHk@w()br0;NutJIrP?Qo@A>25 z2~4Ma2c5B%b3&BH%f%mH@K!{>-RRl=lH6L6GaqA;Y*@rIiO@y2Q}oSyG~;BbJG@Sm>QF@O>1?&<1o zb@lHJ#)~4BGJn2t9atQB72&KIzQX*6g$D6hhX2OUI;Ny~C>83<7Pzf#4(+}vAe>z@ zxp)3fHTme2RJYI)(i^vvEv%XjU z3Uu3bJHcN0|G)nC5)^1NCB>aJUL9?0GmgL9`1U`0%m1%G-}}0V+EY9_y_)z?^xX%G z+?LFTWx7kV_QYlRP)T! z0Yy>s7)s29ny27tYpA&r#1OP*Ld-!-HIpDEB8Z_xC^645_02iwkKgyK^*irc@4MDn z?>{FiE9=hv$G!Kx_r8;TUDs!Dctxnqy!_d?5hT%Nx2cHiD{wPIEbMsikhrII>Wgx^ zL7>Qx$%ZGiqN-=UFy@PKpY4YY3@&utOAg|3>Jxbkf7cuYb@AB+3t&NXg`(v?2!e`T zvJSKg0k@vMZ=n;Js^KBMIg&*Gjma-x%8n+>&9-7?p~mPLyZP|MxP;n%#|yffB@=5P zpa+)7Ed(ohSz2Xltu2w5F6x+{_T^n>cOvifsdsZoqt3}$mep?tBRwDT3avTZv;8da zEH>ZjmyRhWmb;?XMDPwf%isxAnvO$s(S^6_;@$nQDZE*{A&(_N8Sd>9dFzDnk)(+h zXKm(mffD)nK>s&m3g7bzU{}=+{oBP7<(6}m+PQ;hAxsp~;WiGNdc4(2my#%jOr!PG zWb-{|yR1jqA=;+OcFWptjGF+jr$~RgYiO8hT4h$cYw?O;!Q#R@Rn)*~Xe>zPpYdy& z`6bcf$c*zPI7WQI`cdP#HGfvPwW-hUG2e3E%GGx6%^dmd&az^%%_f@!;ytoa79ngv0b(@+P@Z-$C2a9!3`n`Yn{eIs%5-f?j+ z@$+b%3Q%v-Z`^-uDS0u11u-62J0*HsT>I64pohCJvZ7>M0Wn|_;lK{1BwRbbX539; z;d%uJzu3_qwo(&3qV(#B+6<^DZTHdM8*8Fq4MJxe2WNp2HSCJ^Fsr9Zx83XP9gU@g47;;o zJ)osLAak^gnQsr1w^llnw=X)a^e^mk0k^e;hTE~EB?aP~04yzD8b+=q?2L#CZA)xb zfGFW*(mr7gQdWAoo&z^tiPFic0(!(}$(4_;vUk~%j8kjwnCkar30=M7%hhK2Uh{Di zrHz0++#eeeptGCXWl`VNd*?E%tB*en)LE7vGm=^z40!$g z*2upa+$Sw%7SHcw+Rv(3bDb1>JbqY^FF?@0wr17scGY*O2u|)cINX7^B~b-_Gq`K2 z5Gn1RkmK`6C-t%5!$22J%Xq-GTBK;2huMmJeU z#>%=#P{z7b>N17yIF2AEHAi0noYeza}k;0Cg(wAKz`{nb6kE>mqyBcd12uaifm#2eJ`6p&NE@qNf zV*D}c+Pn|?k=#tWfEYeXp{R{gWhIQ8<5$yt|@bu7~oqFS67bU;gMGX~scm2R^rW!GPESUQm(U3jeRy3hVV_9O4hNP3-Nt zpVHXq0i|6Qs2Ce=ljnxpJYlqv*zME=!|=HoWt`s#BMPQpnnO(fmiJ!0lp2u!Il_GY zxG(T?XQ3Z^Tw$;{QQm!^^CrxuL(IBNz_LRudgL=?9crU)9;BW7t4@TNekyN@G;p~bSqDurJ!%m65Do~S<7;k}6>}KzClV~<(#+uYr6fc^ z_nbFaJ4rlD8OD=(;?*~>b#_L7M4!$hf&0H12;sy%NkOj$O-<`n#i2rF|7lCpI9$Mf zPNwC>^c6u+Nu4rxSNZL_QiTP~NO#frpr=u_V=5R9&iLVy0`26}l1qAOr7}BfvAo=u zifeD*{LP@@Lx)1MDuv-DPlC>K^?1yl*ZbFp^rgF@zK&)dhTKOM!ZT)2cm2aUfGtvO z-CmDqF%CLqk5GRB`J@5QHGX*TI_V&hUif5TzHIaLFOD)+sQ1l5n%X<(j--vag9DvF zYq>2Njh>B??Mv;8?6Of+H9fZx)kfHlm$gJ?(iD74{nlCjNgEy;8#8G%wfA?6nTqt3 zr4G=MS#=ePELdyfkLwoA!83$B#tsE|?Z=<^6}8*t25BkTUh|@MEi{U#O+$`q*&!`S zaA+5IHDr6a57&46o{pB#{+0S9E0Uxzn>Yq#U&R7sz8NHArmW|hKvSa!_HL420?mefcpre#xlV8>4_Z}D6Z7sV)?t3!n&u`^5x+U@#Of4q~!IqcjA7pKB&`zZL zejOd0ol}U)#f=}69?A3O-zMj$5r)J{3J(eZMXF9~c{BEFM(MFVosK1W5SgIhJgGQd z!OPO!HLkS?u$_R<zO(agR&C)7xmmGcU{dvhs0M|^O3?-haZY~#) z=>J|0QrsVBrF87EW<%D?GO03Tz0v_2r`2Jrk;MnZ=o+=qAMS_RN-v|UcbAeNNftf4 z-00+A%JwD#`j~4bn*P0-UN~y*2Jwzhl0Wzc0rg+)`6GV>-0fbOu#=@;ariRrpL^7! zVvI`gH$y!>#RdUU@0D*pkPKkf{ed@aH>~!Yxa4HS;o!+$$wdY~#hjPFAp5BB+YA9p z(Ib3R_wxq~8$q}7w8tk;|GqH2!}AJOQG4{ypG}J@F=CcZ+YFa|`a_wlQMd&L#^o=^ zk6S^x-3(l~hkKgAB-PIh|8u$j8N2`Pg~G%>9a1zr_oVuYfg|^uRz3i_X{%;pvTwGa zbST~zsA5IV=aKQj!+k&W|EGZE68+g=>y?BrE3@?~(F4X^Als>Y{~ubjjo)tb4n%9d zlu}K}{#vBigB_Xo{W_S7<|yWpTT#)3JLRh|dcmC@csp8f%Wm4{zeiJO1%>a8$2zJP zx4t;V+y2$g_!=0f(Wk5QXqk_}HV3QudbyBFWE4ODkTT5F2P@vx7x+leWBr2i$f&X~ zux_@8nxG=}mmK;RA7W(ziHonkDyW@B1KQCadW3}aS!GnJok5c#I zaAt<<3|!knE37$H#ZwH53#OxD%C>rS3<3Xhx&Onl(>7}a5d8Sy<$0@z`0nE#U0^PP zmu>fM&YfEL5uZe~jQB24Kqj2=Z_fW>s{fl#3j}xB>bQd9G$-qOt391c{GH>B6gBGr zO`m;uuk8yA=|env*4%nBo|N$kMNG9jHsJ@VvLX`TJWRParFUF@GrVA@ytlfC)St8+ zA&tl=hn63xY4}-9xpM&ce~s@&T<7owcNcVBjU}(D9b~x2>sK%F^ij|#rwVShipj@s zL*RZ*siN`}{wzu{uALN>OG}<=3E6>NJ!{9GCbZ(g*tBNrfTfAa7?+9rM{W1D-L54V zce^<&7!Ou4-y7{QtTs!98#3XX>{7nit+F)Ee~JV`jeb-BO+e9t=Gti_GA(faM780J zcGmAT|G4Sg{+znu(h7qTgV;jD&GJlF&=%jy*XhI^tyUYehb~<&)~tj+F&&CXSBb!= z5tI+j_M~3%O>Lo)l77@cO+uVA1bL!kl^X%kR0*`PK~PY1^$;Gr=^#%m#cO%xIE2$u z@k`12B~(4YdFY-&gSAa{3TllVe3NorDgOY+3<0mIsB~48`?`7`Tzy=%6Y6?Tp$u_e zk7vrh(tt~sm-oR@Vm)V&LBAQSSyfe-I75Qy+g0qD(mCbk^`{Hh?D#?7?&wb|LGPOk zGzkvRXx!O=_{Xq5(t7kQS>kg_S*o;wd<^tm?Cr^pYUBChJwBRFs7`b`#iT2%YDW~a z!JeLVuB)E&^cWhr(kb=Xqwu550CbGmpu234rR!JG$~(Le4qC%yzmsDk&Z;|u!!_iF zuXI=w$a8%S`-=lqq@~6FzMdr^ZG0;67?oLzBl&S<(yn`kD_2t1lG3$bFG<&3Txc@Q zb~Nu_6fl=;HmP`0lQsZv5WMn==~dCFcEpK|_;M~M4IHF>TztSt&p;zhZ*89Ge`?u@ zq6gw1r}t^;u_2C@IJZ6z4%h1B-Ph>ETJ->;6A++?_;W1tIZr!af2d#t_C?l&^c|}A z-4rP=i)&Z{wG-OF7w=|2QYVC3~B=+Ym*M#;4jmAd; zr*;muO4)jLk=& zuF>-;E6dgM9TgBUeBIK7g)nt`oWq`PT_$Src(@wSjpP~u-D@h1DWH6{?!-1$C<<~) zf$I!JtQ|IlW7tDqW`R_>Sv`69TaLm#mBMnprdm#DhmYRE(}J`orj{M3H(wUhX|9ba znQ0&nBbRE*qxGj|?7a7%Vy0KmYLIEB)vn#i-ImT1aW{C)#zzg@)cJ=_2-ZuAjV=W+ z9$oNx3w_DwzpBT$plIZkowInWq(=fn8a33iRM9x(Q-2Yd;Z%QhQRV@nY$h-F$}x*n z{eWfU>g1CM@0p)VI->@jeAWU2DZA{)${#hWgqpVLsyRk2KJx{{M9bqurDE(h4!?ZD z9D@YT6ap+N-uTTHAl6R^egs!atI+MViL)fRall7?{|qTM`R2B9=@5~g53HW{wFc5d zc3!=Y9gN={%LmDpm2ZZfKAvlVDYcp2nyJUq>R_agil#|n%oMQ`de$t%Ov?kC4XMpv z!My6YAN5IUr4%D>E0l3nX#!;5sI;B3lnP+Yw#p2AUg=jKwZ*n9C`4@h<@cF#bP^J7 ztvMfba`Kx&_tGrN`Y>$}4I)Ln627~>;bK1Ezg_5c=MrIR;86@d$wg97fIkj=hbikX zZ`wj5E)re=cVg?*89<%Q{YahX+Y_y$J<>W^IpN|k_G;IibDDQ}U^JmHtmxKU)lrr0 zY&N-TEHtiM=t8__e$}}g9dDrCu4#8JUjAw0r_XIl*bmK(V|BqZQ&kGqC9K6~&mkmC z2i2B9_wFO-?h0c!`acs|L`%J5&c8>r=uIEoE$Yp1dY)56vUvOJiNnXLx+X;(6UVUI zxC+@z{4LG@Xqk7Xu&~uV#y?q3{GrX_`T5CCmM5%hIdTsixN~~4)0+Di-(VJ9>j}3+ z7mRBORb5YMVHM0Tea|F5Cc=Su>R+1e9I7W-o7WPoOA#^(VaGfQGQFc$$&^W{j~Zde z)=UUj`>Oy~oyzA_00W4b&iTh#Rx(YL%G_o*94;cxYafIRnm-9YXq)Yo#tDNk zruBE-w2UvQOy)luXserg{m^~r_>ZR&o#!}?8+Jz%7B3HO@Y$P4I@lP%pk3blGnyBf zCF4amz+%_aPqc9=JVMKTwD8=={z#klTt9jNm3TVL^#Q{wTi`hEl3#c48rCrrsBDKe zcuM?hjY-TxLGkdS<2WI-p5XdfyPxM4zxeA46O$mwfs$~F9g?lwd-+sc=cF!Ib!o~b zjEPTF1$5pLzA^v}A6##EScmE*nJ37l-Rx4Y{^73wxmSnj4^jT1iySt=2WXNE^MG`k z$Ee7~NijYl;UQU9QNM}CR|8+6O*?Z*LiE*nHE4^TSYO`-SG$&Re+w)KzPBFouF?F_ z<4GpX>(`eXtXDRr_-5Jl%?@v521t6W=@eMr`$DxkfH9s*9hZRqjVsx=*{AwTk2~n( zy)l1gy6k3QLBi=~w$u63&yUH2@U*a?%XE~!soV0vQA-(vip1GLSO9YObi)L9s>^V? zjstHK%Y_cUGfp4kxPm*|-5LIGPhFT!4BnNv;RW;XiEnX>Ckr9y{%2O{!;95EE;`>rG zY8~GPdn$?y+l!>f$YgFqj(j;mpD&l(T7VCBQ|3o`X@7*SEO9Yk(v%iolmSj<-50%% zhyO$f&2uPo$#ulR8F)Pa@`2TG1#`7=)y)*6N%7hwF?DhLqM#Q(=Oc_wRQ1v`hM)i1 zhyTs-g~4`OyZmp4T2)lag$oR?zpfmR6g5|_5iI&_ZH?m$ynh@pGU=KZdfXFUzBZ^Q z|Blf4Y};kAs1w3;+2cos=zE9ik>vJh#N^u3p>`W2Zn)SoNq8t>A~5K_^gBC^oV9Y2 zAo6`rU(zk~$&8;UkHnU@ZOzpOL?CZ=yzZEA$y`^&N&Pb}l;(nfH^W{+_FSTli+4D`S+wz;R`^u#o?`=&0z zp^zj*2%(w_)VV#Tc-!$``i0>db$6Ho9HS=z>8!JHV}=}Mjbq~F-E!6?lShHtD zyU75{z}ShNj#YnEN|P!Tg?EfW-*V5g)_uzEE7_DkC5i6&kRMf0q>EEOSl z6u<<@tZA5i@x8fA&-P>du@wG1{xe3>s#71boM<-&Q`I$egS6i^s|Q)UbQ#%4HIveg z3FAjnHco^RhR$8_WG2$ugCymE zvb&roi1Dbms6rjyJ*c8L^w*Nm>7@4Vztu{=U;ary@&D{~11onmpoe%m?;3^Q-YhX_nL0-vSK#U`Ew6Z~pLUf%K=wa(2gxX@Xjdhk|Re73~Xv9#y%9aRDIy`vO=*$G;TMYHtciuj`7+5 z?;u^6NjMj`JwGP?W>9|i7q|9N&u@kkYUSxZ!+qCK6T4ma3Ipn|xE1SZjroKt<#y%p$egFQ$ zCiI)7bV7|uQef*W-;J z`N>)Ua_Njc-;;RHPZRUUs&|s8z{TM3J4q(Ss&jUvQ0C3NxI8LuWf@vwZ!M( zc0H>}^bno&%7nL)X(bBn3El72)sLfeZ1Z(l$sQwl)&~r)2nPqb(F70O|N3-ne`%7u z(K{0_edE%u0QZUyNvCZbMwBe)&@Sb(Fxf3B4W7b_UA=!cfj(T6TOa>TZ?arhQ&*c7SD7}odm0kXPwvYV;kJ!;?4Y}V zz3(>@-_4rLp78>YaGGBOELzXrMz3@KwMGn)+SvWN*qY&i zD8Tnc(X836d}z6RdaC@7aS!`s`fJH=3gZU6Wy% zp3GwJYmU29XKknWU4zfCH0nzSLEO7ZJxo)0?Pm*%f{)SG>=kyIE)N+BOJdbuz7{RL zBXQ}Cz41UvJzc0>Ol3}0MJar4B%Kdx1xOB^9)rRnDKaq1E~RMHWt)=v*XAwZeZ{^f z(ldC^U)Pi?WgO=;~rg`_-dahL3src5`ypM06Y z-O$nPFSVEz>t#g)`y3=CiLF@@bWFyCA=OAuASPN>zK&iVwUMP$zaIQMEbQNw-Su#_ zRWUj&KbC0Yd-lBeWCUJ|<8CMr?UA4+*L0bI$^EgL;}Lr#Wxit zmNn|deSSjgB)xw6Rlv5cj(_zQ{0Zy))y<;t?%z7Ya5HA~)UnM|>+%DCX)TL;+QRQIq#tV!{5s@d=`!~aZ z_;7#c+c=$OzNtoX#A(P5F-cWaSERHTJN#`79x^>{ZjrUx{`e;nbxrb$ES}LRFGF7- zgXl1dk`BLkpSuSStAvjSdnz-pcnBvK%c~ZJ&5;o@pi|r!4=KD}8Y2 z(|4;$rg3KuixXr&cxv_UcfcS?a1NwijN)doAY9N$fP&*RP*m-Zm+1YVi;{3|UEBJn z4ewE+J#FHnHSh1m4DbTwR(Xjy-DftHJOQ{f=J3UrVE$3hwMNQ0ysjOgwu`YAwLHr8 zD;`}Za)pDpcTEis&a8(j;L~tZd%*^%=HVa3d^@SnYig2>pA^F7?T#C#hai9^-6B)W zuWv3r9R*Y10=(6B*O@{1qCxY$G95t;leP(3bD%i#3ESO&Og1f;p+pw{>+MrKZxjawI#^sNXGEMPenv7i6s_fTOf22WZ$Y??S?KT`?4^k^dg_+o zqfwLZ7T0VYJ%~=wE4GFy6i0rg5XEJifTdeKToJO_YGV_1_-6F^=aqPK=XHYb#%_=r zz$P^}a!l9MVbw2V0zFBLEFA~x1~u4~5MjvzPWHlUMLy-yDhYTJV_)t5qYzQrTgod` zilccmV6>Sr+h3(>6x21qh7OHtSyJ;s*`IYk%+P+7Ug%F=QvMW+Ydkc$b zYuPvJ?>F1sz}_1vqL_&#!yCfvYi8r-!f^?q(Qo$?f`X0#bH>2EUQ^9;o{=#{P)-)d zo9)A___&(tRtM*5be9`Q(m!1wDS4|sHp7&f$q)%>bbwHoBIZl zfTM5j_hKxHte2u@A42;xGvAD*g7Y?Re4Bn6k!WDh{i{*s=A#-H^2LF%nVVmGE1$Ni zPPu;KkZre|MY-46gXanuyD!;O>(f{! zS98kVv3gR`-#flw&|ru`m1n~%5~al>U7z00<{Ig!*zUQL(&ViiuK&$YKD*7g`=W>( zW>97!Cn7$*d@b;m!y|jRDg7oHW})d3QIM zhBg1FM%cm0EC_DSsfWDvL?Pa6H+DchmFudi5@iuP^Ccx^?WLu$tSG|U*?4n*NsxH| zc62&m@iAB}`JVm&tR}$L$R$_x$h5jUU+pMaEnB&ClBB1$>^SKGApM%lNU-iRUVUf( z642aHBzN!ePO%3cTk{pnO`PidSXo%ywkaSZ>^H;K`0;U^XL->^eP<`KT+5fKuM<;i zS--cty<9!&1Q0&SGOI#JoR(khb$R*c0w>4@4T&ofMrQ#%;~Z?>elH<9jXNjrk>ZO5 zZX!y*Yzj4{c|A$4m*33N3<_cHMQC)(HCSB-xc-D>-w#|C*H`oH%`KGSl5C@jq%{|A zWdmMT;`Pg>7SA85WRES7KJGX{S@C*4V?LN+RH=TPat`4gQ5yQ2A&`8EelMIE zLes2}+nVFdn>wBq)R})yNGF~@z&p&WU2%SOd*b^2`vWJEpMNvlmJv>HjeamQEo{EE zgj#*BmY*}!WX>rZU;df zF*{k@8X+!wap{^HgDnwdh^8QSHN(aY#mAD5N8O|P=B>##VZ@4ifQMg^rhBS}i-rm6 z8pcEFWzu^>e!fD%nbhUzj7h~E2St&|7rNn>b7PEvR&>J4y}FZY(tx|`tLI;9r2KGi zfHTlARn3lO&xzU9soB+)Sm#Q~>tm5@Bawb?0{3is-F7xo%CleUA>GztWkK3iH<3bq z@?{r+ru_yBu7-*iUuW*rG(>Hg2;RMo0<3#O06%-|M}y{SyvsA5R^Lr}p|t!aDAeQ< zv_!#ko7I0$j(xCIw7Ix)jO-@S0O{>W)174tB6e~pw_*9|<-ZJdnNvq~9b+w5qZd&N z!3oH)-Qr`|7Ws7p?Lah0lx3Z z;7u*{5j1%T^6h9vz;6uV{Zv2Duh^fA{)9CityvF+DXVm((3Xs)ViwaSQx%$=q;GuG zc|Y=DrjWtx>PzVqr#MHrA+rJW*w@u5?))j>oGwPiszUM4A4{e2C zm$4|1lb;+nX85EgVhILAL5-Nf5a(ckw!!*UDoaNp)iu&CrgHzDKhRZuJw%;IHyTj9 zxYz6~p!;*XQo!S+69>qW-_9I+C_uu>WSHYioqD6*rC82!l#cu2^c|Ny_7!egH|rFv z#B(C^`&I!-26()}(9ERtytxPa$P(zd3-}2pFnsCJP?S!PLCqi{hfln(VRHQ-R1cqS z#;)A{79^vXy=>%U=R2#R8X_{tK~ktr8jcCwkFknJfFT*-doEeO^nmR zqRsCf$X_gVp6Uu;30y_hSS()%A)<@ul7l6y-j?#UmcoSz8VL@odkv_GK~Vn$mOVM! zS5p9(imH;zfMCH~k2#8=6~|6`_!-b>;PFOI4)MBA{z~h(-WxZuRd(uxy%UCxLZ8a= zr;`__z+f;9cxYFS;j1lNlxqx7zn!4KQ+lYZHo|3@T(kPb)yJ1KTQ~~zQ^)ZXyVu$z z{Zm%U3Pcr~C!fLk`@bh@I2v}gDPYqSAXx_4kTH%0ogdAX`YyWRmF$JUbe&d4{jsdc zr>>8~nheWTgQPy0N9#Sj8m}Se^W6{>qO5<&ao zCl-2RU>P{ONk2eb>=|c55YeSzQAB=9E>+f)1~qD<#Z{rzq+>+k+l?TEjvQ{mjciiRb(k$p z|EyOseJqvs2_G!cj@s|$|J1OC|6_aMq~7iIu62L1bo^@D>Zkd&+Lz zGlr(|Gt5a}H0vlImF54yl`6+Isi{dpVLnhTO)$-7Ua#+}_grGoLmM$&ANaJx?ANjg zUcqtNxiw#(Bt&PI|0hgDYzvXryaV1Ad$-mO-RTb&dGs`?rEXK;K;=gafoQEWRwvTH zF5<}Oa$pbQ%yYQay1&s{E1lt-TH}SOU@IEo-&{2m1x*bP*=gF!L+{2baZHDB#It|X(fr1HFdF8&3iRLp8C$&*R zM0bu@x&(~ozzbdNzM5sUHVzk!o1;q9{8AqX(CI?oMw*ziN#k~PdQ7hdf}fyLY*dDj ztUl44N(($sf1QG6SkI-a2y89xi7(w;&VVl_EwdAN+)SL=V>^OAPmVQM{^{r*8h7nD z!zIyEHv_KHsOHZO|7tnR>uDo!S@FJ(-HL+2!A#V~L*4{^2MUhI++Yo zY-d;&p>gZ+b~L?Qp&aE5t)6XO?Hy0^_b=U@hb3Q(fSPeoMW6wxZjo_)QrP(*Q~3rG zG{jeYaA`PYiY2qQk==?8SLJdnUB4Doq~pjvwh}ME_2N}sr7Pr<{yYk=r56Ru2?E!X z=aME__noYe5o_LWBkYUjS@5BVNVbyV!NPgXqwT>)$`=ohZMRqWMztauFH$J;V{1^# zqQh?nt;t2X6*27PDLXRrt&5M(1l*@~FE(u!R*fxDC7$U%US$$>f$#_LeUb~_uetiF zJi>_gabB)Z-1_Ev_$hrx!7a=>wE?n zcH_=}GD?I4QCAvfRd+Pb%-ucR+E31MSD3L=&1_BD(*6=&^sLm2*Tdc7=_y;Idd+q- z{j#19=z#R|n85c1X8j$7z^1qw! zUDL({x(;#6QnXyRW}+0N7#z2;o-b8Myzli_lOH-9D1gI@7KtfMo)jDp-#}fvAjYs+ z>>u{wp{ohv*5e99Xv5TOMKM0;ejjzwFGS0z{>(M5@}VnrR3;�zKNywqsU7Q1EHy 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 z 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 Q9}4_X;QtE+1iw%HFLY-)761SM literal 0 HcmV?d00001 diff --git a/docs/diagrams/microservices-flow-diagram.jpeg b/docs/diagrams/microservices-flow-diagram.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8cd410cd84f9fba2e4454a4b39145fe6a0dcbaf9 GIT binary patch literal 139245 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� zMzprW+2hGBjT8c>*chr36E1vi{1-h@8uo{UW zZk*c?_-F7W4Th@4`B}xHrpTxoTZPIR!8~Pb9lPghQY&dw;vlEI_5spdQ7b;D45LCy z$86b1VF5J;dwvrl#UZN4@|(J&0YUEesq$Ed+RKQTFf+^-<03f}iR@0PCjB=w@_Qvr zan}9u8wH;V-y7iXTvNfv_gX#k@*~i$O26%sgO=b4e@s&#P(J1k0Yx4krZ?b zpoj*0ahvEUuWXTRBz%cH(#8_0jXusVOhXoHDaL1!xXQev@S{q<$OvfNX%d*?{WJ`w zWIz=SuyR>a#}?isI^SpqP7&%EdRv^h!f8nD3xxS%)cUomrj2*tWs2kUZn_H*ytp(U z0=Qc_oO{BHm>Ds|UM|)^r%+MkDu)~`hmtrqwQBa-ShT=N>XmmlAROv~CZ2lseCsI( zn6;6Pl8Q;IMRS?v1lIRR*ArpIg?K7ZDbzIu*B(pRO7uE; zfwl6S;6%;iI&#`MOrChQnz*LfyJ#O*ar*dhu8g&LxRNhF*E)B?;FSo5#&lXxCH|3; z7~n{x^UVa&wWPbGF}6D_@BLaqX4x;6b&Nrhvrhx#q6E$NQS|E-iKl9gF`tyW)Cc=D z-g{7H(#7o$yCrCHJ;q8jgNK7+vWJ<&;HdtwWJA;>mX5hr?+KAfQwKK!K7 zzvgu+W1cg6y7qv7K5pOj2R;Jg>p9*&YzUSM-EiQ}J^~Dum(k|^Dl6O1C+Oq>EV#>b z|Mn&P#sBfY>`N#>cLDG3^(}X( zn>LKjAwOBB+3Eole(m+PRtLb2asvFPQ7W`S0raPPam2_+fXZ9&T}I<{@_zNoBj7UI zefeBS`Vr6%O?&OZR{U zs`Ch#-<1LodszMcdsOLPH>&o(8c@sCGre-+-Vg=TCV$(h+_o&}iTOzHIkM_Xy+2$jB&& zx4v^;Agbp2?iH0KGwvtNc_TlZ7`&hj;Y4?F1OINdT-?N(iXnQ|4$O-ZaBfvcrJ{a>CDYp5WcDCnRfeq5(o85aY$49`C$3E|!EcjZPcj}&M>Zo0M zTyRUyIcu3p;i)#puSN87 zqtEwGVeuCMVvfk6;@xsNcq;FX#0%{afKB(HGIH)Gb?(hHUK4#ip-XkyKlX5py_`h$ zr$FuoFemwe-Y9YE+tjWW{aHUSksWe&dp zHc4H>u~pzs`WCGbflazi;rxyEma#*Gk#6vmmz z(9`S=7&Ta4Gw~ZpSpx3}fPdVm#XbUftnweOc?6d}c%8rm{}gOjP!WFTTv9*S&8Y8= zJ)rXk`-ML36trfZ?fExtxI0?^#rR_TN7E8ld>6zIAJy-QGj<>1cdzsdEJ#lan-t*j zdG~8n?TjLS3gU-=-~6vh9iunzU3|+(S59Z$u2S?*3f(|A3ZPYAV7}i->W*NWeDq~V z=3OKDp8{b6!sjz;p8>(N^QoH}zyGScHUWXB>sn&^RBAb2Q06D*4!|siBNtj z<$aq<^FBfT1PcoJxaE9O9&s7(S4D6Tc;Q^5xyAhOl2Kxndsbw8&BHS;zL zgaD{p$FC^=bALQ{vHqb>(w)%O1F^`Db^VG*0L@KZo*(7fsOnSRTiLJD`VlZ=G|dlg zL@)O{aH05y)>6Cu-+)*57vGeuDT;G;MHA@xjz`*?H$QCFA(f7*^<|oTauWORB3#mU)IGO(DNe-#xNFzwTdJuH~*q^wpTzw25)cVu%Q-%&61LsR#|LHwf$64kn*$z(s8 zNqG`Q=~|umM(m#TpiSe^%{7^;p5@}i=Wvbb2YvTYV=jm!Uw-xZu>>4QWKNY3=Z?pcNW;JE`&oBGZY16-}#w$|tWT`K* zJ1?@c4{dmj)uruaxXlQJm9uU`b++)&%ZOc(LttRyqw7=BV7tgiT?7Jy+so=f(F)mTQ1Wj>>n9V7{VHLlOi^*A)*NdUjxr3X z6CTNFLYPP>>L1M9$V|;PT>ZN%laao2^Ag7IG7b$l7r8jDAmr1t0bYCti2nCWX!Q{$ zcrHh|T}P|WXrPU*H#cDxZA%gE#U0oW(DLSkDq7F}gKarEGN`k*ZT~L&|>s zOUHQspGBynnc&1V;;an1Ts9e#E|DjTE{Y>pGb*g*90Oif8I=)R0ug2t+h<#2Hzub0 zx`#!-u3=lMyYa z^)TlmKgO7x-ttgQRyH1s`61$n?UK6sQSyO6*d`9)48ncaF&z+0JSjwR5#_qXXN60#E ztiPfA<&cO^u+OE7D)F?B+!?0f2Ok~HWU>Bp2V~?l@ePNF#k6GPGqYOfc7|*I&3D&4 zqj|%VX^yk7!W&sXJ+Lz)wpq>$QKbjP0MxedqUruQRKHM)B{E5ic8dyWzKkJR3YKTG z$ncUejgd6vx(MPqw5D3pb9j!*cTrJ0kH+-#)ONI+Si89FQ`8B^z`Kmx_|Fibvab9? zevi2(`HABShJqZOp+>{N1?gz&U|<{Lg=#}^EWe>|C#2bp&`OY)U|6*gmo8=Nd~Sql zebm%q(&TzWId$+%px>kdT88PQi@mDgvuJW`KloERUCfq&k6YddI@7cj?Q7`DghO}? z&5)>>ytalY@A_P<3Z;p6JsWf{%Yuw#3B{D0g(f3vn}YbqsjMr8@J}1f-ju zpS|X@-Zx8b#5)pVJrin2;7V5-IEHAr7Z1(Rsc~_VLC}r|1>s-0f-#eVxUCU7oEamC zLS}>1qGMKL$nhzvR@g5qk2*R7_;1y8e*T{J=`ZLr+;G3LWfsy28_nXA-XZ0sldp2U z)$xA&!lqh+y`9LrAbosJIVn@R9^Z14r`J(J`+T>npFMt&5S@N}9X&bXz;JLu{Y*(& zPbSWzV}Lgjs8z%n2ai*d`)IZoXSYwncC9K@BBZg~Pg~~SY~1RMCZ?W0ZMJqHVOmaR zwvSom5xa;~lUhu%Q!Qp8;ZMvDB1wlrGO=MQxXC2s(+xT{13o zJHU%1{^@c`Yptm`bdiO%=$6Im&BST~b@v5x8?og^`R5gSul*ca3Z8;)!TqBf0Zxou zb6f61re9BRX%f)h3D8*N7u0Ah5ZP;%+VQHtKlwajfLz+ct%kodA6L*|LS)2ZP9Q`r zxy%#^;qA6FtbgfdR)rs*h!6FrL+w<=j2NKp!PB6oD(9f>JJCgf$VY9S?MZxYhU%*C zob}PjFeKVcG*ZSy{0K4!?I5OcnguiITE`o^4anhhIG)e9<(b-~bE{Igo!Cv}ENWsF zl6#vSk9iKLi|$y?p4mC{2${|ISeUAntj;SRthC`kF|`Mnh|<_L_?ZV7@)oRv=x}3i zKz$b&J|L>m~^b&K~-J9v|m@r3>h2+l*OpOji%azBPYtb|TjxZj{Z1tiWLn-2_%daKn4y z9ueIU8uuv~#msd%Ju$xFj_LYOyGp7>@)OZ~rs}LJ4lT&-RuoK1`PHy8$qqIfCClni zpTZ%92BsiWK^Nn;LzlaqsBY>!{BZ3H-oxRug>O*|=(@Ha`Q#xFB^@_6wYLE&-~Jp5tu;t+$i@XGcsR??;_eK(#5 zXKz;KTM*@?6L?Dw*+q?V-gXIFw+-*Ueu4O*)Kv>nr`o;X z>kd)CdTMJTxbiPwd9qC(iQW)$2+f(CD#z$ zI|{&E_Tz++?ja|NM!EQ*-wN^0E7hdTkSJd9Do&SjYzFPA>>C{oK@Llk7Dw7Mn71FI zaTyFMCJo^c6lK7-2I=#Am={5CdiJ0THlijlS4C%?cYXpbYgr1P!<*80)Bb_?V*{nG zx@{mKeRr2p=5Q{?9ER4E6212surh`GrcUkD4@#{y|vxKre`*^ z`0R!vF8w}Gf;h>6PCp_vU0yTmW74?C#Jw?zx+<(fV8<^00KUj_pxPvknUTm3=h>MW`A(&rBfhj-fg5}tAZBJ)N z@9|7COg6}N#J1;`L=qUe85==2Y>0)(0afboAU@rdi= zwu1%BZai=?^xuUiD*Tl9Ae+2`wuLY3`HIL-?y*6aV`KTz%G^@o${d|3OlaTYTdlh= zG}R|0sr~?aT5^GR$SK#e!=Xc!JcB;tr#53QOs>O zO*B zXaZ0;NgGnE zHg!(v2Tz|Z?z1g{cp#VOFs~hXBxxUwjTkdPejAc=0`xoLRb{; zklreG$2PF|e8spt5$e;+n(lb$^6G?9z$wqU*>+aEQ6(xi&3WJh4eEsDgJlOV#kx5A zKq=e7_W@hwh(XoemPv>LjllAbWaZZNc9TG|je|aUqgFeZzP@a4_y^o4jiY zd15#e0=aR+y2XhF)w5>z_A2WjO`!=1ez=@yy{w5`E4Ai>uC2_#ed&GeZ%17?p?SEb zzVF;Yv;H1*U7hk6qi+fbUsT3QWAsx@fxf{Ntk+*3GovGUv%$4!h=^zN{ACa*$PC4i zUQ5!4^ue_tFYUj}bHi0n39iMXo7W*(_-ipWN>&&1Dt?=-y9z+>&90WW{+O;m9s$hc za&+dLWs=fuYSNUvj%o4|5*<5)aAY$ME?cTzFj-6Zq0_~kmb)NM_Sp5M;`Tz=GQa+b z+Np2tp2e07oakWDHj8|%T_7aoTYS=73B%HWo>d&R1a0&A2TsRDu6j+%7dfV$LA;4p zB8DDoESS`}Aj4LfSMs8r3&d%v*$z{E`I%&|s5oZcnuhF&*rWK?hJFn~77Iz$q@T`& zJ%2LxDX^Km5!Wx=udfYuK@GPY-`{EgKRS$I28*gEVd;J(8|hBe>22P zhFPPH57heQi%`|!U)>GKZVHHKaH+rwRSXZP&oP!*Qcjs5H_P#rZ4{bzz}-u|OSXCZ@bbnUCmlE7YZxQY1O;}AFj_4_%N=#=z8w0 z)Y1=pV9M09WiodAiP){E#6)S*CVL6YPwgo0?((6rgEX#{T^I_??QHggraTTqKKl}u zU%u!2&iMJ%j&l<+aJ?@QP`n!I$4_G73tN>VoO!>jxz9*+KH}^DiT!7DK$I7iL5iyO zt5mTLh<++hUR$D1)f)mGLax#V`}A>ImYI~W6NCWy-*LMY8TGM4Czt5D;yL3Vn&ddd z18c&G)6LKQ)nCQSs3&-ix|Y{Ig&&BM?5fQON;6Z$WUXwE4jbVd>!0Ei%bGf!_`gyy zni^J&0@|A14jpq8&6hO9zuT*>v`hCYAL;27!$p5@G1^YVIDxm*g6UI{5&)D5CK#N6 z&-q6Z%H+I|n8fIpm&*}3U zIM3orHKqv=^Py{UAYrL>sQ#uA)Dc$7oocPAg}T>%TwqyJ z;*>D&wcHVh_Ek>VI1kocDUk)8I`z)k-cPq!IZV*19%eucR|>XfHEmV65Gzt1lUR7}!+YLImU^y2Xw)EPmn#Gdmt}=Qybl<;^ z+>IfJ_cwL(^fzf)HQo3WHQcorD*3-M-EvF)%C&AfxSfn!=loS)1ViE=?(@UyNqpI--H3S33V3frE7H~Ke1ouzocn9?v8oe8gykgU>(S98J1a;iNc3xmsw)&zPhfmKX{g&1I2i5%;y^PrKS7x*H;? z)l?g0J>^uD1u{V82KeA%Eb5y+IVY2;u+7twu zG3K|s zg{)Sn6kDFs&oAa*kXx(tNT`}6EC=4tkMVvkDg4+Q@08#V@2-nT8MYlV)aSuC6|0Rs^ioPmft7WPfFV5=uXZBOqYP z-{zs<$Ak}lEz5}SUve4dR@ZKyVI+#$5*)~ADQ+qrc0+R*HcZ$PIJ0dbrK;6GP)aE~ z1sR{f^RziFEIZMlYhr1U>yvWM6-CcB%#vHYy4$p^o6ZO!ERn6^P9WX2@P39xrDBnq zbDGyfN?^9qiL)fd$$U@>4Ly6H6pYx@%Q=(ZuEgOmQSswIuM!{_X=7gCa0i9kKI#j5 z4qme6k`Zn9JG>7@oI#QWiwlXI+~W9X8mpMM)<51?G*=w*DMK`t%%}{?84Sh0N4Z6y zeMtv|fM(6>T=X7RyZ!nP{O)+tJHiwxeDMlY3htv@AKsRWNZu~bd)XPlw=WKTqHE8w zF4_j?Z!#z5sP=B!>Whntrh3)n-oG_p zZ;#*IDT`zEYGJ@7-dBFNjc4Y_mA%1c=4j$&J$VnPl>BeNTK>OuAzbfaTY+qwm;}^q zM+8jggMT@ms294_`th-YDGVkd(M{~zqgdm#QF>b)XQvTYIZ+Gz*?anUotMH|! zOM=bgNV?d4t5c4b1>6&%G#=*^dOdvx!$E$!SF=|08f;dDhjmtPT_6;Hik@!oR);EL zoogV~vkhGQ056(&Ko<(XODDT61uvxfNs>{2Uai(iZ{QV>YUC*UDV5j-321yTkWmf9 zvuaTsnh-)QIf6#LOXpm2-=Z$`{}p0Cbr=1P(`<6J*95|;gz!5}vh#N2gh+=t6f|F{ zr5T18@?k1E@NM6cvRcSiCCRJNtK7@CwB<9m1Iz;CB5FJ@2f(<*Z^}szel?q%Y<*30 zZJtY!><<@{1L?3#E0|T4Qs~uxeULpCOkMQIxAV4h{c(k91qSlZ*#WCaab*^^G>Y4_9@HWUXL|4-|9(-o`8JAi!497fpO&6E{K` z?D44wX`5YL^97cH&7}vV2v+2g{g?ndUU3JhFwl$VXul!qfzjWc>=Qm2mSaqmi4rxu zuG`ZM?Vp3KTCSgPts3#O#~4RbnOcOTY{reO9+kdv$e`R#;1#=VIGT~4qt2q+;92Ae z3>e}M?{v~Na?halKE&y^9i(Ag<3Ve*+pepBy^-gBRw`Ru9_L=&%PoXwxF@#DuE4j$ ze}j;$aih;&=MJj}RJIk4I=SzVnDG~V4Qi~bhvqgB?}iU|Frg6V za~^pZpH=@OfRvAi=t{UGdOm44@qJ)%nE>?N`-Agf_)d@$LM;u5SULN*z* z$}}teo6vbKV>gm=J$scg7MeS}Kw>}}9r7S&nT#{IPVp`2ho z`rpm{68Hlor)TfRO*_8E@~^bkO*$swLmu z>voi?2%cb`ODSGIhRAidjKZ%L9i7>tPRZSi0_b9Ko%nRhLmN*~@dM6^Kz~gNWaFEW$#uQq4V+dE38ZnPRq)UdmECrzOKJy08+TnnjLine}5!j3Fc5^&U+l=dll_f=u zW}Gte|1l3psgQj4=q^8Ijla3x?>FsEH2LcBvEFf^^ux-lOM2a^FSaPvFE9o@m4X8n z(iE{%E%M{~XS>5N{Hs-?6(cNF3SZp3jg5TYEA}>5bYzrSA{0avW$l1r$$$~zlG^6) z&iU+w9D=LIdrmWgXtvK}zTnj7D?v3#eVNGx9L<=$k%$?+i4Z%Xv5lUv;2XZf=}a9F zXt#1h^yukjwV^A$1dmiM>1!?dtVM^kYR8?ClERvBq$~2}M7o!*r7DYG-=Lm5hCA*P zKa@?9b5pv+Cuzy>elJzIh%I3Uh6f3k*SJ`4+?e>It>;}XLi#&Nn+ERti_X6PV@c>- z5n7AFn(V|FgrK}Ttc0YM)u_S|EkBG`Cr-fVg_UcHUW`p64TDg_F3b|blq$4G3Fql8 zhK?`Fl?+X~rKE-2rqblv)m22~P7Uo%4w*nK4=zRPc za9tYivnIA(gENKCqnaHIK_A~(0R?{LLtRBceMk7sZy1h$PH-<3zf0fJLj(rwlznXvM z`{oWfAota@+EsH>0k0Wvdk9NJ7~ja$6j=iAONMZ4%_J;hcfx_i&Hgo8c6b0-i&{dF zcn0WPUi36`z2`I54zz&_o-f1tNyS`r>YQYoPZZ3Uff4ol@7x^vrlHejo36HNFI|aW zs}BEoH?=v?oG_QWuOv@&Viw|dM(C9tgM&_LcDv*~yzyl!%E_&8p;F?n; z!+BaaI`0&bc{155=%n>|{$SBd1`zQL3zht1wSl zw_~?U_rw_6fj4=1^4oAgb=J9u(PIN-KN*iDate6dbUAlw!!3czMKd-?!)NEdS~c0RP_yhsl)P8J#jOx8AX=qZkp_C#|a- z1FI90?*{Hjxkb3t<=A>%q1-Opc2z%bh>Upcew`Xy zl+T^{nml%Sm9LAa^L%)Wl%rmkUEJ#4|n z^psRLC>YGPb@g>x(AH+Oly-|&LD9^3#=fP@U&`gJmYAGFNoanY#mB^^MCw3uKU3m~ zJuSf_&b|@1IRdH9#1~|>u6c5q3kg3L>xHF^h!`!^!lW#QUj*Z#5IORR+7b2>nXbW} zAEd~ojOdEWNY>h{Vm-O_K29a4Ky`_sy4)Ez>X&Oc;GO1@`{AccB+9%$h5S@Bhk`6s z*5!1~C!Qlop=K(2PS2sDi!Y)w_28cc|3j@;i9RZ$z7BumH+rV9k&1*b~6)Glm z)9FvRsoti=KgdY@k(XjarN1f8yjy!>pGuyym(8CUB7 zBly>@3BI>*?LDW9eq*B`tme;r{O9q}k`(v|{S$pRTKQwZwu4uKuKxGQ0hX&DRyVf0 z?M{w<{pNq*W|9&a&%(bvLzfp>!fETPuqrB`7W#$*%mXoQ;jF`u^9r| z{!Y@Vmc=4+=|)jnQ&jeBX=~^0UkufpB~!FO~jj{s=MkV z23kQm*OW}MsTQIz1>RCS@vO?Ts2`rfotLaWJ3qWKdo1We?&*=61Iv34OuCjr*CMMm zi_L(WzYXX4R%fVJ!r5bKR%@=A@pFi?x*%y(E1e=?`>K{bmae#Ic$8*X-0!2FA<@X& z(JNN>;=TfYHNuEk9PEc;f6aTp93hQaR(zH+0-p3=KF>2Y1^)1+N(DZnJB$}wBV+YtpP=+kYB#tL}WT6qkAn5H^d zm0MV3Z7SY5wngajXs)a25-6#Gf%^@sQEfJgUCb$D?W{BTA~jy0&qa4-V8o)Ka62iat&3Y(fO5x8ff4aY?e z>A=DY3@aUl%5OjXF|q$L$x9SQF%NYHlU$*sF_>)bdiP)4WFx@t8Th|=eJrOWufH66 zI%tWFZV1YMAD{E^8-lhZgInWk-G_&b7W(-iJvAQ;%HQENRinMWJPh%W8@iV8sI(c; zb`F*I9Q`JHI#O(TG&2Z(!(H}7Dp!W9G78zkPKh1?eLFLCoUT`R9~e>#bq4g0?Rle0W}Xg$U6lNJJX@J*`Mb5&MKrV&B{uJOzBSk5BA4=G4_78hWl~)H)$M~9Bgfw3XG||JMZP06g8@TNjbW%&+D@rx!%eq7D_Zg!WRq* za@|AoahO6W>pbWwTGAP-XZr!!KdpwX1+1e^e!QHpRxwWnir8?ejcJPBZYr}5oU=ya3gJ$MS!Cw)K7#R-OOqOo(y8HcI+a@+kJ!;9R_WB^I z?q1GORi~i8ojiX(g_zPFLw<(A1dXlXG6(j@6e*luX={tOnF4Ez;Vsmegv$E@bS&JF z`Zg1@fgOHFnm2B?p8T%^nhF9v0(PLQhML4`d&Bc2y8A8~#@wxQ@kJLheAvRb`EyKo zWav1Kg5pOn)jkj@tl1=C>3#Z3*3jPeBcHWp zxQj+jLEmz`MWSe*VSd=k`bO5U_*avtm3E1ke$oDTB9OEkHy>lQ=V158eH=ZI-3Xf1 zL~Vj#p99XJ;&ab64z>~Xsf+wU3Jr_Q9&3P|ni3s`&3`(LKO7Rz zQFHpgX`3y&DZ;+TJEjlQ9-Fjte~e-)r9ZJ!Fse)txZD1@_&Buo^vX-jNc_o4kJ^@M zZRD3EhwZGcHm5Zb5#_+=*G*c@KF02uQv*P^$+Oe>@NvH!fuzpm@|mo+XfzwY2$toyl_=Y1-W~s8BJf!bwIWdS2kTyu{Z{0!p!P->S*X&N z9;CPWLA1&7WoH<5!$roMfb$adHhw;selSWQr+;7BXQbTCDP6P3cO3z!w29dkjfz2m z#XyS}VR_A0*I=8e0Zu9dZQsulA9ij}Uugxj8t(w(GjrCQefK=;@pkyt_0jcvf`Sr& z?k$4*R;gRI15L%!7V;5~`MaY&r^M+SAS)O%aeb1o{(L@P)bz)rcpMInnezAHtzDn! zik?Bwz@hdeHil?DW}b;@iBAf-TEt|5r@bPFeX5;<;v5H`y!+%SY@Ubl1S5zYk^TSi zWGF75JPIJJ)%7RWD4+4(Xsy#hyhRayLkNUbo$Z8p?A}qtZTRCG)S$euT5$EX%nPaZ z@M1QvXBDE5nD1xysz{+!H`SD!)D*{Y%%UkPOSIRj2;YN;SM818PD!g>a_s?*qc?{$ zMA0!vDNc<@;Uh}=84?%X>lxQu?4lMeMEzPuFTZ5=DiaU&-5rQxD z=U3zg*s^#&-5DM86O%lFXubN%Fr7M%iX)G9lqk54LHz3|2bRF9y(&=-s#N+kiV@`lhxS zQ~Mr_``rO4b;~(_iy(BLw*p&OFDo~?V*SGTzwc(<=C?o9F+K})8NI2bAP9WA3pj~t zuJjVUJpDKT?fhilT1#pVd7H{=;j9c|bgnpr0@ns&vfsl_GM;*WLN%qv(I)n-fRy|` z<>0P2aLe)uFdcOauh$}S`SMh+Ak!RQ6zJr?cbA7rDN@d~3(%oX2K*PUk?4XZTt z7(P)zb>T{?!Qb%wAtN59BQQ(EP?Iv_j&vsdk8`Mq*W*z@wkh-AWNi}5BWoY{3$33L zLnzG;2>CO`?!oVwn`SfB%xJ27;3-wKs2!7kxSrMt!ZMWXIt=6^oGcY@Ryuq%6t3k` zZwVx|Etk8IC`kc`RV(DKc-FSl?rD0dW!vWIPuXYaotOYV=iKNWdY}f2Nxe`HQ4I$T zZdA)eHn00yAW!}-11#BzNWIZq^hd@BpKlkgvPFH8%}c6pKgZ_RN$_Vf*552}C8vkx z`_uy85k=|s@zDXtfi)j7eZSQzW4@qPrbYhgMLUH27^G`42#GKn%{Nc=Vty%zEnP$T zH@)ZYI#A~ClQ9I=5qa~}pUO&~iu<@^pI0Um1)02WLmsTvEv}R~`iZ&NzwFdga#oFG zUm@T$wCBLk=*EU}*!7)o6?=<uw*;{-%lz-Tz;$=l?3A|I2LyLQoM#9#%QH-gS5qO6^jmz-Xj3 zn5%MG%v@{t@=cFq9A1PeA?Z;L4GmF#b1dyVLro;IUTxNcAL@qpY|Yq|+gRUd_IP=G zOtG3qxGCo+Xx^{Ie-#5b%97oEGxyeI?egMh|x%p3)PhA9B=e!9Cs7kWS0+ zZ?JE~^SbbC^Ctmh^sqV{>xoNQ?OA2Lyqx4lG!gFE|Gs(cf92hGv2T&x%>nkZ4==BY z1^%T5^`pI>vJQwR91wzKD2^)cOUz0Zt~?pjHv8{eH;G>Cr>XfGlw%CnQdljzVcZ#i zDcI&t;@Xv3`enxWGrt7i8K0)NwZGNe0YXAeES#JzUbQHYG!kgBUO>S!*7=pV&y>wd zZ4f7|=eREQBZMKReNV{T6ma^? z>0Cm>sL8&ovpk_fYk5sH5lmucHX@}?1cKCZed9tbNoFkTDOup9Tw8FZ_GY<8Qf5-8 zA{J5$t-Z{vokn`b=uiorXR2i0+kB1v?r%J_7BI4n>A+w6>WMKtX8Qg@3pCaKtvLV7 zgz~_$TCs%X8UypJ71W}c@63*ZQZh&SZ1377+OB?RC-6o9c4KaOqzR1b5;>M7##cMmnpI^{3m6eH20n57s@85wsjcW`fDEv0;nu? z@=F-j-0=19#=h<#Ug{@c)S`CB%7@}Fnln#NerrUV%IhOB8kb8{-?aK_fB(AW79W6n zqR~DwzU`=g_He)PR;Na;eT!drKNRaZrx9zZ{*l@TSPQR#UYOQ^Jz0Q{tb&~BqCs*| zk%piB6Ys@F4m$pd=pTPp)xgt2p{g+w9Hwe|k=={vPG^tKq?I?6G8I{%pY* zzvaqr&X_7k3!1BGxgq?DC+r!f=qITD3hrJvx+{o?;UBCcdmEXuDpF~80wu0rLb+yL{!T>mj}FT3ev)I zvK)jWx5iCUV2+~^nHSz(Z3^(1AZYX5g4Zzb79iY}2@VqEpW~_;X~@4nQ&skuGBn5W zg6LdIT3>lu-}qeeV<5?)R=;)qTg4K%>V6Kdn-2GD{uV%AMS0;o=l{0oYW9llYWEqr zlMKN+-xJVa+cRFrQyE2Ma{s!k9;OenZdWB1(w|+B@=Zp&cLUh#W##L1Kqj!he*PUX zk6}>%%+m?c@=eDd_aw1Fs{WL2k5G}FU|S2UZefq0ZSuOSoE zpi?BSp*_V%C_0FcJ^*-f<9far@o#<4Gb2R$7Uvq%h{E?f(i@hbjGj~(o^|CUFkomt;V>T0 za`Q|rZ?F2Y!9S4IAkbsjdT*&v6h-jVtbEXub%x$_R$st(G}x|<);O@B`D}zOsdO-+ z1UY>nxXX!z-H&HHkY_yPie+{*<4JTwB&G(&keKt#uZL6y)2Eo}(Kl%S0BD2?XqdJH z*g#DR&#gXDi=-#uMMIMI)ovN9&AMo72tz)yf2I-AM|P8s14XK%`53G)Oy8T@kbe4& z)5l%?JNm6_-QDMt)&5r{-V+_7ec5g~yEd%mDhA;9i7cUj&Qm2AYD4#GwQqDi1jg!nZ<8^ zdq6H$IhwMyy~k;yB@l$ozr%m_z|lT2sxGh^1fX~$CWGTw)8D~W0yN-+-`8PFZ&1b? zs0i+BGE;<4Sv2t_0!DU2Lc=EefpUh~sPfPyJ9WOok(|R6m8!*DmDQfL)0W{j-}8PI zPAl+X$k;J*?Cj*9qpT}o;yDp*BbHR%HLAA@!G3uw@Sds?4>nQL?&-Zd9lLUy6srGc zz2&)*KnMI&jGHZ`1-LcV#PO(Iza>i_gWw=Gm9eC)?0&bX6RqBxo;jB&qcq8Yx?DKyW`xbp zcNxRy6=EZPp$P_nEokrG%S2lKbXS;)2w^(!HA6gxvz6{O`|$<2GX#ZO1(oCpbL}+f zErjjM{an2%tGaf#EW*{>8)%TvR}|5a%{*My%>4PoV%os*a-x};w(4u9uYGK6&~HCm zYH)lQVBjj6-kZuQvv15WRo9~GxYqUiU=r;zP>`C)C<1^7)|XoZv^tD8!1i)D}PG%?R0CVu;U3FEnFd4A?gM!vT14H9YP@S~pZT$(RkCdnR?+=>!UPUxkDDA(;{ZQfRT5V|GV@d1%wunlC=OshqSW=VQYQNeJbubp|o zL9M>sNAapn0;li#DDLFwfop-j?P%cIAks^dC9Tbxu@KIB{N}W#++VcC(qS_9=G@B4 z!u?Zy=~><1cQlGoV+4BMDm-s@>+Kc#fz-1;L~?1ZC0$Lt4|@C}v$cIJFHl_32Bici z`=Q{pFv+){b$DkNa2t)x>LKN!=r?3AiQ+dKgfZBxu+U>Vj48%bvpEUoQ}Pg-?=*gB z)1?sKd^Ae;sJtEKBrz`K+Yj*lR2!PBPg5Faf&}}#(AVAqogd)3=e}hO^6M$B;lWT; zV%ajhM_fvx#l>yhq3^uBjyNE-snPJ9o`+|NnS7MV@A$nwu|}ky>U|8jxhBzPYG+46bKN-kKueswbo z4?}0j?hYnpCv6$Hg<>mpK}Qh#W}fBjweTSkX)GZoS?`JnSfXk6`r3?T)gdazCDOT7 z#qlS9%#G`AIU2TS+rO3ni70Vz(Gzbb4?Dsh!mPty^|W_cwAZ$PS37>?{xEyEUAYj* zzSgkP(Xd~QFD*E$eo}lhOLUjEvzwvk9`(WeWYfv{hB{WL}`K|pEv|K`W`sP8Dd%s&y-@Q60Wr27%`5hP0T3mZ>nuW_ZunR3pwj-_D^5P#?h5?lt>*O#-&eYP*Y6CAYE2)lOND@QVEj7ArHVvpQg% z0orZ`8X20$3})#}$#^+ZVPAhZ`b-8qbW_In4h_wYD9m&NGWBNUEXMTsW$qz=qZx|# zuhlaPWTkO!9Nuy|wVV!bMJUN} zwp8%@w1f@TdA({{&8f@rRbM;;p7YlU@)cz%>n)z{+u`qcy~9;8E%}n1sZFapcmB(Y zSTrhCej(W_HqmA?dQ{ClxXiY=|3GDIV;9z@!>R`|dQ+lx(3-wmj4>XXslw+rp|7RX-zVUBSHSvOJjJ z&Uie6Os3zsp4o~JW^Di}k9K!q(m;lhcWbriC9F=bmAeuzFuCRe%ghZo*(^p|de3>< z3uH9Uk`=2pB(mSGeDPbzEtcz6z{LMGi70Bs9a5GS z#W2a-@`{5X!L>MoXTs8RR%zRZGZMBisN`8`S}x);KVMg3%}{aBh0=AgW(Yq7jvRIu zuyNA5a*P~E?pN!uD&1)ZP?S0y!L3)W?Zb|bl$PzuSEsYI)gpNIgP8UVuaQcQms!ST zxIEX(@6;}CJfdnZ?3vl3J-BdZtb`I#ddgnx6U&%W2EuI3%m+INBffdV?FTBK7yi32 zpvro-fzNsBOqZ)R-wsu+n$e2W@4Vm!t-Uq_q9Y?!5&=lh6E4a=Z5~9N9pdu znsksDzNqy2$%>T5CIJJgf*b?c0j0hgoAbWWM6Es?hngtM=hHeQw_^MYxJMsWv`8r# zd=`Y`lvB2O$%QKfXe9UmM zGt*5!e0?dq%cqOZ7?TFkYPwI=N@SvrT@(NquXrXN{32@vcB#Ml?Ro1#QV8Bj)e;k{ zUmhC6Mb66gX=onGPF2REm^-w^^&y|?RAnR-*w?rw?YM&oad$z5>xEnXR=Uqq4z89{#YMOd0P-QdLVdClttqH9~jc5?b1N5kY@-Laggve;)8{D5w zGWKqGg-E7EHVm0YDV*S^Td$#F@bK;N=XKeo$@*|wVH>H8v~f}a$1_~dGc?xkSyn|K zUQ*_r5fkEHU(FwM%dybs_ELXIc-+Z|vV;aAN;mVklZR8e<@m!r3apQe`b8`d?AcUR znU=VV&wh&U1mGqN?%oSj@oqy7e=QGxMA>%}yJzj}E@*Q)xWj1kR3;Y(ETcQLX*wUZ zKP^b{p6^h-0ZBiH8xH0+z%W)9%ChKc&a4NTt=j&AhMYgGv(7ov@|~E=6moptN^g=X zxJlK_CZl2lv?-mV!oc7Aee5))EcR<4*;Kp9R;>N)0BF=^ub-5l=fFrE-7ADdBZ|NrunZ=X(BfWTwf-Hj_5r`x53PYwWpuF zhs@*>ZTXN8(}&4*>4c;+*u?aP$wnZ;WL|m23ES$%vG|I@(xl1QTcZC!x!Y)9%) zPCRzQ!}_bs&I@o^^Cb$dQS;=g_rl;Wv~B3zP2Zy|b#=%d80z`vFSKE{S5+1d8uj0v zZS~H^|2wG6KUZmUN@+7`9(Mv~Jfa`O=`Zl;&x;U2SofG`q=c8tuc}+OhqAbTLAJfl zcRD03Inc1j>q`HR0e=gjmAd_Kn5RGS2#wn=qulc^Rkz%M2Y2|g#S0X+hn4!NhVR(< zc$pxY8!Y|*m+$i*QmUKfE{@>)13?c3qQQ6EORuLBTfC6x8xnt^spWnOBzAso7xdBZ z$z^0Upr_t#!&ebCWhZ`JAAR4Fb}iXO))p{{Y5j|$Sp&{*%}KJ`)n0Xb%S+lOt(AO^ zH|rsAjyL7lrg^py&_)sKvEZ;yy!K=tJw3GdIx;6uC4jsZ;H%qbQy7vnXBo53NKTZl zWN6fj$jN}`oWXMHwyn1eghAD>q^1*wT{ld;m8K-lHCYy!q)xq_Bm_;56^J9)F zVNMmSmQ-o}uswc>V7x?&)o!{vkMi4sj*h;njMXFN@09~BX%R8ihF7BxKc+3LGB2&$ zusIGKC(T40#r8E-0a6{5^VATmd8RIY*aTjp4|WZblw(Ool2mJDt7NX>&6WJ|hs}$` z91-&v;B+kt-(J7&C94&)L#6%<9q@-NpLL038{9OJ=ILOy3KkhQOtw%O&dNdTd)>rk zAYr#D(!`cR-Jmc%J~gm$5iC|H0+T+fjh_ek@<(NNbDX&ktY&O;`)E(F0OU~K4+ZNR zg*mGM%+r6Nz0P$3RYgfIkbSWB_A}_Hb<=ivpUqvaAmBkuZ`d9Al5P1TTS;4*wv;0g z6Uaf0G!7Vmn=+b+axR#ytlt9x1!TV0xa_zqg_CT()H!sEKo1)=OmzzVNn%1!I``|vPm&BWsQkPLRxEP? zX?S*n0Tr4#d2_-{)W@aB4Y5y-sR{~7Y7p(vAxP*1Q$_656Te2WoIkY*5rCJ(wmR?_ z$5x-6BOU5)6_G#3QpWBn9Zao;Th-YtEKdRTKRApKP8VKkqEN=Bq0gT+Z^*G%HB2q4 zS`V6q(v#9k#U5D>^x}2+`~}k|mZtYk!B!PXH{HFyl;SHnw?HFC|G0%}bu(uK`Q44y z95$qYB}=i$dTr9{vbybQi=okGm`6`y4WTyvz;5Jw+Wm@}8MB%DHB6%Y4I-Eyp=o(< zTKJ&j&pHY}Nep5!R{lp;hvBOa(EX1R_)$ zB}wE|X1_fsahycveiyuysd(@3BBF#5*s8}LtXpJvzQS@*Pz_+B@vMB0t7<2IbcwNh zm-JmncmuO{kF?NqR`W!C-*__5sKsvR;MvH{`?~VI-b}BkSXHj0g0*ZaxOTle4Y7oG z`+#(7l4Cy5g`FPZ-AkiWF?3hku;+Iv!F)}qEKRi6paAR_C{`CX03qA*$13ZK2$EVv zB4%x2C$AK)I+N%5)IKu+>fkMyd)dSSEo5u10$>aF4G6dH;9TGQz>fD%4A-@v@bulL z4{N%h2-Oj3&Clcwf~Ir_V#$n7uOI?v67 z^KfgvfE)CWR5yM51+J`hxYYPWJg~cI`C)emtr+FX*L?Z4T0J1Y_ko0pLWMs^$-{d4 z!-h=O>U@QLe9A^0p={DMRz+bwtF%!};I&E(B4|5B}A_Z~D+&!L`mbI}`!8 zF0wM+Ue%s(BSDKXjUFSWN%YX(#v*466d$~x2zc=wdvd8We}KKFD6( zvl?#_2VZk;y%oH)*qhmT{Qv@>g!TtW4*H8&AMvlg5M7Da?A4dsc!DnJm=fDD@)*ZeHr>VAiI$lIaWm(Eo&} z*TMel^nMo~=-uo)A{79EkVW!FK;pS7%k}1vRG3huLn~>tgnWTl9CMEC8wmfKb0)g| zbIXNZ2E+@CyiYRRAvK5zvt{m`N?Ly{3j`-uK`|Gc(dfY6t${DAQm4fLz))m9bQn6P zYf#8a&MpUyedghJ@RM_bWPA@d)k=)y+q{TeW9e{+1GXDJ)2#QtyK7{7j5)}}fYMy_ zg;yWB2(f~j>HLEEc9cF3nW3HcXru0-`GHP7pRF_nO|lnNF3a59PqesLtum)K4Hj(s zy@_Ex?(F@kBtLvgqK4mt0aaGSBiLu|XYB#1gSw2_!w878=~Nk;cU=`r2M@brpTXM1GniqYTqWJG zOd=0>4Il1U_rtNerEwlPvwc82Ctf>eRpG4L^An_7?6ggnJ=kPR1h+)6Er~Tl8>AE8 zG<|)vs3`Lh8aTQZ&m9XGNYoG=WJ7#mib5FN0FhTszBcqxS%w3PLyJ-0K54h;1drZM zLciL5{r>vv6AaO8hBVGv&r|#|SY{o`#8lYhnL_(}$^bKfsd^68CYHr-S;x-uE>_o? zdo|`Yv?poAk_PRqX6wyDe`DwUaR6w~sqL;_6Zy@f<6niYw|$&7%YUJXd-l)pdp(BI zxY(bu{?>WWGZAxRMCH_?QSx)N{yV|qU+g&uA3ci`^F2 zgr{KTiFAOaZ}6DEqIrf^{-1*{Nliit4|l(riMzu>aXbCJ#*=*^ds+;=rQ(ct197Ki zX3Yduh06bVmRr&DKZuPfJt^A|I0lgV3+fB-5kz=`xErZ(^LBG!|CJvZxNq&%Y=^sFcdZC zcu^p`zxCDi05}^w=g)J@*=bCk$!mXnS$D-^u)O@zZ+7;I6ArmNsyz?HvE92_@ENTF zrM5uyG8=hvMO)8+!noQsXWQrl;gY~9-O?{f*r!La>F8P7#4ivzzF5iC(V*HnQlaXQ z-^Z4v!%3ukxtp%}1ZWktu$Rn3JD-}BDmb9x9=40;V_CH5+U=+Zu>mHR!G-t!4T8lka7)Yl zgur{>Jtt>%_2Fj!f?YxpooVInw&^Kp(!w9ScOo!kT1=+Dr?~Z?hC{8YF|+*u>Pgqq zpeg&}$^va#Q@SXS$=MN$rFto~*Y-nW`SZ!aln)qydUQX^jj+nrvtb+6m-G%{L3upUeX-!hzkJA8TnzG_d;9X$k zEOYl^jSX(VBPcq`9~)~OoW zU7tlNHh{RMU}$^7ha0I(WyF>bqN~lr5)GE?%qr6!Z|z(mH|a10pRlJH^q4Qhu_&oL z@?x&j3Ak`f!~US+XSEqWAjh-o-wwD)JTkYSrQ1W`&x%#cZUTo^r-cszGtM6U=ezDH zePa_>r89lesiRuawXy=;ea-tyV5sDfUHA+C-5N+y6G&PLg$ zy&`)O0f{G7neV$)8^+&MCj(y=L9aMYE@NhWtyKb`6-H*Y3qyR~9^yrlxq$2GWGvw~ zPjdQ3c{qumqGBCqwhpp-?8ljO#oyYJg6mUrD_AZ`dTlw*BnSnaV^jAE>1$#;45cc4 z=qjJS5W&x%#W>+i;g*4`AlfN#3w)NM*4}tB)GwvC`AX`m6#32vf(5i=!-44zNlZd~Mm+k` zg&;mMsw7H?vmnIPb4j(~l7@o0C6zD@kj9N+%Y+Jw^Coa;AGPo`Y(qhDI(Tu&16Zj69i7E-rOm%5gPZ>G_2 z5ViH9x^ZV~Kvs#if)Nls9uKe&T9?IKCj^QN9r5Y}a4mZu-fLt!It4gZcPV{gKFBG9io zgj6+KLSefl)ue*ZOvn1nO$W$O#;j5Otl`1Vtiw7H)aki%7P>sUbj>-oZpvkWD=>1h z*;%0acayU=nD@84?O$lXthy$cCTK2C-xQ<+mX1QtmafXKk+Vsbgibpj%(}=GZ&@JS zxG#uH48+rOlY)5IF5M>-y%Jr4F#r3RT>)h}Ja~5z%)nwop3WV54dXqVBH53#{e6Y_ zU1T?SAUaDgP-!K?qdOQnq*E#GM$f_Rul1o$a6KOs%;EulOVHPr^#X@Xhd#`Jee0s{ zVo*1v03HGARzewClWUcc`G{IF7PAM|8_==~(zR=&th8Oa1YEyPmk~?7TPs-Er6fWV zR@ff+FRMqiGsVAJULKuhizW|O;;?f8z=Hvc=SK;m_Tiwr>jg?(_@lHy-U}YD>NLK# z{B}N)H{>~v=0Der`gbv4|JMif>i}?ns2(M#Mqw|;|GoPU*oC~2nsd9xGEw;HM(oA@Jt)*026KvqU1u3JujyYQ zMo;Pk9l7@bkre9<<#1=!I%is=l^MCZEZgQAF(|%y0bB-MIX#{H`!$J_3s4{sh$~BU zzPB`6rZ$*yHks|_R`4KJw(DE|wM zq8;8hREBQ9=Q=ZJ*Zk(Fs%eI!w3UoU^GqJ}dL|~T-XZpm?8&A4<#O9MvL=IU1$jX( zN54=~C9x%dvVO}cf8MTm9zi?f)Wd$M^OxMv+Vew%Ri&b=s*Z!vdXvgW=w}g0Nd_wt zgG$4^K7~FB`{v3#*#T~&R}Q%XYM;sK_4pE&-7jYyRxKb1>I$seqxfcKorWL>6lrUd zqWhk7{yj)N|U*HPwgybEVt=_5BKC%i? zwq{|}3cjwVHP25Hh=`KA(6KHMEF7F9rv1>PfeZY^91`*;qo=pWC^9D}7ZRPixteP?6^^=>xkX(RrPE=%A0xHps`%;qc}w*s;U*t!`rwUZn)=*$RB@ zqWbFtqkd5NTdmC`>j2}f2hD=BefbS>gXz||){1-F>rdzYq(Tof9F#r#s^=fC_}%U+ z3?(9G^7g*}^MT#Jx4-vJ4sp|3miweP$8DE8EaZ&>S=hmv^&iT#7C8y?nM%O7?9U^&1X+RQ96jP{>eI%Z^XC(Uar{q3E$8zS6x{vQ8nPCIny38%mBS<3%x6o z-JKfnZz%Jj^wGPa`;UY9KjmKokqqin9`7p+l9a_f5z+#sdS_Grm8riRa52wFvR~D_ zF5*}Z@8f$!sN5#{gBpaigH3~2)Nb5Sl)HzuIx|jk zog7!;TbZP0F26#N2HhsM`q6oL76iXjDvZriImxLe%f4i%zK`oPCqcE}xu$E>FCd4% z-51hr_3VfB90Qn18AlNL@IgLIZs1#ke72%&0D4ZIthMFkk;#?ikLvn2%xj6nGD^8; zuHR*;_7iIlT3?PlB7KS2Emk1!2GGP^jcos2&;aJ!$bgW+09!BP?jR|i?th8w{!|?l zaO_74^)G|4kcxW+0iw?s)K}0BF!cYO4*b98nk26T1bg?qlJbgl!(#F8HESVc+_rMg z#YbbRZEZ_VK7ooyGWs`3-(HF7{RdaTf9nC5(3!OQ>w{K-OjR~@l-1>CxXdik_MPV={gTdt zqkG*op?K`f+GEB`Zs$ILwil`RS&rAGYKRlb=pS0BQadFxn%61dy}72QQRm}s#$^+_ zpv`PlU`=sFR4YWBm3Cm}JPth^DFb;48H3W&zy%8v1~gCGucf+#M%Ge@p}}4Hcey-y zNi5IZx7GHt)~8}!+FSdx`t-rxQX&WCKAwe79j2C@51@Fnq>eG1;%p$dDJ_vBhyAuJ zk;D9GEqz_D^=z;bbGh#Uc_tynsQhU8E8+=hkH~#(;IEw2uT{e>dUUjErs7|kz#^Mp z<+ZL;uye*(Z4UN}p2<~8Y31|j2%b4KbdJZs`QVS7>B`aCSM^#N$8;& z3kKlCSsASt>ar}%#c`|Gs{B&<23uZGUS-v9M?C%>54bu3Gp-0t4Tt@kytp=nttz0O zbCMXgN7ayB{+ScmASZb#=?#D1!x(PLpdzCev^~a;{QTNuB5~K+p^P&2@@(JXi3)jt zBGX#*afsK(Y@;$AnEJbbk}9c}y9Hv`E9fn)cb00n);l-xC%uAeV53uUQ{~d(VP760 zD`2Qy(a=B@->j8yV%&*Lw1oz*`&D`hw_SwoxMdq``jh&3j z=Nni4s>7p4gI2}J;>hUA#>Xdi|1FW>g?%%8yLq(SKKfMNhlxoSYr=A&xfWw|Zb0++ zyg=`LlgAq^a!&+yfoYg847st6kLNR7?&@H*P&Kq_THI*wZ?bhX)J3z<=REQZ#M5$y zYWV4+HExf~68pJ2f4SIOjWN9S)E;t(Lp?x1MYP!ZH&VO~#>&?d5#&0=z zU8j-^N+og1k|&n)P90EDqRr1_C~nNmx{@?-V9NBnIr4bSYXlMX`LyGFZO#6wnp9oo!C46K&D2ByCLkU)7Ht?Vl#EOE4QNQE}bI{yE9K%;Nc zKA2CMt$R5$?Ui_!4LC|bZ=S2a2JE%wI90ho1O!y zLd_kWp|pmSvol{he+aQ|Y&khW>LYhR%Gjd#NK#bcO=X>XaCJ>fb@XUvhN*3~;>4j% zZ{IJ=9~#o+y`8$msxv<~xNr$m`K=rS;iPVThj$_KsMgO%KijKTjP1pBVm3=OZdIoq z$&J>xo%VT4(WtdPqDdQ7<#M1}v|{fso?yJ9*;5x;wQf_5QEA+6K=;!3{TekZbJEPJ zwimnLyWlWSS)~Q8JJUWV+rx%| zO_ffjIFcO{seLTWhZWy>b*H2X$DULn-oSBYwD$Rd&`vik=AV&~ZdM^dh;701m~|!$ zoB7v7af%`$kSUKkSQBMYOFO||iEbsntV51cy*I-B<4Ck?}YdDfHkINL3VLcDyKoCJRjc=*!ulgdTBvB z-rQx~?AfxVOaEPhi-1>nmw3HrkB4l-Z$w~=GD7*Zia)u7ewnD&E?2KlE5px-tlp`U zF0r9vrcp0OZ24nl5sOE#%Z4yItixFwT}4ywkFJ(9&U1CHdroqnURy z#)pe8(@*~TN=a2F;9UnQD1pkX~sZSA`nRd$GD7|%% zKjh^obj9rO<><&E9dc~ot`s^p@<5S#3_&&2w>{!GY5spq!2c3kF!nE^h1kp9`^!$G zvkD@X>{idUZ~b@%=gDxzHC#M6A7_96 zu_Q4Q6SV#&=<3)TsVoP!VAaYPEl3|wUiZYaA{trn7?96OHZYRD<~y#)K>zdlG4wBE z0pR3mnAW#rd@>vWEx8W=M=2ti;&jN9b;9YkLIOTRNs{zaRQ2ZJk%uyI_8)Ej**ezt zT5ax@53kU>WJs_zkE?3L2W#@keK6Yi%l1W88mUoiF^V-$Nx8>SzYHdXQR1A}T+WE! z46M{|a6%j&dN|ZX*d=ywVxTrdV+(xqZ2XKub``H#Vg9=1gHzP(>BS!V9gGnv)e3Xv zCwp5nl~_Lpm@u$W@A&Myj0J?YM3sO1 z^tR}a8l2%EI~rI5&j`ULRRAPoq;?hTqdtUEO)ViaZ`697tm3@G8a2LrZ_qyS$k{TT zno*&@d#_o~>pJtjdaj8`j;`6vQL`t^Mh?LGOJ6_9na|7VWsd;MC}#7aBIb!AX}lb^ zR$@=JXeI6I_a6YcpZHz)9qbMLs-0S@MbDQh9q7ZAj}y6L(&cl)ZSqKe1@*IE3g>N6 z{-ea_qJH`#`xm)y?v8e0?gx#5{qVP&_~OnzqABV7i5$CU>CwES`ojY{TVP>_-mPb^ zA2Wcs&zjwaNEHI(T}g)aij7&b1L4~+&Wy|9QO=?QtB{THKmk|40gez(=j}o6(d*Em z&KZ)$BHv^_{XEm8t=hd-e1_)L+m>_jloNe)MFT$GeND&GFxut(n_eo5q& zjk{?>6w2=PNMrlHB7?-iAI!}zp6bur#F%k$8 z3?y|^+boiXRMI|AAi{<}2s~050}T#6Bu2#lS=6*yx*pi_9p)g%akFK7%mm?~*d~A4 zC2YGucvq~@nb{i9nNs$8bPqdIG^@YO;De-(e5l%jJQgj4q!@S+ewU59XcChgGT%C3 zBM??#Ef6pR({vb8c}hd4{+^cfLrZI@$v3KZRsl*SLTEImunp$tQaaR@za{>$NdLB6 z&!bO&^fB`XkjMr`-E>e63;l&QG+K1No^y`vJG#vVAHJ|T%OuT0a5Tng{}S~gE70Bd zVqe;PLbr;f;X+|+R)4goPu|~r#k-tWGR0eU{j$i`o`I#TTD2#RRkQ7YzSh%{&kvF`f0TM(8;s8`&z8v4o7MzIb+VTX=8B{U3evmQ+D zYm-kp!1kg%n#$b;=u(qS>5|W~r-Niw25uhp-N>e3`x2GtACtZBi(%w3ec9b;IhX0h ziI7+51eIpOZp%#QOYPrzron6zJx<&TUDWTg6J=gW)w}!{@C$y1r?P?k3+?N=l=QaM ztWF4fl1`$wHIP|gUXlWH(X-$mv-F?y)m(1^U^Yp;(HfV%OUU$k?-k>L76rRTWXP5g z9J{Wr%PvR7vyI;@nn!NNt8l@gKIO;VJN-P2@Jtw@Fg@BP?#MnwuI9e~Znn&Bku*aerXUj&a$imSX3`^K z*NfmLpNAjVZx-|PW9sgcZuNlGOhQwP->}^J)4BlSP2jmKw$ar32T><;UKOvl$Z(?- z)A5RDN9Y2MY87Isn}Oahb80f0)<|aF$Pk1nk4D}(J(6^gH7xE0rC*a7vnspA5_lKm zFHq#Xo2c0r(xChct*l0vsX6bFzT7Y9$3coff=4r_e|b~mINR99s;+KHIgc7}pWraS zs#1UdZ9`lhXpu!=K!5gQxh}0vmmNF4$#<}vQ}48YCfjsug2};1J)*#>d0TsjA+0h` z<@z!8)Pw&~cGmE}@zU`B3oYD(f5GALi@vuy{g0=)$l4*5!x)|9A@1vRJZBwi#0Lg0 z25U21TtZJz4|@ZFrKukQ-Gaj^MsOMdpzg5bhTz6C;HQAsm~!ap;W9mJZT9VON)XO) zQ;N(F((-Zvr=`)J7Y3Wk^u80iT$|je(wT19SWo^FeF^lz+-$y@TpR z$KN!F+Rs?)z(+#}VP`J%%0CE5zrSwiOo?(F&i*9S@aG`gshIkfy`f@1H07ent=>S^ zG`R-dz_R-1$OL(*QAapg!q?2R+L9*&*arg##NRr6%lhbM(>!i+@>KCecy4_=^pkhr zD{u-{ah07$S*rg~Hw72-S1VLW!R$x=AM)NZD6X!J79>hYfZ#5{9fH$naQ9%1yEaZk zqY3U#;}C)c8X9*C!QCAiXK%P%YAa&TzyGxK5e7;OvgY)4K}dv+Kr|D;V}g zd0Wl1)=`NwgMTh zq-Rf5PTia1NZ7Dy5=UUoe=F_+ZuNModD+b z%^B#7Ri+P(dHv$fYX5vW*jC=2JXA%&PW^s|D3@&O-c1m>JThz#+Pwyd#jF7Dp?YzM zEiZ6S5~0d`pX1hkWs01@751e!xw+>V05-X9vaX$!>OHgB9o#5S^^RMb^nj?nKpEy- z%`N2ABF4VEk9@LGcuRYrt9&`Bk>}1$X8z?x$JcliiPHZwmlk#o=xrQzyVLD;d-4vj zsBi96r|RreXD6iLVL8Q7$7&BO9qap#d;M!Tof=7@0H&mM(gA3}jf8(q?RvuV6n6dj z8_JfdHm@m0tQIVOxHYUiA8OEy4_cTx-^jmLnHcpt(hyp+j;MppmjnAaxQ_KzM~z8q z74xjj`o>EtAfAFr2hbbLxSzs7+k7j4XwpJGRilH?qhUk#1VdY9?R&yhrYYYg^+-P* zugCqmujvjVYup1>6D7tHli24v77@-1*cb%XrVK7AIL<7Sk^E>&gmNchhlC?kCS}kW zGP;zl2;#i<5x(xRKUKz@!btMp)VB<~F49-LAqq}XIGlLK*}YZ8@tRPzKd5BkV;jq%06ZtW4pU0t5eR!3orJs6c3hI&w(d#axpAGU%ckvjqWg{i_9mVn_Bd@Q!cQSc@GiR zJ$8J!NKv7-wtD|?bafU-1#q$num~*}00Q;w(0ZDxHSRdL_m=JcqTmw?!79G&%11k)Di?^9yur6mO#FDR9!*CkCox!W%jn=Q@Lru|^lBvaun30!!udb2|L%j;RcVDByJG8$jFLS(D7K7XyYCSXRO6#d79v5Dv(P5Zp zP_x(*`-UdQS>0P$(4@Go(CNhZ29k=!xYVZ&h3_nwY@Jj3SLqAYdz>(gkyyGn3|Tv> z4ca?h|7&}m)`@RJ9mX_Y@`}+;m~OQPshn}Z78yAi7k#bv`IsL4$bp-NFMi~6@^fNu zZ7J|wJV@Dyp$KcmfP+_M&PWt|FdpAd0yaBG{xoh~5okwF&gr#Rj05QByx2Qg`dS^% z-r03~jHN4Zpt%Q`z9L7PCWy*L$T#23*mxVU&BBsC$MPF$3RS5#j1fK5P=>;h{_oCTSFw`a1KV) zB#?_?r@$}p#(+eFK^HVx@C8wOM#N`k*J3 zD5Wjvv13~vQ5bKZrzm97c1Go^aY(i`fb5aEhel7L{Z5F3R$u-{FS~k|D3chV)#m2; zp6DIY>B~~?(D<4|ilP(#F%Kg5cY{XKFh8%Y(I!E=6UK}qq(iZ2n=7l1FH;oJdmEgu zoAOi`rOO9Gdyyy&N+)Q}9$PC+W;ko*$1d_b-iLq4;W(n~{#K4y0{m?2vq4rG1XS2m zZUXbchCQ26DtN>T7jAKXQPlLVgNzn3la#~%Wy^o<1>eCZEVpbV5ypFbUhv~zg=Xev z$?`)1c)mr@w2Iytyxt^N^5?}Ey#;Koorz3$W5j^n-yWZ>%+=jkFj|A{bucHd3|i~f zc)|zC@>|M68dP$DH%FhMHhDy&RvfM(*@#Ya!fY}tIa0~skw z$pX?8B!Ij%r4)S|`Q~oWT^Lh8n*cQ7~}=x1kD`EwQ)AUh1@uKp~W(W|oA;X7cM5Z<>!fv8dE>-wE<8nDYb z!ONKiwW-oi$~9i=EzrtQniQiGCa;w_YL+!t+@#h-DH3vr_zjETZdg^H5W+Q9U=s@> z!4DPL9mRoWIb4o=qNg2Tei?N@I^omXp#_I5(|)O%z}up=a3G1#*^?BKtm%U?PY1~= zQ5M6tIWplR2Mp07XA?+SCWj~}Jd>?xx6yH({94`}f66^Y(Jx8Uuy#pc#2JKi_cMQ| z;#K9Be0n<@tG%GWts4+)B%;{7G>){eY;=z<;AURZ(lW-R5Zr*q0!)*P(Ka-GT|R-` z5xDW^`n|IseYYWP+m5}d`r!@3=Z%6K90!ItC)SENgPjuYL`ALpVKP;#8Ngi)C_RY% zBAt1PB}UeYz>@W&djAw?UwrvJWwRD#mFwcQ%J%H**$j~p;bEO((hs*#@>+E~EG-6? z>KNUju0h!r>0$R_vY|J(KLA#7X7n`k1J&ROawBW&gAJD&gHrISYqy%*l(6gEDieLo zFEuYB3UL7jY}_sLQ0*yiZc`}Jpd=RCEaJt7DQ#C1`WG%+Tc)DZD@`wRJudu+W#-SQ zmxk(woERb1S!Yb`E=4O9xuWsASyUEPF>N>m5M^p}4&fjrx*~EV!0shM)_(i`l? zlB1ZZRghbBR)S7pt9f|EklfNA-`e)m<1N~~;j98bGhX5xUe^@2>>0zIPa7&mGPAVg zVjdms+vRu+f98sYOW+YgyZ%?b{Z2^UKqK(R&ZJP^yT2#}>|3mU>>KCYExVjSTmxH9 zzZ~0$|M*5fBC;LJ-!LaRQE%P0Kz|!)Op~};;u{jEKZHJ4p2_TsqCQ|M#o*dMJQig( zP8@DuvT$t+D3|#8iHh-(WQ9N9y+Q7XwyjiIYF1TRV^vy1NBOg|)YY8(w5p#=edb7=2=X#GAS}p3x|pNA23wv zrb*aQzTKI}z}+Eox5a.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

sCNE<5`mpemRfTtS_Y^96G60t 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 hYb(Bm?r6) { + const client = postgres(config.url, { + max: 10, + idle_timeout: 20, + connect_timeout: 10, + }); + return drizzle(client); +}; + +export type DrizzleClient = ReturnType; diff --git a/libs/common/src/database/database.constants.ts b/libs/common/src/database/database.constants.ts new file mode 100644 index 0000000000..5e0086cc8b --- /dev/null +++ b/libs/common/src/database/database.constants.ts @@ -0,0 +1,2 @@ +export const DRIZZLE_CLIENT = Symbol('DRIZZLE_CLIENT'); +export const DATABASE_OPTIONS = Symbol('DATABASE_OPTIONS'); diff --git a/libs/common/src/database/database.module.ts b/libs/common/src/database/database.module.ts new file mode 100644 index 0000000000..bf72947dc8 --- /dev/null +++ b/libs/common/src/database/database.module.ts @@ -0,0 +1,66 @@ +import { type DynamicModule, Global, Module } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { createDrizzleClient, type DatabaseConfig, type DrizzleClient } from './database.config'; +import { DATABASE_OPTIONS, DRIZZLE_CLIENT } from './database.constants'; + +export interface DatabaseModuleOptions { + isGlobal?: boolean; +} + +@Global() +@Module({}) +export class DatabaseModule { + static forRoot(options: DatabaseModuleOptions = {}): DynamicModule { + return { + module: DatabaseModule, + global: options.isGlobal ?? true, + providers: [ + { + provide: DATABASE_OPTIONS, + useValue: options, + }, + { + provide: DRIZZLE_CLIENT, + inject: [ConfigService], + useFactory: (configService: ConfigService): DrizzleClient => { + const databaseUrl = configService.get('DATABASE_URL'); + if (!databaseUrl) { + throw new Error('DATABASE_URL environment variable is required'); + } + const config: DatabaseConfig = { + url: databaseUrl, + }; + return createDrizzleClient(config); + }, + }, + ], + exports: [DRIZZLE_CLIENT], + }; + } + + static forRootAsync(options: { + isGlobal?: boolean; + useFactory: (...args: any[]) => DatabaseConfig | Promise; + inject?: any[]; + }): DynamicModule { + return { + module: DatabaseModule, + global: options.isGlobal ?? true, + providers: [ + { + provide: DATABASE_OPTIONS, + useValue: { isGlobal: options.isGlobal }, + }, + { + provide: DRIZZLE_CLIENT, + inject: options.inject || [], + useFactory: async (...args: any[]): Promise => { + const config = await options.useFactory(...args); + return createDrizzleClient(config); + }, + }, + ], + exports: [DRIZZLE_CLIENT], + }; + } +} diff --git a/libs/common/src/events/transaction.events.ts b/libs/common/src/events/transaction.events.ts new file mode 100644 index 0000000000..7da04b01a1 --- /dev/null +++ b/libs/common/src/events/transaction.events.ts @@ -0,0 +1,29 @@ +import type { EventMetadata } from '../types/tracing.types'; + +export interface TransactionCreatedEvent { + transactionExternalId: string; + accountExternalIdDebit: string; + accountExternalIdCredit: string; + transferTypeId: number; + value: number; + transactionStatus: string; + createdAt: Date | string; + metadata: EventMetadata; +} + +export interface TransactionStatusUpdatedEvent { + transactionExternalId: string; + transactionStatus: 'approved' | 'rejected'; + reason?: string; + validatedAt?: Date | string; + metadata: EventMetadata; +} + +export interface TransactionApprovedEvent extends TransactionStatusUpdatedEvent { + transactionStatus: 'approved'; +} + +export interface TransactionRejectedEvent extends TransactionStatusUpdatedEvent { + transactionStatus: 'rejected'; + reason: string; +} diff --git a/libs/common/src/exceptions/filters/global-exception.filter.ts b/libs/common/src/exceptions/filters/global-exception.filter.ts new file mode 100644 index 0000000000..8dc6c515f2 --- /dev/null +++ b/libs/common/src/exceptions/filters/global-exception.filter.ts @@ -0,0 +1,45 @@ +import type { LoggerService } from '@app/observability'; +import { type ArgumentsHost, Catch, type ExceptionFilter, HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { SentryExceptionCaptured } from '@sentry/nestjs'; + +@Injectable() +@Catch() +export class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly logger: LoggerService) {} + + @SentryExceptionCaptured() + catch(exception: unknown, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + + const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; + + const message = exception instanceof HttpException ? exception.getResponse() : 'Internal server error'; + + const requestContext = { + correlationId: request.headers['x-correlation-id'] || 'unknown', + requestId: request.headers['x-request-id'] || 'unknown', + userId: request.user?.id, + ipAddress: request.ip, + userAgent: request.headers['user-agent'], + }; + + this.logger.error( + `Unhandled exception: ${status}`, + exception instanceof Error ? exception : new Error(String(exception)), + requestContext, + { + path: request.url, + method: request.method, + }, + ); + + response.status(status).json({ + statusCode: status, + timestamp: new Date().toISOString(), + path: request.url, + message: typeof message === 'object' ? (message as any).message : message, + }); + } +} diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts new file mode 100644 index 0000000000..7719287ea4 --- /dev/null +++ b/libs/common/src/index.ts @@ -0,0 +1,16 @@ +export * from './database/database.config'; +export * from './database/database.constants'; +export * from './database/database.module'; +export * from './events/transaction.events'; +export * from './exceptions/filters/global-exception.filter'; +export * from './interceptors/correlation-id.interceptor'; +export * from './kafka/kafka.config'; +export * from './kafka/kafka.constants'; +export * from './kafka/kafka.consumer'; +export * from './kafka/kafka.module'; +export * from './kafka/kafka.producer'; +export * from './redis/redis.module'; +export * from './redis/redis.service'; +export * from './types/fraud-rules.types'; +export * from './types/tracing.types'; +export * from './types/transaction.types'; diff --git a/libs/common/src/interceptors/correlation-id.interceptor.ts b/libs/common/src/interceptors/correlation-id.interceptor.ts new file mode 100644 index 0000000000..840e5a684a --- /dev/null +++ b/libs/common/src/interceptors/correlation-id.interceptor.ts @@ -0,0 +1,34 @@ +import { randomUUID } from 'node:crypto'; +import { type CallHandler, type ExecutionContext, Injectable, type NestInterceptor } from '@nestjs/common'; +import type { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +export const CORRELATION_ID_HEADER = 'x-correlation-id'; +export const REQUEST_ID_HEADER = 'x-request-id'; + +@Injectable() +export class CorrelationIdInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + const response = context.switchToHttp().getResponse(); + + const correlationId = request.headers[CORRELATION_ID_HEADER] || randomUUID(); + + const requestId = randomUUID(); + + request.correlationId = correlationId; + request.requestId = requestId; + + response.setHeader(CORRELATION_ID_HEADER, correlationId); + response.setHeader(REQUEST_ID_HEADER, requestId); + + const startTime = Date.now(); + + return next.handle().pipe( + tap(() => { + const duration = Date.now() - startTime; + request.duration = duration; + }), + ); + } +} diff --git a/libs/common/src/kafka/kafka.config.ts b/libs/common/src/kafka/kafka.config.ts new file mode 100644 index 0000000000..7f0b2477f2 --- /dev/null +++ b/libs/common/src/kafka/kafka.config.ts @@ -0,0 +1,22 @@ +import { type ConsumerConfig, Kafka, type KafkaConfig, type ProducerConfig } from 'kafkajs'; + +export interface KafkaModuleOptions { + clientId: string; + brokers: string[]; + producerConfig?: ProducerConfig; + consumerConfig?: ConsumerConfig; +} + +export const createKafkaClient = (options: KafkaModuleOptions): Kafka => { + const kafkaConfig: KafkaConfig = { + clientId: options.clientId, + brokers: options.brokers, + retry: { + retries: 8, + initialRetryTime: 100, + maxRetryTime: 30000, + }, + }; + + return new Kafka(kafkaConfig); +}; diff --git a/libs/common/src/kafka/kafka.constants.ts b/libs/common/src/kafka/kafka.constants.ts new file mode 100644 index 0000000000..fd3285800b --- /dev/null +++ b/libs/common/src/kafka/kafka.constants.ts @@ -0,0 +1,9 @@ +export const KAFKA_PRODUCER = Symbol('KAFKA_PRODUCER'); +export const KAFKA_CONSUMER = Symbol('KAFKA_CONSUMER'); +export const KAFKA_OPTIONS = Symbol('KAFKA_OPTIONS'); + +export enum KafkaTopics { + TRANSACTION_CREATED = 'transaction-created', + TRANSACTION_APPROVED = 'transaction-approved', + TRANSACTION_REJECTED = 'transaction-rejected', +} diff --git a/libs/common/src/kafka/kafka.consumer.spec.ts b/libs/common/src/kafka/kafka.consumer.spec.ts new file mode 100644 index 0000000000..737d5265bc --- /dev/null +++ b/libs/common/src/kafka/kafka.consumer.spec.ts @@ -0,0 +1,286 @@ +import type { Consumer, EachMessagePayload } from 'kafkajs'; +import type { KafkaModuleOptions } from './kafka.config'; +import { KafkaConsumerService, type MessageHandler } from './kafka.consumer'; + +jest.mock('./kafka.config', () => ({ + createKafkaClient: jest.fn(() => ({ + consumer: jest.fn(() => mockConsumer), + })), +})); + +let mockConsumer: jest.Mocked; +let capturedEachMessage: ((payload: EachMessagePayload) => Promise) | undefined; + +describe('KafkaConsumerService', () => { + let service: KafkaConsumerService; + let consoleLogSpy: jest.SpyInstance; + let consoleWarnSpy: jest.SpyInstance; + + const mockOptions: KafkaModuleOptions = { + clientId: 'test-consumer-client', + brokers: ['localhost:9092'], + consumerConfig: { + groupId: 'test-group', + }, + }; + + beforeEach(() => { + capturedEachMessage = undefined; + + mockConsumer = { + connect: jest.fn().mockResolvedValue(undefined), + disconnect: jest.fn().mockResolvedValue(undefined), + subscribe: jest.fn().mockResolvedValue(undefined), + run: jest.fn().mockImplementation((config) => { + capturedEachMessage = config.eachMessage; + return Promise.resolve(); + }), + } as any; + + consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(); + consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(); + service = new KafkaConsumerService(mockOptions); + }); + + afterEach(() => { + jest.clearAllMocks(); + consoleLogSpy.mockRestore(); + consoleWarnSpy.mockRestore(); + }); + + describe('constructor', () => { + it('should throw error if consumerConfig is not provided', () => { + const invalidOptions: KafkaModuleOptions = { + clientId: 'test', + brokers: ['localhost:9092'], + }; + + expect(() => new KafkaConsumerService(invalidOptions)).toThrow( + 'consumerConfig is required for KafkaConsumerService', + ); + }); + }); + + describe('onModuleInit', () => { + it('should connect to Kafka consumer', async () => { + await service.onModuleInit(); + + expect(mockConsumer.connect).toHaveBeenCalledTimes(1); + }); + + it('should log successful connection', async () => { + await service.onModuleInit(); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Kafka Consumer connected')); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test-consumer-client')); + }); + + it('should not start consuming if no handlers registered', async () => { + await service.onModuleInit(); + + expect(mockConsumer.run).not.toHaveBeenCalled(); + }); + + it('should start consuming if handlers are registered', async () => { + const handler = jest.fn(); + service.registerHandler('test-topic', handler); + + await service.onModuleInit(); + + expect(mockConsumer.run).toHaveBeenCalled(); + }); + }); + + describe('onModuleDestroy', () => { + it('should disconnect from Kafka consumer', async () => { + await service.onModuleDestroy(); + + expect(mockConsumer.disconnect).toHaveBeenCalledTimes(1); + }); + + it('should log disconnection', async () => { + await service.onModuleDestroy(); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Kafka Consumer disconnected')); + }); + }); + + describe('registerHandler', () => { + it('should register a message handler for a topic', () => { + const handler: MessageHandler = jest.fn(); + + service.registerHandler('test-topic', handler); + + // Verificar que se registró internamente + expect(() => service.registerHandler('test-topic', handler)).not.toThrow(); + }); + + it('should allow registering multiple handlers for different topics', () => { + const handler1: MessageHandler = jest.fn(); + const handler2: MessageHandler = jest.fn(); + + service.registerHandler('topic-1', handler1); + service.registerHandler('topic-2', handler2); + + expect(() => service.registerHandler('topic-1', handler1)).not.toThrow(); + expect(() => service.registerHandler('topic-2', handler2)).not.toThrow(); + }); + }); + + describe('subscribe', () => { + it('should subscribe to a single topic', async () => { + await service.subscribe(['test-topic']); + + expect(mockConsumer.subscribe).toHaveBeenCalledWith({ + topic: 'test-topic', + fromBeginning: false, + }); + }); + + it('should subscribe to multiple topics', async () => { + await service.subscribe(['topic-1', 'topic-2', 'topic-3']); + + expect(mockConsumer.subscribe).toHaveBeenCalledTimes(3); + expect(mockConsumer.subscribe).toHaveBeenCalledWith({ + topic: 'topic-1', + fromBeginning: false, + }); + expect(mockConsumer.subscribe).toHaveBeenCalledWith({ + topic: 'topic-2', + fromBeginning: false, + }); + }); + + it('should log subscription for each topic', async () => { + await service.subscribe(['topic-1', 'topic-2']); + + expect(consoleLogSpy).toHaveBeenCalledWith('📥 Subscribed to topic: topic-1'); + expect(consoleLogSpy).toHaveBeenCalledWith('📥 Subscribed to topic: topic-2'); + }); + }); + + describe('subscribeAndRun', () => { + it('should subscribe and start consuming', async () => { + const handler = jest.fn(); + service.registerHandler('test-topic', handler); + + await service.subscribeAndRun(['test-topic']); + + expect(mockConsumer.subscribe).toHaveBeenCalled(); + expect(mockConsumer.run).toHaveBeenCalled(); + }); + + it('should subscribe to multiple topics and start consuming', async () => { + const handler1 = jest.fn(); + const handler2 = jest.fn(); + service.registerHandler('topic-1', handler1); + service.registerHandler('topic-2', handler2); + + await service.subscribeAndRun(['topic-1', 'topic-2']); + + expect(mockConsumer.subscribe).toHaveBeenCalledTimes(2); + expect(mockConsumer.run).toHaveBeenCalled(); + }); + }); + + describe('message handling', () => { + it('should call registered handler when message is received', async () => { + const handler = jest.fn().mockResolvedValue(undefined); + service.registerHandler('test-topic', handler); + + await service.subscribeAndRun(['test-topic']); + + const mockPayload: EachMessagePayload = { + topic: 'test-topic', + partition: 0, + message: { + key: Buffer.from('key'), + value: Buffer.from('value'), + timestamp: '123', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await capturedEachMessage?.(mockPayload); + + expect(handler).toHaveBeenCalledWith(mockPayload); + }); + + it('should warn when no handler is registered for a topic', async () => { + const handler = jest.fn(); + service.registerHandler('registered-topic', handler); + + await service.subscribeAndRun(['registered-topic']); + + const mockPayload: EachMessagePayload = { + topic: 'unregistered-topic', + partition: 0, + message: { + key: Buffer.from('key'), + value: Buffer.from('value'), + timestamp: '123', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await capturedEachMessage?.(mockPayload); + + expect(consoleWarnSpy).toHaveBeenCalledWith('No handler registered for topic: unregistered-topic'); + expect(handler).not.toHaveBeenCalled(); + }); + + it('should handle multiple messages for different topics', async () => { + const handler1 = jest.fn().mockResolvedValue(undefined); + const handler2 = jest.fn().mockResolvedValue(undefined); + + service.registerHandler('topic-1', handler1); + service.registerHandler('topic-2', handler2); + + await service.subscribeAndRun(['topic-1', 'topic-2']); + + const payload1: EachMessagePayload = { + topic: 'topic-1', + partition: 0, + message: { + key: Buffer.from('key1'), + value: Buffer.from('value1'), + timestamp: '123', + attributes: 0, + offset: '0', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + const payload2: EachMessagePayload = { + topic: 'topic-2', + partition: 0, + message: { + key: Buffer.from('key2'), + value: Buffer.from('value2'), + timestamp: '456', + attributes: 0, + offset: '1', + headers: {}, + }, + heartbeat: async () => {}, + pause: () => () => {}, + }; + + await capturedEachMessage?.(payload1); + await capturedEachMessage?.(payload2); + + expect(handler1).toHaveBeenCalledWith(payload1); + expect(handler2).toHaveBeenCalledWith(payload2); + }); + }); +}); diff --git a/libs/common/src/kafka/kafka.consumer.ts b/libs/common/src/kafka/kafka.consumer.ts new file mode 100644 index 0000000000..808bb853b9 --- /dev/null +++ b/libs/common/src/kafka/kafka.consumer.ts @@ -0,0 +1,66 @@ +import { Inject, Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import type { Consumer, EachMessagePayload } from 'kafkajs'; +import { createKafkaClient, type KafkaModuleOptions } from './kafka.config'; +import { KAFKA_OPTIONS } from './kafka.constants'; + +export type MessageHandler = (payload: EachMessagePayload) => Promise; + +@Injectable() +export class KafkaConsumerService implements OnModuleInit, OnModuleDestroy { + private consumer: Consumer; + private messageHandlers: Map = new Map(); + + constructor( + @Inject(KAFKA_OPTIONS) + private readonly options: KafkaModuleOptions, + ) { + const kafka = createKafkaClient(this.options); + if (!this.options.consumerConfig) { + throw new Error('consumerConfig is required for KafkaConsumerService'); + } + this.consumer = kafka.consumer(this.options.consumerConfig); + } + + async onModuleInit() { + await this.consumer.connect(); + console.log(`✅ Kafka Consumer connected (${this.options.clientId})`); + + if (this.messageHandlers.size > 0) { + await this.startConsuming(); + } + } + + async onModuleDestroy() { + await this.consumer.disconnect(); + console.log(`❌ Kafka Consumer disconnected (${this.options.clientId})`); + } + + registerHandler(topic: string, handler: MessageHandler): void { + this.messageHandlers.set(topic, handler); + } + + async subscribe(topics: string[]): Promise { + for (const topic of topics) { + await this.consumer.subscribe({ topic, fromBeginning: false }); + console.log(`📥 Subscribed to topic: ${topic}`); + } + } + + private async startConsuming(): Promise { + await this.consumer.run({ + eachMessage: async (payload: EachMessagePayload) => { + const handler = this.messageHandlers.get(payload.topic); + if (handler) { + await handler(payload); + } else { + console.warn(`No handler registered for topic: ${payload.topic}`); + } + }, + }); + } + + async subscribeAndRun(topics: string[]): Promise { + await this.subscribe(topics); + await this.startConsuming(); + } +} diff --git a/libs/common/src/kafka/kafka.module.ts b/libs/common/src/kafka/kafka.module.ts new file mode 100644 index 0000000000..1574d5542b --- /dev/null +++ b/libs/common/src/kafka/kafka.module.ts @@ -0,0 +1,48 @@ +import { type DynamicModule, Global, Module } from '@nestjs/common'; +import type { KafkaModuleOptions } from './kafka.config'; +import { KAFKA_OPTIONS } from './kafka.constants'; +import { KafkaConsumerService } from './kafka.consumer'; +import { KafkaProducerService } from './kafka.producer'; + +export interface KafkaModuleAsyncOptions { + isGlobal?: boolean; + useFactory: (...args: any[]) => KafkaModuleOptions | Promise; + inject?: any[]; +} + +@Global() +@Module({}) +export class KafkaModule { + static forRoot(options: KafkaModuleOptions & { isGlobal?: boolean }): DynamicModule { + return { + module: KafkaModule, + global: options.isGlobal ?? true, + providers: [ + { + provide: KAFKA_OPTIONS, + useValue: options, + }, + KafkaProducerService, + KafkaConsumerService, + ], + exports: [KafkaProducerService, KafkaConsumerService], + }; + } + + static forRootAsync(options: KafkaModuleAsyncOptions): DynamicModule { + return { + module: KafkaModule, + global: options.isGlobal ?? true, + providers: [ + { + provide: KAFKA_OPTIONS, + inject: options.inject || [], + useFactory: options.useFactory, + }, + KafkaProducerService, + KafkaConsumerService, + ], + exports: [KafkaProducerService, KafkaConsumerService], + }; + } +} diff --git a/libs/common/src/kafka/kafka.producer.spec.ts b/libs/common/src/kafka/kafka.producer.spec.ts new file mode 100644 index 0000000000..301ac3bd0e --- /dev/null +++ b/libs/common/src/kafka/kafka.producer.spec.ts @@ -0,0 +1,132 @@ +import type { Producer } from 'kafkajs'; +import type { KafkaModuleOptions } from './kafka.config'; +import { KafkaProducerService } from './kafka.producer'; + +jest.mock('./kafka.config', () => ({ + createKafkaClient: jest.fn(() => ({ + producer: jest.fn(() => mockProducer), + })), +})); + +let mockProducer: jest.Mocked; + +describe('KafkaProducerService', () => { + let service: KafkaProducerService; + let consoleLogSpy: jest.SpyInstance; + + const mockOptions: KafkaModuleOptions = { + clientId: 'test-client', + brokers: ['localhost:9092'], + }; + + beforeEach(() => { + mockProducer = { + connect: jest.fn().mockResolvedValue(undefined), + disconnect: jest.fn().mockResolvedValue(undefined), + send: jest.fn().mockResolvedValue(undefined), + } as any; + + consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(); + service = new KafkaProducerService(mockOptions); + }); + + afterEach(() => { + jest.clearAllMocks(); + consoleLogSpy.mockRestore(); + }); + + describe('onModuleInit', () => { + it('should connect to Kafka producer', async () => { + await service.onModuleInit(); + + expect(mockProducer.connect).toHaveBeenCalledTimes(1); + }); + + it('should log successful connection', async () => { + await service.onModuleInit(); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Kafka Producer connected')); + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test-client')); + }); + }); + + describe('onModuleDestroy', () => { + it('should disconnect from Kafka producer', async () => { + await service.onModuleDestroy(); + + expect(mockProducer.disconnect).toHaveBeenCalledTimes(1); + }); + + it('should log disconnection', async () => { + await service.onModuleDestroy(); + + expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Kafka Producer disconnected')); + }); + }); + + describe('send', () => { + it('should send a producer record', async () => { + const record = { + topic: 'test-topic', + messages: [ + { + key: 'key-1', + value: 'value-1', + }, + ], + }; + + await service.send(record); + + expect(mockProducer.send).toHaveBeenCalledWith(record); + }); + }); + + describe('sendMessage', () => { + it('should send a message with JSON serialization', async () => { + const topic = 'test-topic'; + const key = 'test-key'; + const value = { id: 1, name: 'test' }; + + await service.sendMessage(topic, key, value); + + expect(mockProducer.send).toHaveBeenCalledWith({ + topic: 'test-topic', + messages: [ + { + key: 'test-key', + value: JSON.stringify(value), + }, + ], + }); + }); + + it('should handle string values', async () => { + await service.sendMessage('topic', 'key', 'simple-string'); + + expect(mockProducer.send).toHaveBeenCalledWith( + expect.objectContaining({ + messages: [ + expect.objectContaining({ + value: '"simple-string"', + }), + ], + }), + ); + }); + + it('should handle number values', async () => { + await service.sendMessage('topic', 'key', 12345); + + expect(mockProducer.send).toHaveBeenCalledWith( + expect.objectContaining({ + messages: [ + expect.objectContaining({ + value: '12345', + }), + ], + }), + ); + }); + }); +}); diff --git a/libs/common/src/kafka/kafka.producer.ts b/libs/common/src/kafka/kafka.producer.ts new file mode 100644 index 0000000000..e8134d2412 --- /dev/null +++ b/libs/common/src/kafka/kafka.producer.ts @@ -0,0 +1,43 @@ +import { Inject, Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import type { Producer, ProducerRecord } from 'kafkajs'; +import { createKafkaClient, type KafkaModuleOptions } from './kafka.config'; +import { KAFKA_OPTIONS } from './kafka.constants'; + +@Injectable() +export class KafkaProducerService implements OnModuleInit, OnModuleDestroy { + private producer: Producer; + + constructor( + @Inject(KAFKA_OPTIONS) + private readonly options: KafkaModuleOptions, + ) { + const kafka = createKafkaClient(this.options); + this.producer = kafka.producer(this.options.producerConfig); + } + + async onModuleInit() { + await this.producer.connect(); + console.log(`✅ Kafka Producer connected (${this.options.clientId})`); + } + + async onModuleDestroy() { + await this.producer.disconnect(); + console.log(`❌ Kafka Producer disconnected (${this.options.clientId})`); + } + + async send(record: ProducerRecord): Promise { + await this.producer.send(record); + } + + async sendMessage(topic: string, key: string, value: T): Promise { + await this.producer.send({ + topic, + messages: [ + { + key, + value: JSON.stringify(value), + }, + ], + }); + } +} diff --git a/libs/common/src/redis/redis.module.ts b/libs/common/src/redis/redis.module.ts new file mode 100644 index 0000000000..9717d7e10b --- /dev/null +++ b/libs/common/src/redis/redis.module.ts @@ -0,0 +1,11 @@ +import { Global, Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { RedisService } from './redis.service'; + +@Global() +@Module({ + imports: [ConfigModule], + providers: [RedisService], + exports: [RedisService], +}) +export class RedisModule {} diff --git a/libs/common/src/redis/redis.service.spec.ts b/libs/common/src/redis/redis.service.spec.ts new file mode 100644 index 0000000000..bf3bf700f8 --- /dev/null +++ b/libs/common/src/redis/redis.service.spec.ts @@ -0,0 +1,183 @@ +import type { ConfigService } from '@nestjs/config'; +import type Redis from 'ioredis'; +import { RedisService } from './redis.service'; + +jest.mock('ioredis', () => { + return jest.fn().mockImplementation(() => mockRedisClient); +}); + +let mockRedisClient: jest.Mocked; + +describe('RedisService', () => { + let service: RedisService; + let mockConfigService: jest.Mocked; + + beforeEach(() => { + mockRedisClient = { + get: jest.fn(), + set: jest.fn(), + del: jest.fn(), + disconnect: jest.fn(), + } as any; + + mockConfigService = { + get: jest.fn(), + } as any; + + service = new RedisService(mockConfigService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('onModuleInit', () => { + it('should initialize Redis with URL when REDIS_URL is provided', () => { + mockConfigService.get.mockReturnValue('redis://localhost:6379'); + + service.onModuleInit(); + + expect(mockConfigService.get).toHaveBeenCalledWith('REDIS_URL'); + }); + + it('should throw error when REDIS_URL is not provided', () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'REDIS_URL') return null; + return undefined; + }); + + expect(() => service.onModuleInit()).toThrow('REDIS_URL environment variable is required'); + expect(mockConfigService.get).toHaveBeenCalledWith('REDIS_URL'); + }); + }); + + describe('onModuleDestroy', () => { + it('should disconnect Redis client', () => { + mockConfigService.get.mockReturnValue('redis://localhost:6379'); + service.onModuleInit(); + service.onModuleDestroy(); + + expect(mockRedisClient.disconnect).toHaveBeenCalled(); + }); + }); + + describe('get', () => { + beforeEach(() => { + mockConfigService.get.mockReturnValue('redis://localhost:6379'); + service.onModuleInit(); + }); + + it('should get and parse JSON data from Redis', async () => { + const data = { id: 1, name: 'test' }; + mockRedisClient.get.mockResolvedValue(JSON.stringify(data)); + + const result = await service.get('test-key'); + + expect(mockRedisClient.get).toHaveBeenCalledWith('test-key'); + expect(result).toEqual(data); + }); + + it('should return null when key does not exist', async () => { + mockRedisClient.get.mockResolvedValue(null); + + const result = await service.get('non-existent-key'); + + expect(result).toBeNull(); + }); + + it('should handle complex objects', async () => { + const complexData = { + id: 123, + nested: { + value: 'test', + array: [1, 2, 3], + }, + }; + mockRedisClient.get.mockResolvedValue(JSON.stringify(complexData)); + + const result = await service.get('complex-key'); + + expect(result).toEqual(complexData); + }); + + it('should handle arrays', async () => { + const arrayData = [1, 2, 3, 4, 5]; + mockRedisClient.get.mockResolvedValue(JSON.stringify(arrayData)); + + const result = await service.get('array-key'); + + expect(result).toEqual(arrayData); + }); + }); + + describe('set', () => { + beforeEach(() => { + mockConfigService.get.mockReturnValue('redis://localhost:6379'); + service.onModuleInit(); + }); + + it('should set data with default TTL', async () => { + const data = { id: 1, name: 'test' }; + + await service.set('test-key', data); + + expect(mockRedisClient.set).toHaveBeenCalledWith('test-key', JSON.stringify(data), 'EX', 600); + }); + + it('should set data with custom TTL', async () => { + const data = { id: 1, name: 'test' }; + const ttl = 3600; + + await service.set('test-key', data, ttl); + + expect(mockRedisClient.set).toHaveBeenCalledWith('test-key', JSON.stringify(data), 'EX', 3600); + }); + + it('should serialize complex objects', async () => { + const complexData = { + id: 123, + nested: { + value: 'test', + array: [1, 2, 3], + }, + }; + + await service.set('complex-key', complexData); + + expect(mockRedisClient.set).toHaveBeenCalledWith('complex-key', JSON.stringify(complexData), 'EX', 600); + }); + + it('should handle string values', async () => { + await service.set('string-key', 'simple string'); + + expect(mockRedisClient.set).toHaveBeenCalledWith('string-key', '"simple string"', 'EX', 600); + }); + + it('should handle number values', async () => { + await service.set('number-key', 12345); + + expect(mockRedisClient.set).toHaveBeenCalledWith('number-key', '12345', 'EX', 600); + }); + }); + + describe('del', () => { + beforeEach(() => { + mockConfigService.get.mockReturnValue('redis://localhost:6379'); + service.onModuleInit(); + }); + + it('should delete a key from Redis', async () => { + await service.del('test-key'); + + expect(mockRedisClient.del).toHaveBeenCalledWith('test-key'); + }); + + it('should handle deletion of non-existent keys', async () => { + mockRedisClient.del.mockResolvedValue(0); + + await service.del('non-existent-key'); + + expect(mockRedisClient.del).toHaveBeenCalledWith('non-existent-key'); + }); + }); +}); diff --git a/libs/common/src/redis/redis.service.ts b/libs/common/src/redis/redis.service.ts new file mode 100644 index 0000000000..66776a4d84 --- /dev/null +++ b/libs/common/src/redis/redis.service.ts @@ -0,0 +1,36 @@ +import { Injectable, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import Redis from 'ioredis'; + +@Injectable() +export class RedisService implements OnModuleInit, OnModuleDestroy { + private redisClient: Redis; + + constructor(private readonly configService: ConfigService) {} + + onModuleInit() { + const redisUrl = this.configService.get('REDIS_URL'); + if (!redisUrl) { + throw new Error('REDIS_URL environment variable is required'); + } + + this.redisClient = new Redis(redisUrl); + } + + onModuleDestroy() { + this.redisClient.disconnect(); + } + + async get(key: string): Promise { + const data = await this.redisClient.get(key); + return data ? JSON.parse(data) : null; + } + + async set(key: string, value: T, ttlSeconds: number = 600): Promise { + await this.redisClient.set(key, JSON.stringify(value), 'EX', ttlSeconds); + } + + async del(key: string): Promise { + await this.redisClient.del(key); + } +} diff --git a/libs/common/src/types/fraud-rules.types.ts b/libs/common/src/types/fraud-rules.types.ts new file mode 100644 index 0000000000..67f23db634 --- /dev/null +++ b/libs/common/src/types/fraud-rules.types.ts @@ -0,0 +1,70 @@ +export enum FraudRuleType { + AMOUNT_THRESHOLD = 'AMOUNT_THRESHOLD', + DAILY_LIMIT = 'DAILY_LIMIT', + VELOCITY_CHECK = 'VELOCITY_CHECK', + ACCOUNT_BLACKLIST = 'ACCOUNT_BLACKLIST', + TRANSFER_TYPE_LIMIT = 'TRANSFER_TYPE_LIMIT', + TIME_BASED = 'TIME_BASED', +} + +export enum FraudAction { + REJECT = 'REJECT', + APPROVE = 'APPROVE', + REVIEW = 'REVIEW', + FLAG = 'FLAG', +} + +export interface AmountThresholdCondition { + operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq'; + value: number; +} + +export interface DailyLimitCondition { + maxAmount: number; + maxTransactions: number; +} + +export interface VelocityCheckCondition { + maxTransactions: number; + timeWindowMinutes: number; +} + +export interface AccountBlacklistCondition { + accounts: string[]; +} + +export interface TransferTypeLimitCondition { + transferTypeId: number; + maxAmount: number; +} + +export interface TimeBasedCondition { + allowedHours: { start: number; end: number }; + allowedDays: number[]; +} + +export type FraudRuleCondition = + | AmountThresholdCondition + | DailyLimitCondition + | VelocityCheckCondition + | AccountBlacklistCondition + | TransferTypeLimitCondition + | TimeBasedCondition; + +export interface FraudRuleEvaluationResult { + ruleId: string; + ruleName: string; + matched: boolean; + action: FraudAction; + reason?: string; + details?: any; +} + +export interface FraudEvaluationContext { + transactionExternalId: string; + accountExternalIdDebit: string; + accountExternalIdCredit: string; + transferTypeId: number; + value: number; + createdAt: Date; +} diff --git a/libs/common/src/types/tracing.types.ts b/libs/common/src/types/tracing.types.ts new file mode 100644 index 0000000000..5d83d19edd --- /dev/null +++ b/libs/common/src/types/tracing.types.ts @@ -0,0 +1,28 @@ +export interface RequestContext { + correlationId: string; + requestId: string; + timestamp: string; + service: string; + userId?: string; + ipAddress?: string; + userAgent?: string; +} + +export interface LogContext extends RequestContext { + level: 'debug' | 'info' | 'warn' | 'error'; + message: string; + metadata?: Record; + error?: { + message: string; + stack?: string; + code?: string; + }; +} + +export interface EventMetadata { + correlationId: string; + causationId: string; + timestamp: string; + service: string; + version?: string; +} diff --git a/libs/common/src/types/transaction.types.ts b/libs/common/src/types/transaction.types.ts new file mode 100644 index 0000000000..13875096a3 --- /dev/null +++ b/libs/common/src/types/transaction.types.ts @@ -0,0 +1,17 @@ +export enum TransactionStatus { + PENDING = 'pending', + APPROVED = 'approved', + REJECTED = 'rejected', +} + +export enum TransactionType { + TRANSFER = 1, + PAYMENT = 2, + WITHDRAWAL = 3, +} + +export const TransactionTypeNames: Record = { + [TransactionType.TRANSFER]: 'Transfer', + [TransactionType.PAYMENT]: 'Payment', + [TransactionType.WITHDRAWAL]: 'Withdrawal', +}; diff --git a/libs/common/tsconfig.lib.json b/libs/common/tsconfig.lib.json new file mode 100644 index 0000000000..7911731e24 --- /dev/null +++ b/libs/common/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/common", + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/libs/observability/src/adapters/composite-logger.adapter.ts b/libs/observability/src/adapters/composite-logger.adapter.ts new file mode 100644 index 0000000000..03c50f8d2d --- /dev/null +++ b/libs/observability/src/adapters/composite-logger.adapter.ts @@ -0,0 +1,58 @@ +import type { RequestContext } from '@app/common/types/tracing.types'; +import { Injectable } from '@nestjs/common'; +import type { ILogger } from '../ports/logger.port'; + +@Injectable() +export class CompositeLoggerAdapter implements ILogger { + constructor(private readonly loggers: ILogger[]) {} + + log(message: string, context?: Partial, metadata?: Record): void { + this.loggers.forEach((logger) => { + try { + logger.log(message, context, metadata); + } catch (error) { + console.error(`Logger failed:`, error); + } + }); + } + + error(message: string, error?: Error, context?: Partial, metadata?: Record): void { + this.loggers.forEach((logger) => { + try { + logger.error(message, error, context, metadata); + } catch (err) { + console.error(`Logger failed:`, err); + } + }); + } + + warn(message: string, context?: Partial, metadata?: Record): void { + this.loggers.forEach((logger) => { + try { + logger.warn(message, context, metadata); + } catch (error) { + console.error(`Logger failed:`, error); + } + }); + } + + debug(message: string, context?: Partial, metadata?: Record): void { + this.loggers.forEach((logger) => { + try { + logger.debug(message, context, metadata); + } catch (error) { + console.error(`Logger failed:`, error); + } + }); + } + + verbose(message: string, context?: Partial, metadata?: Record): void { + this.loggers.forEach((logger) => { + try { + logger.verbose(message, context, metadata); + } catch (error) { + console.error(`Logger failed:`, error); + } + }); + } +} diff --git a/libs/observability/src/adapters/console-logger.adapter.ts b/libs/observability/src/adapters/console-logger.adapter.ts new file mode 100644 index 0000000000..8706f66e88 --- /dev/null +++ b/libs/observability/src/adapters/console-logger.adapter.ts @@ -0,0 +1,60 @@ +import type { LogContext, RequestContext } from '@app/common/types/tracing.types'; +import { Injectable } from '@nestjs/common'; +import type { ILogger } from '../ports/logger.port'; + +@Injectable() +export class ConsoleLoggerAdapter implements ILogger { + constructor(private readonly serviceName: string) {} + + private buildLogContext( + level: LogContext['level'], + message: string, + context?: Partial, + metadata?: Record, + error?: Error, + ): LogContext { + return { + correlationId: context?.correlationId || 'unknown', + requestId: context?.requestId || 'unknown', + timestamp: new Date().toISOString(), + service: this.serviceName, + userId: context?.userId, + ipAddress: context?.ipAddress, + userAgent: context?.userAgent, + level, + message, + metadata, + error: error + ? { + message: error.message, + stack: error.stack, + code: (error as any).code, + } + : undefined, + }; + } + + private output(logContext: LogContext): void { + console.log(JSON.stringify(logContext)); + } + + log(message: string, context?: Partial, metadata?: Record): void { + this.output(this.buildLogContext('info', message, context, metadata)); + } + + error(message: string, error?: Error, context?: Partial, metadata?: Record): void { + this.output(this.buildLogContext('error', message, context, metadata, error)); + } + + warn(message: string, context?: Partial, metadata?: Record): void { + this.output(this.buildLogContext('warn', message, context, metadata)); + } + + debug(message: string, context?: Partial, metadata?: Record): void { + this.output(this.buildLogContext('debug', message, context, metadata)); + } + + verbose(message: string, context?: Partial, metadata?: Record): void { + this.output(this.buildLogContext('debug', message, context, metadata)); + } +} diff --git a/libs/observability/src/adapters/sentry-logger.adapter.ts b/libs/observability/src/adapters/sentry-logger.adapter.ts new file mode 100644 index 0000000000..9a251ec67d --- /dev/null +++ b/libs/observability/src/adapters/sentry-logger.adapter.ts @@ -0,0 +1,80 @@ +import type { RequestContext } from '@app/common/types/tracing.types'; +import { Injectable } from '@nestjs/common'; +import * as Sentry from '@sentry/nestjs'; +import type { ILogger } from '../ports/logger.port'; + +@Injectable() +export class SentryLoggerAdapter implements ILogger { + private serviceName: string; + + constructor(serviceName: string) { + this.serviceName = serviceName; + } + + private captureWithContext( + level: 'info' | 'warning' | 'error' | 'debug', + message: string, + context?: Partial, + metadata?: Record, + error?: Error, + ): void { + Sentry.withScope((scope: any) => { + scope.setTag('service', this.serviceName); + scope.setTag('correlation_id', context?.correlationId || 'unknown'); + scope.setTag('request_id', context?.requestId || 'unknown'); + scope.setLevel(level); + + if (context?.userId) { + scope.setUser({ + id: context.userId, + ip_address: context.ipAddress, + }); + } + + scope.setContext('request', { + correlationId: context?.correlationId, + requestId: context?.requestId, + ipAddress: context?.ipAddress, + userAgent: context?.userAgent, + timestamp: new Date().toISOString(), + }); + + if (metadata) { + scope.setContext('metadata', metadata); + } + + if (error) { + scope.setContext('error_details', { + name: error.name, + message: error.message, + code: (error as any).code, + }); + Sentry.captureException(error); + } else { + Sentry.captureMessage(message, level); + } + }); + } + + log(message: string, context?: Partial, metadata?: Record): void { + if (process.env.NODE_ENV === 'development') { + this.captureWithContext('info', message, context, metadata); + } + } + + error(message: string, error?: Error, context?: Partial, metadata?: Record): void { + this.captureWithContext('error', message, context, metadata, error); + } + + warn(message: string, context?: Partial, metadata?: Record): void { + this.captureWithContext('warning', message, context, metadata); + } + + debug(message: string, context?: Partial, metadata?: Record): void { + if (process.env.SENTRY_DEBUG === 'true') { + this.captureWithContext('debug', message, context, metadata); + } + } + + verbose(_message: string, _context?: Partial, _metadata?: Record): void {} +} diff --git a/libs/observability/src/index.ts b/libs/observability/src/index.ts new file mode 100644 index 0000000000..1b25de5a1e --- /dev/null +++ b/libs/observability/src/index.ts @@ -0,0 +1,36 @@ +export { context, propagation, Span as OtelSpan, trace } from '@opentelemetry/api'; +export { CompositeLoggerAdapter } from './adapters/composite-logger.adapter'; +export { ConsoleLoggerAdapter } from './adapters/console-logger.adapter'; +export { SentryLoggerAdapter } from './adapters/sentry-logger.adapter'; +export { + extractTraceContext, + getTraceHeaders, + injectTraceContext, + withProducerSpan, + wrapKafkaHandler, +} from './kafka/kafka-tracing.helper'; +export { LoggerService } from './logger.service'; +export { HttpLoggerInterceptor } from './logging/http-logger.interceptor'; +export { LoggingModule } from './logging/logging.module'; +export { + createPinoLogger, + LogContext, + PinoLoggerService, +} from './logging/pino-logger.service'; +export { ObservabilityModule } from './observability.module'; +export { type ILogger, LOGGER_PORT } from './ports/logger.port'; +export { + getCurrentTraceContext, + getTracer, + initializeTelemetry, + shutdownTelemetry, + TelemetryConfig, +} from './tracing/otel'; +export { + KafkaConsumerSpan, + RepositorySpan, + Span, + SpanOptions, + UseCaseSpan, +} from './tracing/span.decorator'; +export { TracingModule } from './tracing/tracing.module'; diff --git a/libs/observability/src/kafka/kafka-tracing.helper.ts b/libs/observability/src/kafka/kafka-tracing.helper.ts new file mode 100644 index 0000000000..d174ad25bf --- /dev/null +++ b/libs/observability/src/kafka/kafka-tracing.helper.ts @@ -0,0 +1,116 @@ +import { context, propagation, type Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'; +import type { EachMessagePayload } from 'kafkajs'; + +export function injectTraceContext(headers: Record = {}): Record { + const activeContext = context.active(); + + propagation.inject(activeContext, headers, { + set: (carrier, key, value) => { + carrier[key] = value; + }, + }); + + return headers; +} + +export function extractTraceContext(headers: Record = {}): any { + return propagation.extract(context.active(), headers, { + get: (carrier, key) => { + const value = carrier[key]; + if (Array.isArray(value)) { + return value[0]?.toString(); + } + return value?.toString(); + }, + keys: (carrier) => Object.keys(carrier), + }); +} + +export function wrapKafkaHandler( + topicName: string, + handler: (payload: EachMessagePayload) => Promise, +): (payload: EachMessagePayload) => Promise { + return async (payload: EachMessagePayload) => { + const { topic, partition, message } = payload; + const tracer = trace.getTracer('kafka-consumer'); + + const extractedContext = extractTraceContext(message.headers || {}); + + return context.with(extractedContext, async () => { + return tracer.startActiveSpan( + `kafka.consume.${topicName}`, + { + kind: SpanKind.CONSUMER, + attributes: { + 'messaging.system': 'kafka', + 'messaging.destination': topic, + 'messaging.operation': 'receive', + 'messaging.kafka.partition': partition, + 'messaging.kafka.offset': message.offset, + 'messaging.message_id': message.key?.toString(), + }, + }, + async (span: Span) => { + try { + await handler(payload); + + span.setStatus({ code: SpanStatusCode.OK }); + } catch (error) { + span.recordException(error); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.message, + }); + + throw error; + } finally { + span.end(); + } + }, + ); + }); + }; +} + +export async function withProducerSpan( + topicName: string, + messageKey: string, + handler: () => Promise, +): Promise { + const tracer = trace.getTracer('kafka-producer'); + + return tracer.startActiveSpan( + `kafka.produce.${topicName}`, + { + kind: 4, + attributes: { + 'messaging.system': 'kafka', + 'messaging.destination': topicName, + 'messaging.operation': 'send', + 'messaging.message_id': messageKey, + }, + }, + async (span: Span) => { + try { + const result = await handler(); + span.setStatus({ code: SpanStatusCode.OK }); + return result; + } catch (error) { + span.recordException(error); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.message, + }); + throw error; + } finally { + span.end(); + } + }, + ); +} + +export function getTraceHeaders(): Record { + const headers: Record = {}; + injectTraceContext(headers); + return headers; +} diff --git a/libs/observability/src/logger.service.ts b/libs/observability/src/logger.service.ts new file mode 100644 index 0000000000..e64daa3cfe --- /dev/null +++ b/libs/observability/src/logger.service.ts @@ -0,0 +1,28 @@ +import type { RequestContext } from '@app/common/types/tracing.types'; +import { Inject, Injectable } from '@nestjs/common'; +import { type ILogger, LOGGER_PORT } from './ports/logger.port'; + +@Injectable() +export class LoggerService implements ILogger { + constructor(@Inject(LOGGER_PORT) private readonly logger: ILogger) {} + + log(message: string, context?: Partial, metadata?: Record): void { + this.logger.log(message, context, metadata); + } + + error(message: string, error?: Error, context?: Partial, metadata?: Record): void { + this.logger.error(message, error, context, metadata); + } + + warn(message: string, context?: Partial, metadata?: Record): void { + this.logger.warn(message, context, metadata); + } + + debug(message: string, context?: Partial, metadata?: Record): void { + this.logger.debug(message, context, metadata); + } + + verbose(message: string, context?: Partial, metadata?: Record): void { + this.logger.verbose(message, context, metadata); + } +} diff --git a/libs/observability/src/logging/http-logger.interceptor.ts b/libs/observability/src/logging/http-logger.interceptor.ts new file mode 100644 index 0000000000..df214d7606 --- /dev/null +++ b/libs/observability/src/logging/http-logger.interceptor.ts @@ -0,0 +1,83 @@ +import { type CallHandler, type ExecutionContext, Injectable, type NestInterceptor } from '@nestjs/common'; +import type { Observable } from 'rxjs'; +import { catchError, tap } from 'rxjs/operators'; +import type { PinoLoggerService } from './pino-logger.service'; + +@Injectable() +export class HttpLoggerInterceptor implements NestInterceptor { + constructor(private readonly logger: PinoLoggerService) {} + + intercept(context: ExecutionContext, next: CallHandler): Observable { + if (context.getType() !== 'http') { + return next.handle(); + } + + const request = context.switchToHttp().getRequest(); + const response = context.switchToHttp().getResponse(); + const { method, url, headers, body } = request; + const startTime = Date.now(); + + this.logger.log('Incoming HTTP request', { + http: { + method, + url, + userAgent: headers['user-agent'], + contentType: headers['content-type'], + }, + request: { + body: this.sanitizeBody(body), + }, + }); + + return next.handle().pipe( + tap((data) => { + const duration = Date.now() - startTime; + + this.logger.log('HTTP request completed', { + http: { + method, + url, + statusCode: response.statusCode, + duration, + }, + response: { + size: JSON.stringify(data).length, + }, + }); + }), + catchError((error) => { + const duration = Date.now() - startTime; + + this.logger.error(`HTTP request failed: ${error.message}`, error.stack, { + http: { + method, + url, + statusCode: error.status || 500, + duration, + }, + error: { + name: error.name, + message: error.message, + }, + }); + + throw error; + }), + ); + } + + private sanitizeBody(body: any): any { + if (!body) return undefined; + + const sanitized = { ...body }; + const sensitiveFields = ['password', 'token', 'creditCard', 'ssn']; + + for (const field of sensitiveFields) { + if (sanitized[field]) { + sanitized[field] = '[REDACTED]'; + } + } + + return sanitized; + } +} diff --git a/libs/observability/src/logging/logging.module.ts b/libs/observability/src/logging/logging.module.ts new file mode 100644 index 0000000000..51687a083a --- /dev/null +++ b/libs/observability/src/logging/logging.module.ts @@ -0,0 +1,39 @@ +import { type DynamicModule, Global, Module } from '@nestjs/common'; +import { createPinoLogger, PinoLoggerService } from './pino-logger.service'; + +@Global() +@Module({}) +export class LoggingModule { + static forRoot(serviceName: string): DynamicModule { + const loggerProvider = { + provide: PinoLoggerService, + useValue: createPinoLogger(serviceName), + }; + + return { + module: LoggingModule, + providers: [loggerProvider], + exports: [loggerProvider], + }; + } + + static forRootAsync(options: { + inject?: any[]; + useFactory: (...args: any[]) => string | Promise; + }): DynamicModule { + const loggerProvider = { + provide: PinoLoggerService, + useFactory: async (...args: any[]) => { + const serviceName = await options.useFactory(...args); + return createPinoLogger(serviceName); + }, + inject: options.inject || [], + }; + + return { + module: LoggingModule, + providers: [loggerProvider], + exports: [loggerProvider], + }; + } +} diff --git a/libs/observability/src/logging/pino-logger.service.ts b/libs/observability/src/logging/pino-logger.service.ts new file mode 100644 index 0000000000..d43e091b47 --- /dev/null +++ b/libs/observability/src/logging/pino-logger.service.ts @@ -0,0 +1,98 @@ +import { Injectable, type LoggerService as NestLoggerService } from '@nestjs/common'; +import pino from 'pino'; +import { getCurrentTraceContext } from '../tracing/otel'; + +export interface LogContext { + [key: string]: any; +} + +@Injectable() +export class PinoLoggerService implements NestLoggerService { + private logger: pino.Logger; + + constructor(private readonly serviceName: string) { + const isDevelopment = process.env.NODE_ENV !== 'production'; + + this.logger = pino({ + name: serviceName, + level: process.env.LOG_LEVEL || (isDevelopment ? 'debug' : 'info'), + + transport: isDevelopment + ? { + target: 'pino-pretty', + options: { + colorize: true, + translateTime: 'HH:MM:ss', + ignore: 'pid,hostname', + singleLine: false, + }, + } + : undefined, + + formatters: { + level: (label) => { + return { level: label }; + }, + }, + + timestamp: pino.stdTimeFunctions.isoTime, + + redact: { + paths: ['password', 'token', 'authorization', 'cookie', 'creditCard', 'ssn'], + remove: true, + }, + }); + } + + private enrichWithTraceContext(context?: LogContext): LogContext { + const traceContext = getCurrentTraceContext(); + + return { + service: this.serviceName, + ...context, + ...(traceContext && { + traceId: traceContext.traceId, + spanId: traceContext.spanId, + traceFlags: traceContext.traceFlags, + }), + }; + } + + log(message: string, context?: LogContext): void { + this.logger.info(this.enrichWithTraceContext(context), message); + } + + error(message: string, trace?: string, context?: LogContext): void { + this.logger.error(this.enrichWithTraceContext({ ...context, stack: trace }), message); + } + + warn(message: string, context?: LogContext): void { + this.logger.warn(this.enrichWithTraceContext(context), message); + } + + debug(message: string, context?: LogContext): void { + this.logger.debug(this.enrichWithTraceContext(context), message); + } + + verbose(message: string, context?: LogContext): void { + this.logger.trace(this.enrichWithTraceContext(context), message); + } + + fatal(message: string, context?: LogContext): void { + this.logger.fatal(this.enrichWithTraceContext(context), message); + } + + child(bindings: LogContext): PinoLoggerService { + const childLogger = new PinoLoggerService(this.serviceName); + childLogger.logger = this.logger.child(bindings); + return childLogger; + } + + getPinoLogger(): pino.Logger { + return this.logger; + } +} + +export function createPinoLogger(serviceName: string): PinoLoggerService { + return new PinoLoggerService(serviceName); +} diff --git a/libs/observability/src/observability.module.ts b/libs/observability/src/observability.module.ts new file mode 100644 index 0000000000..6cf3ca9bb7 --- /dev/null +++ b/libs/observability/src/observability.module.ts @@ -0,0 +1,66 @@ +import { AllExceptionsFilter } from '@app/common'; +import { type DynamicModule, Global, Module } from '@nestjs/common'; +import { APP_FILTER } from '@nestjs/core'; +import { SentryGlobalFilter, SentryModule } from '@sentry/nestjs/setup'; +import { CompositeLoggerAdapter } from './adapters/composite-logger.adapter'; +import { ConsoleLoggerAdapter } from './adapters/console-logger.adapter'; +import { SentryLoggerAdapter } from './adapters/sentry-logger.adapter'; +import { LoggerService } from './logger.service'; +import { type ILogger, LOGGER_PORT } from './ports/logger.port'; + +export interface ObservabilityModuleOptions { + serviceName: string; + enableSentry?: boolean; + sentryDsn?: string; + environment?: string; +} + +@Global() +@Module({}) +export class ObservabilityModule { + static forRoot(options: ObservabilityModuleOptions): DynamicModule { + const loggers: ILogger[] = []; + const imports: any[] = []; + + loggers.push(new ConsoleLoggerAdapter(options.serviceName)); + + if (options.enableSentry && options.sentryDsn) { + loggers.push(new SentryLoggerAdapter(options.serviceName)); + + imports.push(SentryModule.forRoot()); + } + + const compositeLogger = loggers.length > 1 ? new CompositeLoggerAdapter(loggers) : loggers[0]; + + const providers: any[] = [ + { + provide: LOGGER_PORT, + useValue: compositeLogger, + }, + LoggerService, + ]; + + if (options.enableSentry && options.sentryDsn) { + providers.push({ + provide: APP_FILTER, + useClass: SentryGlobalFilter, + }); + } else { + providers.push({ + provide: APP_FILTER, + inject: [LoggerService], + useFactory: (logger: LoggerService) => { + return new AllExceptionsFilter(logger); + }, + }); + } + + return { + module: ObservabilityModule, + global: true, + imports, + providers, + exports: [LOGGER_PORT, LoggerService], + }; + } +} diff --git a/libs/observability/src/ports/logger.port.ts b/libs/observability/src/ports/logger.port.ts new file mode 100644 index 0000000000..cb3d5deb83 --- /dev/null +++ b/libs/observability/src/ports/logger.port.ts @@ -0,0 +1,11 @@ +import type { RequestContext } from '@app/common/types/tracing.types'; + +export interface ILogger { + log(message: string, context?: Partial, metadata?: Record): void; + error(message: string, error?: Error, context?: Partial, metadata?: Record): void; + warn(message: string, context?: Partial, metadata?: Record): void; + debug(message: string, context?: Partial, metadata?: Record): void; + verbose(message: string, context?: Partial, metadata?: Record): void; +} + +export const LOGGER_PORT = Symbol.for('LOGGER_PORT'); diff --git a/libs/observability/src/tracing/otel.ts b/libs/observability/src/tracing/otel.ts new file mode 100644 index 0000000000..69f04b315d --- /dev/null +++ b/libs/observability/src/tracing/otel.ts @@ -0,0 +1,146 @@ +import { trace } from '@opentelemetry/api'; +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { Resource } from '@opentelemetry/resources'; +import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { NodeSDK } from '@opentelemetry/sdk-node'; +import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; + +export interface TelemetryConfig { + serviceName: string; + serviceVersion?: string; + otlpEndpoint?: string; + environment?: string; + sampling?: number; + enabled?: boolean; +} + +let sdk: NodeSDK | null = null; + +export function initializeTelemetry(config: TelemetryConfig): NodeSDK | null { + if (sdk) { + console.warn('⚠️ OpenTelemetry SDK already initialized'); + return sdk; + } + + const { + serviceName, + serviceVersion = '1.0.0', + otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318', + environment = process.env.NODE_ENV || 'development', + sampling = parseFloat(process.env.OTEL_SAMPLING_RATIO || '1.0'), + enabled = process.env.OTEL_ENABLED !== 'false', + } = config; + + if (!enabled) { + console.log('📊 OpenTelemetry is disabled'); + return null; + } + + const resource = new Resource({ + [ATTR_SERVICE_NAME]: serviceName, + [ATTR_SERVICE_VERSION]: serviceVersion, + 'deployment.environment': environment, + }); + + const traceExporter = new OTLPTraceExporter({ + url: `${otlpEndpoint}/v1/traces`, + headers: {}, + }); + + const metricExporter = new OTLPMetricExporter({ + url: `${otlpEndpoint}/v1/metrics`, + headers: {}, + }); + + sdk = new NodeSDK({ + resource, + traceExporter, + metricReader: new PeriodicExportingMetricReader({ + exporter: metricExporter, + exportIntervalMillis: 60000, + }), + instrumentations: [ + getNodeAutoInstrumentations({ + // Auto-instrumenta HTTP, Express, Kafka, PostgreSQL, etc. + '@opentelemetry/instrumentation-http': { + ignoreIncomingRequestHook: (req) => { + const ignorePaths = ['/health', '/metrics', '/ready']; + return ignorePaths.some((path) => req.url?.startsWith(path)); + }, + requestHook: (span, request) => { + if (request.socket?.remoteAddress) { + span.setAttribute('http.client_ip', request.socket.remoteAddress); + } + }, + }, + // Deshabilitar instrumentaciones que no necesites + '@opentelemetry/instrumentation-fs': { + enabled: false, + }, + }), + ], + + sampler: + sampling < 1.0 + ? { + shouldSample: () => { + return Math.random() < sampling ? { decision: 1 } : { decision: 0 }; + }, + toString: () => `CustomSampler{${sampling}}`, + } + : undefined, + }); + + sdk.start(); + + console.log(`🚀 OpenTelemetry initialized for service: ${serviceName}`); + console.log(`📡 Exporting traces to: ${otlpEndpoint}`); + console.log(`🎲 Sampling ratio: ${sampling * 100}%`); + + const shutdown = async () => { + try { + if (sdk) { + await sdk.shutdown(); + console.log('✅ OpenTelemetry SDK shut down successfully'); + } + } catch (err) { + console.error('❌ Error shutting down OpenTelemetry SDK:', err); + } + }; + + process.on('SIGTERM', shutdown); + process.on('SIGINT', shutdown); + + return sdk; +} + +export function getTracer(name: string) { + return trace.getTracer(name); +} + +export function getCurrentTraceContext(): { + traceId: string; + spanId: string; + traceFlags: string; +} | null { + const span = trace.getActiveSpan(); + if (!span) { + return null; + } + + const spanContext = span.spanContext(); + return { + traceId: spanContext.traceId, + spanId: spanContext.spanId, + traceFlags: spanContext.traceFlags.toString(16).padStart(2, '0'), + }; +} + +export async function shutdownTelemetry(): Promise { + if (sdk) { + await sdk.shutdown(); + sdk = null; + } +} diff --git a/libs/observability/src/tracing/span.decorator.ts b/libs/observability/src/tracing/span.decorator.ts new file mode 100644 index 0000000000..035058e82c --- /dev/null +++ b/libs/observability/src/tracing/span.decorator.ts @@ -0,0 +1,93 @@ +import { type Span as OtelSpan, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'; + +export interface SpanOptions { + name?: string; + kind?: number; + attributes?: Record; + recordException?: boolean; +} + +export function Span(nameOrOptions?: string | SpanOptions) { + return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { + const originalMethod = descriptor.value; + const className = target.constructor.name; + + descriptor.value = async function (...args: any[]) { + const options: SpanOptions = + typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions || {}; + + const spanName = options.name || `${className}.${propertyKey}`; + const tracer = trace.getTracer('app-tracer'); + + return tracer.startActiveSpan( + spanName, + { + kind: options.kind, + attributes: { + 'code.function': propertyKey, + 'code.class': className, + ...options.attributes, + }, + }, + async (span: OtelSpan) => { + try { + const result = await originalMethod.apply(this, args); + span.setStatus({ code: SpanStatusCode.OK }); + return result; + } catch (error) { + if (options.recordException !== false) { + span.recordException(error); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.message, + }); + } + throw error; + } finally { + span.end(); + } + }, + ); + }; + + return descriptor; + }; +} + +export function KafkaConsumerSpan(topicName: string) { + return Span({ + name: `kafka.consume.${topicName}`, + kind: SpanKind.CONSUMER, + attributes: { + 'messaging.system': 'kafka', + 'messaging.destination': topicName, + 'messaging.operation': 'receive', + }, + recordException: true, + }); +} + +export function RepositorySpan(operationName: string, entityName?: string) { + return Span({ + name: `db.${operationName}`, + kind: SpanKind.CLIENT, + attributes: { + 'db.system': 'postgresql', + 'db.operation': operationName, + ...(entityName && { 'db.entity': entityName }), + }, + recordException: true, + }); +} + +export function UseCaseSpan(useCaseName: string) { + return Span({ + name: `usecase.${useCaseName}`, + kind: SpanKind.INTERNAL, + attributes: { + 'code.layer': 'application', + 'code.type': 'usecase', + }, + recordException: true, + }); +} diff --git a/libs/observability/src/tracing/tracing.module.ts b/libs/observability/src/tracing/tracing.module.ts new file mode 100644 index 0000000000..adad3c003a --- /dev/null +++ b/libs/observability/src/tracing/tracing.module.ts @@ -0,0 +1,36 @@ +import { type DynamicModule, Global, Module } from '@nestjs/common'; +import type { TelemetryConfig } from './otel'; + +@Global() +@Module({}) +export class TracingModule { + static forRoot(config: TelemetryConfig): DynamicModule { + return { + module: TracingModule, + providers: [ + { + provide: 'TELEMETRY_CONFIG', + useValue: config, + }, + ], + exports: ['TELEMETRY_CONFIG'], + }; + } + + static forRootAsync(options: { + inject?: any[]; + useFactory: (...args: any[]) => TelemetryConfig | Promise; + }): DynamicModule { + return { + module: TracingModule, + providers: [ + { + provide: 'TELEMETRY_CONFIG', + useFactory: options.useFactory, + inject: options.inject || [], + }, + ], + exports: ['TELEMETRY_CONFIG'], + }; + } +} diff --git a/libs/observability/tsconfig.lib.json b/libs/observability/tsconfig.lib.json new file mode 100644 index 0000000000..42c1e8f41c --- /dev/null +++ b/libs/observability/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/observability", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/nest-cli.json b/nest-cli.json new file mode 100644 index 0000000000..35e08d4f62 --- /dev/null +++ b/nest-cli.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "apps", + "monorepo": true, + "root": "apps", + "compilerOptions": { + "deleteOutDir": true, + "webpack": false, + "tsConfigPath": "apps/transaction-service/tsconfig.app.json" + }, + "projects": { + "transaction-service": { + "type": "application", + "root": "apps/transaction-service", + "entryFile": "main", + "sourceRoot": "apps/transaction-service/src", + "compilerOptions": { + "tsConfigPath": "apps/transaction-service/tsconfig.app.json" + } + }, + "anti-fraud-service": { + "type": "application", + "root": "apps/anti-fraud-service", + "entryFile": "main", + "sourceRoot": "apps/anti-fraud-service/src", + "compilerOptions": { + "tsConfigPath": "apps/anti-fraud-service/tsconfig.app.json" + } + }, + "common": { + "type": "library", + "root": "libs/common", + "entryFile": "index", + "sourceRoot": "libs/common/src", + "compilerOptions": { + "tsConfigPath": "libs/common/tsconfig.lib.json" + } + }, + "observability": { + "type": "library", + "root": "libs/observability", + "entryFile": "index", + "sourceRoot": "libs/observability/src", + "compilerOptions": { + "tsConfigPath": "libs/observability/tsconfig.lib.json" + } + } + } +} diff --git a/observability/grafana/provisioning/dashboards/dashboard.yaml b/observability/grafana/provisioning/dashboards/dashboard.yaml new file mode 100644 index 0000000000..8a5e7b7d98 --- /dev/null +++ b/observability/grafana/provisioning/dashboards/dashboard.yaml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Default' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /var/lib/grafana/dashboards diff --git a/observability/grafana/provisioning/datasources/datasources-minimal.yaml b/observability/grafana/provisioning/datasources/datasources-minimal.yaml new file mode 100644 index 0000000000..2699efef3e --- /dev/null +++ b/observability/grafana/provisioning/datasources/datasources-minimal.yaml @@ -0,0 +1,20 @@ +apiVersion: 1 + +datasources: + # Tempo - Distributed Tracing + - name: Tempo + type: tempo + access: proxy + url: http://tempo:3200 + uid: tempo + isDefault: true + editable: true + jsonData: + nodeGraph: + enabled: true + search: + hide: false + lokiSearch: + datasourceUid: '' + serviceMap: + datasourceUid: '' diff --git a/observability/grafana/provisioning/datasources/datasources.yaml b/observability/grafana/provisioning/datasources/datasources.yaml new file mode 100644 index 0000000000..d93b772586 --- /dev/null +++ b/observability/grafana/provisioning/datasources/datasources.yaml @@ -0,0 +1,55 @@ +apiVersion: 1 + +datasources: + # Tempo - Distributed Tracing + - name: Tempo + type: tempo + access: proxy + url: http://tempo:3200 + uid: tempo + editable: true + jsonData: + tracesToLogs: + datasourceUid: 'loki' + tags: ['traceId', 'spanId'] + mappedTags: [{ key: 'service', value: 'service' }] + mapTagNamesEnabled: true + spanStartTimeShift: '-1h' + spanEndTimeShift: '1h' + tracesToMetrics: + datasourceUid: 'prometheus' + tags: [{ key: 'service.name', value: 'service' }] + queries: + - name: 'Sample query' + query: 'sum(rate(traces_spanmetrics_latency_bucket{$$__tags}[5m]))' + serviceMap: + datasourceUid: 'prometheus' + nodeGraph: + enabled: true + + # Prometheus - Metrics + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + uid: prometheus + editable: true + jsonData: + httpMethod: POST + exemplarTraceIdDestinations: + - name: traceId + datasourceUid: tempo + + # Loki - Logs + - name: Loki + type: loki + access: proxy + url: http://loki:3100 + uid: loki + editable: true + jsonData: + derivedFields: + - datasourceUid: tempo + matcherRegex: "traceId=(\\w+)" + name: TraceID + url: '$${__value.raw}' diff --git a/observability/tempo/tempo.yaml b/observability/tempo/tempo.yaml new file mode 100644 index 0000000000..d239e882a9 --- /dev/null +++ b/observability/tempo/tempo.yaml @@ -0,0 +1,31 @@ +server: + http_listen_port: 3200 + +distributor: + receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + +ingester: + max_block_duration: 5m + +compactor: + compaction: + block_retention: 48h + +storage: + trace: + backend: local + wal: + path: /tmp/tempo/wal + local: + path: /tmp/tempo/blocks + +overrides: + defaults: + metrics_generator: + processors: [service-graphs, span-metrics] diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..292840e40a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14828 @@ +{ + "name": "app-nodejs-codechallenge", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "app-nodejs-codechallenge", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@nestjs/common": "^11.1.11", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.1.11", + "@nestjs/microservices": "^11.1.11", + "@nestjs/platform-express": "^11.1.11", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.50.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.53.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", + "@opentelemetry/instrumentation-http": "^0.53.0", + "@opentelemetry/instrumentation-kafkajs": "^0.3.0", + "@opentelemetry/resources": "^1.26.0", + "@opentelemetry/sdk-node": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@sentry/nestjs": "^10.32.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "drizzle-orm": "^0.45.1", + "ioredis": "^5.8.2", + "kafkajs": "^2.2.4", + "pino": "^9.5.0", + "pino-http": "^10.3.0", + "pino-pretty": "^13.0.0", + "postgres": "^3.4.7", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.2", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@biomejs/biome": "2.3.10", + "@nestjs/cli": "^11.0.14", + "@nestjs/testing": "^11.1.11", + "@types/express": "^5.0.6", + "@types/jest": "^29.5.12", + "@types/node": "^25.0.3", + "@types/supertest": "^6.0.2", + "@types/uuid": "^10.0.0", + "concurrently": "^9.2.1", + "drizzle-kit": "^0.31.8", + "jest": "^29.7.0", + "nodemon": "^3.1.11", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.9.3" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.19.tgz", + "integrity": "sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "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 + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.19.tgz", + "integrity": "sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "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" + } + }, + "node_modules/@angular-devkit/schematics-cli": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.19.tgz", + "integrity": "sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "@angular-devkit/schematics": "19.2.19", + "@inquirer/prompts": "7.3.2", + "ansi-colors": "4.1.3", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "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" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@apm-js-collab/code-transformer": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz", + "integrity": "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==", + "license": "Apache-2.0" + }, + "node_modules/@apm-js-collab/tracing-hooks": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.3.1.tgz", + "integrity": "sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==", + "license": "Apache-2.0", + "dependencies": { + "@apm-js-collab/code-transformer": "^0.8.0", + "debug": "^4.4.1", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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/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.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@biomejs/biome": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.10.tgz", + "integrity": "sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.3.10", + "@biomejs/cli-darwin-x64": "2.3.10", + "@biomejs/cli-linux-arm64": "2.3.10", + "@biomejs/cli-linux-arm64-musl": "2.3.10", + "@biomejs/cli-linux-x64": "2.3.10", + "@biomejs/cli-linux-x64-musl": "2.3.10", + "@biomejs/cli-win32-arm64": "2.3.10", + "@biomejs/cli-win32-x64": "2.3.10" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.10.tgz", + "integrity": "sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.10.tgz", + "integrity": "sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.10.tgz", + "integrity": "sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.10.tgz", + "integrity": "sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.10.tgz", + "integrity": "sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.10.tgz", + "integrity": "sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.10.tgz", + "integrity": "sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.10.tgz", + "integrity": "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", + "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@ioredis/commands": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", + "license": "MIT" + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nestjs/cli": { + "version": "11.0.14", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.14.tgz", + "integrity": "sha512-YwP03zb5VETTwelXU+AIzMVbEZKk/uxJL+z9pw0mdG9ogAtqZ6/mpmIM4nEq/NU8D0a7CBRLcMYUmWW/55pfqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "@angular-devkit/schematics": "19.2.19", + "@angular-devkit/schematics-cli": "19.2.19", + "@inquirer/prompts": "7.10.1", + "@nestjs/schematics": "^11.0.1", + "ansis": "4.2.0", + "chokidar": "4.0.3", + "cli-table3": "0.6.5", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "9.1.0", + "glob": "13.0.0", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.2.0", + "typescript": "5.9.3", + "webpack": "5.103.0", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 20.11" + }, + "peerDependencies": { + "@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": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nestjs/common": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.11.tgz", + "integrity": "sha512-R/+A8XFqLgN8zNs2twhrOaE7dJbRQhdPX3g46am4RT/x8xGLqDphrXkUIno4cGUZHxbczChBAaAPTdPv73wDZA==", + "license": "MIT", + "dependencies": { + "file-type": "21.2.0", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", + "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", + "license": "MIT", + "dependencies": { + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", + "lodash": "4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.11.tgz", + "integrity": "sha512-H9i+zT3RvHi7tDc+lCmWHJ3ustXveABCr+Vcpl96dNOxgmrx4elQSTC4W93Mlav2opfLV+p0UTHY6L+bpUA4zA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/microservices": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.1.11.tgz", + "integrity": "sha512-nqOdHk0QHmaloWTBb+6enT+OIT5atqjEHWKaaSoQfAlJVGa7FVhgdNVcWBdDcPtNQM6hCTc8VGgQHIRDDhjFOw==", + "license": "MIT", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@grpc/grpc-js": "*", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "amqp-connection-manager": "*", + "amqplib": "*", + "cache-manager": "*", + "ioredis": "*", + "kafkajs": "*", + "mqtt": "*", + "nats": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@grpc/grpc-js": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + }, + "amqp-connection-manager": { + "optional": true + }, + "amqplib": { + "optional": true + }, + "cache-manager": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "kafkajs": { + "optional": true + }, + "mqtt": { + "optional": true + }, + "nats": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.11.tgz", + "integrity": "sha512-kyABSskdMRIAMWL0SlbwtDy4yn59RL4HDdwHDz/fxWuv7/53YP8Y2DtV3/sHqY5Er0msMVTZrM38MjqXhYL7gw==", + "license": "MIT", + "dependencies": { + "cors": "2.8.5", + "express": "5.2.1", + "multer": "2.0.2", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/schematics": { + "version": "11.0.9", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz", + "integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.17", + "@angular-devkit/schematics": "19.2.17", + "comment-json": "4.4.1", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz", + "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "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 + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz", + "integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.17", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "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" + } + }, + "node_modules/@nestjs/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.11.tgz", + "integrity": "sha512-Po2aZKXlxuySDEh3Gi05LJ7/BtfTAPRZ3KPTrbpNrTmgGr3rFgEGYpQwN50wXYw0pywoICiFLZSZ/qXsplf6NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", + "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.50.2.tgz", + "integrity": "sha512-l1JWvNp5gt5Fze8X68+zjzBqiviB5B8zeepsbfpFgdDxoCVjmixg8gcMt/AmqI9Qntw2qaeXah84V14fCbVuMg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation-amqplib": "^0.42.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.45.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.44.0", + "@opentelemetry/instrumentation-bunyan": "^0.41.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.41.0", + "@opentelemetry/instrumentation-connect": "^0.39.0", + "@opentelemetry/instrumentation-cucumber": "^0.9.0", + "@opentelemetry/instrumentation-dataloader": "^0.12.0", + "@opentelemetry/instrumentation-dns": "^0.39.0", + "@opentelemetry/instrumentation-express": "^0.43.0", + "@opentelemetry/instrumentation-fastify": "^0.40.0", + "@opentelemetry/instrumentation-fs": "^0.15.0", + "@opentelemetry/instrumentation-generic-pool": "^0.39.0", + "@opentelemetry/instrumentation-graphql": "^0.43.0", + "@opentelemetry/instrumentation-grpc": "^0.53.0", + "@opentelemetry/instrumentation-hapi": "^0.41.0", + "@opentelemetry/instrumentation-http": "^0.53.0", + "@opentelemetry/instrumentation-ioredis": "^0.43.0", + "@opentelemetry/instrumentation-kafkajs": "^0.3.0", + "@opentelemetry/instrumentation-knex": "^0.40.0", + "@opentelemetry/instrumentation-koa": "^0.43.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.40.0", + "@opentelemetry/instrumentation-memcached": "^0.39.0", + "@opentelemetry/instrumentation-mongodb": "^0.47.0", + "@opentelemetry/instrumentation-mongoose": "^0.42.0", + "@opentelemetry/instrumentation-mysql": "^0.41.0", + "@opentelemetry/instrumentation-mysql2": "^0.41.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.40.0", + "@opentelemetry/instrumentation-net": "^0.39.0", + "@opentelemetry/instrumentation-pg": "^0.45.1", + "@opentelemetry/instrumentation-pino": "^0.42.0", + "@opentelemetry/instrumentation-redis": "^0.42.0", + "@opentelemetry/instrumentation-redis-4": "^0.42.1", + "@opentelemetry/instrumentation-restify": "^0.41.0", + "@opentelemetry/instrumentation-router": "^0.40.0", + "@opentelemetry/instrumentation-socket.io": "^0.42.0", + "@opentelemetry/instrumentation-tedious": "^0.14.0", + "@opentelemetry/instrumentation-undici": "^0.6.0", + "@opentelemetry/instrumentation-winston": "^0.40.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.3", + "@opentelemetry/resource-detector-aws": "^1.6.2", + "@opentelemetry/resource-detector-azure": "^0.2.11", + "@opentelemetry/resource-detector-container": "^0.4.3", + "@opentelemetry/resource-detector-gcp": "^0.29.12", + "@opentelemetry/resources": "^1.24.0", + "@opentelemetry/sdk-node": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", + "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", + "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", + "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-express": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", + "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", + "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", + "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", + "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", + "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", + "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.40.0.tgz", + "integrity": "sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", + "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz", + "integrity": "sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", + "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", + "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", + "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", + "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", + "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.45.1.tgz", + "integrity": "sha512-GHUvPv7CQEK3RKHH3YAj6mjgJ3nZb6wRQS+t0yaRgKZzX2ggGsLN6OhRT04+IjqmMg9aIRUy1CzqwzgqAxjYbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.42.0.tgz", + "integrity": "sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.14.0.tgz", + "integrity": "sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", + "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", + "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.53.0.tgz", + "integrity": "sha512-x5ygAQgWAQOI+UOhyV3z9eW7QU2dCfnfOuIBiyYmC2AWr74f6x/3JBnP27IAcEx6aihpqBYWKnpoUTztkVPAZw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/sdk-logs": "0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.53.0.tgz", + "integrity": "sha512-cSRKgD/n8rb+Yd+Cif6EnHEL/VZg1o8lEcEwFji1lwene6BdH51Zh3feAD9p2TyVoBKrl6Q9Zm2WltSp2k9gWQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/sdk-logs": "0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.53.0.tgz", + "integrity": "sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-logs": "0.53.0", + "@opentelemetry/sdk-trace-base": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.53.0.tgz", + "integrity": "sha512-nvZtOk23pZOrTW10Za2WPd9pk4tWDvL6ALlHRFfInpcTjtOgCrv+fQDxpzosa5PeXvYeFFUO5aYCTnwiCX4Dzg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-metrics": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.53.0.tgz", + "integrity": "sha512-m6KSh6OBDwfDjpzPVbuJbMgMbkoZfpxYH2r262KckgX9cMYvooWXEKzlJYsNDC6ADr28A1rtRoUVRwNfIN4tUg==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.53.0.tgz", + "integrity": "sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.53.0.tgz", + "integrity": "sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", + "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", + "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.55.0.tgz", + "integrity": "sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", + "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.143" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.44.0.tgz", + "integrity": "sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/propagation-utils": "^0.30.11", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.41.0.tgz", + "integrity": "sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.41.0.tgz", + "integrity": "sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.52.0.tgz", + "integrity": "sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.9.0.tgz", + "integrity": "sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.26.0.tgz", + "integrity": "sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.39.0.tgz", + "integrity": "sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-dns/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.57.0.tgz", + "integrity": "sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", + "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.28.0.tgz", + "integrity": "sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.52.0.tgz", + "integrity": "sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.56.0.tgz", + "integrity": "sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.53.0.tgz", + "integrity": "sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.55.0.tgz", + "integrity": "sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", + "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/instrumentation": "0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.56.0.tgz", + "integrity": "sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/redis-common": "^0.38.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", + "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.53.0.tgz", + "integrity": "sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.33.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.57.0.tgz", + "integrity": "sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.53.0.tgz", + "integrity": "sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.39.0.tgz", + "integrity": "sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.61.0.tgz", + "integrity": "sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.55.0.tgz", + "integrity": "sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.54.0.tgz", + "integrity": "sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.55.0.tgz", + "integrity": "sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.41.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.55.0.tgz", + "integrity": "sha512-JFLNhbbEGnnQrMKOYoXx0nNk5N9cPeghu4xP/oup40a7VaSeYruyOiFbg9nkbS4ZQiI8aMuRqUT3Mo4lQjKEKg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.39.0.tgz", + "integrity": "sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.61.0.tgz", + "integrity": "sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.42.0.tgz", + "integrity": "sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.57.0.tgz", + "integrity": "sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/redis-common": "^0.38.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", + "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.41.0.tgz", + "integrity": "sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.40.0.tgz", + "integrity": "sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-router/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.42.0.tgz", + "integrity": "sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.27.0.tgz", + "integrity": "sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.19.0.tgz", + "integrity": "sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.40.0.tgz", + "integrity": "sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.53.0.tgz", + "integrity": "sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-transformer": "0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.53.0.tgz", + "integrity": "sha512-F7RCN8VN+lzSa4fGjewit8Z5fEUpY/lmMVy5EWn2ZpbAabg3EE3sCLuTNfOiooNGnmvzimUPruoeqeko/5/TzQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.53.0.tgz", + "integrity": "sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-logs": "0.53.0", + "@opentelemetry/sdk-metrics": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.16", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", + "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", + "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", + "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", + "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz", + "integrity": "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.7.tgz", + "integrity": "sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", + "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", + "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.10.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", + "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.13", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", + "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.53.0.tgz", + "integrity": "sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz", + "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.53.0.tgz", + "integrity": "sha512-0hsxfq3BKy05xGktwG8YdGdxV978++x40EAKyKr1CaHZRh8uqVlXnclnl7OMi9xLMJEcXUw7lGhiRlArFcovyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.53.0", + "@opentelemetry/exporter-logs-otlp-http": "0.53.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.53.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.53.0", + "@opentelemetry/exporter-trace-otlp-http": "0.53.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.53.0", + "@opentelemetry/exporter-zipkin": "1.26.0", + "@opentelemetry/instrumentation": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-logs": "0.53.0", + "@opentelemetry/sdk-metrics": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", + "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", + "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", + "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.26.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/propagator-b3": "1.26.0", + "@opentelemetry/propagator-jaeger": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/context-async-hooks": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", + "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/resources": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", + "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", + "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@prisma/instrumentation": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.19.0.tgz", + "integrity": "sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": ">=0.52.0 <1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@sentry/core": { + "version": "10.32.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.32.1.tgz", + "integrity": "sha512-PH2ldpSJlhqsMj2vCTyU0BI2Fx1oIDhm7Izo5xFALvjVCS0gmlqHt1udu6YlKn8BtpGH6bGzssvv5APrk+OdPQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/nestjs": { + "version": "10.32.1", + "resolved": "https://registry.npmjs.org/@sentry/nestjs/-/nestjs-10.32.1.tgz", + "integrity": "sha512-StgRg8AojiCbH+Q7uhO/9DOhfpjw6SxtsTWwNoioLfHIx968btdQPhALrHji0xXR8DYDBf+bk99P1KdqgDDh/w==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.2.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/instrumentation-nestjs-core": "0.55.0", + "@opentelemetry/semantic-conventions": "^1.37.0", + "@sentry/core": "10.32.1", + "@sentry/node": "10.32.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + } + }, + "node_modules/@sentry/node": { + "version": "10.32.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.32.1.tgz", + "integrity": "sha512-oxlybzt8QW0lx/QaEj1DcvZDRXkgouewFelu/10dyUwv5So3YvipfvWInda+yMLmn25OggbloDQ0gyScA2jU3g==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^2.2.0", + "@opentelemetry/core": "^2.2.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/instrumentation-amqplib": "0.55.0", + "@opentelemetry/instrumentation-connect": "0.52.0", + "@opentelemetry/instrumentation-dataloader": "0.26.0", + "@opentelemetry/instrumentation-express": "0.57.0", + "@opentelemetry/instrumentation-fs": "0.28.0", + "@opentelemetry/instrumentation-generic-pool": "0.52.0", + "@opentelemetry/instrumentation-graphql": "0.56.0", + "@opentelemetry/instrumentation-hapi": "0.55.0", + "@opentelemetry/instrumentation-http": "0.208.0", + "@opentelemetry/instrumentation-ioredis": "0.56.0", + "@opentelemetry/instrumentation-kafkajs": "0.18.0", + "@opentelemetry/instrumentation-knex": "0.53.0", + "@opentelemetry/instrumentation-koa": "0.57.0", + "@opentelemetry/instrumentation-lru-memoizer": "0.53.0", + "@opentelemetry/instrumentation-mongodb": "0.61.0", + "@opentelemetry/instrumentation-mongoose": "0.55.0", + "@opentelemetry/instrumentation-mysql": "0.54.0", + "@opentelemetry/instrumentation-mysql2": "0.55.0", + "@opentelemetry/instrumentation-pg": "0.61.0", + "@opentelemetry/instrumentation-redis": "0.57.0", + "@opentelemetry/instrumentation-tedious": "0.27.0", + "@opentelemetry/instrumentation-undici": "0.19.0", + "@opentelemetry/resources": "^2.2.0", + "@opentelemetry/sdk-trace-base": "^2.2.0", + "@opentelemetry/semantic-conventions": "^1.37.0", + "@prisma/instrumentation": "6.19.0", + "@sentry/core": "10.32.1", + "@sentry/node-core": "10.32.1", + "@sentry/opentelemetry": "10.32.1", + "import-in-the-middle": "^2", + "minimatch": "^9.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node-core": { + "version": "10.32.1", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.32.1.tgz", + "integrity": "sha512-w56rxdBanBKc832zuwnE+zNzUQ19fPxfHEtOhK8JGPu3aSwQYcIxwz9z52lOx3HN7k/8Fj5694qlT3x/PokhRw==", + "license": "MIT", + "dependencies": { + "@apm-js-collab/tracing-hooks": "^0.3.1", + "@sentry/core": "10.32.1", + "@sentry/opentelemetry": "10.32.1", + "import-in-the-middle": "^2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-http": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.208.0.tgz", + "integrity": "sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/instrumentation": "0.208.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.18.0.tgz", + "integrity": "sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@sentry/node/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@sentry/node/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@sentry/node/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "10.32.1", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.32.1.tgz", + "integrity": "sha512-YLssSz5Y+qPvufrh2cDaTXDoXU8aceOhB+YTjT8/DLF6SOj7Tzen52aAcjNaifawaxEsLCC8O+B+A2iA+BllvA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.32.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0 || ^2.2.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.143", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.143.tgz", + "integrity": "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "license": "MIT" + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-json": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", + "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/drizzle-kit": { + "version": "0.31.8", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz", + "integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "esbuild-register": "^3.5.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-copy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.2.tgz", + "integrity": "sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.2.0.tgz", + "integrity": "sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^4.0.1", + "cosmiconfig": "^8.2.0", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-in-the-middle": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.1.tgz", + "integrity": "sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ioredis": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", + "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.4.0", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kafkajs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", + "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.12.33", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.33.tgz", + "integrity": "sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/nodemon/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-http": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.5.0.tgz", + "integrity": "sha512-hD91XjgaKkSsdn8P7LaebrNzhGTdB086W3pyPihX0EzGPjq5uBJBXo4N5guqNaK6mUjg9aubMF7wDViYek9dRA==", + "license": "MIT", + "dependencies": { + "get-caller-file": "^2.0.5", + "pino": "^9.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", + "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^4.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pump": "^3.0.0", + "secure-json-parse": "^4.0.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^5.0.2" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", + "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", + "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.4", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", + "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^10.2.3" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tapable": "^2.2.1", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/validator": { + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", + "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.103.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz", + "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.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.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..5b7f66c506 --- /dev/null +++ b/package.json @@ -0,0 +1,100 @@ +{ + "name": "app-nodejs-codechallenge", + "version": "1.0.0", + "description": "Our code challenge will let you marvel us with your Jedi coding skills :smile:.", + "main": "index.js", + "scripts": { + "build": "nest build", + "build:transaction": "nest build transaction-service", + "build:anti-fraud": "nest build anti-fraud-service", + "start:transaction": "nest start transaction-service", + "start:anti-fraud": "nest start anti-fraud-service", + "start:transaction:dev": "nest start transaction-service --watch", + "start:anti-fraud:dev": "nest start anti-fraud-service --watch", + "start:dev": "concurrently \"npm run start:transaction:dev\" \"npm run start:anti-fraud:dev\"", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:push": "drizzle-kit push", + "db:studio": "drizzle-kit studio", + "seed:fraud-rules": "ts-node -r tsconfig-paths/register -P tsconfig.json apps/anti-fraud-service/scripts/seed-default-rules.ts", + "test": "jest --config=config/jest.config.js", + "test:watch": "jest --config=config/jest.config.js --watch", + "test:cov": "jest --config=config/jest.config.js --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --config=config/jest.config.js --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json", + "test:api": "bash test/api/test-transaction-api.sh", + "lint": "biome lint .", + "lint:fix": "biome lint --write .", + "format": "biome format .", + "format:fix": "biome format --write .", + "check": "biome check .", + "check:fix": "biome check --write .", + "ci": "biome ci ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/yaperos/app-nodejs-codechallenge.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/yaperos/app-nodejs-codechallenge/issues" + }, + "homepage": "https://github.com/yaperos/app-nodejs-codechallenge#readme", + "dependencies": { + "@nestjs/common": "^11.1.11", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.1.11", + "@nestjs/microservices": "^11.1.11", + "@nestjs/platform-express": "^11.1.11", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.52.1", + "@opentelemetry/exporter-metrics-otlp-http": "^0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.54.2", + "@opentelemetry/instrumentation-http": "^0.54.2", + "@opentelemetry/instrumentation-kafkajs": "^0.3.0", + "@opentelemetry/resources": "^1.26.0", + "@opentelemetry/sdk-metrics": "^1.30.1", + "@opentelemetry/sdk-node": "^0.54.2", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@sentry/nestjs": "^10.32.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "drizzle-orm": "^0.45.1", + "ioredis": "^5.8.2", + "kafkajs": "^2.2.4", + "pino": "^9.5.0", + "pino-http": "^10.3.0", + "pino-pretty": "^13.0.0", + "postgres": "^3.4.7", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.2", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@biomejs/biome": "2.3.10", + "@nestjs/cli": "^11.0.14", + "@nestjs/testing": "^11.1.11", + "@types/express": "^5.0.6", + "@types/jest": "^29.5.12", + "@types/node": "^25.0.3", + "@types/supertest": "^6.0.2", + "@types/uuid": "^10.0.0", + "concurrently": "^9.2.1", + "drizzle-kit": "^0.31.8", + "jest": "^29.7.0", + "nodemon": "^3.1.11", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.9.3" + }, + "pnpm": { + "overrides": { + "@opentelemetry/sdk-metrics": "1.30.1" + } + } +} diff --git a/test/api/test-transaction-api.sh b/test/api/test-transaction-api.sh new file mode 100644 index 0000000000..00f589416f --- /dev/null +++ b/test/api/test-transaction-api.sh @@ -0,0 +1,92 @@ +#!/bin/bash + +set -e + +BASE_URL="${BASE_URL:-http://localhost:3000}" +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo -e "${YELLOW}======================================${NC}" +echo -e "${YELLOW}Testing Transaction Service API${NC}" +echo -e "${YELLOW}Base URL: $BASE_URL${NC}" +echo -e "${YELLOW}======================================${NC}\n" + +echo -e "${YELLOW}[1/4] Testing Health Check...${NC}" +HEALTH_RESPONSE=$(curl -s -w "\n%{http_code}" "$BASE_URL/health" || echo "000") +HTTP_CODE=$(echo "$HEALTH_RESPONSE" | tail -n1) +if [ "$HTTP_CODE" = "200" ]; then + echo -e "${GREEN}✓ Health check passed${NC}\n" +else + echo -e "${RED}✗ Health check failed (HTTP $HTTP_CODE)${NC}\n" + exit 1 +fi + +echo -e "${YELLOW}[2/4] Creating a valid transaction (amount: 500)...${NC}" +CREATE_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/transactions" \ + -H "Content-Type: application/json" \ + -d '{ + "accountExternalIdDebit": "acc-debit-001", + "accountExternalIdCredit": "acc-credit-001", + "tranferTypeId": 1, + "value": 500 + }') + +HTTP_CODE=$(echo "$CREATE_RESPONSE" | tail -n1) +RESPONSE_BODY=$(echo "$CREATE_RESPONSE" | head -n -1) + +if [ "$HTTP_CODE" = "201" ]; then + echo -e "${GREEN}✓ Transaction created successfully${NC}" + echo "$RESPONSE_BODY" | jq '.' + TRANSACTION_ID=$(echo "$RESPONSE_BODY" | jq -r '.transactionExternalId') + echo -e "${GREEN}Transaction ID: $TRANSACTION_ID${NC}\n" +else + echo -e "${RED}✗ Failed to create transaction (HTTP $HTTP_CODE)${NC}" + echo "$RESPONSE_BODY" + exit 1 +fi + +echo -e "${YELLOW}[3/4] Getting transaction by ID...${NC}" +GET_RESPONSE=$(curl -s -w "\n%{http_code}" "$BASE_URL/transactions/$TRANSACTION_ID") +HTTP_CODE=$(echo "$GET_RESPONSE" | tail -n1) +RESPONSE_BODY=$(echo "$GET_RESPONSE" | head -n -1) + +if [ "$HTTP_CODE" = "200" ]; then + echo -e "${GREEN}✓ Transaction retrieved successfully${NC}" + echo "$RESPONSE_BODY" | jq '.' + echo "" +else + echo -e "${RED}✗ Failed to get transaction (HTTP $HTTP_CODE)${NC}" + echo "$RESPONSE_BODY" + exit 1 +fi + +echo -e "${YELLOW}[4/4] Creating high-value transaction (should be flagged by anti-fraud)...${NC}" +CREATE_HIGH_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/transactions" \ + -H "Content-Type: application/json" \ + -d '{ + "accountExternalIdDebit": "acc-debit-002", + "accountExternalIdCredit": "acc-credit-002", + "tranferTypeId": 1, + "value": 1500 + }') + +HTTP_CODE=$(echo "$CREATE_HIGH_RESPONSE" | tail -n1) +RESPONSE_BODY=$(echo "$CREATE_HIGH_RESPONSE" | head -n -1) + +if [ "$HTTP_CODE" = "201" ]; then + echo -e "${GREEN}✓ High-value transaction created${NC}" + echo "$RESPONSE_BODY" | jq '.' + HIGH_TRANSACTION_ID=$(echo "$RESPONSE_BODY" | jq -r '.transactionExternalId') + echo -e "${YELLOW}Note: This transaction should be processed by anti-fraud service${NC}" + echo -e "${YELLOW}Check anti-fraud logs for validation results${NC}\n" +else + echo -e "${RED}✗ Failed to create high-value transaction (HTTP $HTTP_CODE)${NC}" + echo "$RESPONSE_BODY" + exit 1 +fi + +echo -e "${GREEN}======================================${NC}" +echo -e "${GREEN}All Transaction API tests passed! ✓${NC}" +echo -e "${GREEN}======================================${NC}" diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000000..bd1e640913 --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,42 @@ +import 'reflect-metadata'; + +beforeAll(async () => { +}); + +afterAll(async () => { +}); + +jest.mock('@nestjs/config', () => ({ + ConfigService: jest.fn().mockImplementation(() => ({ + get: jest.fn((key: string) => { + const mockValues: Record = { + TRANSACTION_DB_URL: 'postgresql://test:test@localhost:5432/test', + ANTIFRAUD_DB_URL: 'postgresql://test:test@localhost:5432/test', + KAFKA_BROKER: 'localhost:9092', + OTEL_ENABLED: 'false', + REDIS_URL: 'redis://localhost:6379', + }; + return mockValues[key]; + }), + })), +})); + +jest.mock('kafkajs'); +jest.mock('drizzle-orm'); +jest.mock('ioredis'); + +jest.mock('pino', () => ({ + __esModule: true, + default: jest.fn(() => ({ + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + child: jest.fn(() => ({ + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), + })), + })), +})); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..70d3e87730 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": true, + "strictFunctionTypes": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "@app/common": ["./libs/common/src"], + "@app/common/*": ["./libs/common/src/*"], + "@app/observability": ["./libs/observability/src"], + "@app/observability/*": ["./libs/observability/src/*"], + "@domain/*": ["./apps/transaction-service/src/domain/*"], + "@application/*": ["./apps/transaction-service/src/application/*"], + "@infrastructure/*": ["./apps/transaction-service/src/infrastructure/*"], + "@presentation/*": ["./apps/transaction-service/src/presentation/*"] + } + }, + "include": ["apps/**/*", "libs/**/*"], + "exclude": ["node_modules", "dist"] +} From 408811c1dcc7f85b4c4c57efb2566599489dd4a7 Mon Sep 17 00:00:00 2001 From: bearcode-dev Date: Tue, 6 Jan 2026 06:35:11 -0500 Subject: [PATCH 2/5] se configuro postgresql en docker y ya no en neon ademas de redis en docker --- .dockerignore | 1 - apps/anti-fraud-service/Dockerfile | 6 +- apps/transaction-service/Dockerfile | 8 +- docker-compose.yml | 42 +- package-lock.json | 4708 +++++---------------------- package.json | 39 +- 6 files changed, 861 insertions(+), 3943 deletions(-) diff --git a/.dockerignore b/.dockerignore index caee196ac7..300d6de016 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,4 +7,3 @@ dist .vscode .idea *.md -drizzle diff --git a/apps/anti-fraud-service/Dockerfile b/apps/anti-fraud-service/Dockerfile index afc8e1817a..34172b456f 100644 --- a/apps/anti-fraud-service/Dockerfile +++ b/apps/anti-fraud-service/Dockerfile @@ -8,7 +8,7 @@ COPY tsconfig*.json ./ COPY nest-cli.json ./ # Install dependencies -RUN npm ci +RUN npm install # Copy source code COPY apps/anti-fraud-service ./apps/anti-fraud-service @@ -18,13 +18,13 @@ COPY libs ./libs RUN npm run build:anti-fraud # Production image -FROM node:20-alpine +FROM node:20-alpine AS runner WORKDIR /app # Copy package files and install production dependencies only COPY package*.json ./ -RUN npm ci --only=production && npm cache clean --force +RUN npm install --only=production && npm cache clean --force # Copy built application from builder (maintain directory structure) COPY --from=builder /app/dist ./dist diff --git a/apps/transaction-service/Dockerfile b/apps/transaction-service/Dockerfile index 30e94e8767..33b4d9b4a1 100644 --- a/apps/transaction-service/Dockerfile +++ b/apps/transaction-service/Dockerfile @@ -8,24 +8,26 @@ COPY tsconfig*.json ./ COPY nest-cli.json ./ # Install dependencies -RUN npm ci +RUN npm install # Copy source code COPY apps/transaction-service ./apps/transaction-service +COPY apps/anti-fraud-service ./apps/anti-fraud-service COPY libs ./libs COPY config/database/drizzle.config.ts ./config/database/ +COPY drizzle ./drizzle # Build application RUN npm run build:transaction # Production image -FROM node:20-alpine +FROM node:20-alpine AS runner WORKDIR /app # Copy package files and install production dependencies only COPY package*.json ./ -RUN npm ci --only=production && npm cache clean --force +RUN npm install --only=production && npm cache clean --force # Copy built application from builder (maintain directory structure) COPY --from=builder /app/dist ./dist diff --git a/docker-compose.yml b/docker-compose.yml index 371c946f64..e9594f4154 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3.7" services: postgres: image: postgres:14 @@ -9,6 +8,8 @@ services: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres + volumes: + - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s @@ -22,14 +23,20 @@ services: container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 + healthcheck: + test: ["CMD-SHELL", "echo srvr | nc localhost 2181 || exit 1"] + interval: 10s + timeout: 5s + retries: 5 networks: - yape-network kafka: - image: confluentinc/cp-enterprise-kafka:5.5.3 + image: confluentinc/cp-kafka:5.5.3 container_name: kafka depends_on: - - zookeeper + zookeeper: + condition: service_healthy environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 @@ -48,20 +55,37 @@ services: networks: - yape-network + db-migration: + build: + context: . + dockerfile: apps/transaction-service/Dockerfile + target: builder + container_name: db-migration + environment: + - TRANSACTION_DB_URL=${TRANSACTION_DB_URL:-postgresql://postgres:postgres@postgres:5432/postgres} + - ANTIFRAUD_DB_URL=${ANTIFRAUD_DB_URL:-postgresql://postgres:postgres@postgres:5432/postgres} + depends_on: + postgres: + condition: service_healthy + command: sh -c "npm run db:migrate && npm run seed:fraud-rules" + networks: + - yape-network + transaction-service: build: context: . dockerfile: apps/transaction-service/Dockerfile + target: runner container_name: transaction-service ports: - "3000:3000" environment: # Database - - TRANSACTION_DB_URL=${TRANSACTION_DB_URL} + - TRANSACTION_DB_URL=${TRANSACTION_DB_URL:-postgresql://postgres:postgres@postgres:5432/postgres} # Kafka - KAFKA_BROKER=${KAFKA_BROKER:-kafka:29092} # Redis - - REDIS_URL=${REDIS_URL} + - REDIS_URL=${REDIS_URL:-redis://redis:6379} # Service - PORT=3000 - SERVICE_NAME=transaction-service @@ -75,6 +99,8 @@ services: # Sentry (optional) - SENTRY_ENABLED=${SENTRY_ENABLED:-false} depends_on: + db-migration: + condition: service_completed_successfully postgres: condition: service_healthy kafka: @@ -87,16 +113,17 @@ services: build: context: . dockerfile: apps/anti-fraud-service/Dockerfile + target: runner container_name: anti-fraud-service ports: - "3001:3001" environment: # Database - - ANTIFRAUD_DB_URL=${ANTIFRAUD_DB_URL} + - ANTIFRAUD_DB_URL=${ANTIFRAUD_DB_URL:-postgresql://postgres:postgres@postgres:5432/postgres} # Kafka - KAFKA_BROKER=${KAFKA_BROKER:-kafka:29092} # Redis - - REDIS_URL=${REDIS_URL} + - REDIS_URL=${REDIS_URL:-redis://redis:6379} # Service - ANTI_FRAUD_PORT=3001 - SERVICE_NAME=anti-fraud-service @@ -191,3 +218,4 @@ networks: volumes: tempo-data: grafana-data: + postgres-data: diff --git a/package-lock.json b/package-lock.json index 292840e40a..a9b77d64ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,16 @@ "@nestjs/core": "^11.1.11", "@nestjs/microservices": "^11.1.11", "@nestjs/platform-express": "^11.1.11", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.50.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.53.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", - "@opentelemetry/instrumentation-http": "^0.53.0", + "@opentelemetry/api": "1.9.0", + "@opentelemetry/auto-instrumentations-node": "0.52.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "0.54.2", + "@opentelemetry/instrumentation-http": "0.54.2", "@opentelemetry/instrumentation-kafkajs": "^0.3.0", - "@opentelemetry/resources": "^1.26.0", - "@opentelemetry/sdk-node": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-node": "0.54.2", + "@opentelemetry/semantic-conventions": "1.27.0", "@sentry/nestjs": "^10.32.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", @@ -59,8 +60,6 @@ }, "node_modules/@angular-devkit/core": { "version": "19.2.19", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.19.tgz", - "integrity": "sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -87,8 +86,6 @@ }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -97,8 +94,6 @@ }, "node_modules/@angular-devkit/schematics": { "version": "19.2.19", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.19.tgz", - "integrity": "sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==", "dev": true, "license": "MIT", "dependencies": { @@ -116,8 +111,6 @@ }, "node_modules/@angular-devkit/schematics-cli": { "version": "19.2.19", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.19.tgz", - "integrity": "sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==", "dev": true, "license": "MIT", "dependencies": { @@ -139,8 +132,6 @@ }, "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -169,8 +160,6 @@ }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -179,14 +168,10 @@ }, "node_modules/@apm-js-collab/code-transformer": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz", - "integrity": "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==", "license": "Apache-2.0" }, "node_modules/@apm-js-collab/tracing-hooks": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.3.1.tgz", - "integrity": "sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==", "license": "Apache-2.0", "dependencies": { "@apm-js-collab/code-transformer": "^0.8.0", @@ -196,8 +181,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -211,8 +194,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -221,8 +202,6 @@ }, "node_modules/@babel/core": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { @@ -252,8 +231,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -262,8 +239,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -279,8 +254,6 @@ }, "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -290,8 +263,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -307,8 +278,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -317,8 +286,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -327,8 +294,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -337,8 +302,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -351,8 +314,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -369,8 +330,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -379,8 +338,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -389,8 +346,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -399,8 +354,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -409,8 +362,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -423,8 +374,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -439,8 +388,6 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -452,8 +399,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { @@ -465,8 +410,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -478,8 +421,6 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -494,8 +435,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { @@ -510,8 +449,6 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -523,8 +460,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -536,8 +471,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { @@ -552,8 +485,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -565,8 +496,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -578,8 +507,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -591,8 +518,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -604,8 +529,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -617,8 +540,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -630,8 +551,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -646,8 +565,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -662,8 +579,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -678,8 +593,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -693,8 +606,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -712,8 +623,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { @@ -726,15 +635,11 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@biomejs/biome": { "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.10.tgz", - "integrity": "sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -879,8 +784,6 @@ }, "node_modules/@biomejs/cli-win32-x64": { "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.10.tgz", - "integrity": "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ==", "cpu": [ "x64" ], @@ -896,8 +799,6 @@ }, "node_modules/@borewit/text-codec": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", - "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", "license": "MIT", "funding": { "type": "github", @@ -906,8 +807,6 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", "optional": true, @@ -917,8 +816,6 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -930,16 +827,11 @@ }, "node_modules/@drizzle-team/brocli": { "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", "dev": true, "license": "Apache-2.0" }, "node_modules/@esbuild-kit/core-utils": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", "dev": true, "license": "MIT", "dependencies": { @@ -1306,8 +1198,6 @@ }, "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -1323,8 +1213,6 @@ }, "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1361,9 +1249,6 @@ }, "node_modules/@esbuild-kit/esm-loader": { "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", "dev": true, "license": "MIT", "dependencies": { @@ -1798,8 +1683,6 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1815,8 +1698,6 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -1828,8 +1709,6 @@ }, "node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", @@ -1846,8 +1725,6 @@ }, "node_modules/@inquirer/ansi": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", "engines": { @@ -1856,8 +1733,6 @@ }, "node_modules/@inquirer/checkbox": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { @@ -1881,8 +1756,6 @@ }, "node_modules/@inquirer/confirm": { "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1903,8 +1776,6 @@ }, "node_modules/@inquirer/core": { "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { @@ -1931,8 +1802,6 @@ }, "node_modules/@inquirer/editor": { "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1954,8 +1823,6 @@ }, "node_modules/@inquirer/expand": { "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { @@ -1977,8 +1844,6 @@ }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { @@ -1999,8 +1864,6 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -2009,8 +1872,6 @@ }, "node_modules/@inquirer/input": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { @@ -2031,8 +1892,6 @@ }, "node_modules/@inquirer/number": { "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2053,8 +1912,6 @@ }, "node_modules/@inquirer/password": { "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { @@ -2076,8 +1933,6 @@ }, "node_modules/@inquirer/prompts": { "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, "license": "MIT", "dependencies": { @@ -2106,8 +1961,6 @@ }, "node_modules/@inquirer/rawlist": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { @@ -2129,8 +1982,6 @@ }, "node_modules/@inquirer/search": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { @@ -2153,8 +2004,6 @@ }, "node_modules/@inquirer/select": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { @@ -2178,8 +2027,6 @@ }, "node_modules/@inquirer/type": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -2196,14 +2043,10 @@ }, "node_modules/@ioredis/commands": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", - "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", "license": "MIT" }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", "engines": { @@ -2212,8 +2055,6 @@ }, "node_modules/@isaacs/brace-expansion": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", "dependencies": { @@ -2225,8 +2066,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2242,8 +2081,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -2252,8 +2089,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -2266,8 +2101,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -2276,8 +2109,6 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -2286,8 +2117,6 @@ }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2304,8 +2133,6 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2352,8 +2179,6 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2368,8 +2193,6 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2382,8 +2205,6 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -2395,8 +2216,6 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2413,8 +2232,6 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2429,8 +2246,6 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -2473,8 +2288,6 @@ }, "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2484,9 +2297,6 @@ }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -2506,8 +2316,6 @@ }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -2522,8 +2330,6 @@ }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2538,8 +2344,6 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -2551,8 +2355,6 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -2566,8 +2368,6 @@ }, "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2577,8 +2377,6 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2593,8 +2391,6 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -2609,8 +2405,6 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -2636,8 +2430,6 @@ }, "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2647,8 +2439,6 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -2665,8 +2455,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -2676,8 +2464,6 @@ }, "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2687,8 +2473,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2698,8 +2482,6 @@ }, "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2709,8 +2491,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -2719,8 +2499,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -2730,8 +2508,6 @@ }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2741,15 +2517,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2759,8 +2531,6 @@ }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", "funding": { "type": "opencollective", @@ -2769,8 +2539,6 @@ }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "license": "MIT", "engines": { "node": ">=8" @@ -2778,8 +2546,6 @@ }, "node_modules/@nestjs/cli": { "version": "11.0.14", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.14.tgz", - "integrity": "sha512-YwP03zb5VETTwelXU+AIzMVbEZKk/uxJL+z9pw0mdG9ogAtqZ6/mpmIM4nEq/NU8D0a7CBRLcMYUmWW/55pfqw==", "dev": true, "license": "MIT", "dependencies": { @@ -2823,8 +2589,6 @@ }, "node_modules/@nestjs/common": { "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.11.tgz", - "integrity": "sha512-R/+A8XFqLgN8zNs2twhrOaE7dJbRQhdPX3g46am4RT/x8xGLqDphrXkUIno4cGUZHxbczChBAaAPTdPv73wDZA==", "license": "MIT", "dependencies": { "file-type": "21.2.0", @@ -2854,8 +2618,6 @@ }, "node_modules/@nestjs/config": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", - "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", "license": "MIT", "dependencies": { "dotenv": "16.4.7", @@ -2869,8 +2631,6 @@ }, "node_modules/@nestjs/core": { "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.11.tgz", - "integrity": "sha512-H9i+zT3RvHi7tDc+lCmWHJ3ustXveABCr+Vcpl96dNOxgmrx4elQSTC4W93Mlav2opfLV+p0UTHY6L+bpUA4zA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -2910,8 +2670,6 @@ }, "node_modules/@nestjs/microservices": { "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.1.11.tgz", - "integrity": "sha512-nqOdHk0QHmaloWTBb+6enT+OIT5atqjEHWKaaSoQfAlJVGa7FVhgdNVcWBdDcPtNQM6hCTc8VGgQHIRDDhjFOw==", "license": "MIT", "dependencies": { "iterare": "1.2.1", @@ -2968,8 +2726,6 @@ }, "node_modules/@nestjs/platform-express": { "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.11.tgz", - "integrity": "sha512-kyABSskdMRIAMWL0SlbwtDy4yn59RL4HDdwHDz/fxWuv7/53YP8Y2DtV3/sHqY5Er0msMVTZrM38MjqXhYL7gw==", "license": "MIT", "dependencies": { "cors": "2.8.5", @@ -2989,8 +2745,6 @@ }, "node_modules/@nestjs/schematics": { "version": "11.0.9", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz", - "integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==", "dev": true, "license": "MIT", "dependencies": { @@ -3006,8 +2760,6 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz", - "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3034,8 +2786,6 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz", - "integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==", "dev": true, "license": "MIT", "dependencies": { @@ -3053,8 +2803,6 @@ }, "node_modules/@nestjs/schematics/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3063,8 +2811,6 @@ }, "node_modules/@nestjs/testing": { "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.11.tgz", - "integrity": "sha512-Po2aZKXlxuySDEh3Gi05LJ7/BtfTAPRZ3KPTrbpNrTmgGr3rFgEGYpQwN50wXYw0pywoICiFLZSZ/qXsplf6NA==", "dev": true, "license": "MIT", "dependencies": { @@ -3091,8 +2837,6 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, "license": "MIT", "engines": { @@ -3104,8 +2848,6 @@ }, "node_modules/@nuxt/opencollective": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", - "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", "license": "MIT", "dependencies": { "consola": "^3.2.3" @@ -3120,78 +2862,74 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", - "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", + "version": "0.54.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.2.tgz", + "integrity": "sha512-4MTVwwmLgUh5QrJnZpYo6YRO5IBLAggf2h8gWDblwRagDStY13aEvt7gGk3jewrMaPlHiF83fENhIx0HO97/cQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.3.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.50.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.50.2.tgz", - "integrity": "sha512-l1JWvNp5gt5Fze8X68+zjzBqiviB5B8zeepsbfpFgdDxoCVjmixg8gcMt/AmqI9Qntw2qaeXah84V14fCbVuMg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/instrumentation-amqplib": "^0.42.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.45.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.44.0", - "@opentelemetry/instrumentation-bunyan": "^0.41.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.41.0", - "@opentelemetry/instrumentation-connect": "^0.39.0", - "@opentelemetry/instrumentation-cucumber": "^0.9.0", - "@opentelemetry/instrumentation-dataloader": "^0.12.0", - "@opentelemetry/instrumentation-dns": "^0.39.0", - "@opentelemetry/instrumentation-express": "^0.43.0", - "@opentelemetry/instrumentation-fastify": "^0.40.0", - "@opentelemetry/instrumentation-fs": "^0.15.0", - "@opentelemetry/instrumentation-generic-pool": "^0.39.0", - "@opentelemetry/instrumentation-graphql": "^0.43.0", - "@opentelemetry/instrumentation-grpc": "^0.53.0", - "@opentelemetry/instrumentation-hapi": "^0.41.0", - "@opentelemetry/instrumentation-http": "^0.53.0", - "@opentelemetry/instrumentation-ioredis": "^0.43.0", - "@opentelemetry/instrumentation-kafkajs": "^0.3.0", - "@opentelemetry/instrumentation-knex": "^0.40.0", - "@opentelemetry/instrumentation-koa": "^0.43.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.40.0", - "@opentelemetry/instrumentation-memcached": "^0.39.0", - "@opentelemetry/instrumentation-mongodb": "^0.47.0", - "@opentelemetry/instrumentation-mongoose": "^0.42.0", - "@opentelemetry/instrumentation-mysql": "^0.41.0", - "@opentelemetry/instrumentation-mysql2": "^0.41.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.40.0", - "@opentelemetry/instrumentation-net": "^0.39.0", - "@opentelemetry/instrumentation-pg": "^0.45.1", - "@opentelemetry/instrumentation-pino": "^0.42.0", - "@opentelemetry/instrumentation-redis": "^0.42.0", - "@opentelemetry/instrumentation-redis-4": "^0.42.1", - "@opentelemetry/instrumentation-restify": "^0.41.0", - "@opentelemetry/instrumentation-router": "^0.40.0", - "@opentelemetry/instrumentation-socket.io": "^0.42.0", - "@opentelemetry/instrumentation-tedious": "^0.14.0", - "@opentelemetry/instrumentation-undici": "^0.6.0", - "@opentelemetry/instrumentation-winston": "^0.40.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.3", - "@opentelemetry/resource-detector-aws": "^1.6.2", - "@opentelemetry/resource-detector-azure": "^0.2.11", - "@opentelemetry/resource-detector-container": "^0.4.3", - "@opentelemetry/resource-detector-gcp": "^0.29.12", + "version": "0.52.1", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/instrumentation-amqplib": "^0.43.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.47.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.46.0", + "@opentelemetry/instrumentation-bunyan": "^0.42.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.42.0", + "@opentelemetry/instrumentation-connect": "^0.40.0", + "@opentelemetry/instrumentation-cucumber": "^0.10.0", + "@opentelemetry/instrumentation-dataloader": "^0.13.0", + "@opentelemetry/instrumentation-dns": "^0.40.0", + "@opentelemetry/instrumentation-express": "^0.44.0", + "@opentelemetry/instrumentation-fastify": "^0.41.0", + "@opentelemetry/instrumentation-fs": "^0.16.0", + "@opentelemetry/instrumentation-generic-pool": "^0.40.0", + "@opentelemetry/instrumentation-graphql": "^0.44.0", + "@opentelemetry/instrumentation-grpc": "^0.54.0", + "@opentelemetry/instrumentation-hapi": "^0.42.0", + "@opentelemetry/instrumentation-http": "^0.54.0", + "@opentelemetry/instrumentation-ioredis": "^0.44.0", + "@opentelemetry/instrumentation-kafkajs": "^0.4.0", + "@opentelemetry/instrumentation-knex": "^0.41.0", + "@opentelemetry/instrumentation-koa": "^0.44.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.41.0", + "@opentelemetry/instrumentation-memcached": "^0.40.0", + "@opentelemetry/instrumentation-mongodb": "^0.48.0", + "@opentelemetry/instrumentation-mongoose": "^0.43.0", + "@opentelemetry/instrumentation-mysql": "^0.42.0", + "@opentelemetry/instrumentation-mysql2": "^0.42.1", + "@opentelemetry/instrumentation-nestjs-core": "^0.41.0", + "@opentelemetry/instrumentation-net": "^0.40.0", + "@opentelemetry/instrumentation-pg": "^0.47.1", + "@opentelemetry/instrumentation-pino": "^0.43.0", + "@opentelemetry/instrumentation-redis": "^0.43.0", + "@opentelemetry/instrumentation-redis-4": "^0.43.0", + "@opentelemetry/instrumentation-restify": "^0.42.0", + "@opentelemetry/instrumentation-router": "^0.41.0", + "@opentelemetry/instrumentation-socket.io": "^0.43.0", + "@opentelemetry/instrumentation-tedious": "^0.15.0", + "@opentelemetry/instrumentation-undici": "^0.7.1", + "@opentelemetry/instrumentation-winston": "^0.41.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.4", + "@opentelemetry/resource-detector-aws": "^1.7.0", + "@opentelemetry/resource-detector-azure": "^0.2.12", + "@opentelemetry/resource-detector-container": "^0.5.0", + "@opentelemetry/resource-detector-gcp": "^0.29.13", "@opentelemetry/resources": "^1.24.0", - "@opentelemetry/sdk-node": "^0.53.0" + "@opentelemetry/sdk-node": "^0.54.0" }, "engines": { "node": ">=14" @@ -3200,22 +2938,8 @@ "@opentelemetry/api": "^1.4.1" } }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -3227,34 +2951,21 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, "engines": { "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", - "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3264,14 +2975,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", - "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", + "version": "0.40.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.36" }, @@ -3282,13 +3000,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", - "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", + "version": "0.13.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3298,13 +3023,11 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-express": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", - "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", + "version": "0.44.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3314,14 +3037,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", - "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", + "version": "0.16.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3331,12 +3061,10 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", - "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", + "version": "0.40.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3346,12 +3074,10 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", - "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", + "version": "0.44.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3361,13 +3087,11 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", - "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", + "version": "0.42.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3377,13 +3101,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", - "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", + "version": "0.44.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, @@ -3394,13 +3125,43 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-ioredis/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.4.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.40.0.tgz", - "integrity": "sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==", + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3410,14 +3171,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", - "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", + "version": "0.44.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3427,13 +3195,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz", - "integrity": "sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==", + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3443,13 +3218,10 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", - "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", + "version": "0.48.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3459,14 +3231,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", - "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3476,13 +3255,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", - "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", + "version": "0.42.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/mysql": "2.15.26" }, @@ -3493,13 +3279,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", - "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", + "version": "0.42.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.40.1" }, @@ -3510,13 +3303,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", - "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -3526,14 +3326,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.45.1.tgz", - "integrity": "sha512-GHUvPv7CQEK3RKHH3YAj6mjgJ3nZb6wRQS+t0yaRgKZzX2ggGsLN6OhRT04+IjqmMg9aIRUy1CzqwzgqAxjYbw==", + "version": "0.47.1", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.26.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "1.27.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", @@ -3548,20 +3355,16 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/semantic-conventions": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.42.0.tgz", - "integrity": "sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==", + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, @@ -3572,13 +3375,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.14.0.tgz", - "integrity": "sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==", + "version": "0.15.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, @@ -3589,14 +3399,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", - "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", + "version": "0.7.1", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -3607,17 +3424,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/redis-common": { "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -3625,8 +3431,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sql-common": { "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.1.0" @@ -3640,8 +3444,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/connect": { "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3649,8 +3451,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/mysql": { "version": "2.15.26", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", - "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3658,8 +3458,6 @@ }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@types/pg": { "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -3667,36 +3465,8 @@ "pg-types": "^2.2.0" } }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@opentelemetry/context-async-hooks": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", - "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -3707,8 +3477,6 @@ }, "node_modules/@opentelemetry/core": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", - "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -3721,28 +3489,24 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.53.0.tgz", - "integrity": "sha512-x5ygAQgWAQOI+UOhyV3z9eW7QU2dCfnfOuIBiyYmC2AWr74f6x/3JBnP27IAcEx6aihpqBYWKnpoUTztkVPAZw==", + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/sdk-logs": "0.53.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/sdk-logs": "0.54.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -3754,50 +3518,57 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.54.2", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.54.2", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/sdk-logs": "0.54.2" + }, "engines": { "node": ">=14" - } + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.53.0.tgz", - "integrity": "sha512-cSRKgD/n8rb+Yd+Cif6EnHEL/VZg1o8lEcEwFji1lwene6BdH51Zh3feAD9p2TyVoBKrl6Q9Zm2WltSp2k9gWQ==", + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/sdk-logs": "0.53.0" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api-logs": "0.54.2", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.2", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -3809,52 +3580,40 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.53.0.tgz", - "integrity": "sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-metrics": "1.27.0" }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -3866,30 +3625,28 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -3899,26 +3656,30 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.53.0.tgz", - "integrity": "sha512-nvZtOk23pZOrTW10Za2WPd9pk4tWDvL6ALlHRFfInpcTjtOgCrv+fQDxpzosa5PeXvYeFFUO5aYCTnwiCX4Dzg==", + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-metrics": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" @@ -3927,10 +3688,8 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -3942,13 +3701,12 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -3958,41 +3716,42 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.54.2", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.53.0.tgz", - "integrity": "sha512-m6KSh6OBDwfDjpzPVbuJbMgMbkoZfpxYH2r262KckgX9cMYvooWXEKzlJYsNDC6ADr28A1rtRoUVRwNfIN4tUg==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -4002,30 +3761,26 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -4035,74 +3790,91 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.53.0.tgz", - "integrity": "sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.54.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.54.2.tgz", + "integrity": "sha512-go6zpOVoZVztT9r1aPd79Fr3OWiD4N24bCPJsIKkBses8oyFo12F/Ew3UBTdIu6hsW4HC4MVEJygG6TEyJI/lg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/api-logs": "0.54.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.55.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.47.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.143" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.46.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/propagation-utils": "^0.30.12", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/core": { + "version": "1.30.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" @@ -4111,7 +3883,7 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", @@ -4120,140 +3892,133 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.53.0.tgz", - "integrity": "sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==", + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.42.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@types/bunyan": "1.8.9" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.42.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.52.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.10.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.26.0", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.208.0" + }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", - "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.40.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.57.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/core": { + "version": "1.30.1", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" @@ -4262,7 +4027,7 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", @@ -4271,15 +4036,19 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", - "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.208.0", - "import-in-the-middle": "^2.0.0", - "require-in-the-middle": "^8.0.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -4288,13 +4057,10 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.55.0.tgz", - "integrity": "sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==", + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.52.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { @@ -4304,1111 +4070,40 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", - "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.56.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagator-aws-xray": "^1.3.1", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/aws-lambda": "8.10.143" + "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.44.0.tgz", - "integrity": "sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagation-utils": "^0.30.11", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.41.0.tgz", - "integrity": "sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@types/bunyan": "1.8.9" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.41.0.tgz", - "integrity": "sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.52.0.tgz", - "integrity": "sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/connect": "3.4.38" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.9.0.tgz", - "integrity": "sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.26.0.tgz", - "integrity": "sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.39.0.tgz", - "integrity": "sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.57.0.tgz", - "integrity": "sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", - "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.28.0.tgz", - "integrity": "sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.52.0.tgz", - "integrity": "sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.56.0.tgz", - "integrity": "sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.53.0.tgz", - "integrity": "sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.55.0.tgz", - "integrity": "sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", - "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.56.0.tgz", - "integrity": "sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/redis-common": "^0.38.2" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", - "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.53.0.tgz", - "integrity": "sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.33.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.57.0.tgz", - "integrity": "sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.36.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.53.0.tgz", - "integrity": "sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.39.0.tgz", - "integrity": "sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/memcached": "^2.2.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.61.0.tgz", - "integrity": "sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0" + "@opentelemetry/instrumentation": "0.54.2", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mongoose": { + "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.55.0.tgz", - "integrity": "sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.208.0" + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5417,47 +4112,42 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.54.0.tgz", - "integrity": "sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==", + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0", - "@types/mysql": "2.15.27" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/instrumentation": "0.54.2", + "@opentelemetry/semantic-conventions": "1.27.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.55.0.tgz", - "integrity": "sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==", + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.33.0", - "@opentelemetry/sql-common": "^0.41.2" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.55.0.tgz", - "integrity": "sha512-JFLNhbbEGnnQrMKOYoXx0nNk5N9cPeghu4xP/oup40a7VaSeYruyOiFbg9nkbS4ZQiI8aMuRqUT3Mo4lQjKEKg==", + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.56.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.30.0" + "@opentelemetry/redis-common": "^0.38.2" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5466,10 +4156,8 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.39.0.tgz", - "integrity": "sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==", + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.3.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.53.0", @@ -5482,192 +4170,96 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/instrumentation": { + "node_modules/@opentelemetry/instrumentation-knex": { "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.33.1" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.61.0.tgz", - "integrity": "sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==", + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.57.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/semantic-conventions": "^1.34.0", - "@opentelemetry/sql-common": "^0.41.2", - "@types/pg": "8.15.6", - "@types/pg-pool": "2.0.6" + "@opentelemetry/semantic-conventions": "^1.36.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.9.0" } }, - "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.42.0.tgz", - "integrity": "sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==", + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.53.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/core": "^1.25.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.40.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.61.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.55.0", "license": "Apache-2.0", "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0" }, "engines": { - "node": ">=8.6.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.57.0.tgz", - "integrity": "sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==", + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.54.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.208.0", - "@opentelemetry/redis-common": "^0.38.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@types/mysql": "2.15.27" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5676,47 +4268,41 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", - "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.55.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.41.2" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.55.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.30.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.40.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -5725,74 +4311,41 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.41.0.tgz", - "integrity": "sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==", + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.61.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.6" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -5804,68 +4357,36 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.57.0", "license": "Apache-2.0", "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/redis-common": "^0.38.2", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=8.6.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.40.0.tgz", - "integrity": "sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==", + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -5875,30 +4396,20 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, "engines": { "node": ">=14" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.42.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -5907,72 +4418,41 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/core": { + "version": "1.30.1", "license": "Apache-2.0", "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.42.0.tgz", - "integrity": "sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==", + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, "engines": { "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, "engines": { "node": ">=14" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -5981,36 +4461,22 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.43.0", "license": "Apache-2.0", "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/instrumentation-tedious": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.27.0.tgz", - "integrity": "sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.208.0", @@ -6025,8 +4491,6 @@ }, "node_modules/@opentelemetry/instrumentation-undici": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.19.0.tgz", - "integrity": "sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -6041,45 +4505,11 @@ } }, "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.40.0.tgz", - "integrity": "sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "version": "0.41.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -6088,7 +4518,7 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/import-in-the-middle": { + "node_modules/@opentelemetry/instrumentation/node_modules/import-in-the-middle": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", @@ -6100,40 +4530,22 @@ "module-details-from-path": "^1.0.3" } }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.53.0.tgz", - "integrity": "sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==", + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-transformer": "0.53.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-transformer": "0.54.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -6145,94 +4557,24 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.53.0.tgz", - "integrity": "sha512-F7RCN8VN+lzSa4fGjewit8Z5fEUpY/lmMVy5EWn2ZpbAabg3EE3sCLuTNfOiooNGnmvzimUPruoeqeko/5/TzQ==", + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.2", + "@opentelemetry/otlp-transformer": "0.54.2" }, "engines": { "node": ">=14" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.53.0.tgz", - "integrity": "sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-metrics": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -6244,30 +4586,29 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/api-logs": "0.54.2", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.2", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", + "protobufjs": "^7.3.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6277,19 +4618,23 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/propagation-utils": { "version": "0.30.16", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", - "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6298,25 +4643,11 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/propagator-aws-xray": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", - "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", - "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/core": "1.27.0" }, "engines": { "node": ">=14" @@ -6326,9 +4657,7 @@ } }, "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -6340,22 +4669,11 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", - "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/core": "1.27.0" }, "engines": { "node": ">=14" @@ -6365,9 +4683,7 @@ } }, "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -6379,19 +4695,8 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/redis-common": { "version": "0.38.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz", - "integrity": "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -6399,8 +4704,6 @@ }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { "version": "0.29.7", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.7.tgz", - "integrity": "sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.26.0", @@ -6416,8 +4719,6 @@ }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -6429,10 +4730,17 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6440,8 +4748,6 @@ }, "node_modules/@opentelemetry/resource-detector-aws": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", - "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.0.0", @@ -6457,8 +4763,6 @@ }, "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -6470,10 +4774,17 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6481,8 +4792,6 @@ }, "node_modules/@opentelemetry/resource-detector-azure": { "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", - "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.25.1", @@ -6498,8 +4807,6 @@ }, "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -6511,19 +4818,24 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", - "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", + "version": "0.5.3", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.26.0", @@ -6539,8 +4851,6 @@ }, "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -6552,10 +4862,17 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6563,8 +4880,6 @@ }, "node_modules/@opentelemetry/resource-detector-gcp": { "version": "0.29.13", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", - "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.0.0", @@ -6581,8 +4896,6 @@ }, "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -6594,23 +4907,30 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/resources": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", - "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz", + "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -6620,12 +4940,12 @@ } }, "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz", + "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -6634,24 +4954,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.53.0.tgz", - "integrity": "sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==", + "version": "0.54.2", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/api-logs": "0.54.2", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" @@ -6660,40 +4969,10 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6703,23 +4982,14 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz", - "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz", + "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" @@ -6729,27 +4999,11 @@ } }, "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz", + "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6759,36 +5013,25 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-node": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.53.0.tgz", - "integrity": "sha512-0hsxfq3BKy05xGktwG8YdGdxV978++x40EAKyKr1CaHZRh8uqVlXnclnl7OMi9xLMJEcXUw7lGhiRlArFcovyg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/exporter-logs-otlp-grpc": "0.53.0", - "@opentelemetry/exporter-logs-otlp-http": "0.53.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.53.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.53.0", - "@opentelemetry/exporter-trace-otlp-http": "0.53.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.53.0", - "@opentelemetry/exporter-zipkin": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-metrics": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "@opentelemetry/sdk-trace-node": "1.26.0", + "version": "0.54.2", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.54.2", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.54.2", + "@opentelemetry/exporter-logs-otlp-http": "0.54.2", + "@opentelemetry/exporter-logs-otlp-proto": "0.54.2", + "@opentelemetry/exporter-trace-otlp-grpc": "0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "0.54.2", + "@opentelemetry/exporter-trace-otlp-proto": "0.54.2", + "@opentelemetry/exporter-zipkin": "1.27.0", + "@opentelemetry/instrumentation": "0.54.2", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.2", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", + "@opentelemetry/sdk-trace-node": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6798,60 +5041,10 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6862,13 +5055,11 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -6878,45 +5069,8 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", - "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -6932,8 +5086,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -6947,16 +5099,14 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", - "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.26.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/propagator-b3": "1.26.0", - "@opentelemetry/propagator-jaeger": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/context-async-hooks": "1.27.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/propagator-b3": "1.27.0", + "@opentelemetry/propagator-jaeger": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", "semver": "^7.5.2" }, "engines": { @@ -6967,9 +5117,7 @@ } }, "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/context-async-hooks": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", - "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", + "version": "1.27.0", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6979,27 +5127,9 @@ } }, "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -7010,13 +5140,11 @@ } }, "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "version": "1.27.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -7026,7 +5154,7 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/semantic-conventions": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", @@ -7035,19 +5163,8 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", - "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sql-common": { "version": "0.41.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", - "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0" @@ -7061,8 +5178,6 @@ }, "node_modules/@paralleldrive/cuid2": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "dev": true, "license": "MIT", "dependencies": { @@ -7071,14 +5186,10 @@ }, "node_modules/@pinojs/redact": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, "node_modules/@prisma/instrumentation": { "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.19.0.tgz", - "integrity": "sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": ">=0.52.0 <1" @@ -7089,32 +5200,22 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -7123,38 +5224,26 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@sentry/core": { "version": "10.32.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.32.1.tgz", - "integrity": "sha512-PH2ldpSJlhqsMj2vCTyU0BI2Fx1oIDhm7Izo5xFALvjVCS0gmlqHt1udu6YlKn8BtpGH6bGzssvv5APrk+OdPQ==", "license": "MIT", "engines": { "node": ">=18" @@ -7162,8 +5251,6 @@ }, "node_modules/@sentry/nestjs": { "version": "10.32.1", - "resolved": "https://registry.npmjs.org/@sentry/nestjs/-/nestjs-10.32.1.tgz", - "integrity": "sha512-StgRg8AojiCbH+Q7uhO/9DOhfpjw6SxtsTWwNoioLfHIx968btdQPhALrHji0xXR8DYDBf+bk99P1KdqgDDh/w==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -7184,8 +5271,6 @@ }, "node_modules/@sentry/node": { "version": "10.32.1", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.32.1.tgz", - "integrity": "sha512-oxlybzt8QW0lx/QaEj1DcvZDRXkgouewFelu/10dyUwv5So3YvipfvWInda+yMLmn25OggbloDQ0gyScA2jU3g==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -7230,8 +5315,6 @@ }, "node_modules/@sentry/node-core": { "version": "10.32.1", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.32.1.tgz", - "integrity": "sha512-w56rxdBanBKc832zuwnE+zNzUQ19fPxfHEtOhK8JGPu3aSwQYcIxwz9z52lOx3HN7k/8Fj5694qlT3x/PokhRw==", "license": "MIT", "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", @@ -7254,8 +5337,6 @@ }, "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-http": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.208.0.tgz", - "integrity": "sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -7272,8 +5353,6 @@ }, "node_modules/@sentry/node/node_modules/@opentelemetry/instrumentation-kafkajs": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.18.0.tgz", - "integrity": "sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.208.0", @@ -7288,8 +5367,6 @@ }, "node_modules/@sentry/node/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -7304,8 +5381,6 @@ }, "node_modules/@sentry/node/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -7313,8 +5388,6 @@ }, "node_modules/@sentry/node/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -7328,8 +5401,6 @@ }, "node_modules/@sentry/opentelemetry": { "version": "10.32.1", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.32.1.tgz", - "integrity": "sha512-YLssSz5Y+qPvufrh2cDaTXDoXU8aceOhB+YTjT8/DLF6SOj7Tzen52aAcjNaifawaxEsLCC8O+B+A2iA+BllvA==", "license": "MIT", "dependencies": { "@sentry/core": "10.32.1" @@ -7347,15 +5418,11 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7364,8 +5431,6 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7374,8 +5439,6 @@ }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -7391,48 +5454,34 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, "node_modules/@tsconfig/node10": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@types/aws-lambda": { "version": "8.10.143", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.143.tgz", - "integrity": "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==", "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -7445,8 +5494,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -7455,8 +5502,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7466,8 +5511,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7476,8 +5519,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -7487,8 +5528,6 @@ }, "node_modules/@types/bunyan": { "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", - "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7496,8 +5535,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7505,15 +5542,11 @@ }, "node_modules/@types/cookiejar": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", "dependencies": { @@ -7523,8 +5556,6 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", "dependencies": { @@ -7534,15 +5565,11 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -7553,8 +5580,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "license": "MIT", "dependencies": { @@ -7566,8 +5591,6 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7576,22 +5599,16 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -7600,8 +5617,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7610,8 +5625,6 @@ }, "node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7621,15 +5634,11 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/memcached": { "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", - "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7637,15 +5646,11 @@ }, "node_modules/@types/methods": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", "dev": true, "license": "MIT" }, "node_modules/@types/mysql": { "version": "2.15.27", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", - "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7653,8 +5658,6 @@ }, "node_modules/@types/node": { "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", - "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -7662,8 +5665,6 @@ }, "node_modules/@types/pg": { "version": "8.15.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", - "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -7673,8 +5674,6 @@ }, "node_modules/@types/pg-pool": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", "license": "MIT", "dependencies": { "@types/pg": "*" @@ -7682,22 +5681,16 @@ }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7706,8 +5699,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7717,21 +5708,15 @@ }, "node_modules/@types/shimmer": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", "license": "MIT" }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, "node_modules/@types/superagent": { "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7743,8 +5728,6 @@ }, "node_modules/@types/supertest": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, "license": "MIT", "dependencies": { @@ -7754,8 +5737,6 @@ }, "node_modules/@types/tedious": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7763,21 +5744,15 @@ }, "node_modules/@types/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", "dev": true, "license": "MIT" }, "node_modules/@types/validator": { "version": "13.15.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", - "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -7786,15 +5761,11 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7804,29 +5775,21 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { @@ -7837,15 +5800,11 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -7857,8 +5816,6 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { @@ -7867,8 +5824,6 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7877,15 +5832,11 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7901,8 +5852,6 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { @@ -7915,8 +5864,6 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -7928,8 +5875,6 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7943,8 +5888,6 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { @@ -7954,22 +5897,16 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -7981,8 +5918,6 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7993,8 +5928,6 @@ }, "node_modules/acorn-import-attributes": { "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -8002,8 +5935,6 @@ }, "node_modules/acorn-import-phases": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", "engines": { @@ -8015,8 +5946,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { @@ -8028,8 +5957,6 @@ }, "node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -8037,8 +5964,6 @@ }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { @@ -8054,8 +5979,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8072,8 +5995,6 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", "dependencies": { @@ -8085,8 +6006,6 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { @@ -8095,8 +6014,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8111,8 +6028,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -8120,8 +6035,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8135,8 +6048,6 @@ }, "node_modules/ansis": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", - "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", "dev": true, "license": "ISC", "engines": { @@ -8145,8 +6056,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -8159,8 +6068,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -8172,49 +6079,35 @@ }, "node_modules/append-field": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", "dev": true, "license": "MIT" }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -8222,8 +6115,6 @@ }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -8244,8 +6135,6 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8261,8 +6150,6 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8278,8 +6165,6 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -8288,8 +6173,6 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -8304,8 +6187,6 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -8331,8 +6212,6 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -8348,14 +6227,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -8375,8 +6250,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8385,8 +6258,6 @@ }, "node_modules/bignumber.js": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", "engines": { "node": "*" @@ -8394,8 +6265,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -8407,8 +6276,6 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8419,8 +6286,6 @@ }, "node_modules/body-parser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -8443,8 +6308,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -8454,8 +6317,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -8467,8 +6328,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -8501,8 +6360,6 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "license": "MIT", "dependencies": { @@ -8514,8 +6371,6 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8524,8 +6379,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -8549,14 +6402,10 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -8566,8 +6415,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8575,8 +6422,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8588,8 +6433,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -8604,8 +6447,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -8614,8 +6455,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -8624,8 +6463,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001762", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", - "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -8645,8 +6482,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -8662,8 +6497,6 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -8672,15 +6505,11 @@ }, "node_modules/chardet": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, "node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { @@ -8695,8 +6524,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -8705,8 +6532,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -8721,20 +6546,14 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "license": "MIT" }, "node_modules/class-transformer": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", "license": "MIT" }, "node_modules/class-validator": { "version": "0.14.3", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", - "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", "license": "MIT", "dependencies": { "@types/validator": "^13.15.3", @@ -8744,8 +6563,6 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { @@ -8757,8 +6574,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -8770,8 +6585,6 @@ }, "node_modules/cli-table3": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8786,8 +6599,6 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", "engines": { @@ -8796,8 +6607,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -8810,8 +6619,6 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -8827,8 +6634,6 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", "engines": { @@ -8837,8 +6642,6 @@ }, "node_modules/cluster-key-slot": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "license": "Apache-2.0", "engines": { "node": ">=0.10.0" @@ -8846,8 +6649,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -8857,15 +6658,11 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -8876,20 +6673,14 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -8901,8 +6692,6 @@ }, "node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", "engines": { @@ -8911,8 +6700,6 @@ }, "node_modules/comment-json": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", - "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", "dev": true, "license": "MIT", "dependencies": { @@ -8926,8 +6713,6 @@ }, "node_modules/component-emitter": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, "license": "MIT", "funding": { @@ -8936,15 +6721,11 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "engines": [ "node >= 6.0" ], @@ -8958,8 +6739,6 @@ }, "node_modules/concurrently": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -8983,8 +6762,6 @@ }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8999,8 +6776,6 @@ }, "node_modules/consola": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" @@ -9008,8 +6783,6 @@ }, "node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -9021,8 +6794,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9030,15 +6801,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9046,8 +6813,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -9055,22 +6820,16 @@ }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true, "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -9082,8 +6841,6 @@ }, "node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", "dependencies": { @@ -9109,8 +6866,6 @@ }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9131,15 +6886,11 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -9153,8 +6904,6 @@ }, "node_modules/dateformat": { "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "license": "MIT", "engines": { "node": "*" @@ -9162,8 +6911,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9179,8 +6926,6 @@ }, "node_modules/dedent": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -9194,8 +6939,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -9204,8 +6947,6 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", "dependencies": { @@ -9217,8 +6958,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { @@ -9227,8 +6966,6 @@ }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "license": "Apache-2.0", "engines": { "node": ">=0.10" @@ -9236,8 +6973,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9245,8 +6980,6 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -9255,8 +6988,6 @@ }, "node_modules/dezalgo": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "license": "ISC", "dependencies": { @@ -9266,8 +6997,6 @@ }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -9276,8 +7005,6 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -9286,8 +7013,6 @@ }, "node_modules/dotenv": { "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -9298,8 +7023,6 @@ }, "node_modules/dotenv-expand": { "version": "12.0.1", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", - "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" @@ -9313,8 +7036,6 @@ }, "node_modules/drizzle-kit": { "version": "0.31.8", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz", - "integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==", "dev": true, "license": "MIT", "dependencies": { @@ -9329,8 +7050,6 @@ }, "node_modules/drizzle-orm": { "version": "0.45.1", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", - "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", "license": "Apache-2.0", "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", @@ -9454,8 +7173,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -9468,21 +7185,15 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -9494,14 +7205,10 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9509,8 +7216,6 @@ }, "node_modules/end-of-stream": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -9518,8 +7223,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9532,8 +7235,6 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9542,8 +7243,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9551,8 +7250,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9560,15 +7257,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -9579,8 +7272,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9595,8 +7286,6 @@ }, "node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9637,8 +7326,6 @@ }, "node_modules/esbuild-register": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, "license": "MIT", "dependencies": { @@ -9650,8 +7337,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -9659,14 +7344,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { @@ -9675,8 +7356,6 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9689,8 +7368,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -9703,8 +7380,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9716,8 +7391,6 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -9726,8 +7399,6 @@ }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -9736,8 +7407,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9745,8 +7414,6 @@ }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -9755,8 +7422,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -9779,15 +7444,11 @@ }, "node_modules/execa/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -9795,8 +7456,6 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -9812,8 +7471,6 @@ }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -9855,40 +7512,28 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/fast-copy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.2.tgz", - "integrity": "sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==", "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -9904,8 +7549,6 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9914,8 +7557,6 @@ }, "node_modules/file-type": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.2.0.tgz", - "integrity": "sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg==", "license": "MIT", "dependencies": { "@tokenizer/inflate": "^0.4.1", @@ -9932,8 +7573,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -9945,8 +7584,6 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -9966,8 +7603,6 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -9980,8 +7615,6 @@ }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10008,8 +7641,6 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -10025,8 +7656,6 @@ }, "node_modules/form-data/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -10035,8 +7664,6 @@ }, "node_modules/form-data/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -10048,8 +7675,6 @@ }, "node_modules/formidable": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "license": "MIT", "dependencies": { @@ -10066,8 +7691,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -10075,14 +7698,10 @@ }, "node_modules/forwarded-parse": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", - "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", "license": "MIT" }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10090,8 +7709,6 @@ }, "node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10105,15 +7722,11 @@ }, "node_modules/fs-monkey": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", "dev": true, "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, @@ -10134,8 +7747,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10143,8 +7754,6 @@ }, "node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -10159,8 +7768,6 @@ }, "node_modules/gaxios/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -10172,8 +7779,6 @@ }, "node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "license": "Apache-2.0", "dependencies": { "gaxios": "^6.1.1", @@ -10186,8 +7791,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -10196,8 +7799,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -10205,8 +7806,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -10229,8 +7828,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -10239,8 +7836,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -10252,8 +7847,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -10265,8 +7858,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10278,8 +7869,6 @@ }, "node_modules/glob": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10296,8 +7885,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -10309,15 +7896,11 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/minimatch": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10332,8 +7915,6 @@ }, "node_modules/google-logging-utils": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -10341,8 +7922,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10353,15 +7932,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10382,8 +7957,6 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -10392,8 +7965,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -10402,8 +7973,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10414,8 +7983,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -10430,8 +7997,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -10442,21 +8007,15 @@ }, "node_modules/help-me": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -10475,8 +8034,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -10488,8 +8045,6 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10498,8 +8053,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10514,8 +8067,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -10534,15 +8085,11 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10558,8 +8105,6 @@ }, "node_modules/import-in-the-middle": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.1.tgz", - "integrity": "sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==", "license": "Apache-2.0", "dependencies": { "acorn": "^8.14.0", @@ -10570,8 +8115,6 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -10590,8 +8133,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -10600,9 +8141,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -10612,14 +8150,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ioredis": { "version": "5.8.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", - "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", "license": "MIT", "dependencies": { "@ioredis/commands": "1.4.0", @@ -10642,8 +8176,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -10651,15 +8183,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -10671,8 +8199,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -10686,8 +8212,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -10696,8 +8220,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -10705,8 +8227,6 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -10715,8 +8235,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -10728,8 +8246,6 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, "license": "MIT", "engines": { @@ -10738,8 +8254,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -10748,14 +8262,10 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -10766,8 +8276,6 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -10779,15 +8287,11 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -10796,8 +8300,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10813,8 +8315,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10828,8 +8328,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10843,8 +8341,6 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -10853,8 +8349,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10867,8 +8361,6 @@ }, "node_modules/iterare": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", "license": "ISC", "engines": { "node": ">=6" @@ -10876,8 +8368,6 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -10903,8 +8393,6 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -10918,8 +8406,6 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -10950,8 +8436,6 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -10984,8 +8468,6 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11030,9 +8512,6 @@ }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -11052,8 +8531,6 @@ }, "node_modules/jest-config/node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -11065,8 +8542,6 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -11081,8 +8556,6 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -11094,8 +8567,6 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11111,8 +8582,6 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -11129,8 +8598,6 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -11139,8 +8606,6 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -11165,8 +8630,6 @@ }, "node_modules/jest-haste-map/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -11181,8 +8644,6 @@ }, "node_modules/jest-haste-map/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11197,8 +8658,6 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -11211,8 +8670,6 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -11227,8 +8684,6 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -11248,8 +8703,6 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -11263,8 +8716,6 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -11281,8 +8732,6 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { @@ -11291,8 +8740,6 @@ }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -11312,8 +8759,6 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -11326,8 +8771,6 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11359,8 +8802,6 @@ }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -11375,8 +8816,6 @@ }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11385,8 +8824,6 @@ }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -11396,8 +8833,6 @@ }, "node_modules/jest-runner/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11412,8 +8847,6 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11446,9 +8879,6 @@ }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -11468,8 +8898,6 @@ }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -11478,8 +8906,6 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -11510,8 +8936,6 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -11528,8 +8952,6 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -11541,8 +8963,6 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -11559,8 +8979,6 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -11572,8 +8990,6 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -11592,8 +9008,6 @@ }, "node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -11607,8 +9021,6 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11623,8 +9035,6 @@ }, "node_modules/joycon": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "license": "MIT", "engines": { "node": ">=10" @@ -11632,15 +9042,11 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -11652,8 +9058,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -11665,8 +9069,6 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" @@ -11674,22 +9076,16 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -11701,15 +9097,11 @@ }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, "node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -11721,8 +9113,6 @@ }, "node_modules/kafkajs": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", - "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -11730,8 +9120,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -11740,8 +9128,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -11750,21 +9136,15 @@ }, "node_modules/libphonenumber-js": { "version": "1.12.33", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.33.tgz", - "integrity": "sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==", "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/load-esm": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", - "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", "funding": [ { "type": "github", @@ -11782,8 +9162,6 @@ }, "node_modules/loader-runner": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", "engines": { @@ -11796,8 +9174,6 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -11809,39 +9185,27 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "license": "MIT" }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -11857,14 +9221,10 @@ }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, "node_modules/lru-cache": { "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -11873,8 +9233,6 @@ }, "node_modules/magic-string": { "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -11883,8 +9241,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -11899,15 +9255,11 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11916,8 +9268,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11925,8 +9275,6 @@ }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11934,8 +9282,6 @@ }, "node_modules/memfs": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "license": "Unlicense", "dependencies": { @@ -11947,8 +9293,6 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -11959,15 +9303,11 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { @@ -11976,8 +9316,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -11990,8 +9328,6 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -12003,8 +9339,6 @@ }, "node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", "bin": { @@ -12016,8 +9350,6 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12025,8 +9357,6 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -12041,8 +9371,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -12051,8 +9379,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -12064,8 +9390,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12073,8 +9397,6 @@ }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { @@ -12083,8 +9405,6 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "license": "MIT", "dependencies": { "minimist": "^1.2.6" @@ -12095,20 +9415,14 @@ }, "node_modules/module-details-from-path": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/multer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -12125,8 +9439,6 @@ }, "node_modules/multer/node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12134,8 +9446,6 @@ }, "node_modules/multer/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12143,8 +9453,6 @@ }, "node_modules/multer/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -12155,8 +9463,6 @@ }, "node_modules/multer/node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -12168,8 +9474,6 @@ }, "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "license": "ISC", "engines": { @@ -12178,15 +9482,11 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12194,22 +9494,16 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/node-abort-controller": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true, "license": "MIT" }, "node_modules/node-emoji": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, "license": "MIT", "dependencies": { @@ -12218,8 +9512,6 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -12238,22 +9530,16 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -12281,8 +9567,6 @@ }, "node_modules/nodemon/node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -12306,8 +9590,6 @@ }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -12316,8 +9598,6 @@ }, "node_modules/nodemon/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -12329,8 +9609,6 @@ }, "node_modules/nodemon/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -12342,8 +9620,6 @@ }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -12355,8 +9631,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -12365,8 +9639,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -12378,8 +9650,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12387,8 +9657,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -12399,8 +9667,6 @@ }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -12408,8 +9674,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -12420,8 +9684,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -12429,8 +9691,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -12445,8 +9705,6 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12469,8 +9727,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12485,8 +9741,6 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -12498,8 +9752,6 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -12514,8 +9766,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -12524,8 +9774,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -12537,8 +9785,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -12556,8 +9802,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -12565,8 +9809,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -12575,8 +9817,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -12585,8 +9825,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -12595,14 +9833,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12618,8 +9852,6 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -12628,8 +9860,6 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -12638,8 +9868,6 @@ }, "node_modules/pg-int8": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "license": "ISC", "engines": { "node": ">=4.0.0" @@ -12647,14 +9875,10 @@ }, "node_modules/pg-protocol": { "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "license": "MIT", "dependencies": { "pg-int8": "1.0.1", @@ -12669,15 +9893,11 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { @@ -12689,8 +9909,6 @@ }, "node_modules/pino": { "version": "9.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", - "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", @@ -12711,8 +9929,6 @@ }, "node_modules/pino-abstract-transport": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -12720,8 +9936,6 @@ }, "node_modules/pino-http": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.5.0.tgz", - "integrity": "sha512-hD91XjgaKkSsdn8P7LaebrNzhGTdB086W3pyPihX0EzGPjq5uBJBXo4N5guqNaK6mUjg9aubMF7wDViYek9dRA==", "license": "MIT", "dependencies": { "get-caller-file": "^2.0.5", @@ -12732,8 +9946,6 @@ }, "node_modules/pino-pretty": { "version": "13.1.3", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", - "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", "license": "MIT", "dependencies": { "colorette": "^2.0.7", @@ -12756,8 +9968,6 @@ }, "node_modules/pino-pretty/node_modules/pino-abstract-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -12765,14 +9975,10 @@ }, "node_modules/pino-std-serializers": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", "license": "MIT" }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { @@ -12781,8 +9987,6 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12794,8 +9998,6 @@ }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { @@ -12804,8 +10006,6 @@ }, "node_modules/postgres": { "version": "3.4.7", - "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", - "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", "license": "Unlicense", "engines": { "node": ">=12" @@ -12817,8 +10017,6 @@ }, "node_modules/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "license": "MIT", "engines": { "node": ">=4" @@ -12826,8 +10024,6 @@ }, "node_modules/postgres-bytea": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12835,8 +10031,6 @@ }, "node_modules/postgres-date": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12844,8 +10038,6 @@ }, "node_modules/postgres-interval": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "license": "MIT", "dependencies": { "xtend": "^4.0.0" @@ -12856,8 +10048,6 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12871,8 +10061,6 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -12884,8 +10072,6 @@ }, "node_modules/process-warning": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -12900,8 +10086,6 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12914,8 +10098,6 @@ }, "node_modules/protobufjs": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -12938,8 +10120,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -12951,15 +10131,11 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true, "license": "MIT" }, "node_modules/pump": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -12968,8 +10144,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -12978,8 +10152,6 @@ }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -12995,8 +10167,6 @@ }, "node_modules/qs": { "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -13010,14 +10180,10 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13026,8 +10192,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -13035,8 +10199,6 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -13050,15 +10212,11 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -13071,8 +10229,6 @@ }, "node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -13085,8 +10241,6 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -13094,8 +10248,6 @@ }, "node_modules/redis-errors": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "license": "MIT", "engines": { "node": ">=4" @@ -13103,8 +10255,6 @@ }, "node_modules/redis-parser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" @@ -13115,14 +10265,10 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13130,8 +10276,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { @@ -13139,22 +10283,21 @@ } }, "node_modules/require-in-the-middle": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", - "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", "license": "MIT", "dependencies": { "debug": "^4.3.5", - "module-details-from-path": "^1.0.3" + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" }, "engines": { - "node": ">=9.3.0 || >=8.10.0 <9.0.0" + "node": ">=8.6.0" } }, "node_modules/resolve": { "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -13173,8 +10316,6 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -13186,8 +10327,6 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -13196,8 +10335,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -13206,8 +10343,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -13216,8 +10351,6 @@ }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -13226,8 +10359,6 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", "dependencies": { @@ -13240,15 +10371,11 @@ }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -13263,8 +10390,6 @@ }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -13272,8 +10397,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -13292,8 +10415,6 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -13301,14 +10422,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "license": "MIT", "dependencies": { @@ -13326,8 +10443,6 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -13343,8 +10458,6 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -13353,15 +10466,11 @@ }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/secure-json-parse": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", "funding": [ { "type": "github", @@ -13376,8 +10485,6 @@ }, "node_modules/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -13388,8 +10495,6 @@ }, "node_modules/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -13414,8 +10519,6 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13424,8 +10527,6 @@ }, "node_modules/serve-static": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -13443,14 +10544,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -13462,8 +10559,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -13472,8 +10567,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -13485,14 +10578,10 @@ }, "node_modules/shimmer": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", "license": "BSD-2-Clause" }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -13510,8 +10599,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -13526,8 +10613,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -13544,8 +10629,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -13563,8 +10646,6 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -13576,8 +10657,6 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -13589,15 +10668,11 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -13606,8 +10681,6 @@ }, "node_modules/sonic-boom": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -13615,8 +10688,6 @@ }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13625,8 +10696,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -13636,8 +10705,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13646,8 +10713,6 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", "engines": { "node": ">= 10.x" @@ -13655,15 +10720,11 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13675,14 +10736,10 @@ }, "node_modules/standard-as-callback": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -13690,16 +10747,12 @@ }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -13707,8 +10760,6 @@ }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13721,8 +10772,6 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -13735,8 +10784,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -13747,8 +10794,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -13757,8 +10802,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -13767,8 +10810,6 @@ }, "node_modules/strip-json-comments": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -13779,8 +10820,6 @@ }, "node_modules/strtok3": { "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0" @@ -13795,8 +10834,6 @@ }, "node_modules/superagent": { "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", "dev": true, "license": "MIT", "dependencies": { @@ -13816,8 +10853,6 @@ }, "node_modules/supertest": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", "dev": true, "license": "MIT", "dependencies": { @@ -13830,8 +10865,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -13843,8 +10876,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13855,8 +10886,6 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, "license": "MIT", "engines": { @@ -13865,8 +10894,6 @@ }, "node_modules/tapable": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { @@ -13879,8 +10906,6 @@ }, "node_modules/terser": { "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -13898,8 +10923,6 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13933,8 +10956,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -13944,8 +10965,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -13962,8 +10981,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -13982,15 +10999,11 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -14004,9 +11017,6 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -14026,8 +11036,6 @@ }, "node_modules/thread-stream": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "license": "MIT", "dependencies": { "real-require": "^0.2.0" @@ -14035,15 +11043,11 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14055,8 +11059,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -14064,8 +11066,6 @@ }, "node_modules/token-types": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", "dependencies": { "@borewit/text-codec": "^0.2.1", @@ -14082,8 +11082,6 @@ }, "node_modules/touch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, "license": "ISC", "bin": { @@ -14092,14 +11090,10 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -14108,8 +11102,6 @@ }, "node_modules/ts-jest": { "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -14161,8 +11153,6 @@ }, "node_modules/ts-jest/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -14174,8 +11164,6 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14218,8 +11206,6 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -14233,8 +11219,6 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", "dev": true, "license": "MIT", "dependencies": { @@ -14249,14 +11233,10 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -14265,8 +11245,6 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -14278,8 +11256,6 @@ }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -14292,14 +11268,10 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "license": "MIT" }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -14312,8 +11284,6 @@ }, "node_modules/uglify-js": { "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -14326,8 +11296,6 @@ }, "node_modules/uid": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.0.0" @@ -14338,8 +11306,6 @@ }, "node_modules/uint8array-extras": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", "engines": { "node": ">=18" @@ -14350,21 +11316,15 @@ }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, "license": "MIT" }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -14373,8 +11333,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -14382,8 +11340,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -14413,8 +11369,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14423,14 +11377,10 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/uuid": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -14442,15 +11392,11 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -14464,8 +11410,6 @@ }, "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -14475,8 +11419,6 @@ }, "node_modules/validator": { "version": "13.15.26", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", - "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -14484,8 +11426,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -14493,8 +11433,6 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14503,8 +11441,6 @@ }, "node_modules/watchpack": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", - "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", "dev": true, "license": "MIT", "dependencies": { @@ -14517,8 +11453,6 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", "dependencies": { @@ -14527,14 +11461,10 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/webpack": { "version": "5.103.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz", - "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "dev": true, "license": "MIT", "dependencies": { @@ -14582,8 +11512,6 @@ }, "node_modules/webpack-node-externals": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true, "license": "MIT", "engines": { @@ -14592,8 +11520,6 @@ }, "node_modules/webpack-sources": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", "engines": { @@ -14602,8 +11528,6 @@ }, "node_modules/webpack/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -14620,8 +11544,6 @@ }, "node_modules/webpack/node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -14630,8 +11552,6 @@ }, "node_modules/webpack/node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -14643,8 +11563,6 @@ }, "node_modules/webpack/node_modules/schema-utils": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -14663,8 +11581,6 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -14673,8 +11589,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -14689,15 +11603,11 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -14711,14 +11621,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -14731,15 +11637,11 @@ }, "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", "engines": { "node": ">=0.4" @@ -14747,8 +11649,6 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -14756,15 +11656,11 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -14781,8 +11677,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -14790,8 +11684,6 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -14800,8 +11692,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -14813,8 +11703,6 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 5b7f66c506..9a606c96e3 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,14 @@ "scripts": { "build": "nest build", "build:transaction": "nest build transaction-service", - "build:anti-fraud": "nest build anti-fraud-service", - "start:transaction": "nest start transaction-service", "start:anti-fraud": "nest start anti-fraud-service", "start:transaction:dev": "nest start transaction-service --watch", "start:anti-fraud:dev": "nest start anti-fraud-service --watch", "start:dev": "concurrently \"npm run start:transaction:dev\" \"npm run start:anti-fraud:dev\"", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:push": "drizzle-kit push", - "db:studio": "drizzle-kit studio", + "db:generate": "drizzle-kit generate --config=config/database/drizzle.config.ts", + "db:migrate": "drizzle-kit migrate --config=config/database/drizzle.config.ts", + "db:push": "drizzle-kit push --config=config/database/drizzle.config.ts", + "db:studio": "drizzle-kit studio --config=config/database/drizzle.config.ts", "seed:fraud-rules": "ts-node -r tsconfig-paths/register -P tsconfig.json apps/anti-fraud-service/scripts/seed-default-rules.ts", "test": "jest --config=config/jest.config.js", "test:watch": "jest --config=config/jest.config.js --watch", @@ -49,16 +47,16 @@ "@nestjs/core": "^11.1.11", "@nestjs/microservices": "^11.1.11", "@nestjs/platform-express": "^11.1.11", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.52.1", - "@opentelemetry/exporter-metrics-otlp-http": "^0.54.2", - "@opentelemetry/exporter-trace-otlp-http": "^0.54.2", - "@opentelemetry/instrumentation-http": "^0.54.2", + "@opentelemetry/api": "1.9.0", + "@opentelemetry/auto-instrumentations-node": "0.52.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "0.54.2", + "@opentelemetry/instrumentation-http": "0.54.2", "@opentelemetry/instrumentation-kafkajs": "^0.3.0", - "@opentelemetry/resources": "^1.26.0", - "@opentelemetry/sdk-metrics": "^1.30.1", - "@opentelemetry/sdk-node": "^0.54.2", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-node": "0.54.2", + "@opentelemetry/semantic-conventions": "1.27.0", "@sentry/nestjs": "^10.32.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", @@ -92,9 +90,12 @@ "tsconfig-paths": "^4.2.0", "typescript": "^5.9.3" }, - "pnpm": { - "overrides": { - "@opentelemetry/sdk-metrics": "1.30.1" - } + "overrides": { + "@opentelemetry/api": "1.9.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-node": "0.54.2", + "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/instrumentation": "0.54.2" } } From b5be84c17f568c2aea9212c3c9967f0f25443b7d Mon Sep 17 00:00:00 2001 From: bearcode-dev Date: Tue, 6 Jan 2026 06:52:02 -0500 Subject: [PATCH 3/5] se agrego y referencio la colleccion de postman de pruebas para documentacion asi como verificar el funcionamiento del script sh para correr pruebas de las apis test-transaction-api.sh --- README.md | 9 +-- docs/API-TESTING.md | 17 +++-- docs/INDEX.md | 1 + .../RETO YAPE.postman_collection.json | 62 +++++++++++++++++++ test/api/test-transaction-api.sh | 34 ++++------ 5 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 docs/collection/RETO YAPE.postman_collection.json diff --git a/README.md b/README.md index 16e8c27330..49903566a7 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,8 @@ curl -X POST http://localhost:3000/transactions \ ![Arquitectura](docs/diagrams/architecture-overview-jsoncrack.jpeg) ### Microservicios -- **Transaction Service** (3000): Gestión de transacciones (CRUD + eventos Kafka) -- **Anti-Fraud Service** (3001): Motor de reglas configurables + auditoría +- **Transaction Service** (3000): Gestión de transacciones + eventos Kafka +- **Anti-Fraud Service** (3001): Motor de reglas configurables (Umbral de monto prioritario) + auditoría ### Patrones Implementados - **Hexagonal Architecture**: Domain, Application, Infrastructure, Presentation @@ -119,6 +119,7 @@ curl -X POST http://localhost:3000/transactions \ | **[GUIDE.md](docs/GUIDE.md)** | Arquitectura hexagonal y patrones de diseño | | **[FRAUD_RULES.md](docs/FRAUD_RULES.md)** | Motor de reglas anti-fraude configurables | | **[API-TESTING.md](docs/API-TESTING.md)** | Guía de testing con curl y scripts | +| **[Postman Collection](docs/collection/RETO%20YAPE.postman_collection.json)** | Colección de Postman para pruebas de API | --- @@ -139,8 +140,8 @@ npm run test:e2e **Pruebas manuales con curl:** ```bash -# Health check -curl http://localhost:3000/health +# Consultar transacción (Verificar estado) +curl http://localhost:3000/transactions/{transactionExternalId} # Crear transacción curl -X POST http://localhost:3000/transactions \ diff --git a/docs/API-TESTING.md b/docs/API-TESTING.md index e718ae3de5..52b2aca9aa 100644 --- a/docs/API-TESTING.md +++ b/docs/API-TESTING.md @@ -16,11 +16,11 @@ docker-compose up -d npm run start:dev ``` -### 2. Verificar Servicios +### 2. Verificar Logs de Servicios ```bash -curl http://localhost:3000/health # Transaction Service -curl http://localhost:3001/health # Anti-Fraud Service +docker logs transaction-service -f +docker logs anti-fraud-service -f ``` ### 3. Ejecutar Test Automatizado @@ -29,11 +29,16 @@ curl http://localhost:3001/health # Anti-Fraud Service npm run test:api ``` +### 4. Postman + +También puedes importar la colección de Postman ubicada en: +`docs/collection/RETO YAPE.postman_collection.json` + ## Escenarios de Testing El script `test/api/test-transaction-api.sh` cubre: -1. Health check del servicio +1. Verificación de logs del servicio 2. Crear transacción válida (< 1000) 3. Consultar transacción por ID 4. Crear transacción de alto valor (> 1000) para verificar anti-fraude @@ -74,8 +79,8 @@ curl http://localhost:3000/transactions/{transaction-id} docker logs transaction-service -f docker logs anti-fraud-service -f -# Curl verbose -curl -v http://localhost:3000/health +# Curl verbose (Verificar cabeceras) +curl -v http://localhost:3000/transactions/{transaction-id} ``` ## Troubleshooting diff --git a/docs/INDEX.md b/docs/INDEX.md index ad7fb6a42f..a164eb4554 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -11,6 +11,7 @@ Documentación especializada del sistema de transacciones. Para inicio rápido, | **[GUIDE.md](GUIDE.md)** | Arquitectura hexagonal, DDD, patrones de diseño | | **[FRAUD_RULES.md](FRAUD_RULES.md)** | Motor de reglas anti-fraude y gestión | | **[API-TESTING.md](API-TESTING.md)** | Guía completa de testing | +| **[Postman Collection](collection/RETO%20YAPE.postman_collection.json)** | Colección oficial de Postman | ## Diagramas diff --git a/docs/collection/RETO YAPE.postman_collection.json b/docs/collection/RETO YAPE.postman_collection.json new file mode 100644 index 0000000000..63eae73111 --- /dev/null +++ b/docs/collection/RETO YAPE.postman_collection.json @@ -0,0 +1,62 @@ +{ + "info": { + "_postman_id": "542944d9-9b82-46c0-a971-3f9fb59e07b8", + "name": "RETO YAPE", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "33499029" + }, + "item": [ + { + "name": "transactions", + "item": [] + }, + { + "name": "CREAR TRANSACCION", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"accountExternalIdDebit\": \"120e8400-e29b-41d4-a716-446655440000\",\r\n \"accountExternalIdCredit\": \"120e8400-e29b-41d4-a716-446655440001\",\r\n \"tranferTypeId\": 1,\r\n \"value\": 700\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:3000/transactions", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "3000", + "path": [ + "transactions" + ] + } + }, + "response": [] + }, + { + "name": "CONSULTA DE TRANSACCION", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:3000/transactions/13eace8e-832d-4270-aac6-c8dfee8688c5", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "3000", + "path": [ + "transactions", + "13eace8e-832d-4270-aac6-c8dfee8688c5" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/test/api/test-transaction-api.sh b/test/api/test-transaction-api.sh index 00f589416f..53de04d12e 100644 --- a/test/api/test-transaction-api.sh +++ b/test/api/test-transaction-api.sh @@ -13,22 +13,12 @@ echo -e "${YELLOW}Testing Transaction Service API${NC}" echo -e "${YELLOW}Base URL: $BASE_URL${NC}" echo -e "${YELLOW}======================================${NC}\n" -echo -e "${YELLOW}[1/4] Testing Health Check...${NC}" -HEALTH_RESPONSE=$(curl -s -w "\n%{http_code}" "$BASE_URL/health" || echo "000") -HTTP_CODE=$(echo "$HEALTH_RESPONSE" | tail -n1) -if [ "$HTTP_CODE" = "200" ]; then - echo -e "${GREEN}✓ Health check passed${NC}\n" -else - echo -e "${RED}✗ Health check failed (HTTP $HTTP_CODE)${NC}\n" - exit 1 -fi - -echo -e "${YELLOW}[2/4] Creating a valid transaction (amount: 500)...${NC}" +echo -e "${YELLOW}[1/3] Creating a valid transaction (amount: 500)...${NC}" CREATE_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/transactions" \ -H "Content-Type: application/json" \ -d '{ - "accountExternalIdDebit": "acc-debit-001", - "accountExternalIdCredit": "acc-credit-001", + "accountExternalIdDebit": "123e4567-e89b-12d3-a456-426614174000", + "accountExternalIdCredit": "123e4567-e89b-12d3-a456-426614174001", "tranferTypeId": 1, "value": 500 }') @@ -38,8 +28,8 @@ RESPONSE_BODY=$(echo "$CREATE_RESPONSE" | head -n -1) if [ "$HTTP_CODE" = "201" ]; then echo -e "${GREEN}✓ Transaction created successfully${NC}" - echo "$RESPONSE_BODY" | jq '.' - TRANSACTION_ID=$(echo "$RESPONSE_BODY" | jq -r '.transactionExternalId') + echo "$RESPONSE_BODY" | node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0, 'utf-8')), null, 2))" + TRANSACTION_ID=$(echo "$RESPONSE_BODY" | node -e "console.log(JSON.parse(require('fs').readFileSync(0, 'utf-8')).transactionExternalId)") echo -e "${GREEN}Transaction ID: $TRANSACTION_ID${NC}\n" else echo -e "${RED}✗ Failed to create transaction (HTTP $HTTP_CODE)${NC}" @@ -47,14 +37,14 @@ else exit 1 fi -echo -e "${YELLOW}[3/4] Getting transaction by ID...${NC}" +echo -e "${YELLOW}[2/3] Getting transaction by ID...${NC}" GET_RESPONSE=$(curl -s -w "\n%{http_code}" "$BASE_URL/transactions/$TRANSACTION_ID") HTTP_CODE=$(echo "$GET_RESPONSE" | tail -n1) RESPONSE_BODY=$(echo "$GET_RESPONSE" | head -n -1) if [ "$HTTP_CODE" = "200" ]; then echo -e "${GREEN}✓ Transaction retrieved successfully${NC}" - echo "$RESPONSE_BODY" | jq '.' + echo "$RESPONSE_BODY" | node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0, 'utf-8')), null, 2))" echo "" else echo -e "${RED}✗ Failed to get transaction (HTTP $HTTP_CODE)${NC}" @@ -62,12 +52,12 @@ else exit 1 fi -echo -e "${YELLOW}[4/4] Creating high-value transaction (should be flagged by anti-fraud)...${NC}" +echo -e "${YELLOW}[3/3] Creating high-value transaction (should be flagged by anti-fraud)...${NC}" CREATE_HIGH_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/transactions" \ -H "Content-Type: application/json" \ -d '{ - "accountExternalIdDebit": "acc-debit-002", - "accountExternalIdCredit": "acc-credit-002", + "accountExternalIdDebit": "123e4567-e89b-12d3-a456-426614174002", + "accountExternalIdCredit": "123e4567-e89b-12d3-a456-426614174003", "tranferTypeId": 1, "value": 1500 }') @@ -77,8 +67,8 @@ RESPONSE_BODY=$(echo "$CREATE_HIGH_RESPONSE" | head -n -1) if [ "$HTTP_CODE" = "201" ]; then echo -e "${GREEN}✓ High-value transaction created${NC}" - echo "$RESPONSE_BODY" | jq '.' - HIGH_TRANSACTION_ID=$(echo "$RESPONSE_BODY" | jq -r '.transactionExternalId') + echo "$RESPONSE_BODY" | node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0, 'utf-8')), null, 2))" + HIGH_TRANSACTION_ID=$(echo "$RESPONSE_BODY" | node -e "console.log(JSON.parse(require('fs').readFileSync(0, 'utf-8')).transactionExternalId)") echo -e "${YELLOW}Note: This transaction should be processed by anti-fraud service${NC}" echo -e "${YELLOW}Check anti-fraud logs for validation results${NC}\n" else From b4e4ef809a4c2a22cb2061d174ca6ca28219d3c8 Mon Sep 17 00:00:00 2001 From: bearcode-dev Date: Tue, 6 Jan 2026 07:02:15 -0500 Subject: [PATCH 4/5] se corrigio el readme.md del proyecto en relacion a estructura de carpetas --- README.md | 118 +++++++++++++++++++++++++++----------------------- docs/GUIDE.md | 1 - 2 files changed, 64 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 49903566a7..b3f7723507 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,6 @@ npm run start:dev ### Verificar Instalación ```bash -# Health checks -curl http://localhost:3000/health # Transaction Service -curl http://localhost:3001/health # Anti-Fraud Service - # Crear una transacción de prueba curl -X POST http://localhost:3000/transactions \ -H "Content-Type: application/json" \ @@ -171,58 +167,74 @@ npm run check:fix # Lint + format (automático) ``` app-nodejs-codechallenge/ ├── apps/ -│ ├── transaction-service/ # Servicio principal de transacciones +│ ├── transaction-service/ │ │ └── src/ -│ │ ├── domain/ # Entidades y lógica de negocio -│ │ │ ├── entities/ # Transaction, TransactionStatus -│ │ │ ├── repositories/ # Interfaces de repositorios -│ │ │ └── value-objects/ # Objetos de valor inmutables -│ │ ├── application/ # Casos de uso -│ │ │ ├── use-cases/ # CreateTransaction, GetTransaction -│ │ │ └── dto/ # Data Transfer Objects -│ │ ├── infrastructure/ # Implementaciones técnicas -│ │ │ ├── database/ # Drizzle ORM, schemas, repositories -│ │ │ ├── kafka/ # Producers, consumers, eventos -│ │ │ └── cache/ # Redis adapter -│ │ ├── presentation/ # Capa de API -│ │ │ ├── controllers/ # REST endpoints -│ │ │ └── dto/ # Request/Response DTOs -│ │ └── config/ # Configuración de NestJS -│ │ -│ └── anti-fraud-service/ # Servicio de validación anti-fraude +│ │ ├── application/ +│ │ │ └── use-cases/ +│ │ ├── config/ +│ │ ├── domain/ +│ │ │ ├── entities/ +│ │ │ ├── ports/ +│ │ │ ├── repositories/ +│ │ │ └── value-objects/ +│ │ ├── infrastructure/ +│ │ │ ├── database/ +│ │ │ ├── messaging/ +│ │ │ └── repositories/ +│ │ └── presentation/ +│ │ ├── controllers/ +│ │ └── dtos/ +│ └── anti-fraud-service/ +│ ├── scripts/ │ └── src/ -│ ├── domain/ # Motor de reglas -│ │ ├── entities/ # FraudRule, RuleExecution -│ │ ├── services/ # FraudEvaluator -│ │ └── repositories/ # Interfaces -│ ├── application/ # Evaluación de transacciones -│ │ └── use-cases/ # EvaluateTransaction -│ ├── infrastructure/ # Implementaciones -│ │ ├── database/ # Schemas, repositories -│ │ └── kafka/ # Consumers, producers -│ └── config/ # Configuración -│ +│ ├── application/ +│ │ └── use-cases/ +│ ├── config/ +│ ├── domain/ +│ │ ├── entities/ +│ │ ├── ports/ +│ │ ├── repositories/ +│ │ ├── services/ +│ │ └── types/ +│ └── infrastructure/ +│ ├── database/ +│ ├── mappers/ +│ ├── messaging/ +│ └── repositories/ ├── libs/ -│ ├── common/ # Código compartido -│ │ ├── utils/ # Helpers y utilidades -│ │ ├── exceptions/ # Excepciones personalizadas -│ │ └── interfaces/ # Interfaces comunes -│ └── observability/ # Telemetría y monitoreo -│ ├── logging/ # Pino logger configurado -│ ├── tracing/ # OpenTelemetry setup -│ └── metrics/ # Métricas de aplicación -│ -├── config/ # Configuración global -│ ├── drizzle.config.ts # ORM configuration -│ └── jest.config.js # Test configuration -│ +│ ├── common/ +│ │ └── src/ +│ │ ├── database/ +│ │ │ └── schemas/ +│ │ ├── events/ +│ │ ├── exceptions/ +│ │ │ └── filters/ +│ │ ├── interceptors/ +│ │ ├── kafka/ +│ │ ├── redis/ +│ │ └── types/ +│ └── observability/ +│ └── src/ +│ ├── adapters/ +│ ├── kafka/ +│ ├── logging/ +│ ├── ports/ +│ └── tracing/ +├── config/ +│ └── database/ +├── drizzle/ +│ └── meta/ +├── docs/ +│ ├── collection/ +│ └── diagrams/ +├── observability/ +│ ├── grafana/ +│ │ ├── dashboards/ +│ │ └── provisioning/ +│ └── tempo/ ├── test/ -│ └── api/ # Tests de integración -│ └── test-transaction-api.sh -│ -├── docs/ # Documentación técnica -├── observability/ # Dashboards y configuración -└── docker-compose.yml # Infraestructura local +│ └── api/ +└── docker-compose.yml ``` ### Variables de Entorno @@ -268,10 +280,8 @@ Every transaction with a value greater than 1000 should be rejected. **Transaction Service (3000):** - `POST /transactions` - Crear transacción - `GET /transactions/:id` - Obtener transacción por ID -- `GET /health` - Health check **Anti-Fraud Service (3001):** -- `GET /health` - Health check **Eventos Kafka:** - `transaction-created` → `transaction-approved/rejected` diff --git a/docs/GUIDE.md b/docs/GUIDE.md index 9bd11bd3a9..9ce904eaf6 100644 --- a/docs/GUIDE.md +++ b/docs/GUIDE.md @@ -142,7 +142,6 @@ graph TD #### **Dashboards y Visualización** - **Grafana**: Métricas en tiempo real y dashboards customizables - **Tempo**: Tracing distribuido para debugging de requests complejos -- **Health Checks**: Endpoints dedicados para monitoreo de servicios #### **Alerting y Error Tracking** - **Sentry**: Captura automática de errores en producción From 05f3096612b4f738689468cf064e4124bf3527f4 Mon Sep 17 00:00:00 2001 From: bearcode-dev Date: Tue, 6 Jan 2026 07:17:41 -0500 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20correcci=C3=B3n=20de=20entorno=20doc?= =?UTF-8?q?ker,=20scripts=20de=20test=20y=20aclaraci=C3=B3n=20de=20reglas?= =?UTF-8?q?=20en=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 6 +- README.md | 105 +++++++++--------- .../scripts/seed-default-rules.ts | 2 +- docs/API-TESTING.md | 6 +- docs/FRAUD_RULES.md | 28 ++--- 5 files changed, 75 insertions(+), 72 deletions(-) diff --git a/.env.example b/.env.example index 336abe3938..66c8486592 100644 --- a/.env.example +++ b/.env.example @@ -20,8 +20,10 @@ NODE_ENV=development # Redis (optional) REDIS_URL=redis://localhost:6379 -# OpenTelemetry (optional) -OTEL_ENABLED=false +# OpenTelemetry +# Para Docker usar: http://tempo:4318 +# Para ejecución local usar: http://localhost:4318 +OTEL_ENABLED=true OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 OTEL_SAMPLING_RATIO=1.0 diff --git a/README.md b/README.md index b3f7723507..65bd4931f1 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ Sistema de procesamiento de transacciones con validación anti-fraude usando mic ## Inicio Rápido ### Prerrequisitos -- **Node.js 18+** +- **Node.js 20+** - **Docker & Docker Compose** -- **PostgreSQL** (opcional, se puede usar Docker) +- **PostgreSQL 14+** (incluido en Docker Compose) ### Instalación y Ejecución @@ -42,22 +42,19 @@ npm install cp .env.example .env # Editar .env con tus configuraciones -# 4. Levantar infraestructura externa (Docker) -docker-compose up -d +# 4. Levantar infraestructura y servicios (Docker) +# Esto inicializará la base de datos y cargará las reglas automáticamente +docker-compose up --build -d -# 5. Inicializar base de datos -npm run db:push - -# 6. Cargar reglas de anti-fraude por defecto -npm run seed:fraud-rules - -# 7. Iniciar servicios -npm run start:dev +# 5. (Opcional) Si ejecutas localmente sin Docker Compose: +# npm run db:push +# npm run seed:fraud-rules +# npm run start:dev ``` ### Verificar Instalación ```bash -# Crear una transacción de prueba +# Crear una transacción de prueba (UUIDs válidos requeridos) curl -X POST http://localhost:3000/transactions \ -H "Content-Type: application/json" \ -d '{ @@ -73,7 +70,7 @@ curl -X POST http://localhost:3000/transactions \ |----------|-----|-------------| | **Transaction Service** | http://localhost:3000 | API de transacciones | | **Anti-Fraud Service** | http://localhost:3001 | Validación anti-fraude | -| **Kafka UI** | http://localhost:9000 | Monitor de mensajes | +| **Kafka UI** | http://localhost:9000 | Monitor de mensajes (Kafka 2.5/5.5.3) | | **Grafana** | http://localhost:3002 | Dashboards (admin/admin) | --- @@ -84,8 +81,8 @@ curl -X POST http://localhost:3000/transactions \ ![Arquitectura](docs/diagrams/architecture-overview-jsoncrack.jpeg) ### Microservicios -- **Transaction Service** (3000): Gestión de transacciones + eventos Kafka -- **Anti-Fraud Service** (3001): Motor de reglas configurables (Umbral de monto prioritario) + auditoría +- **Transaction Service** (3000): Gestión de transacciones + eventos Kafka. +- **Anti-Fraud Service** (3001): Validación de reglas de negocio. Incluye la **regla obligatoria de umbral de monto (>1000)** y un motor extensible para reglas adicionales (demo). ### Patrones Implementados - **Hexagonal Architecture**: Domain, Application, Infrastructure, Presentation @@ -139,10 +136,15 @@ npm run test:e2e # Consultar transacción (Verificar estado) curl http://localhost:3000/transactions/{transactionExternalId} -# Crear transacción +# Crear transacción (Usar UUIDs reales) curl -X POST http://localhost:3000/transactions \ -H "Content-Type: application/json" \ - -d '{"accountExternalIdDebit": "acc-001", "accountExternalIdCredit": "acc-002", "tranferTypeId": 1, "value": 500}' + -d '{ + "accountExternalIdDebit": "550e8400-e29b-41d4-a716-446655440000", + "accountExternalIdCredit": "550e8400-e29b-41d4-a716-446655440001", + "tranferTypeId": 1, + "value": 500 + }' ``` --- @@ -242,35 +244,36 @@ Ver [.env.example](.env.example) para configuración completa. --- -# Problem +# El Problema -Every time a financial transaction is created it must be validated by our anti-fraud microservice and then the same service sends a message back to update the transaction status. -For now, we have only three transaction statuses: +Cada vez que se crea una transacción financiera, esta debe ser validada por nuestro microservicio anti-fraude y luego el mismo servicio envía un mensaje de vuelta para actualizar el estado de la transacción. + +Por ahora, solo tenemos tres estados de transacción:

    -
  1. pending
  2. -
  3. approved
  4. -
  5. rejected
  6. +
  7. pending (pendiente)
  8. +
  9. approved (aprobado)
  10. +
  11. rejected (rechazado)
-Every transaction with a value greater than 1000 should be rejected. +Cada transacción con un valor superior a 1000 debe ser rechazada. ```mermaid flowchart LR - Transaction -- Save Transaction with pending Status --> transactionDatabase[(Database)] - Transaction --Send transaction Created event--> Anti-Fraud - Anti-Fraud -- Send transaction Status Approved event--> Transaction - Anti-Fraud -- Send transaction Status Rejected event--> Transaction - Transaction -- Update transaction Status event--> transactionDatabase[(Database)] + Transaction -- Guarda Transacción con estado pending --> transactionDatabase[(Base de Datos)] + Transaction --Envía evento TransactionCreated--> Anti-Fraud + Anti-Fraud -- Envía evento TransactionApproved--> Transaction + Anti-Fraud -- Envía evento TransactionRejected--> Transaction + Transaction -- Actualiza estado de transacción --> transactionDatabase[(Base de Datos)] ``` -# Tech Stack +# Stack Tecnológico | Categoría | Tecnología | |-----------|-----------| -| **Backend** | Node.js 18+ · NestJS 11 · TypeScript | +| **Backend** | Node.js 20+ · NestJS 11 · TypeScript | | **Base de Datos** | PostgreSQL 14 · Drizzle ORM | -| **Mensajería** | Apache Kafka 2.8 · Redis | +| **Mensajería** | Apache Kafka 2.5/5.5.3 · Redis | | **Observabilidad** | OpenTelemetry · Grafana · Tempo · Pino · Sentry | | **Testing** | Jest · Supertest · Biome | | **DevOps** | Docker · Docker Compose | @@ -279,16 +282,17 @@ Every transaction with a value greater than 1000 should be rejected. **Transaction Service (3000):** - `POST /transactions` - Crear transacción -- `GET /transactions/:id` - Obtener transacción por ID +- `GET /transactions/:transactionExternalId` - Obtener transacción por ID externo **Anti-Fraud Service (3001):** +- Validación interna basada en reglas. **Eventos Kafka:** - `transaction-created` → `transaction-approved/rejected` -You must have two resources: +Se deben tener dos recursos principales: -1. Resource to create a transaction that must containt: +1. Recurso para crear una transacción que debe contener: ```json { @@ -299,7 +303,7 @@ You must have two resources: } ``` -2. Resource to retrieve a transaction +2. Recurso para recuperar una transacción: ```json { @@ -315,20 +319,18 @@ You must have two resources: } ``` -## Optional - -**High Volume Scenarios:** -- **Write optimization**: Kafka para ingesta asíncrona, PostgreSQL con índices optimizados -- **Read optimization**: Redis cache, read replicas, CQRS pattern -- **Escalabilidad**: Microservicios independientes, stateless design +## Opcionales (Consideraciones de Diseño) -**GraphQL**: No implementado en esta versión (REST API) +**Escenarios de Alto Volumen:** +- **Optimización de Escritura**: Kafka para ingesta asíncrona, PostgreSQL con índices optimizados. +- **Optimización de Lectura**: Cache con Redis, réplicas de lectura, patrón CQRS. +- **Escalabilidad**: Microservicios independientes, diseño sin estado (stateless). --- -# Send us your challenge +# Envíanos tu desafío -When you finish your challenge, after forking a repository, you **must** open a pull request to our repository. There are no limitations to the implementation, you can follow the programming paradigm, modularization, and style that you feel is the most appropriate solution. +Cuando termines tu desafío, después de hacer un fork del repositorio, **debes** abrir un pull request a nuestro repositorio. No hay limitaciones para la implementación, puedes seguir el paradigma de programación, la modularización y el estilo que sientas que es la solución más apropiada. If you have any questions, please let us know. @@ -337,12 +339,11 @@ If you have any questions, please let us know. ## Notas de Implementación Implementación: -- Cumple todos los requerimientos del challenge -- Arquitectura hexagonal + DDD -- Sistema de reglas anti-fraude extensible -- Observabilidad con OpenTelemetry -- Tests unitarios e integración -- Documentación técnica +- **Regla de Negocio**: Se cumple con la validación de transacciones > 1000. Aunque el requerimiento era un monto fijo, se implementó mediante un motor de reglas configurable para demostrar extensibilidad. +- **Arquitectura**: Hexagonal + DDD. +- **Extras**: Se incluyen reglas adicionales de forma demostrativa (blacklist, límites por tipo, etc.) para mostrar cómo el sistema puede evolucionar. +- **Observabilidad**: Implementada con OpenTelemetry. +- **Tests**: Unitarios e integración incluidos. **Próximos pasos:** 1. Revisar [docs/INDEX.md](docs/INDEX.md) para documentación completa diff --git a/apps/anti-fraud-service/scripts/seed-default-rules.ts b/apps/anti-fraud-service/scripts/seed-default-rules.ts index 31d0e9a73d..0b2215aba2 100644 --- a/apps/anti-fraud-service/scripts/seed-default-rules.ts +++ b/apps/anti-fraud-service/scripts/seed-default-rules.ts @@ -35,7 +35,7 @@ async function seedDefaultRules() { }, action: FraudAction.REVIEW, priority: 50, - isActive: false, // Desactivada por defecto + isActive: false, // Desactivada por defecto (activar manualmente si se requiere) }, { name: 'Weekend Transfer Limit', diff --git a/docs/API-TESTING.md b/docs/API-TESTING.md index 52b2aca9aa..e2b017f631 100644 --- a/docs/API-TESTING.md +++ b/docs/API-TESTING.md @@ -49,7 +49,7 @@ El script `test/api/test-transaction-api.sh` cubre: |----------------------|----------------|---------| | < 1000 | PENDING → APPROVED | Normal | | 1001 - 5000 | PENDING → REJECTED | Alto riesgo | -| > 5000 | PENDING → REVIEW | Muy alto - requiere revisión | +| > 5000 | PENDING → REVIEW | Muy alto - requiere revisión (Regla desactivada por defecto) | ## Pruebas Manuales con curl @@ -59,8 +59,8 @@ El script `test/api/test-transaction-api.sh` cubre: curl -X POST http://localhost:3000/transactions \ -H "Content-Type: application/json" \ -d '{ - "accountExternalIdDebit": "acc-001", - "accountExternalIdCredit": "acc-002", + "accountExternalIdDebit": "550e8400-e29b-41d4-a716-446655440000", + "accountExternalIdCredit": "550e8400-e29b-41d4-a716-446655440001", "tranferTypeId": 1, "value": 500 }' diff --git a/docs/FRAUD_RULES.md b/docs/FRAUD_RULES.md index 850529fbb8..69cc1188fd 100644 --- a/docs/FRAUD_RULES.md +++ b/docs/FRAUD_RULES.md @@ -4,23 +4,23 @@ Sistema configurable para validar transacciones dinámicamente sin código hardc ## 🎯 Características Principales -- **Sistema extensible** de reglas configurables -- **AMOUNT_THRESHOLD** (único requerido por el reto) -- **5 tipos adicionales** demostrativos de extensibilidad -- **Sistema de prioridades** para resolución de conflictos -- **Gestión vía base de datos** (sin APIs REST) -- **Auditoría completa** de todas las evaluaciones +- **Regla Obligatoria**: `AMOUNT_THRESHOLD` (Única requerida por el reto). +- **Extensibilidad**: Se incluyen otros tipos de reglas únicamente de forma **demostrativa**. +- **Configurabilidad**: Aunque el reto pedía un monto fijo (>1000), se implementó de forma configurable para permitir flexibilidad futura. +- **Sistema de prioridades**: Para resolución de conflictos entre múltiples reglas. +- **Gestión vía base de datos**: Sin necesidad de cambios en el código para ajustar umbrales. +- **Auditoría completa**: Registro de todas las evaluaciones realizadas. ## 🔧 Tipos de Reglas -| Tipo | Descripción | Estado | Ejemplo de Condición | -|------|-------------|--------|----------------------| -| `AMOUNT_THRESHOLD` | **Umbral de monto (REQUERIDO)** | ✅ Configurable | `{"operator": "gt", "value": 1000}` | -| `DAILY_LIMIT` | Límite diario | 🚧 Demo (pendiente) | `{"maxAmount": 5000, "maxTransactions": 10}` | -| `VELOCITY_CHECK` | Detección de velocidad | 🚧 Demo (pendiente) | `{"maxTransactions": 5, "timeWindowMinutes": 30}` | -| `ACCOUNT_BLACKLIST` | Lista negra | ✅ Implementado | `{"accounts": ["uuid1", "uuid2"]}` | -| `TRANSFER_TYPE_LIMIT` | Límite por tipo | ✅ Implementado | `{"transferTypeId": 2, "maxAmount": 500}` | -| `TIME_BASED` | Restricción horaria | ✅ Implementado | `{"allowedHours": {"start": 8, "end": 18}}` | +| Tipo | Descripción | Importancia | Ejemplo de Condición | +|------|-------------|------------|----------------------| +| `AMOUNT_THRESHOLD` | **Umbral de monto** | ⭐ **REQUERIDA** | `{"operator": "gt", "value": 1000}` | +| `DAILY_LIMIT` | Límite diario | 🧪 Demo | `{"maxAmount": 5000, "maxTransactions": 10}` | +| `VELOCITY_CHECK` | Detección de velocidad | 🧪 Demo | `{"maxTransactions": 5, "timeWindowMinutes": 30}` | +| `ACCOUNT_BLACKLIST` | Lista negra | 🧪 Demo | `{"accounts": ["uuid1", "uuid2"]}` | +| `TRANSFER_TYPE_LIMIT` | Límite por tipo | 🧪 Demo | `{"transferTypeId": 2, "maxAmount": 500}` | +| `TIME_BASED` | Restricción horaria | 🧪 Demo | `{"allowedHours": {"start": 8, "end": 18}}` | ## 🎬 Acciones