adonis5-prometheus
Advanced tools
Comparing version 0.0.6 to 0.0.7
/// <reference types="@adonisjs/http-server/build/adonis-typings" /> | ||
declare module '@ioc:Adonis/Prometheus' { | ||
export * from 'prom-client'; | ||
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
export interface PrometheusConfig { | ||
@@ -6,0 +6,0 @@ exposeHttpEndpoint: boolean; |
/// <reference types="@adonisjs/application/build/adonis-typings" /> | ||
/// <reference types="@adonisjs/http-server/build/adonis-typings" /> | ||
declare module '@ioc:Adonis/Prometheus/Middlewares/CollectPerformanceMetrics' { | ||
import { ApplicationContract } from '@ioc:Adonis/Core/Application'; | ||
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
import type { ApplicationContract } from '@ioc:Adonis/Core/Application'; | ||
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
export interface MiddlewareContract { | ||
@@ -7,0 +7,0 @@ new (application: ApplicationContract): { |
/// <reference types="@adonisjs/application/build/adonis-typings" /> | ||
import { ApplicationContract, IocContract } from '@ioc:Adonis/Core/Application'; | ||
import type { ApplicationContract, IocContract } from '@ioc:Adonis/Core/Application'; | ||
export default class PrometheusProvider { | ||
@@ -8,4 +8,12 @@ protected app: ApplicationContract; | ||
constructor(app: ApplicationContract); | ||
/** | ||
* Expose metrics on the given endpoint | ||
*/ | ||
private exposeMetricsEndpoint; | ||
/** | ||
* Collect system metrics if enabled | ||
*/ | ||
private collectSystemMetrics; | ||
register(): void; | ||
private exposeMetrics; | ||
shutdown(): Promise<void>; | ||
} |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
@@ -23,2 +27,3 @@ if (k2 === undefined) k2 = k; | ||
const prometheus = __importStar(require("prom-client")); | ||
const Metrics_1 = require("../src/Metrics"); | ||
class PrometheusProvider { | ||
@@ -29,27 +34,11 @@ constructor(app) { | ||
} | ||
register() { | ||
const Config = this.app.container.resolveBinding('Adonis/Core/Config'); | ||
const systemMetrics = Config.get('prometheus.systemMetrics'); | ||
if (Config.get('prometheus.systemMetrics').enabled) { | ||
const { enabled, ...params } = systemMetrics; | ||
prometheus.collectDefaultMetrics(params); | ||
/** | ||
* Expose metrics on the given endpoint | ||
*/ | ||
exposeMetricsEndpoint(config) { | ||
if (config.exposeHttpEndpoint === false) { | ||
return; | ||
} | ||
if (Config.get('prometheus.exposeHttpEndpoint')) { | ||
this.exposeMetrics(Config.get('prometheus.endpoint')); | ||
} | ||
this.app.container.singleton('Adonis/Prometheus', () => prometheus); | ||
this.app.container.singleton('Adonis/Prometheus/Middlewares/CollectPerformanceMetrics', () => { | ||
const { CollectPerformanceMetrics } = require('../src/CollectPerformanceMetrics'); | ||
const { Metrics } = require('../src/Metrics'); | ||
const config = this.container.use('Adonis/Core/Config').get('prometheus'); | ||
const metrics = new Metrics(config); | ||
const enableUptimeMetric = config.uptimeMetric.enabled; | ||
if (enableUptimeMetric) { | ||
metrics.uptimeMetric.inc(1); | ||
} | ||
return new CollectPerformanceMetrics(metrics, config); | ||
}); | ||
} | ||
exposeMetrics(urlPath = '/metrics') { | ||
const router = this.app.container.resolveBinding('Adonis/Core/Route'); | ||
const urlPath = config.endpoint || '/metrics'; | ||
router.get(urlPath, async ({ response }) => { | ||
@@ -61,4 +50,31 @@ response | ||
} | ||
/** | ||
* Collect system metrics if enabled | ||
*/ | ||
collectSystemMetrics(config) { | ||
if (config.systemMetrics.enabled) { | ||
prometheus.collectDefaultMetrics(config.systemMetrics); | ||
} | ||
} | ||
register() { | ||
const promConfig = this.app.container | ||
.resolveBinding('Adonis/Core/Config') | ||
.get('prometheus'); | ||
this.collectSystemMetrics(promConfig); | ||
this.exposeMetricsEndpoint(promConfig); | ||
const metrics = new Metrics_1.Metrics(promConfig); | ||
if (promConfig.uptimeMetric.enabled) { | ||
metrics.uptimeMetric.inc(1); | ||
} | ||
this.app.container.singleton('Adonis/Prometheus', () => prometheus); | ||
this.app.container.singleton('Adonis/Prometheus/Middlewares/CollectPerformanceMetrics', () => { | ||
const { CollectPerformanceMetrics } = require('../src/CollectPerformanceMetrics'); | ||
return new CollectPerformanceMetrics(metrics, promConfig); | ||
}); | ||
} | ||
async shutdown() { | ||
prometheus.register.clear(); | ||
} | ||
} | ||
exports.default = PrometheusProvider; | ||
PrometheusProvider.needsApplication = true; |
/// <reference types="@adonisjs/http-server/build/adonis-typings" /> | ||
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
import { PrometheusConfig } from '@ioc:Adonis/Prometheus'; | ||
import { Metrics } from './Metrics'; | ||
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; | ||
import type { PrometheusConfig } from '@ioc:Adonis/Prometheus'; | ||
import type { Metrics } from './Metrics'; | ||
export declare class CollectPerformanceMetrics { | ||
@@ -9,4 +9,2 @@ protected metrics: Metrics; | ||
constructor(metrics: Metrics, config: PrometheusConfig); | ||
handle(ctx: HttpContextContract, next: () => Promise<void>): Promise<void>; | ||
private afterRequest; | ||
/** | ||
@@ -16,2 +14,7 @@ * Check if current route is excluded by the user in the configuration | ||
private isRouteExcluded; | ||
/** | ||
* Called when the request is finished. | ||
*/ | ||
private afterRequest; | ||
handle(ctx: HttpContextContract, next: () => Promise<void>): Promise<void>; | ||
} |
@@ -9,2 +9,34 @@ "use strict"; | ||
} | ||
/** | ||
* Check if current route is excluded by the user in the configuration | ||
*/ | ||
isRouteExcluded(ctx) { | ||
const excludedRoutes = this.config.httpMetric.excludedRoutes || []; | ||
if (typeof excludedRoutes === 'function') { | ||
return excludedRoutes(ctx); | ||
} | ||
return excludedRoutes.includes(ctx.route.pattern); | ||
} | ||
/** | ||
* Called when the request is finished. | ||
*/ | ||
async afterRequest(statusCode, stopHttpRequestTimer) { | ||
const enableThroughputMetric = this.config.throughputMetric.enabled; | ||
const httpMetricOptions = this.config.httpMetric; | ||
/** | ||
* Track request throughput.. | ||
*/ | ||
if (enableThroughputMetric) | ||
this.metrics.throughputMetric.inc(); | ||
/** | ||
* End HTTP request timer. | ||
*/ | ||
if (httpMetricOptions.enabled && stopHttpRequestTimer) { | ||
let statusCodeStr = statusCode.toString(); | ||
if (httpMetricOptions.shouldGroupStatusCode) { | ||
statusCodeStr = `${statusCodeStr[0]}xx`; | ||
} | ||
stopHttpRequestTimer({ statusCode: statusCodeStr }); | ||
} | ||
} | ||
async handle(ctx, next) { | ||
@@ -19,18 +51,17 @@ const { request, response, route } = ctx; | ||
let stopHttpRequestTimer; | ||
if (httpMetricOptions.enabled) { | ||
if (httpMetricOptions.enabled && !this.isRouteExcluded(ctx)) { | ||
const includeRouteParams = httpMetricOptions.includeRouteParams; | ||
const includeQueryParams = httpMetricOptions.includeQueryParams; | ||
if (!this.isRouteExcluded(ctx)) { | ||
let url = includeRouteParams ? request.url() : route?.pattern; | ||
if (includeQueryParams && request.parsedUrl.query) { | ||
url += `?${request.parsedUrl.query}`; | ||
} | ||
stopHttpRequestTimer = this.metrics.httpMetric.startTimer({ | ||
method: request.method(), | ||
url, | ||
}); | ||
let url = includeRouteParams ? request.url() : route?.pattern; | ||
if (includeQueryParams && request.parsedUrl.query) { | ||
url += `?${request.parsedUrl.query}`; | ||
} | ||
stopHttpRequestTimer = this.metrics.httpMetric.startTimer({ | ||
method: request.method(), | ||
url, | ||
}); | ||
} | ||
/** | ||
* Execute request and track metrics for the request. | ||
* | ||
* If the request fails with any error, we have to catch | ||
@@ -48,32 +79,3 @@ * this error, track metrics, then rethrow the error. | ||
} | ||
async afterRequest(statusCode, stopHttpRequestTimer) { | ||
const enableThroughputMetric = this.config.throughputMetric.enabled; | ||
const httpMetricOptions = this.config.httpMetric; | ||
/** | ||
* Track request throughput.. | ||
*/ | ||
if (enableThroughputMetric) | ||
this.metrics.throughputMetric.inc(); | ||
/** | ||
* End HTTP request timer. | ||
*/ | ||
if (httpMetricOptions.enabled && stopHttpRequestTimer) { | ||
let statusCodeStr = statusCode.toString(); | ||
if (httpMetricOptions.shouldGroupStatusCode) { | ||
statusCodeStr = statusCodeStr[0] + 'xx'; | ||
} | ||
stopHttpRequestTimer({ statusCode: statusCodeStr }); | ||
} | ||
} | ||
/** | ||
* Check if current route is excluded by the user in the configuration | ||
*/ | ||
isRouteExcluded(ctx) { | ||
const excludedRoutes = this.config.httpMetric.excludedRoutes || []; | ||
if (typeof excludedRoutes === 'function') { | ||
return excludedRoutes(ctx); | ||
} | ||
return excludedRoutes.includes(ctx.route.pattern); | ||
} | ||
} | ||
exports.CollectPerformanceMetrics = CollectPerformanceMetrics; |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
@@ -6,0 +10,0 @@ if (k2 === undefined) k2 = k; |
120
package.json
{ | ||
"name": "adonis5-prometheus", | ||
"version": "0.0.6", | ||
"version": "0.0.7", | ||
"packageManager": "pnpm@7.9.5", | ||
"description": "Prometheus wrapper for Adonis 5", | ||
"main": "build/providers/PrometheusProvider.js", | ||
"typings": "./build/adonis-typings/index.d.ts", | ||
"files": [ | ||
"build/adonis-typings", | ||
"build/providers", | ||
"build/src", | ||
"build/templates" | ||
], | ||
"scripts": { | ||
"mrm": "mrm --preset=@adonisjs/mrm-preset", | ||
"pretest": "npm run lint", | ||
"test": "node .bin/test.js", | ||
"lint": "eslint . --ext=.ts", | ||
"clean": "del-cli build", | ||
"copyfiles": "copyfiles \"templates/**/*.txt\" build", | ||
"compile": "npm run lint && npm run clean && tsc", | ||
"build": "npm run compile && npm run copyfiles", | ||
"prepublishOnly": "npm run build", | ||
"format": "prettier --write .", | ||
"release": "np --message=\"🔖 %s\"", | ||
"version": "npm run build", | ||
"sync-labels": "github-label-sync --labels ./node_modules/@adonisjs/mrm-preset/gh-labels.json Julien-R44/adonis5-prometheus" | ||
}, | ||
"author": "Julien Ripouteau <julien@ripouteau.com>", | ||
"license": "MIT", | ||
"homepage": "https://github.com/Julien-R44/adonis5-prometheus#readme", | ||
"repository": { | ||
@@ -32,2 +13,5 @@ "type": "git", | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/Julien-R44/adonis5-prometheus/issues" | ||
}, | ||
"keywords": [ | ||
@@ -41,50 +25,48 @@ "adonisjs", | ||
], | ||
"author": "Julien Ripouteau <julien@ripouteau.com>", | ||
"license": "MIT", | ||
"bugs": { | ||
"url": "https://github.com/Julien-R44/adonis5-prometheus/issues" | ||
"main": "build/providers/PrometheusProvider.js", | ||
"typings": "./build/adonis-typings/index.d.ts", | ||
"files": [ | ||
"build/adonis-typings", | ||
"build/providers", | ||
"build/src", | ||
"build/templates" | ||
], | ||
"peerDependencies": { | ||
"@adonisjs/core": "^5.8.0" | ||
}, | ||
"homepage": "https://github.com/Julien-R44/adonis5-prometheus#readme", | ||
"dependencies": { | ||
"prom-client": "^14.0.1" | ||
"@poppinss/dev-utils": "^2.0.3", | ||
"prom-client": "^14.1.0" | ||
}, | ||
"devDependencies": { | ||
"@adonisjs/core": "^5.4.2", | ||
"@adonisjs/mrm-preset": "^5.0.2", | ||
"@adonisjs/require-ts": "^2.0.8", | ||
"@types/node": "^17.0.0", | ||
"commitizen": "^4.2.4", | ||
"@adonisjs/core": "^5.8.6", | ||
"@adonisjs/mrm-preset": "^5.0.3", | ||
"@adonisjs/require-ts": "^2.0.12", | ||
"@japa/api-client": "^1.4.1", | ||
"@japa/assert": "^1.3.5", | ||
"@japa/runner": "^2.1.1", | ||
"@japa/spec-reporter": "^1.2.0", | ||
"@julr/eslint-config": "^0.3.2", | ||
"@types/node": "^18.7.14", | ||
"bumpp": "^8.2.1", | ||
"commitizen": "^4.2.5", | ||
"copyfiles": "^2.4.1", | ||
"del-cli": "^4.0.1", | ||
"eslint": "^8.5.0", | ||
"eslint-config-prettier": "^8.3.0", | ||
"eslint-plugin-adonis": "^2.1.0", | ||
"eslint-plugin-prettier": "^4.0.0", | ||
"github-label-sync": "^2.0.2", | ||
"del-cli": "^5.0.0", | ||
"eslint": "^8.23.0", | ||
"github-label-sync": "^2.2.0", | ||
"japa": "^4.0.0", | ||
"mrm": "^3.0.10", | ||
"np": "^7.6.0", | ||
"prettier": "^2.5.1", | ||
"typescript": "^4.5.4" | ||
"mrm": "^4.1.0", | ||
"nodemon": "^2.0.19", | ||
"prettier": "^2.7.1", | ||
"typescript": "^4.8.2" | ||
}, | ||
"eslintConfig": { | ||
"extends": [ | ||
"plugin:adonis/typescriptPackage", | ||
"prettier" | ||
"ignorePatterns": [ | ||
"build" | ||
], | ||
"plugins": [ | ||
"prettier" | ||
], | ||
"extends": "@julr", | ||
"rules": { | ||
"prettier/prettier": [ | ||
"error", | ||
{ | ||
"endOfLine": "auto" | ||
} | ||
] | ||
"@typescript-eslint/no-var-requires": "off" | ||
} | ||
}, | ||
"eslintIgnore": [ | ||
"build" | ||
], | ||
"prettier": { | ||
@@ -119,3 +101,17 @@ "trailingComma": "es5", | ||
} | ||
} | ||
} | ||
}, | ||
"scripts": { | ||
"mrm": "mrm --preset=@adonisjs/mrm-preset", | ||
"test": "nodemon --ignore test-app/ bin/test.ts", | ||
"lint": "eslint .", | ||
"clean": "del-cli build", | ||
"copyfiles": "copyfiles \"templates/**/*.txt\" build", | ||
"compile": "pnpm lint && pnpm clean && tsc", | ||
"build": "pnpm compile && pnpm copyfiles", | ||
"format": "prettier --write .", | ||
"release": "bumpp --commit --push --tag && pnpm publish", | ||
"version": "pnpm build", | ||
"sync-labels": "github-label-sync --labels ./node_modules/@adonisjs/mrm-preset/gh-labels.json Julien-R44/adonis5-prometheus" | ||
}, | ||
"readme": "<div align=\"center\">\n <img src=\"https://i.imgur.com/QZf8jrj.png\" width=\"300px\" /> \n <br/>\n <h3>Adonis5-Prometheus</h3>\n <p>Simple Prometheus Wrapper for Adonis</p>\n <a href=\"https://www.npmjs.com/package/adonis5-prometheus\">\n <img src=\"https://img.shields.io/npm/v/adonis5-prometheus.svg?style=for-the-badge&logo=npm\" />\n </a>\n <img src=\"https://img.shields.io/npm/l/adonis5-prometheus?color=blueviolet&style=for-the-badge\" />\n <img src=\"https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript\" />\n</div>\n\n## Installation\n```\nnpm i adonis5-prometheus\nnode ace configure adonis5-prometheus\n```\n\n## Usage\n\nA configuration file has been added in `config/prometheus.ts`.\n\nBy default the system metrics are collected ( `systemMetrics.enabled: true` ), so now you can call the endpoint `{{host}}/metrics` to get the measured metrics.\n\nHere is an example scrape_config to add to prometheus.yml:\n```yaml\nscrape_configs:\n - job_name: my-adonis-app\n static_configs:\n - targets: [my-adonis-app.com]\n scrape_interval: 5s\n```\n\n## Built-in Metrics\nMetrics collected by Adonis5-prometheus middleware\n| Type | Name | Description |\n| --- | --- | --- |\n| Histogram | `adonis_http_request_durations` | Total time each HTTP requests takes. |\n| Gauge | `adonis_uptime_metrics` | Uptime performance of the application (1 = up, 0 = down) |\n| Counter | `adonis_throughput_metrics` | No. of request handled. |\n\nTo enable them, simply register the `CollectPerformanceMetrics` as the first item in the start/kernel.ts:\n```typescript\nServer.middleware.register([\n // Make it first in the list for reliable metrics.\n () => import('@ioc:Adonis/Prometheus/Middlewares/CollectPerformanceMetrics'),\n () => import('@ioc:Adonis/Core/BodyParser'),\n ...\n])\n```\nVerify if the metrics are enabled in the `config/prometheus.ts` file. You can also configure the metrics there.\n\n## Custom Metrics\n```typescript\n// Register your custom metrics in the separate file you want.\nexport const OrderMetric = new Prometheus.Counter({\n name: 'sent_orders',\n help: 'Total Orders Sent',\n})\n\n// OrderController.ts\nimport { OrderMetric } from 'App/Metrics'\n\nexport default class OrderController {\n public async store({ request }: HttpContextContract) {\n const order = await request.validate({ schema: OrderSchema })\n\n // ...\n OrderMetric.inc()\n // ...\n }\n}\n```\nWhen hitting `{{host}}/metrics` you will now get the following:\n```\n# HELP send_orders Total Orders Sent\n# TYPE send_orders counter\nsent_orders 2\n```\n\n## Grafana Dashboard\nA basic ready to use dashboard is available in the `grafana` folder.\n**Grafana 8 is required** to be able to import the dashboard correctly, otherwise you'll have to tinker a bit to make it work.\n![https://i.imgur.com/mD0UMhA.png?1](https://i.imgur.com/mD0UMhA.png?1)\nIt includes :\n- Process CPU usage\n- Event loop lag\n- Node.JS version\n- Requests by second\n- Request volume rate by URL\n- Average response time\n- Response error rate by URL\n\nTo be fully functional, you need to enable `systemMetrics`, `httpMetric` and `throughputMetric` in the `config/prometheus.ts` file.\n\n## Documentation\nThis library is a wrapper for prom-client. The prom-client object can be imported with `import Prometheus from '@ioc:Adonis/Prometheus'`. Check out the [documentation](https://github.com/siimon/prom-client) for more information.\n" | ||
} |
@@ -28,5 +28,5 @@ <div align="center"> | ||
scrape_configs: | ||
- job_name: 'my-adonis-app' | ||
- job_name: my-adonis-app | ||
static_configs: | ||
- targets: ['my-adonis-app.com'] | ||
- targets: [my-adonis-app.com] | ||
scrape_interval: 5s | ||
@@ -84,2 +84,3 @@ ``` | ||
A basic ready to use dashboard is available in the `grafana` folder. | ||
**Grafana 8 is required** to be able to import the dashboard correctly, otherwise you'll have to tinker a bit to make it work. | ||
![https://i.imgur.com/mD0UMhA.png?1](https://i.imgur.com/mD0UMhA.png?1) | ||
@@ -99,4 +100,1 @@ It includes : | ||
This library is a wrapper for prom-client. The prom-client object can be imported with `import Prometheus from '@ioc:Adonis/Prometheus'`. Check out the [documentation](https://github.com/siimon/prom-client) for more information. | ||
## Acknowledgments | ||
- [tnkemdilim/adonis-prometheus](https://github.com/tnkemdilim/adonis-prometheus) - At first, I just adapted his library to support Adonis5. |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
25304
298
3
20
98
1
+ Added@poppinss/dev-utils@^2.0.3
+ Added@adonisjs/ace@11.3.1(transitive)
+ Added@adonisjs/application@5.3.0(transitive)
+ Added@adonisjs/bodyparser@8.1.9(transitive)
+ Added@adonisjs/config@3.0.9(transitive)
+ Added@adonisjs/core@5.9.0(transitive)
+ Added@adonisjs/drive@2.3.0(transitive)
+ Added@adonisjs/encryption@4.0.8(transitive)
+ Added@adonisjs/env@3.0.9(transitive)
+ Added@adonisjs/events@7.2.1(transitive)
+ Added@adonisjs/fold@8.2.0(transitive)
+ Added@adonisjs/hash@7.2.2(transitive)
+ Added@adonisjs/http-server@5.12.0(transitive)
+ Added@adonisjs/logger@4.1.6(transitive)
+ Added@adonisjs/profiler@6.0.9(transitive)
+ Added@adonisjs/validator@12.6.0(transitive)
+ Added@arr/every@1.0.1(transitive)
+ Added@colors/colors@1.5.0(transitive)
+ Added@phc/format@1.0.0(transitive)
+ Added@poppinss/cliui@3.0.5(transitive)
+ Added@poppinss/co-body@1.2.0(transitive)
+ Added@poppinss/colors@3.0.3(transitive)
+ Added@poppinss/dev-utils@2.0.3(transitive)
+ Added@poppinss/file-generator@1.0.2(transitive)
+ Added@poppinss/manager@5.0.2(transitive)
+ Added@poppinss/matchit@3.1.2(transitive)
+ Added@poppinss/multiparty@2.0.1(transitive)
+ Added@poppinss/prompts@2.0.2(transitive)
+ Added@poppinss/utils@4.0.45.0.0(transitive)
+ Added@tokenizer/token@0.3.0(transitive)
+ Added@types/bytes@3.1.5(transitive)
+ Added@types/fs-extra@9.0.13(transitive)
+ Added@types/he@1.2.3(transitive)
+ Added@types/luxon@3.4.2(transitive)
+ Added@types/node@22.10.7(transitive)
+ Added@types/pino@6.3.12(transitive)
+ Added@types/pino-pretty@5.0.0(transitive)
+ Added@types/pino-std-serializers@4.0.0(transitive)
+ Added@types/validator@13.12.2(transitive)
+ Addedabstract-logging@2.0.1(transitive)
+ Addedaccepts@1.3.8(transitive)
+ Addedansi-colors@4.1.3(transitive)
+ Addedansi-escapes@4.3.2(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@4.3.0(transitive)
+ Addedastral-regex@2.0.0(transitive)
+ Addedatomic-sleep@1.0.0(transitive)
+ Addedbytes@3.1.2(transitive)
+ Addedcall-bind-apply-helpers@1.0.1(transitive)
+ Addedcall-bound@1.0.3(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedcamel-case@4.1.2(transitive)
+ Addedcapital-case@1.0.4(transitive)
+ Addedchange-case@4.1.2(transitive)
+ Addedclear-module@4.1.2(transitive)
+ Addedcli-boxes@3.0.0(transitive)
+ Addedcli-cursor@3.1.0(transitive)
+ Addedcli-table3@0.6.5(transitive)
+ Addedco-compose@7.0.3(transitive)
+ Addedcolor-convert@2.0.1(transitive)
+ Addedcolor-name@1.1.4(transitive)
+ Addedcolor-support@1.1.3(transitive)
+ Addedcolorette@2.0.20(transitive)
+ Addedconstant-case@3.0.4(transitive)
+ Addedcontent-disposition@0.5.4(transitive)
+ Addedcookie@0.5.0(transitive)
+ Addedcuid@2.1.8(transitive)
+ Addeddateformat@4.6.3(transitive)
+ Addeddebug@2.6.9(transitive)
+ Addeddepd@2.0.0(transitive)
+ Addeddestroy@1.2.0(transitive)
+ Addeddot-case@3.0.4(transitive)
+ Addeddotenv@16.4.7(transitive)
+ Addeddunder-proto@1.0.1(transitive)
+ Addedee-first@1.1.1(transitive)
+ Addedemittery@0.10.2(transitive)
+ Addedemoji-regex@8.0.0(transitive)
+ Addedencodeurl@1.0.22.0.0(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addedenquirer@2.4.1(transitive)
+ Addedes-define-property@1.0.1(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.1.1(transitive)
+ Addedescape-goat@2.1.1(transitive)
+ Addedescape-html@1.0.3(transitive)
+ Addedetag@1.8.1(transitive)
+ Addedfast-copy@3.0.2(transitive)
+ Addedfast-redact@3.5.0(transitive)
+ Addedfast-safe-stringify@2.1.1(transitive)
+ Addedfile-type@16.5.4(transitive)
+ Addedflatstr@1.0.12(transitive)
+ Addedflattie@1.1.1(transitive)
+ Addedforwarded@0.2.0(transitive)
+ Addedfresh@0.5.2(transitive)
+ Addedfs-extra@10.1.0(transitive)
+ Addedfs-monkey@1.0.6(transitive)
+ Addedfs-readdir-recursive@1.1.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-intrinsic@1.2.7(transitive)
+ Addedget-proto@1.0.1(transitive)
+ Addedgetopts@2.3.0(transitive)
+ Addedgopd@1.2.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-flag@4.0.0(transitive)
+ Addedhas-symbols@1.1.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhaye@3.0.0(transitive)
+ Addedhe@1.2.0(transitive)
+ Addedheader-case@2.0.4(transitive)
+ Addedhelp-me@5.0.0(transitive)
+ Addedhttp-errors@2.0.0(transitive)
+ Addediconv-lite@0.4.24(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedinflation@2.1.0(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedipaddr.js@1.9.1(transitive)
+ Addedis-fullwidth-code-point@3.0.0(transitive)
+ Addedjest-worker@27.5.1(transitive)
+ Addedjoycon@3.1.1(transitive)
+ Addedjsonfile@6.1.0(transitive)
+ Addedkind-of@6.0.3(transitive)
+ Addedkleur@4.1.5(transitive)
+ Addedleven@3.1.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedlog-update@4.0.0(transitive)
+ Addedlower-case@2.0.2(transitive)
+ Addedluxon@3.5.0(transitive)
+ Addedmacroable@7.0.2(transitive)
+ Addedmath-intrinsics@1.1.0(transitive)
+ Addedmedia-typer@0.3.01.1.0(transitive)
+ Addedmemfs@3.6.0(transitive)
+ Addedmerge-stream@2.0.0(transitive)
+ Addedmime@1.6.0(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedmimic-fn@2.1.0(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedms@2.0.02.1.3(transitive)
+ Addedmustache@4.2.0(transitive)
+ Addednegotiator@0.6.3(transitive)
+ Addedno-case@3.0.4(transitive)
+ Addednormalize-url@6.1.0(transitive)
+ Addedobject-inspect@1.13.3(transitive)
+ Addedon-exit-leak-free@2.1.2(transitive)
+ Addedon-finished@2.4.1(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedonetime@5.1.2(transitive)
+ Addedparam-case@3.0.4(transitive)
+ Addedparent-module@2.0.0(transitive)
+ Addedparseurl@1.3.3(transitive)
+ Addedpascal-case@3.1.2(transitive)
+ Addedpath-case@3.0.4(transitive)
+ Addedpeek-readable@4.1.0(transitive)
+ Addedpino@6.14.0(transitive)
+ Addedpino-abstract-transport@2.0.0(transitive)
+ Addedpino-pretty@13.0.0(transitive)
+ Addedpino-std-serializers@3.2.07.0.0(transitive)
+ Addedpluralize@8.0.0(transitive)
+ Addedpretty-hrtime@1.0.3(transitive)
+ Addedprocess-warning@1.0.0(transitive)
+ Addedproxy-addr@2.0.7(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedqs@6.14.0(transitive)
+ Addedquick-format-unescaped@4.0.4(transitive)
+ Addedrandom-bytes@1.0.0(transitive)
+ Addedrange-parser@1.2.1(transitive)
+ Addedraw-body@2.5.2(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedreadable-web-to-node-stream@3.0.2(transitive)
+ Addedrequire-all@3.0.0(transitive)
+ Addedresolve-from@5.0.0(transitive)
+ Addedrestore-cursor@3.1.0(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsecure-json-parse@2.7.0(transitive)
+ Addedsemver@7.6.3(transitive)
+ Addedsend@0.19.0(transitive)
+ Addedsentence-case@3.0.4(transitive)
+ Addedserve-static@1.16.2(transitive)
+ Addedsetprototypeof@1.2.0(transitive)
+ Addedside-channel@1.1.0(transitive)
+ Addedside-channel-list@1.0.0(transitive)
+ Addedside-channel-map@1.0.1(transitive)
+ Addedside-channel-weakmap@1.0.2(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedslash@3.0.0(transitive)
+ Addedslice-ansi@4.0.0(transitive)
+ Addedslugify@1.6.6(transitive)
+ Addedsnake-case@3.0.4(transitive)
+ Addedsonic-boom@1.4.12.8.04.2.0(transitive)
+ Addedsplit2@4.2.0(transitive)
+ Addedstatuses@2.0.1(transitive)
+ Addedstring-width@4.2.3(transitive)
+ Addedstring_decoder@1.3.0(transitive)
+ Addedstringify-attributes@2.0.0(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedstrip-json-comments@3.1.1(transitive)
+ Addedstrtok3@6.3.0(transitive)
+ Addedsupports-color@8.1.1(transitive)
+ Addedterm-size@2.2.1(transitive)
+ Addedtmp-cache@1.1.0(transitive)
+ Addedtoidentifier@1.0.1(transitive)
+ Addedtoken-types@4.2.1(transitive)
+ Addedtruncatise@0.0.8(transitive)
+ Addedtslib@2.8.1(transitive)
+ Addedtype-fest@0.21.3(transitive)
+ Addedtype-is@1.6.18(transitive)
+ Addeduid-safe@2.1.5(transitive)
+ Addedundici-types@6.20.0(transitive)
+ Addeduniversalify@2.0.1(transitive)
+ Addedunpipe@1.0.0(transitive)
+ Addedupper-case@2.0.2(transitive)
+ Addedupper-case-first@2.0.2(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedvalidator@13.12.0(transitive)
+ Addedvary@1.1.2(transitive)
+ Addedwrap-ansi@6.2.0(transitive)
+ Addedwrappy@1.0.2(transitive)
Updatedprom-client@^14.1.0