From 236b1c49e36809caeefbbc376f640b4ea1569e27 Mon Sep 17 00:00:00 2001 From: Rui Costa Date: Fri, 17 Oct 2025 12:17:11 -0400 Subject: [PATCH] feat: migrate from New Relic to Prometheus/Grafana metrics - Remove New Relic APM dependencies and configuration - Add prom-client for Prometheus metrics collection - Implement comprehensive metrics across all services: - HTTP requests (count, duration, status codes) - WebSocket connections and messages (by type and direction) - Database queries (count, duration by operation and table) - Cache operations (hits, misses, duration) - Code execution (duration, success rate by language) - Business and security events - Node.js system metrics (memory, CPU, event loop) - Update /metrics endpoint to use Basic Auth for Grafana - Add METRICS_API_KEY environment variable for authentication - Update documentation with Grafana setup instructions --- .env.example | 10 +- CHANGELOG.md | 6 +- README.md | 62 ++- newrelic.js | 45 -- package.json | 3 +- pnpm-lock.yaml | 1145 +-------------------------------------- src/lib/logger.ts | 115 +--- src/lib/prometheus.ts | 95 ++++ src/routes/code/crud.ts | 20 + src/routes/metrics.ts | 77 ++- src/server.ts | 10 - src/version.ts | 2 +- src/websocket/index.ts | 65 ++- 13 files changed, 344 insertions(+), 1311 deletions(-) delete mode 100644 newrelic.js create mode 100644 src/lib/prometheus.ts diff --git a/.env.example b/.env.example index 2b28f64..f512669 100644 --- a/.env.example +++ b/.env.example @@ -118,11 +118,11 @@ FREE_TIER_NOTE_LIMIT=100# Note count limit for free users (default: 100) # LOGGING & MONITORING # ================================================================ -# New Relic APM (OPTIONAL - for production monitoring) -# Get your license key from: https://one.newrelic.com -# NEW_RELIC_APP_NAME=Typelets API -# NEW_RELIC_LICENSE_KEY=your_license_key_here -# NEW_RELIC_LOG_LEVEL=warn # Options: error, warn, info, debug, trace (default: warn in dev, info in prod) +# Prometheus Metrics API Key (REQUIRED for production) +# Protects /metrics endpoint from unauthorized access with Basic Auth +# Generate with: openssl rand -hex 32 +# Configure in Grafana data source: Basic Auth with username "metrics" and password +METRICS_API_KEY=your-secure-metrics-api-key-here-min-32-chars # Debug Logging # DEBUG=false # Set to true for verbose logging (not recommended in production) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ad3aa9..31a194e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,14 @@ ## [1.8.1](https://github.com/typelets/typelets-api/compare/v1.8.0...v1.8.1) (2025-10-16) - ### Bug Fixes -* resolve Redis Cluster CROSSSLOT error in cache deletions ([862d796](https://github.com/typelets/typelets-api/commit/862d796a684a45f7ca76affe8480633d8dc6220a)) +- resolve Redis Cluster CROSSSLOT error in cache deletions ([862d796](https://github.com/typelets/typelets-api/commit/862d796a684a45f7ca76affe8480633d8dc6220a)) # [1.8.0](https://github.com/typelets/typelets-api/compare/v1.7.2...v1.8.0) (2025-10-16) - ### Features -* add comprehensive OpenAPI documentation and refactor routes ([5ca9cc6](https://github.com/typelets/typelets-api/commit/5ca9cc6397b8054c41a2be5575d7233757fc9a53)) +- add comprehensive OpenAPI documentation and refactor routes ([5ca9cc6](https://github.com/typelets/typelets-api/commit/5ca9cc6397b8054c41a2be5575d7233757fc9a53)) ## [1.7.2](https://github.com/typelets/typelets-api/compare/v1.7.1...v1.7.2) (2025-10-15) diff --git a/README.md b/README.md index dd07c92..48b28e6 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The backend API for the [Typelets Application](https://github.com/typelets/typel - ⚡ **Fast & Type-Safe** with TypeScript and Hono - 🐘 **PostgreSQL** with Drizzle ORM - 🚀 **Valkey/Redis Caching** for high-performance data access with cluster support -- 📊 **New Relic APM** integration for monitoring, metrics, and error tracking +- 📊 **Prometheus Metrics** with Grafana integration for monitoring and observability - 💻 **Code Execution** via secure Judge0 API proxy - 🛡️ **Comprehensive Rate Limiting** for HTTP, WebSocket, file uploads, and code execution - 🏥 **Health Checks** with detailed system status and readiness probes @@ -36,8 +36,8 @@ The backend API for the [Typelets Application](https://github.com/typelets/typel - **Cache**: Valkey/Redis Cluster for high-performance caching - **Authentication**: [Clerk](https://clerk.com/) - **Validation**: [Zod](https://zod.dev/) -- **Monitoring**: [New Relic APM](https://newrelic.com/) for metrics, logging, and error tracking -- **Logging**: Structured JSON logging with automatic New Relic integration +- **Monitoring**: [Prometheus](https://prometheus.io/) metrics with [Grafana](https://grafana.com/) for observability +- **Logging**: Structured JSON logging with Prometheus metrics integration - **TypeScript**: Strict mode enabled for type safety ## Prerequisites @@ -47,7 +47,7 @@ The backend API for the [Typelets Application](https://github.com/typelets/typel - PostgreSQL database (local installation or Docker) - Clerk account for authentication ([sign up here](https://dashboard.clerk.com)) - Valkey/Redis cluster for caching (optional - improves performance) -- New Relic account for monitoring (optional - [sign up here](https://newrelic.com/signup)) +- Grafana workspace for monitoring (optional - AWS Managed Grafana or self-hosted) - Judge0 API key for code execution (optional - [get from RapidAPI](https://rapidapi.com/judge0-official/api/judge0-ce)) ## Local Development Setup @@ -176,7 +176,7 @@ If you prefer to install PostgreSQL locally instead of Docker: - `GET /` - API information and health status - `GET /health` - Enhanced health check with system status -- `GET /metrics` - System metrics for monitoring dashboards +- `GET /metrics` - Prometheus metrics endpoint for Grafana (requires Basic Auth) - `GET /ready` - Readiness probe for container orchestration - `GET /live` - Liveness probe for container orchestration - `GET /websocket/status` - WebSocket server status and statistics @@ -286,9 +286,7 @@ The application uses the following main tables: | `VALKEY_HOST` | Valkey/Redis cluster hostname | No | - | | `VALKEY_PORT` | Valkey/Redis cluster port | No | 6379 | | **Monitoring (Optional)** | | | | -| `NEW_RELIC_APP_NAME` | Application name in New Relic | No | Typelets API | -| `NEW_RELIC_LICENSE_KEY` | New Relic license key | No | - | -| `NEW_RELIC_LOG_LEVEL` | New Relic log level (error/warn/info/debug) | No | warn (dev), info (prod) | +| `METRICS_API_KEY` | API key for Prometheus metrics endpoint | No | - | | **Rate Limiting** | | | | | `HTTP_RATE_LIMIT_WINDOW_MS` | HTTP rate limit window in milliseconds | No | 900000 (15 min) | | `HTTP_RATE_LIMIT_MAX_REQUESTS` | Max HTTP requests per window | No | 1000 | @@ -311,6 +309,49 @@ The application uses the following main tables: \*Required only for code execution features +## Monitoring with Prometheus & Grafana + +The API exposes Prometheus metrics at the `/metrics` endpoint for monitoring with Grafana or other Prometheus-compatible systems. + +### Available Metrics + +- **HTTP Metrics**: Request counts, duration histograms, status codes +- **WebSocket Metrics**: Active connections, message counts by type and direction +- **Database Metrics**: Query counts and duration by operation and table +- **Cache Metrics**: Operations, hit/miss rates, operation duration +- **Code Execution Metrics**: Execution duration and success rates by language +- **Business Events**: Custom event tracking +- **Security Events**: Security-related event tracking +- **System Metrics**: Memory, CPU, event loop, and other Node.js metrics + +### Grafana Configuration + +To connect Grafana to the metrics endpoint: + +1. **Generate a secure API key**: `openssl rand -hex 32` +2. **Set `METRICS_API_KEY` in your environment** (ECS task definition or `.env`) +3. **Add Prometheus data source in Grafana**: + - **Type**: Prometheus + - **URL**: `https://api.typelets.com/metrics` (or your API URL) + - **Auth**: Basic auth + - **User**: `metrics` (or any username) + - **Password**: Your `METRICS_API_KEY` value + +### Local Testing + +Test the metrics endpoint locally: + +```bash +# Set your API key in .env +METRICS_API_KEY=your-secure-key-here + +# Start the server +pnpm run dev + +# Test with curl (Basic Auth) +curl -u metrics:your-secure-key-here http://localhost:3000/metrics +``` + ## Development ### Project Structure @@ -323,7 +364,8 @@ src/ ├── lib/ │ ├── cache.ts # Valkey/Redis cluster caching layer │ ├── cache-keys.ts # Centralized cache key patterns and TTL values -│ ├── logger.ts # Structured logging with New Relic integration +│ ├── logger.ts # Structured logging with Prometheus metrics integration +│ ├── prometheus.ts # Prometheus metrics definitions and registry │ └── validation.ts # Zod validation schemas ├── middleware/ │ ├── auth.ts # Authentication middleware @@ -351,7 +393,7 @@ src/ │ │ └── rate-limiter.ts # WebSocket rate limiting │ ├── types.ts # WebSocket message types │ └── index.ts # Main WebSocket server manager -└── server.ts # Application entry point with New Relic initialization +└── server.ts # Application entry point ``` ### Type Safety diff --git a/newrelic.js b/newrelic.js deleted file mode 100644 index 5944731..0000000 --- a/newrelic.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; - -/** - * New Relic agent configuration. - */ -exports.config = { - app_name: [process.env.NEW_RELIC_APP_NAME || "Typelets API"], - license_key: process.env.NEW_RELIC_LICENSE_KEY || "", - logging: { - level: - process.env.NEW_RELIC_LOG_LEVEL || (process.env.NODE_ENV === "production" ? "info" : "warn"), - filepath: "stdout", - }, - application_logging: { - enabled: true, - forwarding: { - enabled: true, - max_samples_stored: 10000, - }, - metrics: { - enabled: true, - }, - local_decorating: { - enabled: true, - }, - }, - distributed_tracing: { - enabled: true, - }, - allow_all_headers: true, - attributes: { - exclude: [ - "request.headers.cookie", - "request.headers.authorization", - "request.headers.proxyAuthorization", - "request.headers.setCookie*", - "request.headers.x*", - "response.headers.cookie", - "response.headers.authorization", - "response.headers.proxyAuthorization", - "response.headers.setCookie*", - "response.headers.x*", - ], - }, -}; diff --git a/package.json b/package.json index ed5f159..292077c 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,8 @@ "drizzle-orm": "^0.44.2", "hono": "^4.8.3", "ioredis": "^5.8.1", - "newrelic": "latest", "postgres": "^3.4.7", + "prom-client": "^15.1.3", "ws": "^8.18.3", "zod": "^4.1.12" }, @@ -61,7 +61,6 @@ "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^11.0.5", "@semantic-release/release-notes-generator": "^14.1.0", - "@types/newrelic": "^9.14.8", "@types/node": "^24.0.10", "@types/pg": "^8.15.4", "@typescript-eslint/eslint-plugin": "^8.38.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1306e74..41b234c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,12 +41,12 @@ importers: ioredis: specifier: ^5.8.1 version: 5.8.1 - newrelic: - specifier: latest - version: 13.4.0 postgres: specifier: ^3.4.7 version: 3.4.7 + prom-client: + specifier: ^15.1.3 + version: 15.1.3 ws: specifier: ^8.18.3 version: 8.18.3 @@ -75,9 +75,6 @@ importers: '@semantic-release/release-notes-generator': specifier: ^14.1.0 version: 14.1.0(semantic-release@24.2.7(typescript@5.9.2)) - '@types/newrelic': - specifier: ^9.14.8 - version: 9.14.8 '@types/node': specifier: ^24.0.10 version: 24.3.1 @@ -129,12 +126,6 @@ importers: packages: - '@apm-js-collab/code-transformer@0.8.2': - resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} - - '@apm-js-collab/tracing-hooks@0.3.1': - resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} - '@asteasolutions/zod-to-openapi@8.1.0': resolution: {integrity: sha512-tQFxVs05J/6QXXqIzj6rTRk3nj1HFs4pe+uThwE95jL5II2JfpVXkK+CqkO7aT0Do5AYqO6LDrKpleLUFXgY+g==} peerDependencies: @@ -329,10 +320,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -663,20 +650,6 @@ packages: resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@grpc/grpc-js@1.14.0': - resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true - '@hono/node-server@1.19.1': resolution: {integrity: sha512-h44e5s+ByUriaRIbeS/C74O8v90m0A95luyYQGMF7KEn96KkYMXO7bZAwombzTpjQTU4e0TkU8U1WBIXlwuwtA==} engines: {node: '>=18.14.1'} @@ -833,24 +806,9 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@newrelic/fn-inspect@4.4.0': - resolution: {integrity: sha512-VgoXZp3zqP1167XvrA772EHDFUNuYGQh14whFq1d2sE6dC3ZL46tXI9JY0yZdAAeyCERi7mhq7CPx9BYiTOl/A==} - engines: {node: '>=16.9.1'} - - '@newrelic/native-metrics@12.0.0': - resolution: {integrity: sha512-l0MTkuazDMaEDWJk4ufHVgco4ssWhk/uSUYTn33dFOHAqpHLyxZHxxzKJb4vyZkhRy11UaKNhmNiAiXH557SJQ==} - engines: {node: '>=20', npm: '>=6'} - - '@newrelic/security-agent@2.4.4': - resolution: {integrity: sha512-KQs76SGqTOG/pTuqRGwzy1lNAm96z8gbb5XHl9FsbOY7Kt9Ltbr46AiiovDHhNQbXFTPnHEY7FfmNJ4GK4W5dQ==} - engines: {node: '>=18', npm: '>=6.0.0'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -911,106 +869,10 @@ packages: '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} - '@opentelemetry/api-logs@0.201.1': - resolution: {integrity: sha512-IxcFDP1IGMDemVFG2by/AMK+/o6EuBQ8idUq3xZ6MxgQGeumYZuX5OwR0h9HuvcUc/JPjQGfU5OHKIKYDJcXeA==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.203.0': - resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} - engines: {node: '>=8.0.0'} - '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.0.1': - resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.1.0': - resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/exporter-metrics-otlp-http@0.201.1': - resolution: {integrity: sha512-LMRVg2yTev28L51RLLUK3gY0avMa1RVBq7IkYNtXDBxJRcd0TGGq/0rqfk7Y4UIM9NCJhDIUFHeGg8NpSgSWcw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-metrics-otlp-proto@0.201.1': - resolution: {integrity: sha512-9ie2jcaUQZdIoe6B02r0rF4Gz+JsZ9mev/2pYou1N0woOUkFM8xwO6BAlORnrFVslqF/XO5WG3q5FsTbuC5iiw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-exporter-base@0.201.1': - resolution: {integrity: sha512-FiS/mIWmZXyRxYGyXPHY+I/4+XrYVTD7Fz/zwOHkVPQsA1JTakAOP9fAi6trXMio0dIpzvQujLNiBqGM7ExrQw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.201.1': - resolution: {integrity: sha512-+q/8Yuhtu9QxCcjEAXEO8fXLjlSnrnVwfzi9jiWaMAppQp69MoagHHomQj02V2WnGjvBod5ajgkbK4IoWab50A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/resources@2.0.1': - resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/resources@2.1.0': - resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-logs@0.201.1': - resolution: {integrity: sha512-Ug8gtpssUNUnfpotB9ZhnSsPSGDu+7LngTMgKl31mmVJwLAKyl6jC8diZrMcGkSgBh0o5dbg9puvLyR25buZfw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-logs@0.203.0': - resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.0.1': - resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.1.0': - resolution: {integrity: sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.0.1': - resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.1.0': - resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.37.0': - resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} - engines: {node: '>=14'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1031,39 +893,6 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@prisma/prisma-fmt-wasm@4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085': - resolution: {integrity: sha512-zYz3rFwPB82mVlHGknAPdnSY/a308dhPOblxQLcZgZTDRtDXOE1MgxoRAys+jekwR4/bm3+rZDPs1xsFMsPZig==} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -1165,12 +994,6 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/luxon@3.4.2': - resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} - - '@types/newrelic@9.14.8': - resolution: {integrity: sha512-rkOTEVR7Lui4TTEykDUxIxCbFkcI/yw3C8URLOWM84zjuHh9W35RAequHTEvGBbbrLCdn43FVTHMLji4uunDWQ==} - '@types/node@24.3.1': resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} @@ -1183,9 +1006,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -1254,9 +1074,6 @@ packages: resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@tyriar/fibonacci-heap@2.0.9': - resolution: {integrity: sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -1355,11 +1172,6 @@ packages: cpu: [x64] os: [win32] - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1436,12 +1248,6 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - babel-jest@30.1.2: resolution: {integrity: sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1470,17 +1276,11 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -1506,13 +1306,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1544,20 +1337,10 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - check-disk-space@3.4.0: - resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} - engines: {node: '>=16'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@4.3.0: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - cjs-module-lexer@2.1.0: resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} @@ -1609,27 +1392,15 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - conventional-changelog-angular@8.0.0: resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} engines: {node: '>=18'} @@ -1671,9 +1442,6 @@ packages: typescript: optional: true - cron@3.5.0: - resolution: {integrity: sha512-0eYZqCnapmxYcV06uktql93wNWdlTmmBFP2iYz+JPVcQqlyFYcn1lFuIk4R54pkOmE7mcldTAPZv6X5XA4Q46A==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1685,10 +1453,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1717,10 +1481,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1853,10 +1613,6 @@ packages: sqlite3: optional: true - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} @@ -1879,9 +1635,6 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - env-ci@11.2.0: resolution: {integrity: sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==} engines: {node: ^18.17 || >=20.6.1} @@ -1897,22 +1650,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -2031,10 +1768,6 @@ packages: resolution: {integrity: sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -2054,9 +1787,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} @@ -2066,9 +1796,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -2085,9 +1812,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-package-json@1.2.0: - resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -2115,37 +1839,17 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.3.1: resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2154,9 +1858,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function-timeout@1.0.2: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} @@ -2169,18 +1870,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2234,10 +1927,6 @@ packages: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -2260,21 +1949,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -2294,9 +1968,6 @@ packages: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2325,9 +1996,6 @@ packages: engines: {node: '>=18'} hasBin: true - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2344,9 +2012,6 @@ packages: resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} engines: {node: '>=18.20'} - import-in-the-middle@1.14.4: - resolution: {integrity: sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==} - import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -2392,14 +2057,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2416,10 +2073,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-invalid-path@1.0.2: - resolution: {integrity: sha512-6KLcFrPCEP3AFXMfnWrIFkZpYNBVzZAoBJJDEZKtI3LXkaDjM3uFMJQjxiizUuZTZ9Oh9FNv/soXbx5TcpaDmA==} - engines: {node: '>=6.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2637,9 +2290,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2655,23 +2305,14 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonschema@1.5.0: - resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2705,9 +2346,6 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} @@ -2735,27 +2373,12 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} - - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} - engines: {node: '>=12'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2774,10 +2397,6 @@ packages: engines: {node: '>= 18'} hasBin: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -2793,14 +2412,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mime@4.0.7: resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} engines: {node: '>=16'} @@ -2814,9 +2425,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2831,21 +2439,12 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.23.0: - resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} - napi-postinstall@0.3.3: resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -2860,23 +2459,10 @@ packages: nerf-dart@1.0.0: resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} - newrelic@13.4.0: - resolution: {integrity: sha512-XEGimVRw2wT8szwDnZ1GUFPh2+VVtN276W9I0rZUmXHYykMQ5D7XuqhtSouCznGuDGs37tMBQfmxUTtVhu+N3Q==} - engines: {node: '>=20', npm: '>=6.0.0'} - hasBin: true - - node-abi@3.78.0: - resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} - engines: {node: '>=10'} - node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2895,10 +2481,6 @@ packages: resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} engines: {node: '>=14.16'} - npm-run-path@3.1.0: - resolution: {integrity: sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==} - engines: {node: '>=8'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3115,9 +2697,6 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -3188,10 +2767,6 @@ packages: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} - prebuildify@6.0.1: - resolution: {integrity: sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3205,10 +2780,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - pretty-format@30.0.5: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3220,19 +2791,13 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3265,10 +2830,6 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -3281,17 +2842,10 @@ packages: resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} engines: {node: '>=14'} - request-ip@3.3.0: - resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3307,36 +2861,21 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - ringbufferjs@2.0.0: - resolution: {integrity: sha512-GCOqTzUsTHF7nrqcgtNGAFotXztLgiePpIDpyWZ7R5I02tmfJWV+/yuJc//Hlsd8G+WzI1t/dc2y/w2imDZdog==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - semantic-release@24.2.7: resolution: {integrity: sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g==} engines: {node: '>=20.8.1'} @@ -3437,10 +2976,6 @@ packages: stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} - streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -3453,9 +2988,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -3515,10 +3047,6 @@ packages: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - swr@2.3.4: resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} peerDependencies: @@ -3528,12 +3056,8 @@ packages: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} @@ -3575,10 +3099,6 @@ packages: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -3621,9 +3141,6 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} @@ -3637,13 +3154,6 @@ packages: undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - unescape-js@1.1.4: - resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} - - unescape@1.0.1: - resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} - engines: {node: '>=0.10.0'} - unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -3663,10 +3173,6 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3695,10 +3201,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -3714,10 +3216,6 @@ packages: engines: {node: '>= 8'} hasBin: true - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3797,16 +3295,6 @@ packages: snapshots: - '@apm-js-collab/code-transformer@0.8.2': {} - - '@apm-js-collab/tracing-hooks@0.3.1': - dependencies: - '@apm-js-collab/code-transformer': 0.8.2 - debug: 4.4.1 - module-details-from-path: 1.0.4 - transitivePeerDependencies: - - supports-color - '@asteasolutions/zod-to-openapi@8.1.0(zod@4.1.12)': dependencies: openapi3-ts: 4.5.0 @@ -4030,8 +3518,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@colors/colors@1.6.0': {} - '@drizzle-team/brocli@0.10.2': {} '@emnapi/core@1.5.0': @@ -4229,25 +3715,6 @@ snapshots: '@eslint/js@9.37.0': {} - '@grpc/grpc-js@1.14.0': - dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - - '@grpc/proto-loader@0.8.0': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - '@hono/node-server@1.19.1(hono@4.9.6)': dependencies: hono: 4.9.6 @@ -4505,8 +3972,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@js-sdsl/ordered-map@4.4.2': {} - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 @@ -4514,50 +3979,6 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true - '@newrelic/fn-inspect@4.4.0': - dependencies: - nan: 2.23.0 - node-gyp-build: 4.8.4 - prebuildify: 6.0.1 - optional: true - - '@newrelic/native-metrics@12.0.0': - dependencies: - nan: 2.23.0 - node-gyp-build: 4.8.4 - prebuildify: 6.0.1 - optional: true - - '@newrelic/security-agent@2.4.4': - dependencies: - axios: 1.12.2 - check-disk-space: 3.4.0 - content-type: 1.0.5 - cron: 3.5.0 - fast-safe-stringify: 2.1.1 - find-package-json: 1.2.0 - hash.js: 1.1.7 - html-entities: 2.6.0 - https-proxy-agent: 7.0.6 - is-invalid-path: 1.0.2 - js-yaml: 4.1.0 - jsonschema: 1.5.0 - lodash: 4.17.21 - log4js: 6.9.1 - pretty-bytes: 5.6.0 - request-ip: 3.3.0 - ringbufferjs: 2.0.0 - semver: 7.7.2 - unescape: 1.0.1 - unescape-js: 1.1.4 - uuid: 9.0.1 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4629,116 +4050,8 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 - '@opentelemetry/api-logs@0.201.1': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.203.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api@1.9.0': {} - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/exporter-metrics-otlp-http@0.201.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-proto@0.201.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-exporter-base@0.201.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.201.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-transformer@0.201.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.201.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 - - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-logs@0.201.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.201.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/semantic-conventions@1.37.0': {} - '@pkgjs/parseargs@0.11.0': optional: true @@ -4756,32 +4069,6 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@prisma/prisma-fmt-wasm@4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085': - optional: true - - '@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': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 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': {} - '@sec-ant/readable-stream@0.4.1': {} '@semantic-release/changelog@6.0.3(semantic-release@24.2.7(typescript@5.9.2))': @@ -4945,10 +4232,6 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/luxon@3.4.2': {} - - '@types/newrelic@9.14.8': {} - '@types/node@24.3.1': dependencies: undici-types: 7.10.0 @@ -4963,8 +4246,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/triple-beam@1.3.5': {} - '@types/ws@8.18.1': dependencies: '@types/node': 24.3.1 @@ -5068,8 +4349,6 @@ snapshots: '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 - '@tyriar/fibonacci-heap@2.0.9': {} - '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -5131,10 +4410,6 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - acorn-import-attributes@1.9.5(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -5201,16 +4476,6 @@ snapshots: array-ify@1.0.0: {} - asynckit@0.4.0: {} - - axios@1.12.2: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - babel-jest@30.1.2(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 @@ -5267,19 +4532,9 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: - optional: true - before-after-hook@4.0.0: {} - bignumber.js@9.3.1: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true + bintrees@1.0.2: {} bottleneck@2.19.5: {} @@ -5309,17 +4564,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - callsites@3.1.0: {} camelcase@5.3.1: {} @@ -5343,15 +4587,8 @@ snapshots: char-regex@1.0.2: {} - check-disk-space@3.4.0: {} - - chownr@1.1.4: - optional: true - ci-info@4.3.0: {} - cjs-module-lexer@1.4.3: {} - cjs-module-lexer@2.1.0: {} clean-stack@2.2.0: {} @@ -5405,10 +4642,6 @@ snapshots: color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -5416,20 +4649,11 @@ snapshots: concat-map@0.0.1: {} - concat-stream@2.0.0: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - content-type@1.0.5: {} - conventional-changelog-angular@8.0.0: dependencies: compare-func: 2.0.0 @@ -5464,11 +4688,6 @@ snapshots: optionalDependencies: typescript: 5.9.2 - cron@3.5.0: - dependencies: - '@types/luxon': 3.4.2 - luxon: 3.5.0 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5481,8 +4700,6 @@ snapshots: csstype@3.1.3: {} - date-format@4.0.14: {} - debug@4.4.1: dependencies: ms: 2.1.3 @@ -5495,8 +4712,6 @@ snapshots: deepmerge@4.3.1: {} - delayed-stream@1.0.0: {} - denque@2.1.0: {} dequal@2.0.3: {} @@ -5538,12 +4753,6 @@ snapshots: '@types/pg': 8.15.5 postgres: 3.4.7 - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - duplexer2@0.1.4: dependencies: readable-stream: 2.3.8 @@ -5560,11 +4769,6 @@ snapshots: emojilib@2.4.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - optional: true - env-ci@11.2.0: dependencies: execa: 8.0.1 @@ -5578,21 +4782,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - esbuild-register@3.6.0(esbuild@0.25.9): dependencies: debug: 4.4.1 @@ -5799,10 +4988,6 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -5821,8 +5006,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} - fast-sha256@1.3.0: {} fastq@1.19.1: @@ -5833,8 +5016,6 @@ snapshots: dependencies: bser: 2.1.1 - fecha@4.2.3: {} - figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -5851,8 +5032,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-package-json@1.2.0: {} - find-up-simple@1.0.1: {} find-up@2.1.0: @@ -5882,74 +5061,35 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11: {} - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - from2@2.3.0: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - fs-constants@1.0.0: - optional: true - fs-extra@11.3.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs.realpath@1.0.0: {} fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - function-timeout@1.0.2: {} gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - get-package-type@0.1.0: {} - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - get-stream@6.0.1: {} get-stream@7.0.1: {} @@ -6017,8 +5157,6 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 - gopd@1.2.0: {} - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -6038,21 +5176,6 @@ snapshots: has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - highlight.js@10.7.3: {} hono@4.9.6: {} @@ -6067,8 +5190,6 @@ snapshots: dependencies: lru-cache: 10.4.3 - html-entities@2.6.0: {} - html-escaper@2.0.2: {} http-proxy-agent@7.0.2: @@ -6093,9 +5214,6 @@ snapshots: husky@9.1.7: {} - ieee754@1.2.1: - optional: true - ignore@5.3.2: {} ignore@7.0.5: {} @@ -6112,13 +5230,6 @@ snapshots: transitivePeerDependencies: - supports-color - import-in-the-middle@1.14.4: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.4 - import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -6164,12 +5275,6 @@ snapshots: is-arrayish@0.2.1: {} - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6180,8 +5285,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-invalid-path@1.0.2: {} - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -6576,10 +5679,6 @@ snapshots: jsesc@3.1.0: {} - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -6590,22 +5689,14 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - jsonschema@1.5.0: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -6641,8 +5732,6 @@ snapshots: lodash-es@4.17.21: {} - lodash.camelcase@4.3.0: {} - lodash.capitalize@4.2.1: {} lodash.defaults@4.2.0: {} @@ -6661,35 +5750,12 @@ snapshots: lodash@4.17.21: {} - log4js@6.9.1: - dependencies: - date-format: 4.0.14 - debug: 4.4.1 - flatted: 3.3.3 - rfdc: 1.4.1 - streamroller: 3.1.5 - transitivePeerDependencies: - - supports-color - - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - - long@5.3.2: {} - lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - luxon@3.5.0: {} - make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -6711,8 +5777,6 @@ snapshots: marked@15.0.12: {} - math-intrinsics@1.1.0: {} - meow@13.2.0: {} merge-stream@2.0.0: {} @@ -6724,20 +5788,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mime@4.0.7: {} mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} - minimalistic-assert@1.0.1: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -6750,11 +5806,6 @@ snapshots: minipass@7.1.2: {} - mkdirp-classic@0.5.3: - optional: true - - module-details-from-path@1.0.4: {} - ms@2.1.3: {} mz@2.7.0: @@ -6763,9 +5814,6 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.23.0: - optional: true - napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -6774,46 +5822,6 @@ snapshots: nerf-dart@1.0.0: {} - newrelic@13.4.0: - dependencies: - '@apm-js-collab/tracing-hooks': 0.3.1 - '@grpc/grpc-js': 1.14.0 - '@grpc/proto-loader': 0.7.15 - '@newrelic/security-agent': 2.4.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.201.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@tyriar/fibonacci-heap': 2.0.9 - concat-stream: 2.0.0 - https-proxy-agent: 7.0.6 - import-in-the-middle: 1.14.4 - json-bigint: 1.0.0 - json-stringify-safe: 5.0.1 - module-details-from-path: 1.0.4 - readable-stream: 3.6.2 - require-in-the-middle: 7.5.2 - semver: 7.7.2 - winston-transport: 4.9.0 - optionalDependencies: - '@newrelic/fn-inspect': 4.4.0 - '@newrelic/native-metrics': 12.0.0 - '@prisma/prisma-fmt-wasm': 4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - node-abi@3.78.0: - dependencies: - semver: 7.7.2 - optional: true - node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -6821,9 +5829,6 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-gyp-build@4.8.4: - optional: true - node-int64@0.4.0: {} node-releases@2.0.20: {} @@ -6838,11 +5843,6 @@ snapshots: normalize-url@8.0.2: {} - npm-run-path@3.1.0: - dependencies: - path-key: 3.1.1 - optional: true - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -6971,8 +5971,6 @@ snapshots: path-key@4.0.0: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -7025,16 +6023,6 @@ snapshots: postgres@3.4.7: {} - prebuildify@6.0.1: - dependencies: - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - node-abi: 3.78.0 - npm-run-path: 3.1.0 - pump: 3.0.3 - tar-fs: 2.1.4 - optional: true - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -7043,8 +6031,6 @@ snapshots: prettier@3.6.2: {} - pretty-bytes@5.6.0: {} - pretty-format@30.0.5: dependencies: '@jest/schemas': 30.0.5 @@ -7057,30 +6043,12 @@ snapshots: process-nextick-args@2.0.1: {} - proto-list@1.2.4: {} - - protobufjs@7.5.4: - 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': 24.3.1 - long: 5.3.2 - - proxy-from-env@1.1.0: {} - - pump@3.0.3: + prom-client@15.1.3: dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - optional: true + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + + proto-list@1.2.4: {} punycode@2.3.1: {} @@ -7123,12 +6091,6 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -7139,18 +6101,8 @@ snapshots: dependencies: '@pnpm/npm-conf': 2.3.1 - request-ip@3.3.0: {} - require-directory@2.1.1: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.4.1 - module-details-from-path: 1.0.4 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -7161,30 +6113,18 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - rfdc@1.4.1: {} - rimraf@3.0.2: dependencies: glob: 7.2.3 - ringbufferjs@2.0.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 safe-buffer@5.1.2: {} - safe-stable-stringify@2.5.0: {} - semantic-release@24.2.7(typescript@5.9.2): dependencies: '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.7(typescript@5.9.2)) @@ -7306,14 +6246,6 @@ snapshots: duplexer2: 0.1.4 readable-stream: 2.3.8 - streamroller@3.1.5: - dependencies: - date-format: 4.0.14 - debug: 4.4.1 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -7331,8 +6263,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 - string.fromcodepoint@0.2.1: {} - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -7381,8 +6311,6 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} - swr@2.3.4(react@19.1.1): dependencies: dequal: 2.0.3 @@ -7393,22 +6321,9 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - tar-fs@2.1.4: + tdigest@0.1.2: dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - optional: true - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true + bintrees: 1.0.2 temp-dir@3.0.0: {} @@ -7452,8 +6367,6 @@ snapshots: traverse@0.6.8: {} - triple-beam@1.4.1: {} - ts-api-utils@2.1.0(typescript@5.9.2): dependencies: typescript: 5.9.2 @@ -7483,8 +6396,6 @@ snapshots: type-fest@4.41.0: {} - typedarray@0.0.6: {} - typescript@5.9.2: {} uglify-js@3.19.3: @@ -7492,14 +6403,6 @@ snapshots: undici-types@7.10.0: {} - unescape-js@1.1.4: - dependencies: - string.fromcodepoint: 0.2.1 - - unescape@1.0.1: - dependencies: - extend-shallow: 2.0.1 - unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -7512,8 +6415,6 @@ snapshots: universal-user-agent@7.0.3: {} - universalify@0.1.2: {} - universalify@2.0.1: {} unrs-resolver@1.11.1: @@ -7558,8 +6459,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@9.0.1: {} - v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.30 @@ -7579,12 +6478,6 @@ snapshots: dependencies: isexe: 2.0.0 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - word-wrap@1.2.5: {} wordwrap@1.0.0: {} diff --git a/src/lib/logger.ts b/src/lib/logger.ts index 5817649..c35d379 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -1,4 +1,4 @@ -import * as newrelic from "newrelic"; +import * as prometheus from "./prometheus"; interface LogLevel { level: string; @@ -19,14 +19,11 @@ class Logger { private service: string; private version: string; private currentLogLevel: LogLevel; - private newrelicEnabled: boolean; constructor() { this.environment = process.env.NODE_ENV || "development"; this.service = "typelets-api"; this.version = process.env.npm_package_version || "1.0.0"; - // Check if New Relic is properly initialized - this.newrelicEnabled = typeof newrelic === "object" && !!newrelic; // Set log level based on environment const logLevelName = @@ -55,29 +52,12 @@ class Logger { error(message: string, meta: LogMetadata = {}, error?: Error): void { if (this.shouldLog(LOG_LEVELS.error)) { console.error(this.formatLog("error", message, meta)); - - // Send error to New Relic - if (this.newrelicEnabled) { - if (error) { - newrelic.noticeError(error, meta); - } else { - newrelic.noticeError(new Error(message), meta); - } - } } } warn(message: string, meta: LogMetadata = {}): void { if (this.shouldLog(LOG_LEVELS.warn)) { console.warn(this.formatLog("warn", message, meta)); - - // Log warning as custom event in New Relic - if (this.newrelicEnabled) { - newrelic.recordCustomEvent("ApplicationWarning", { - message, - ...meta, - }); - } } } @@ -110,18 +90,12 @@ class Logger { userId: userId || "anonymous", }); - // Record metrics to New Relic - if (this.newrelicEnabled) { - // Record response time - this.recordMetric("Custom/HTTP/ResponseTime", duration); - - // Record status code metrics - const statusCategory = Math.floor(statusCode / 100); - this.recordMetric(`Custom/HTTP/Status/${statusCategory}xx`, 1); - - // Record request count by method - this.recordMetric(`Custom/HTTP/Method/${method}`, 1); - } + // Record Prometheus metrics + prometheus.httpRequestsTotal.inc({ method, path, status: statusCode.toString() }); + prometheus.httpRequestDuration.observe( + { method, path, status: statusCode.toString() }, + duration + ); } websocketEvent(eventType: string, userId?: string, connectionCount?: number): void { @@ -146,6 +120,10 @@ class Logger { duration, userId: userId || "anonymous", }); + + // Record Prometheus metrics + prometheus.databaseQueriesTotal.inc({ operation, table }); + prometheus.databaseQueryDuration.observe({ operation, table }, duration); } codeExecution(languageId: number, duration: number, success: boolean, userId?: string): void { @@ -166,15 +144,8 @@ class Logger { ...metadata, }); - // Record business event to New Relic - if (this.newrelicEnabled) { - this.recordCustomEvent("BusinessEvent", { - eventName, - userId, - ...metadata, - }); - this.recordMetric(`Custom/Business/${eventName}`, 1); - } + // Record Prometheus metrics + prometheus.businessEventsTotal.inc({ event_name: eventName }); } securityEvent( @@ -189,28 +160,8 @@ class Logger { ...details, }); - // Record security event to New Relic - if (this.newrelicEnabled) { - this.recordCustomEvent("SecurityEvent", { - eventType, - severity, - ...details, - }); - this.recordMetric(`Custom/Security/${severity}`, 1); - } - } - - // New Relic specific methods - recordMetric(name: string, value: number): void { - if (this.newrelicEnabled) { - newrelic.recordMetric(name, value); - } - } - - recordCustomEvent(eventType: string, attributes: LogMetadata): void { - if (this.newrelicEnabled) { - newrelic.recordCustomEvent(eventType, attributes); - } + // Record Prometheus metrics + prometheus.securityEventsTotal.inc({ event_type: eventType, severity }); } // Cache-specific logging methods @@ -236,25 +187,18 @@ class Logger { // Log at debug level this.debug(`Cache ${operation}${hit !== undefined ? (hit ? " HIT" : " MISS") : ""}`, meta); - // Send metrics to New Relic - if (this.newrelicEnabled) { - if (operation === "get" && hit !== undefined) { - this.recordMetric(`Custom/Cache/${hit ? "Hit" : "Miss"}`, 1); - if (duration !== undefined) { - this.recordMetric("Custom/Cache/GetDuration", duration); - } - } else if (operation === "set" && duration !== undefined) { - this.recordMetric("Custom/Cache/Set", 1); - this.recordMetric("Custom/Cache/SetDuration", duration); - } else if (operation === "delete") { - this.recordMetric("Custom/Cache/Delete", keyCount || 1); - if (duration !== undefined) { - this.recordMetric("Custom/Cache/DeleteDuration", duration); - } - } - - // Record custom event for detailed analysis - this.recordCustomEvent("CacheOperation", meta); + // Record Prometheus metrics + prometheus.cacheOperationsTotal.inc({ + operation, + status: hit !== undefined ? (hit ? "hit" : "miss") : "success", + }); + + if (hit !== undefined) { + prometheus.cacheHitRate.inc({ result: hit ? "hit" : "miss" }); + } + + if (duration !== undefined) { + prometheus.cacheOperationDuration.observe({ operation }, duration); } } @@ -270,9 +214,8 @@ class Logger { error ); - if (this.newrelicEnabled) { - this.recordMetric("Custom/Cache/Error", 1); - } + // Record Prometheus metrics + prometheus.cacheOperationsTotal.inc({ operation, status: "error" }); } } diff --git a/src/lib/prometheus.ts b/src/lib/prometheus.ts new file mode 100644 index 0000000..dafaba7 --- /dev/null +++ b/src/lib/prometheus.ts @@ -0,0 +1,95 @@ +import { register, collectDefaultMetrics, Counter, Histogram, Gauge } from "prom-client"; + +// Collect default Node.js metrics (memory, CPU, event loop, etc.) +collectDefaultMetrics({ prefix: "typelets_" }); + +// HTTP Request Metrics +export const httpRequestsTotal = new Counter({ + name: "typelets_http_requests_total", + help: "Total number of HTTP requests", + labelNames: ["method", "path", "status"], +}); + +export const httpRequestDuration = new Histogram({ + name: "typelets_http_request_duration_ms", + help: "HTTP request duration in milliseconds", + labelNames: ["method", "path", "status"], + buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000], +}); + +// Cache Metrics +export const cacheOperationsTotal = new Counter({ + name: "typelets_cache_operations_total", + help: "Total number of cache operations", + labelNames: ["operation", "status"], +}); + +export const cacheOperationDuration = new Histogram({ + name: "typelets_cache_operation_duration_ms", + help: "Cache operation duration in milliseconds", + labelNames: ["operation"], + buckets: [1, 5, 10, 25, 50, 100, 250, 500], +}); + +export const cacheHitRate = new Counter({ + name: "typelets_cache_hits_total", + help: "Total number of cache hits and misses", + labelNames: ["result"], // "hit" or "miss" +}); + +// WebSocket Metrics +export const websocketConnectionsTotal = new Gauge({ + name: "typelets_websocket_connections_total", + help: "Current number of WebSocket connections", +}); + +export const websocketMessagesTotal = new Counter({ + name: "typelets_websocket_messages_total", + help: "Total number of WebSocket messages", + labelNames: ["type", "direction"], // direction: "inbound" or "outbound" +}); + +// Database Metrics +export const databaseQueriesTotal = new Counter({ + name: "typelets_database_queries_total", + help: "Total number of database queries", + labelNames: ["operation", "table"], +}); + +export const databaseQueryDuration = new Histogram({ + name: "typelets_database_query_duration_ms", + help: "Database query duration in milliseconds", + labelNames: ["operation", "table"], + buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000], +}); + +// Code Execution Metrics +export const codeExecutionsTotal = new Counter({ + name: "typelets_code_executions_total", + help: "Total number of code executions", + labelNames: ["language_id", "success"], +}); + +export const codeExecutionDuration = new Histogram({ + name: "typelets_code_execution_duration_ms", + help: "Code execution duration in milliseconds", + labelNames: ["language_id"], + buckets: [100, 250, 500, 1000, 2500, 5000, 10000, 30000], +}); + +// Business Metrics +export const businessEventsTotal = new Counter({ + name: "typelets_business_events_total", + help: "Total number of business events", + labelNames: ["event_name"], +}); + +// Security Metrics +export const securityEventsTotal = new Counter({ + name: "typelets_security_events_total", + help: "Total number of security events", + labelNames: ["event_type", "severity"], +}); + +// Export the Prometheus registry +export { register }; diff --git a/src/routes/code/crud.ts b/src/routes/code/crud.ts index 746c0f2..dd76609 100644 --- a/src/routes/code/crud.ts +++ b/src/routes/code/crud.ts @@ -10,6 +10,7 @@ import { codeHealthResponseSchema, tokenParamSchema, } from "../../lib/openapi-schemas"; +import * as prometheus from "../../lib/prometheus"; const crudRouter = new OpenAPIHono(); @@ -156,6 +157,7 @@ const executeCodeRoute = createRoute({ }); crudRouter.openapi(executeCodeRoute, async (c) => { + const startTime = Date.now(); try { const body = c.req.valid("json"); @@ -171,6 +173,14 @@ crudRouter.openapi(executeCodeRoute, async (c) => { }); const result = await response.json(); + + // Track code execution submission + const duration = Date.now() - startTime; + prometheus.codeExecutionDuration.observe( + { language_id: body.language_id.toString() }, + duration + ); + return c.json(result); } catch (error) { if (error instanceof HTTPException) { @@ -247,6 +257,16 @@ crudRouter.openapi(getStatusRoute, async (c) => { result.message = Buffer.from(result.message, "base64").toString("utf-8"); } + // Track completed executions + // Status IDs: 1=In Queue, 2=Processing, 3=Accepted, 4+=Various errors + if (result.status?.id && result.status.id >= 3) { + const success = result.status.id === 3; // 3 = Accepted (successful execution) + prometheus.codeExecutionsTotal.inc({ + language_id: result.language_id?.toString() || "unknown", + success: success.toString(), + }); + } + return c.json(result); } catch (error) { if (error instanceof HTTPException) { diff --git a/src/routes/metrics.ts b/src/routes/metrics.ts index 34f29a6..fbdab97 100644 --- a/src/routes/metrics.ts +++ b/src/routes/metrics.ts @@ -54,7 +54,10 @@ metricsRouter.get("/health", async (c: Context) => { }; // Database connectivity check - let databaseCheck = { status: "pass" as const, details: "Database connection healthy" }; + let databaseCheck: { status: "pass" | "warn" | "fail"; details: string } = { + status: "pass", + details: "Database connection healthy", + }; try { // Basic database health check could be added here // For now, assume healthy if no errors are thrown @@ -97,27 +100,61 @@ metricsRouter.get("/health", async (c: Context) => { return c.json(healthStatus, statusCode); }); -// System metrics endpoint for monitoring dashboards +// Prometheus metrics endpoint for Grafana (requires Basic Auth) metricsRouter.get("/metrics", async (c: Context) => { - const startTime = Date.now(); - const memUsage = process.memoryUsage(); - const cpuUsage = process.cpuUsage(); - const environment = process.env.NODE_ENV || "development"; - const version = process.env.npm_package_version || "1.0.0"; - - const metrics: SystemMetrics = { - timestamp: new Date().toISOString(), - uptime: process.uptime(), - memory: memUsage, - cpuUsage, - environment, - version, - }; - - const duration = Date.now() - startTime; - logger.debug("System metrics retrieved", { duration }); + const metricsApiKey = process.env.METRICS_API_KEY; + + // Check for Basic Auth authentication + if (!metricsApiKey) { + logger.warn("METRICS_API_KEY not configured - metrics endpoint is unprotected"); + } else { + const authHeader = c.req.header("Authorization"); + + if (!authHeader || !authHeader.startsWith("Basic ")) { + logger.warn("Unauthorized metrics access attempt - missing or invalid auth", { + ip: c.req.header("x-forwarded-for") || "unknown", + userAgent: c.req.header("user-agent") || "unknown", + }); + c.header("WWW-Authenticate", 'Basic realm="Metrics"'); + return c.text("Unauthorized", 401); + } + + try { + // Decode Basic Auth credentials + const base64Credentials = authHeader.substring(6); // Remove "Basic " + const credentials = Buffer.from(base64Credentials, "base64").toString("utf-8"); + const [username, password] = credentials.split(":"); + + // Verify password matches API key (username can be anything) + if (password !== metricsApiKey) { + logger.warn("Unauthorized metrics access attempt - invalid credentials", { + ip: c.req.header("x-forwarded-for") || "unknown", + userAgent: c.req.header("user-agent") || "unknown", + username: username || "empty", + }); + c.header("WWW-Authenticate", 'Basic realm="Metrics"'); + return c.text("Unauthorized", 401); + } + } catch (error) { + logger.warn("Unauthorized metrics access attempt - malformed auth header", { + ip: c.req.header("x-forwarded-for") || "unknown", + userAgent: c.req.header("user-agent") || "unknown", + }); + c.header("WWW-Authenticate", 'Basic realm="Metrics"'); + return c.text("Unauthorized", 401); + } + } - return c.json(metrics); + try { + const { register } = await import("../lib/prometheus"); + const metrics = await register.metrics(); + return c.text(metrics, 200, { + "Content-Type": register.contentType, + }); + } catch (error) { + logger.error("Failed to generate Prometheus metrics", {}, error as Error); + return c.text("Error generating metrics", 500); + } }); // Readiness probe for Kubernetes/ECS diff --git a/src/server.ts b/src/server.ts index 7137c64..10b5111 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,5 +1,3 @@ -const newrelic = require("newrelic"); - import "dotenv-flow/config"; const isDevelopment = process.env.NODE_ENV === "development"; @@ -29,14 +27,6 @@ import metricsRouter from "./routes/metrics"; import { VERSION } from "./version"; import { logger } from "./lib/logger"; -// Verify New Relic is connected -if (newrelic.agent?.config?.agent_enabled) { - console.log("✅ New Relic agent is enabled"); - console.log("📊 App Name:", newrelic.agent.config.app_name); -} else { - logger.error("New Relic agent is NOT enabled - check license key"); -} - const maxFileSize = process.env.MAX_FILE_SIZE_MB ? parseInt(process.env.MAX_FILE_SIZE_MB) : 50; const maxBodySize = Math.ceil(maxFileSize * 1.35); diff --git a/src/version.ts b/src/version.ts index 3e9769a..ecb596d 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,2 +1,2 @@ // This file is automatically updated by semantic-release -export const VERSION = "1.8.1" \ No newline at end of file +export const VERSION = "1.8.1"; diff --git a/src/websocket/index.ts b/src/websocket/index.ts index e0015f0..c5421a6 100644 --- a/src/websocket/index.ts +++ b/src/websocket/index.ts @@ -11,6 +11,7 @@ import { ConnectionManager } from "./middleware/connection-manager"; import { AuthHandler } from "./auth/handler"; import { NoteHandler } from "./handlers/notes"; import { FolderHandler } from "./handlers/folders"; +import * as prometheus from "../lib/prometheus"; export class WebSocketManager { private wss: WebSocketServer; @@ -53,6 +54,7 @@ export class WebSocketManager { } // Record WebSocket connection metrics + prometheus.websocketConnectionsTotal.inc(); // Add connection start time for duration tracking (ws as WebSocket & { connectionStart: number }).connectionStart = connectionStart; @@ -107,12 +109,16 @@ export class WebSocketManager { return; } + // Record inbound WebSocket message + prometheus.websocketMessagesTotal.inc({ + type: message.type, + direction: "inbound", + }); + await this.handleMessage(ws, message); const messageDuration = Date.now() - messageStart; - // Record WebSocket message metrics - // Log WebSocket performance const emoji = messageDuration > 2000 ? "🐌" : messageDuration > 1000 ? "⚠️" : "⚡"; if (process.env.NODE_ENV === "development") { @@ -146,6 +152,7 @@ export class WebSocketManager { } // Record WebSocket disconnection metrics + prometheus.websocketConnectionsTotal.dec(); this.handleDisconnection(ws); }); @@ -269,6 +276,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, syncMessage); + + // Track outbound messages (one per device) + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "note_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about note ${noteId} update for user ${userId}` ); @@ -283,6 +299,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, createMessage); + + // Track outbound messages + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "note_created_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about new note ${noteData.id} for user ${userId}` ); @@ -297,6 +322,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, deleteMessage); + + // Track outbound messages + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "note_deleted_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about note ${noteId} deletion for user ${userId}` ); @@ -311,6 +345,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, createMessage); + + // Track outbound messages + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "folder_created_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about new folder ${folderData.id} for user ${userId}` ); @@ -332,6 +375,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, updateMessage); + + // Track outbound messages + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "folder_updated_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about folder ${folderId} update for user ${userId}` ); @@ -346,6 +398,15 @@ export class WebSocketManager { }; const sentCount = this.connectionManager.broadcastToUserDevices(userId, deleteMessage); + + // Track outbound messages + for (let i = 0; i < sentCount; i++) { + prometheus.websocketMessagesTotal.inc({ + type: "folder_deleted_sync", + direction: "outbound", + }); + } + console.log( `Server notified ${sentCount} devices about folder ${folderId} deletion for user ${userId}` );