feature: add telemetry to the HTTP layer (#9116)

---------

Co-authored-by: adrien2p <adrien.deperetti@gmail.com>
This commit is contained in:
Harminder Virk
2024-09-13 12:36:54 +05:30
committed by GitHub
parent 8c2a5fbcf2
commit 9cf0df53b5
12 changed files with 951 additions and 44 deletions

View File

@@ -20,7 +20,10 @@ const API_KEY_AUTH = "api-key"
// This is the only hard-coded actor type, as API keys have special handling for now. We could also generalize API keys to carry the actor type with them.
const ADMIN_ACTOR_TYPE = "user"
type AuthType = typeof SESSION_AUTH | typeof BEARER_AUTH | typeof API_KEY_AUTH
export type AuthType =
| typeof SESSION_AUTH
| typeof BEARER_AUTH
| typeof API_KEY_AUTH
type MedusaSession = {
auth_context: AuthContext
@@ -31,7 +34,7 @@ export const authenticate = (
authType: AuthType | AuthType[],
options: { allowUnauthenticated?: boolean; allowUnregistered?: boolean } = {}
): RequestHandler => {
const handler = async (
const authenticateMiddleware = async (
req: MedusaRequest,
res: MedusaResponse,
next: NextFunction
@@ -105,7 +108,7 @@ export const authenticate = (
res.status(401).json({ message: "Unauthorized" })
}
return handler as unknown as RequestHandler
return authenticateMiddleware as unknown as RequestHandler
}
const getApiKeyInfo = async (req: MedusaRequest): Promise<ApiKeyDTO | null> => {

View File

@@ -1,6 +1,13 @@
import { parseCorsOrigins, promiseAll, wrapHandler } from "@medusajs/utils"
import cors from "cors"
import { type Express, json, Router, text, urlencoded } from "express"
import {
type Express,
json,
RequestHandler,
Router,
text,
urlencoded,
} from "express"
import { readdir } from "fs/promises"
import { extname, join, parse, sep } from "path"
import {
@@ -8,15 +15,17 @@ import {
HTTP_METHODS,
MedusaRequest,
MedusaResponse,
MiddlewareFunction,
MiddlewareRoute,
MiddlewaresConfig,
MiddlewareVerb,
ParserConfigArgs,
RouteConfig,
RouteDescriptor,
RouteHandler,
RouteVerb,
} from "./types"
import { authenticate, errorHandler } from "./middlewares"
import { authenticate, AuthType, errorHandler } from "./middlewares"
import { configManager } from "../config"
import { logger } from "../logger"
@@ -212,6 +221,24 @@ class ApiRoutesLoader {
*/
readonly #sourceDir: string
/**
* Wrap the original route handler implementation for
* instrumentation.
*/
static traceRoute?: (
handler: RouteHandler,
route: { route: string; method: string }
) => RouteHandler
/**
* Wrap the original middleware handler implementation for
* instrumentation.
*/
static traceMiddleware?: (
handler: RequestHandler | MiddlewareFunction,
route: { route: string; method?: string }
) => RequestHandler
constructor({
app,
activityId,
@@ -560,6 +587,27 @@ class ApiRoutesLoader {
return
}
/**
* Applies the route middleware on a route. Encapsulates the logic
* needed to pass the middleware via the trace calls
*/
applyAuthMiddleware(
route: string,
actorType: string | string[],
authType: AuthType | AuthType[],
options?: { allowUnauthenticated?: boolean; allowUnregistered?: boolean }
) {
let authenticateMiddleware = authenticate(actorType, authType, options)
if (ApiRoutesLoader.traceMiddleware) {
authenticateMiddleware = ApiRoutesLoader.traceMiddleware(
authenticateMiddleware,
{ route: route }
)
}
this.#router.use(route, authenticateMiddleware)
}
/**
* Apply the route specific middlewares to the router,
* this includes the cors, authentication and
@@ -629,20 +677,22 @@ class ApiRoutesLoader {
// We only apply the auth middleware to store routes to populate the auth context. For actual authentication, users can just reapply the middleware.
if (!config.optedOutOfAuth && config.routeType === "store") {
this.#router.use(
this.applyAuthMiddleware(
descriptor.route,
authenticate("customer", ["bearer", "session"], {
"customer",
["bearer", "session"],
{
allowUnauthenticated: true,
})
}
)
}
if (!config.optedOutOfAuth && config.routeType === "admin") {
// We probably don't want to allow access to all endpoints using an api key, but it will do until we revamp our routing.
this.#router.use(
descriptor.route,
authenticate("user", ["bearer", "session", "api-key"])
)
this.applyAuthMiddleware(descriptor.route, "user", [
"bearer",
"session",
"api-key",
])
}
for (const route of routes) {
@@ -708,13 +758,26 @@ class ApiRoutesLoader {
}`,
})
let handler: RequestHandler | RouteHandler = route.handler
/**
* Give handler to the trace route handler for instrumentation
* from outside-in.
*/
if (ApiRoutesLoader.traceRoute) {
handler = ApiRoutesLoader.traceRoute(handler, {
method: route.method!,
route: descriptor.route,
})
}
/**
* If the user hasn't opted out of error handling then
* we wrap the handler in a try/catch block.
*/
const handler = shouldWrapHandler
? wrapHandler(route.handler as Parameters<typeof wrapHandler>[0])
: route.handler
if (shouldWrapHandler) {
handler = wrapHandler(handler as Parameters<typeof wrapHandler>[0])
}
this.#router[route.method!.toLowerCase()](descriptor.route, handler)
}
@@ -756,7 +819,17 @@ class ApiRoutesLoader {
message: `Registering middleware [${method}] - ${route.matcher}`,
})
this.#router[method.toLowerCase()](route.matcher, ...route.middlewares)
let middlewares = route.middlewares
if (ApiRoutesLoader.traceMiddleware) {
middlewares = middlewares.map((middleware) =>
ApiRoutesLoader.traceMiddleware!(middleware, {
route: String(route.matcher),
method,
})
)
}
this.#router[method.toLowerCase()](route.matcher, ...middlewares)
}
}
}
@@ -840,6 +913,27 @@ export class RoutesLoader {
*/
readonly #sourceDir: string | string[]
static instrument: {
/**
* Instrument middleware function calls by wrapping the original
* middleware handler inside a custom implementation
*/
middleware: (callback: (typeof ApiRoutesLoader)["traceMiddleware"]) => void
/**
* Instrument route handler function calls by wrapping the original
* middleware handler inside a custom implementation
*/
route: (callback: (typeof ApiRoutesLoader)["traceRoute"]) => void
} = {
middleware(callback) {
ApiRoutesLoader.traceMiddleware = callback
},
route(callback) {
ApiRoutesLoader.traceRoute = callback
},
}
constructor({
app,
activityId,

View File

@@ -36,7 +36,7 @@ export type AsyncRouteHandler = (
res: MedusaResponse
) => Promise<void>
type RouteHandler = SyncRouteHandler | AsyncRouteHandler
export type RouteHandler = SyncRouteHandler | AsyncRouteHandler
export type RouteImplementation = {
method?: RouteVerb

View File

@@ -22,6 +22,11 @@
"license": "MIT",
"devDependencies": {
"@medusajs/types": "^1.11.16",
"@opentelemetry/instrumentation": "^0.53.0",
"@opentelemetry/instrumentation-pg": "^0.44.0",
"@opentelemetry/resources": "^1.26.0",
"@opentelemetry/sdk-node": "^0.53.0",
"@opentelemetry/sdk-trace-node": "^1.26.0",
"@swc/jest": "^0.2.36",
"@types/express": "^4.17.17",
"@types/ioredis": "^4.28.10",

View File

@@ -7,7 +7,11 @@ import { NextFunction } from "express"
import { MedusaRequest } from "../../../../types/routing"
export function maybeApplyPriceListsFilter() {
return async (req: MedusaRequest, _, next: NextFunction) => {
return async function applyPriceListsFilter(
req: MedusaRequest,
_,
next: NextFunction
) {
const filterableFields: HttpTypes.AdminProductListParams =
req.filterableFields

View File

@@ -12,7 +12,7 @@ export function maybeApplyLinkFilter({
filterableField,
filterByField = "id",
}) {
return async (req: MedusaRequest, _, next: NextFunction) => {
return async function linkFilter(req: MedusaRequest, _, next: NextFunction) {
const filterableFields = req.filterableFields
if (!filterableFields?.[filterableField]) {
@@ -76,27 +76,26 @@ export function maybeApplyLinkFilter({
}
*/
function transformFilterableFields(filterableFields: Record<string, unknown>) {
const result = {};
const result = {}
for (const key of Object.keys(filterableFields)) {
const value = filterableFields[key];
const keys = key.split(".");
let current = result;
const value = filterableFields[key]
const keys = key.split(".")
let current = result
// Iterate over the keys, creating nested objects as needed
for (let i = 0; i < keys.length; i++) {
const part = keys[i];
current[part] ??= {};
const part = keys[i]
current[part] ??= {}
if (i === keys.length - 1) {
// If its the last key, assign the value
current[part] = value;
break;
current[part] = value
break
}
current = current[part];
current = current[part]
}
}
return result;
return result
}

View File

@@ -14,7 +14,11 @@ export function validateAndTransformBody(
res: MedusaResponse,
next: NextFunction
) => Promise<void> {
return async (req: MedusaRequest, _: MedusaResponse, next: NextFunction) => {
return async function validateBody(
req: MedusaRequest,
_: MedusaResponse,
next: NextFunction
) {
try {
let schema: z.ZodObject<any, any> | z.ZodEffects<any, any>
if (typeof zodSchema === "function") {

View File

@@ -65,7 +65,11 @@ export function validateAndTransformQuery<TEntity extends BaseEntity>(
res: MedusaResponse,
next: NextFunction
) => Promise<void> {
return async (req: MedusaRequest, _: MedusaResponse, next: NextFunction) => {
return async function validateQuery(
req: MedusaRequest,
_: MedusaResponse,
next: NextFunction
) {
try {
const allowed = (req.allowed ?? queryConfig.allowed ?? []) as string[]
delete req.allowed

View File

@@ -1,21 +1,59 @@
import path from "path"
import express from "express"
import { track } from "medusa-telemetry"
import { scheduleJob } from "node-schedule"
import { gqlSchemaToTypes, logger } from "@medusajs/framework"
import { GracefulShutdownServer } from "@medusajs/utils"
import http, { IncomingMessage, ServerResponse } from "http"
import { gqlSchemaToTypes, logger } from "@medusajs/framework"
import loaders from "../loaders"
import path from "path"
const EVERY_SIXTH_HOUR = "0 */6 * * *"
const CRON_SCHEDULE = EVERY_SIXTH_HOUR
export default async function ({ port, directory, types }) {
async function start() {
/**
* Imports the "instrumentation.js" file from the root of the
* directory and invokes the register function. The existence
* of this file is optional, hence we ignore "ENOENT"
* errors.
*/
async function registerInstrumentation(directory: string) {
try {
const instrumentation = await import(
path.join(directory, "instrumentation.js")
)
if (typeof instrumentation.register === "function") {
logger.info("OTEL registered")
instrumentation.register()
}
} catch (error) {
if (!["ENOENT", "MODULE_NOT_FOUND"].includes(error.code)) {
throw error
}
}
}
async function start({ port, directory, types }) {
async function internalStart() {
track("CLI_START")
await registerInstrumentation(directory)
const app = express()
const http_ = http.createServer(async (req, res) => {
await start.traceRequestHandler(
async () => {
return new Promise((resolve) => {
res.on("finish", resolve)
app(req, res)
})
},
req,
res
)
})
try {
const { shutdown, gqlSchema } = await loaders({
directory,
@@ -33,7 +71,7 @@ export default async function ({ port, directory, types }) {
const serverActivity = logger.activity(`Creating server`)
const server = GracefulShutdownServer.create(
app.listen(port).on("listening", () => {
http_.listen(port).on("listening", () => {
logger.success(serverActivity, `Server is ready on port: ${port}`)
track("CLI_START_COMPLETED")
})
@@ -68,5 +106,19 @@ export default async function ({ port, directory, types }) {
}
}
await start()
await internalStart()
}
/**
* Wrap request handler inside custom implementation to enabled
* instrumentation.
*/
start.traceRequestHandler = async (
requestHandler: () => Promise<void>,
_: IncomingMessage,
__: ServerResponse
) => {
return await requestHandler()
}
export default start

View File

@@ -5,3 +5,4 @@ export * from "./types/middlewares"
export * from "./types/routing"
export * from "./types/subscribers"
export * from "./utils"
export * from "./instrumentation"

View File

@@ -0,0 +1,151 @@
import { snakeCase } from "lodash"
import { NodeSDK } from "@opentelemetry/sdk-node"
import { Resource } from "@opentelemetry/resources"
import { SpanStatusCode } from "@opentelemetry/api"
import { RoutesLoader, Tracer } from "@medusajs/framework"
import {
type SpanExporter,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-node"
import { PgInstrumentation } from "@opentelemetry/instrumentation-pg"
import type { Instrumentation } from "@opentelemetry/instrumentation"
import start from "../commands/start"
const EXCLUDED_RESOURCES = [".vite", "virtual:"]
function shouldExcludeResource(resource: string) {
return EXCLUDED_RESOURCES.some((excludedResource) =>
resource.includes(excludedResource)
)
}
/**
* Instrumenting the first touch point of the Http layer to report traces to
* OpenTelemetry
*/
export function instrumentHttpLayer() {
const HTTPTracer = new Tracer("@medusajs/http", "2.0.0")
start.traceRequestHandler = async (requestHandler, req, res) => {
if (shouldExcludeResource(req.url!)) {
return await requestHandler()
}
const traceName = `${req.method} ${req.url}`
await HTTPTracer.trace(traceName, async (span) => {
span.setAttributes({
"http.url": req.url,
"http.method": req.method,
...req.headers,
})
try {
await requestHandler()
} finally {
span.setAttributes({ "http.statusCode": res.statusCode })
span.end()
}
})
}
/**
* Instrumenting the route handler to report traces to
* OpenTelemetry
*/
RoutesLoader.instrument.route((handler) => {
const traceName = `route: ${
handler.name ? snakeCase(handler.name) : `anonymous`
}`
return async (req, res) => {
if (shouldExcludeResource(req.originalUrl)) {
return await handler(req, res)
}
await HTTPTracer.trace(traceName, async (span) => {
try {
await handler(req, res)
} catch (error) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: error.message || "Failed",
})
} finally {
span.end()
}
})
}
})
/**
* Instrumenting the middleware handler to report traces to
* OpenTelemetry
*/
RoutesLoader.instrument.middleware((handler) => {
const traceName = `middleware: ${
handler.name ? snakeCase(handler.name) : `anonymous`
}`
return async (req, res, next) => {
if (shouldExcludeResource(req.originalUrl)) {
return handler(req, res, next)
}
await HTTPTracer.trace(traceName, async (span) => {
return new Promise<void>((resolve, reject) => {
const _next = (error?: any) => {
if (error) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: error.message || "Failed",
})
span.end()
reject(error)
} else {
span.end()
resolve()
}
}
handler(req, res, _next)
})
})
.catch(next)
.then(next)
}
})
}
/**
* A helper function to configure the OpenTelemetry SDK with some defaults.
* For better/more control, please configure the SDK manually.
*
* You will have to install the following packages within your app for
* telemetry to work
*
* - @opentelemetry/sdk-node
* - @opentelemetry/resources
* - @opentelemetry/sdk-trace-node
* - @opentelemetry/instrumentation-pg
* - @opentelemetry/instrumentation
*/
export function registerOtel(options: {
serviceName: string
exporter: SpanExporter
instrumentations?: Instrumentation[]
}) {
const sdk = new NodeSDK({
serviceName: options.serviceName,
resource: new Resource({
"service.name": options.serviceName,
}),
spanProcessor: new SimpleSpanProcessor(options.exporter),
instrumentations: [
new PgInstrumentation(),
...(options.instrumentations || []),
],
})
sdk.start()
return sdk
}

600
yarn.lock
View File

@@ -4700,6 +4700,30 @@ __metadata:
languageName: node
linkType: hard
"@grpc/grpc-js@npm:^1.7.1":
version: 1.11.2
resolution: "@grpc/grpc-js@npm:1.11.2"
dependencies:
"@grpc/proto-loader": ^0.7.13
"@js-sdsl/ordered-map": ^4.4.2
checksum: d69a1db3726d7a09a54394971bd54c77dfc2e8f48b23384771a2074ecc947b240ea065b4f1d74300e76fd47d7914071460d98702bd1512b7a9d6085eac6a6012
languageName: node
linkType: hard
"@grpc/proto-loader@npm:^0.7.13":
version: 0.7.13
resolution: "@grpc/proto-loader@npm:0.7.13"
dependencies:
lodash.camelcase: ^4.3.0
long: ^5.0.0
protobufjs: ^7.2.5
yargs: ^17.7.2
bin:
proto-loader-gen-types: build/bin/proto-loader-gen-types.js
checksum: dc8ed7aa1454c15e224707cc53d84a166b98d76f33606a9f334c7a6fb1aedd3e3614dcd2c2b02a6ffaf140587d19494f93b3a56346c6c2e26bc564f6deddbbf3
languageName: node
linkType: hard
"@hapi/boom@npm:^10.0.1":
version: 10.0.1
resolution: "@hapi/boom@npm:10.0.1"
@@ -5397,6 +5421,13 @@ __metadata:
languageName: node
linkType: hard
"@js-sdsl/ordered-map@npm:^4.4.2":
version: 4.4.2
resolution: "@js-sdsl/ordered-map@npm:4.4.2"
checksum: cc7e15dc4acf6d9ef663757279600bab70533d847dcc1ab01332e9e680bd30b77cdf9ad885cc774276f51d98b05a013571c940e5b360985af5eb798dc1a2ee2b
languageName: node
linkType: hard
"@jsdevtools/ono@npm:^7.1.3":
version: 7.1.3
resolution: "@jsdevtools/ono@npm:7.1.3"
@@ -6140,6 +6171,11 @@ __metadata:
"@medusajs/types": ^1.11.16
"@medusajs/utils": ^1.11.9
"@medusajs/workflows-sdk": ^0.1.6
"@opentelemetry/instrumentation": ^0.53.0
"@opentelemetry/instrumentation-pg": ^0.44.0
"@opentelemetry/resources": ^1.26.0
"@opentelemetry/sdk-node": ^0.53.0
"@opentelemetry/sdk-trace-node": ^1.26.0
"@swc/core": 1.5.7
"@swc/helpers": ^0.5.11
"@swc/jest": ^0.2.36
@@ -7238,13 +7274,355 @@ __metadata:
languageName: node
linkType: hard
"@opentelemetry/api@npm:^1.9.0":
"@opentelemetry/api-logs@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/api-logs@npm:0.53.0"
dependencies:
"@opentelemetry/api": ^1.0.0
checksum: 969ad3bbb74e3de6fdfe8eb9b3ab86d3dc284ca7bffd0ca67eef64efd08c97a4305696afe0b7b03e5d356f15d0a1a67ac517e5fa7d1ddee6fdc249eef2209fcb
languageName: node
linkType: hard
"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.9.0":
version: 1.9.0
resolution: "@opentelemetry/api@npm:1.9.0"
checksum: 9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add
languageName: node
linkType: hard
"@opentelemetry/context-async-hooks@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/context-async-hooks@npm:1.26.0"
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 76ed53be50a472cbfe26a62620cb2a34f031474d08d302d31eb95d71cac2ed1567c6fa302c7ac5498e9d467d7d8e64f8d0e58c5c8b7bd987a352baafe5d9b213
languageName: node
linkType: hard
"@opentelemetry/core@npm:1.26.0, @opentelemetry/core@npm:^1.1.0":
version: 1.26.0
resolution: "@opentelemetry/core@npm:1.26.0"
dependencies:
"@opentelemetry/semantic-conventions": 1.27.0
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 8038a3b9124a0b3b48dceb3949f88726c6853eac33b79fc049856f78dcf4b7ee453db1e6f4d5205a79b315caba809cb7d2f853946cf14773e50ce6a87fd5260e
languageName: node
linkType: hard
"@opentelemetry/exporter-logs-otlp-grpc@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.53.0"
dependencies:
"@grpc/grpc-js": ^1.7.1
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-grpc-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/sdk-logs": 0.53.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: b09fa8d15ff1879aab2b7de3cdf3fbde86985e8db8d5a3d7d617971402798a0f95b58a892940d14699f92621910721151e7398793ca9581a17764353b8bf6b68
languageName: node
linkType: hard
"@opentelemetry/exporter-logs-otlp-http@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/sdk-logs": 0.53.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 85f0babba08cd2cba209284d0efaba3a993ebbc0ae0703c7545d013eb58bc9c52351fb5b99f9f3155bca03a54a5c12e32114f7f583b627d634c24a5e911e0e7d
languageName: node
linkType: hard
"@opentelemetry/exporter-logs-otlp-proto@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-logs": 0.53.0
"@opentelemetry/sdk-trace-base": 1.26.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 82dd9e6d6c1199d4cf1d35e8a87953ebf3354b277c8016dc75b092ddeafd1633ddf0a796a067acedf1490f64850613bfba00311d116862c8d77ad3a5a85ca971
languageName: node
linkType: hard
"@opentelemetry/exporter-trace-otlp-grpc@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.53.0"
dependencies:
"@grpc/grpc-js": ^1.7.1
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-grpc-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 7933e1d4ed2ea8c470a7d7783de0ed84adcbf125a11420c67842f17f5d68baefdb6e7db9635287b22eb3cec6f2fd791ab4f5c7eb22152a4c0c2ce9a201b0b110
languageName: node
linkType: hard
"@opentelemetry/exporter-trace-otlp-http@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.53.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 234fd44b87608e9332e9756a93db41b86ea5a976fb3b66242b79df05bce73256435fe767fd1dd2304ffac6fc8c49ea44c6b31b52fbff12d4ca120e2b49efce30
languageName: node
linkType: hard
"@opentelemetry/exporter-trace-otlp-proto@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.53.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: fa1b2d67d20fccbb14252c9edb56c9d47ae305fa211f17cc8a3213f2645c5aa9f47334bb0a4b636dd0bfba8509199d3577a8a517f618be738b3ac2e5b5e078ab
languageName: node
linkType: hard
"@opentelemetry/exporter-zipkin@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/exporter-zipkin@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
"@opentelemetry/semantic-conventions": 1.27.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 062cedd03fd2cc4c98468143ab19ae87697b3195f7b33419f71a23428bc910ca5e2783882ca42a38aa0c05d8d321403c18c6cc1dbb12d8b37ae1549b0b3cf5e6
languageName: node
linkType: hard
"@opentelemetry/instrumentation-pg@npm:^0.44.0":
version: 0.44.0
resolution: "@opentelemetry/instrumentation-pg@npm:0.44.0"
dependencies:
"@opentelemetry/instrumentation": ^0.53.0
"@opentelemetry/semantic-conventions": ^1.27.0
"@opentelemetry/sql-common": ^0.40.1
"@types/pg": 8.6.1
"@types/pg-pool": 2.0.6
peerDependencies:
"@opentelemetry/api": ^1.3.0
checksum: d20db7b7791d40cf65751dc9d79feae8694b2eb156985ef1dc1ee3ff9a230424305b24534192d9f234b87465b47d6b622e8f9e001e4665ea17d9017825835b80
languageName: node
linkType: hard
"@opentelemetry/instrumentation@npm:0.53.0, @opentelemetry/instrumentation@npm:^0.53.0":
version: 0.53.0
resolution: "@opentelemetry/instrumentation@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@types/shimmer": ^1.2.0
import-in-the-middle: ^1.8.1
require-in-the-middle: ^7.1.1
semver: ^7.5.2
shimmer: ^1.2.1
peerDependencies:
"@opentelemetry/api": ^1.3.0
checksum: 943e289926812272cb77cda5e0a6b662bc6a92812b66420ceeca1c764f2e3a13364f6bbed7c9e84a17ad677474101ea3c598ef6a6cca982c35bfd24be6f6a25e
languageName: node
linkType: hard
"@opentelemetry/otlp-exporter-base@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/otlp-exporter-base@npm:0.53.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-transformer": 0.53.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: bc68d59106c095627bfbc522b9c3c7e1770e0d9e5e5abfd1912585209cd892ded1ac06002c57015ca51c5335fed2f82ab6c1fb7ac23686621eb72cc890c4dfdc
languageName: node
linkType: hard
"@opentelemetry/otlp-grpc-exporter-base@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.53.0"
dependencies:
"@grpc/grpc-js": ^1.7.1
"@opentelemetry/core": 1.26.0
"@opentelemetry/otlp-exporter-base": 0.53.0
"@opentelemetry/otlp-transformer": 0.53.0
peerDependencies:
"@opentelemetry/api": ^1.0.0
checksum: 8a1b616d8b5026998c3744fdb76c6ee986ca6cfd8efb30d51bf6ed8bd6a58fa73f0e433a9074d0e8c2af9138ad25be451fbd0a3be1c90772417ecec2a269cfb0
languageName: node
linkType: hard
"@opentelemetry/otlp-transformer@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/otlp-transformer@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-logs": 0.53.0
"@opentelemetry/sdk-metrics": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
protobufjs: ^7.3.0
peerDependencies:
"@opentelemetry/api": ^1.3.0
checksum: d9a43bb00ce5386aeb477cd95e72cd86114ed01b2e11e8f39c3988aa2bb56cbda16b533ffd55396ed374961c32e1cc76face565e21b6cedcc85e844776912666
languageName: node
linkType: hard
"@opentelemetry/propagator-b3@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/propagator-b3@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 7b1e42872929b167a2d4155732d9253adfec65a307dbb05509b88ade2d7f68a8759714141a17c8e646199ad80a60529c02a45098a1fcce27f0cf0c69d90932d3
languageName: node
linkType: hard
"@opentelemetry/propagator-jaeger@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/propagator-jaeger@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 167a250f0c10223897f24335025af848b8fe0e5c550eafb5e9a011f301243faf3633ad74caebc6b38dfaac4ed4b138b1bf8149a33eadc2816c3d405d955fbc25
languageName: node
linkType: hard
"@opentelemetry/resources@npm:1.26.0, @opentelemetry/resources@npm:^1.26.0":
version: 1.26.0
resolution: "@opentelemetry/resources@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/semantic-conventions": 1.27.0
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 62ffbf7edee8676055661cf608b32a52bfa46fedb1a88830b4d4d0faf6664edbcbf7922034d3690d11fe9ebef9d9f5ffcb05645e8c7b27c707bf57d5289617e9
languageName: node
linkType: hard
"@opentelemetry/sdk-logs@npm:0.53.0":
version: 0.53.0
resolution: "@opentelemetry/sdk-logs@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/resources": 1.26.0
peerDependencies:
"@opentelemetry/api": ">=1.4.0 <1.10.0"
checksum: bd47e9a70966c53ac7b394ba0f27a4400b4fdebfbe781027f53457954b79b1c821301936bc87f5fe09a462af579c02c4fa27f353b6d9a1dca0b760cc284ec068
languageName: node
linkType: hard
"@opentelemetry/sdk-metrics@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/sdk-metrics@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/resources": 1.26.0
peerDependencies:
"@opentelemetry/api": ">=1.3.0 <1.10.0"
checksum: 640a0dcfa4af73a029ef57b51f8ecc1d08dfb0c3a5242552876fab36c7f9ae7c410fa52dbc5202a2d8675fcfe61df3c49205079963f1c11acfe42981d1d01a76
languageName: node
linkType: hard
"@opentelemetry/sdk-node@npm:^0.53.0":
version: 0.53.0
resolution: "@opentelemetry/sdk-node@npm:0.53.0"
dependencies:
"@opentelemetry/api-logs": 0.53.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/exporter-logs-otlp-grpc": 0.53.0
"@opentelemetry/exporter-logs-otlp-http": 0.53.0
"@opentelemetry/exporter-logs-otlp-proto": 0.53.0
"@opentelemetry/exporter-trace-otlp-grpc": 0.53.0
"@opentelemetry/exporter-trace-otlp-http": 0.53.0
"@opentelemetry/exporter-trace-otlp-proto": 0.53.0
"@opentelemetry/exporter-zipkin": 1.26.0
"@opentelemetry/instrumentation": 0.53.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/sdk-logs": 0.53.0
"@opentelemetry/sdk-metrics": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
"@opentelemetry/sdk-trace-node": 1.26.0
"@opentelemetry/semantic-conventions": 1.27.0
peerDependencies:
"@opentelemetry/api": ">=1.3.0 <1.10.0"
checksum: 77b9d054dae897408f96cf0a411a3668d7a61766c21eaa7781d551b56d19d1b8d267ece10ac80731ba9416fb474e9d34c86de79f3f038595e8742b3292b93e35
languageName: node
linkType: hard
"@opentelemetry/sdk-trace-base@npm:1.26.0":
version: 1.26.0
resolution: "@opentelemetry/sdk-trace-base@npm:1.26.0"
dependencies:
"@opentelemetry/core": 1.26.0
"@opentelemetry/resources": 1.26.0
"@opentelemetry/semantic-conventions": 1.27.0
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 0d5fc19179375f1599edae91b7232f432faf8631746835a10d0cd0c4907d0ca3ed156cc8087d4e78efdfbd9ba5ba414cc9e1399172c2aa68d7e0cd5190394d87
languageName: node
linkType: hard
"@opentelemetry/sdk-trace-node@npm:1.26.0, @opentelemetry/sdk-trace-node@npm:^1.26.0":
version: 1.26.0
resolution: "@opentelemetry/sdk-trace-node@npm:1.26.0"
dependencies:
"@opentelemetry/context-async-hooks": 1.26.0
"@opentelemetry/core": 1.26.0
"@opentelemetry/propagator-b3": 1.26.0
"@opentelemetry/propagator-jaeger": 1.26.0
"@opentelemetry/sdk-trace-base": 1.26.0
semver: ^7.5.2
peerDependencies:
"@opentelemetry/api": ">=1.0.0 <1.10.0"
checksum: 6924c565b4d187810c48a7b92215f8f986a8831bc24620856aaaeb057bf19dd8916f070a77cc45aa76182f6b70b534749274ba168d27941f0ed752d171ca3b51
languageName: node
linkType: hard
"@opentelemetry/semantic-conventions@npm:1.27.0, @opentelemetry/semantic-conventions@npm:^1.27.0":
version: 1.27.0
resolution: "@opentelemetry/semantic-conventions@npm:1.27.0"
checksum: b859773ba06b7e53dd9c6b45a171bf3000e405733adbf462ae91004ed011bc80edb5beecb817fb344a085adfd06045ab5b729c9bd0f1479650ad377134fb798c
languageName: node
linkType: hard
"@opentelemetry/sql-common@npm:^0.40.1":
version: 0.40.1
resolution: "@opentelemetry/sql-common@npm:0.40.1"
dependencies:
"@opentelemetry/core": ^1.1.0
peerDependencies:
"@opentelemetry/api": ^1.1.0
checksum: 60a70358f0c94f610e2995333e96b406626d67d03d38ed03b15a3461ad0f8d64afbf6275cca7cb58fe955ecdce832f3ffc9b73f9d88503bba5d2a620bbd6d351
languageName: node
linkType: hard
"@peculiar/asn1-schema@npm:^2.3.8":
version: 2.3.13
resolution: "@peculiar/asn1-schema@npm:2.3.13"
@@ -7285,6 +7663,79 @@ __metadata:
languageName: node
linkType: hard
"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/aspromise@npm:1.1.2"
checksum: a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f
languageName: node
linkType: hard
"@protobufjs/base64@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/base64@npm:1.1.2"
checksum: eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6
languageName: node
linkType: hard
"@protobufjs/codegen@npm:^2.0.4":
version: 2.0.4
resolution: "@protobufjs/codegen@npm:2.0.4"
checksum: 26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43
languageName: node
linkType: hard
"@protobufjs/eventemitter@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/eventemitter@npm:1.1.0"
checksum: 1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70
languageName: node
linkType: hard
"@protobufjs/fetch@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/fetch@npm:1.1.0"
dependencies:
"@protobufjs/aspromise": ^1.1.1
"@protobufjs/inquire": ^1.1.0
checksum: cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233
languageName: node
linkType: hard
"@protobufjs/float@npm:^1.0.2":
version: 1.0.2
resolution: "@protobufjs/float@npm:1.0.2"
checksum: 18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069
languageName: node
linkType: hard
"@protobufjs/inquire@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/inquire@npm:1.1.0"
checksum: 64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a
languageName: node
linkType: hard
"@protobufjs/path@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/path@npm:1.1.2"
checksum: cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4
languageName: node
linkType: hard
"@protobufjs/pool@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/pool@npm:1.1.0"
checksum: eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038
languageName: node
linkType: hard
"@protobufjs/utf8@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/utf8@npm:1.1.0"
checksum: a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487
languageName: node
linkType: hard
"@radix-ui/number@npm:1.0.1":
version: 1.0.1
resolution: "@radix-ui/number@npm:1.0.1"
@@ -13434,6 +13885,15 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:>=13.7.0":
version: 22.5.4
resolution: "@types/node@npm:22.5.4"
dependencies:
undici-types: ~6.19.2
checksum: b445daa7eecd761ad4d778b882d6ff7bcc3b4baad2086ea9804db7c5d4a4ab0298b00d7f5315fc640a73b5a1d52bbf9628e09c9fec0cf44dbf9b4df674a8717d
languageName: node
linkType: hard
"@types/node@npm:^12.7.1":
version: 12.20.55
resolution: "@types/node@npm:12.20.55"
@@ -13505,6 +13965,37 @@ __metadata:
languageName: node
linkType: hard
"@types/pg-pool@npm:2.0.6":
version: 2.0.6
resolution: "@types/pg-pool@npm:2.0.6"
dependencies:
"@types/pg": "*"
checksum: 41965d4d0b677c54ce45d36add760e496d356b78019cb062d124af40287cf6b0fd4d86e3b0085f443856c185983a60c8b0795ff76d15683e2a93c62f5ac0125f
languageName: node
linkType: hard
"@types/pg@npm:*":
version: 8.11.9
resolution: "@types/pg@npm:8.11.9"
dependencies:
"@types/node": "*"
pg-protocol: "*"
pg-types: ^4.0.1
checksum: fec741d90db9a627d4aa5e4852b34dade1b374de8eaf6a819dbdb43b309282f71f1331fcb99b79bd32a45be36fb7006c2e2ebc3762c0b51fdf766f86838d62e7
languageName: node
linkType: hard
"@types/pg@npm:8.6.1":
version: 8.6.1
resolution: "@types/pg@npm:8.6.1"
dependencies:
"@types/node": "*"
pg-protocol: "*"
pg-types: ^2.2.0
checksum: 8d16660c9a4f050d6d5e391c59f9a62e9d377a2a6a7eb5865f8828082dbdfeab700fd707e585f42d67b29e796b32863aea5bd6d5cbb8ceda2d598da5d0c61693
languageName: node
linkType: hard
"@types/pg@npm:^8.6.6":
version: 8.11.6
resolution: "@types/pg@npm:8.11.6"
@@ -13640,6 +14131,13 @@ __metadata:
languageName: node
linkType: hard
"@types/shimmer@npm:^1.2.0":
version: 1.2.0
resolution: "@types/shimmer@npm:1.2.0"
checksum: 6f7bfe1b55601cfc3ae713fc74a03341f3834253b8b91cb2add926d5949e4a63f7e666f59c2a6e40a883a5f9e2f3e3af10f9d3aed9b60fced0bda87659e58d8d
languageName: node
linkType: hard
"@types/simple-oauth2@npm:^5.0.7":
version: 5.0.7
resolution: "@types/simple-oauth2@npm:5.0.7"
@@ -14375,6 +14873,15 @@ __metadata:
languageName: node
linkType: hard
"acorn-import-attributes@npm:^1.9.5":
version: 1.9.5
resolution: "acorn-import-attributes@npm:1.9.5"
peerDependencies:
acorn: ^8
checksum: 5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d
languageName: node
linkType: hard
"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2":
version: 5.3.2
resolution: "acorn-jsx@npm:5.3.2"
@@ -16171,6 +16678,13 @@ __metadata:
languageName: node
linkType: hard
"cjs-module-lexer@npm:^1.2.2":
version: 1.4.1
resolution: "cjs-module-lexer@npm:1.4.1"
checksum: 5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc
languageName: node
linkType: hard
"classnames@npm:^2.3.2":
version: 2.5.1
resolution: "classnames@npm:2.5.1"
@@ -17633,6 +18147,18 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:^4.3.5":
version: 4.3.7
resolution: "debug@npm:4.3.7"
dependencies:
ms: ^2.1.3
peerDependenciesMeta:
supports-color:
optional: true
checksum: 1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b
languageName: node
linkType: hard
"decamelize-keys@npm:^1.1.0":
version: 1.1.1
resolution: "decamelize-keys@npm:1.1.1"
@@ -21429,6 +21955,18 @@ __metadata:
languageName: node
linkType: hard
"import-in-the-middle@npm:^1.8.1":
version: 1.11.0
resolution: "import-in-the-middle@npm:1.11.0"
dependencies:
acorn: ^8.8.2
acorn-import-attributes: ^1.9.5
cjs-module-lexer: ^1.2.2
module-details-from-path: ^1.0.3
checksum: b5b52b635450f69640289b9b597fef796ef9aa6c231ae22583a1c2e97bd1b61aa0048d7fc143b4af3ec5bffb7d64131302ed0882f62e0e2d60f0a4f009daff3f
languageName: node
linkType: hard
"import-lazy@npm:~4.0.0":
version: 4.0.0
resolution: "import-lazy@npm:4.0.0"
@@ -24121,6 +24659,13 @@ __metadata:
languageName: node
linkType: hard
"long@npm:^5.0.0":
version: 5.2.3
resolution: "long@npm:5.2.3"
checksum: 6a0da658f5ef683b90330b1af76f06790c623e148222da9d75b60e266bbf88f803232dd21464575681638894a84091616e7f89557aa087fd14116c0f4e0e43d9
languageName: node
linkType: hard
"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
@@ -25067,6 +25612,13 @@ __metadata:
languageName: node
linkType: hard
"module-details-from-path@npm:^1.0.3":
version: 1.0.3
resolution: "module-details-from-path@npm:1.0.3"
checksum: 3d881f3410c142e4c2b1307835a2862ba04e5b3ec6e90655614a0ee2c4b299b4c1d117fb525d2435bf436990026f18d338a197b54ad6bd36252f465c336ff423
languageName: node
linkType: hard
"moment@npm:^2.19.3, moment@npm:~2.30.1":
version: 2.30.1
resolution: "moment@npm:2.30.1"
@@ -25115,7 +25667,7 @@ __metadata:
languageName: node
linkType: hard
"ms@npm:2.1.3, ms@npm:^2.1.1":
"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
@@ -26535,7 +27087,7 @@ __metadata:
languageName: node
linkType: hard
"pg-types@npm:^2.1.0":
"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0":
version: 2.2.0
resolution: "pg-types@npm:2.2.0"
dependencies:
@@ -27569,6 +28121,26 @@ __metadata:
languageName: node
linkType: hard
"protobufjs@npm:^7.2.5, protobufjs@npm:^7.3.0":
version: 7.4.0
resolution: "protobufjs@npm:7.4.0"
dependencies:
"@protobufjs/aspromise": ^1.1.2
"@protobufjs/base64": ^1.1.2
"@protobufjs/codegen": ^2.0.4
"@protobufjs/eventemitter": ^1.1.0
"@protobufjs/fetch": ^1.1.0
"@protobufjs/float": ^1.0.2
"@protobufjs/inquire": ^1.1.0
"@protobufjs/path": ^1.1.2
"@protobufjs/pool": ^1.1.0
"@protobufjs/utf8": ^1.1.0
"@types/node": ">=13.7.0"
long: ^5.0.0
checksum: a5460a63fe596523b9a067cbce39a6b310d1a71750fda261f076535662aada97c24450e18c5bc98a27784f70500615904ff1227e1742183509f0db4fdede669b
languageName: node
linkType: hard
"proxy-addr@npm:~2.0.5, proxy-addr@npm:~2.0.7":
version: 2.0.7
resolution: "proxy-addr@npm:2.0.7"
@@ -28738,6 +29310,17 @@ __metadata:
languageName: node
linkType: hard
"require-in-the-middle@npm:^7.1.1":
version: 7.4.0
resolution: "require-in-the-middle@npm:7.4.0"
dependencies:
debug: ^4.3.5
module-details-from-path: ^1.0.3
resolve: ^1.22.8
checksum: 67c2242ea5b059c2a10c01d4f409233c67278051b47b9bf83198ab7e3ea591ffe3fa1d97912180d7d3d9a5e44490c00c55882b702849d61ac4db87d2c3823cb0
languageName: node
linkType: hard
"require-main-filename@npm:^2.0.0":
version: 2.0.0
resolution: "require-main-filename@npm:2.0.0"
@@ -28825,7 +29408,7 @@ __metadata:
languageName: node
linkType: hard
"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:~1.22.1":
"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8, resolve@npm:~1.22.1":
version: 1.22.8
resolution: "resolve@npm:1.22.8"
dependencies:
@@ -28860,7 +29443,7 @@ __metadata:
languageName: node
linkType: hard
"resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.2#~builtin<compat/resolve>, resolve@patch:resolve@~1.22.1#~builtin<compat/resolve>":
"resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.17.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.8#~builtin<compat/resolve>, resolve@patch:resolve@~1.22.1#~builtin<compat/resolve>":
version: 1.22.8
resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin<compat/resolve>::version=1.22.8&hash=07638b"
dependencies:
@@ -29781,6 +30364,13 @@ __metadata:
languageName: node
linkType: hard
"shimmer@npm:^1.2.1":
version: 1.2.1
resolution: "shimmer@npm:1.2.1"
checksum: ae8b27c389db2a00acfc8da90240f11577685a8f3e40008f826a3bea8b4f3b3ecd305c26be024b4a0fd3b123d132c1569d6e238097960a9a543b6c60760fb46a
languageName: node
linkType: hard
"should-equal@npm:^2.0.0":
version: 2.0.0
resolution: "should-equal@npm:2.0.0"