From 343c7726bf0663bab388c227856292cf058424d3 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 17 Sep 2025 19:34:35 -0400 Subject: [PATCH 01/61] first attempt at otel logs support --- README.md | 76 +- docs/API.md | 120 + package.json | 1 + packages/dd-trace/src/config.js | 21 +- packages/dd-trace/src/config_defaults.js | 8 + packages/dd-trace/src/plugin_manager.js | 2 + packages/dd-trace/src/proxy.js | 57 + .../src/supported-configurations.json | 15 + yarn.lock | 2484 +++++++++-------- 9 files changed, 1676 insertions(+), 1108 deletions(-) diff --git a/README.md b/README.md index c434aeb846a..32a7b8210df 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,80 @@ If you would like to trace your bundled application then please read this page o Please refer to the [SECURITY.md](https://github.com/DataDog/dd-trace-js/blob/master/SECURITY.md) document if you have found a security issue. -## Datadog With OpenTelemetery +## Datadog With OpenTelemetry Please refer to the [Node.js Custom Instrumentation using OpenTelemetry API](https://docs.datadoghq.com/tracing/trace_collection/custom_instrumentation/nodejs/otel/) document. It includes information on how to use the OpenTelemetry API with dd-trace-js. + +### OpenTelemetry Logs Support + +dd-trace-js includes experimental support for OpenTelemetry logs, allowing you to send log data using the OpenTelemetry Logs API. This implementation is based on the [OpenTelemetry Logs specification](https://opentelemetry.io/docs/specs/otel/logs/overview/) and follows the [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/). + +#### Configuration + +Enable OpenTelemetry logs using standard OpenTelemetry environment variables: + +```bash +# Enable OpenTelemetry logs +export OTEL_LOGS_EXPORTER=otlp + +# OTLP endpoint URL +export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs + +# Optional headers (JSON format) +export OTEL_EXPORTER_OTLP_LOGS_HEADERS='{"Authorization": "Bearer token"}' + +# Request timeout in milliseconds +export OTEL_EXPORTER_OTLP_TIMEOUT=10000 + +# Batch timeout in milliseconds +export OTEL_BSP_SCHEDULE_DELAY=5000 + +# Maximum number of log records per batch +export OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512 + +# Maximum queue size +export OTEL_BSP_MAX_QUEUE_SIZE=2048 + +# Export timeout in milliseconds +export OTEL_BSP_EXPORT_TIMEOUT=30000 +``` + +#### Usage + +```javascript +const tracer = require('dd-trace').init() +const { logs } = require('@opentelemetry/api-logs') + +// Get a logger from OpenTelemetry API +const logger = logs.getLogger('my-service', '1.0.0') + +// Log messages +logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Application started', + attributes: { version: '1.0.0' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'ERROR', + severityNumber: 17, + body: 'Database connection failed', + attributes: { error: 'timeout' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'DEBUG', + severityNumber: 5, + body: 'Processing request', + attributes: { requestId: '123' }, + timestamp: Date.now() * 1000000 +}) +``` + +For more information about OpenTelemetry logs, see: +- [OpenTelemetry Logs Overview](https://opentelemetry.io/docs/specs/otel/logs/overview/) +- [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) +- [OTLP Protocol](https://opentelemetry.io/docs/specs/otlp/) diff --git a/docs/API.md b/docs/API.md index 6f8b4b179aa..ba106b24642 100644 --- a/docs/API.md +++ b/docs/API.md @@ -379,6 +379,126 @@ The following attributes are available to override Datadog-specific options: * `resource.name`: The resource name to be used for this span. The operation name will be used if this is not provided. * `span.type`: The span type to be used for this span. Will fallback to `custom` if not provided. +

OpenTelemetry Logs

+ +dd-trace-js includes experimental support for OpenTelemetry logs, implementing the [OpenTelemetry Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) specification. This allows you to send structured log data using the OpenTelemetry standard. + +#### Configuration + +Enable OpenTelemetry logs using standard OpenTelemetry environment variables: + +```bash +# Enable OpenTelemetry logs +export OTEL_LOGS_EXPORTER=otlp + +# OTLP endpoint URL +export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs + +# Optional headers (JSON format) +export OTEL_EXPORTER_OTLP_LOGS_HEADERS='{"Authorization": "Bearer token"}' + +# Request timeout in milliseconds +export OTEL_EXPORTER_OTLP_TIMEOUT=10000 + +# Batch timeout in milliseconds +export OTEL_BSP_SCHEDULE_DELAY=5000 + +# Maximum number of log records per batch +export OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512 + +# Maximum queue size +export OTEL_BSP_MAX_QUEUE_SIZE=2048 + +# Export timeout in milliseconds +export OTEL_BSP_EXPORT_TIMEOUT=30000 +``` + +#### LoggerProvider + +The LoggerProvider is the main entry point for creating loggers. It follows the [OpenTelemetry LoggerProvider specification](https://opentelemetry.io/docs/specs/otel/logs/sdk/#loggerprovider): + +```javascript +const tracer = require('dd-trace').init() +const { logs } = require('@opentelemetry/api-logs') + +// Get a logger from OpenTelemetry API +const logger = logs.getLogger('my-service', '1.0.0') +``` + +#### Logger Usage + +Loggers support the standard OpenTelemetry log levels and methods: + +```javascript +// Different log levels +logger.emit({ + severityText: 'DEBUG', + severityNumber: 5, + body: 'Debug message', + attributes: { debug: 'info' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Info message', + attributes: { user: 'john' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'WARN', + severityNumber: 13, + body: 'Warning message', + attributes: { warning: 'deprecated' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'ERROR', + severityNumber: 17, + body: 'Error message', + attributes: { error: 'connection failed' }, + timestamp: Date.now() * 1000000 +}) + +logger.emit({ + severityText: 'FATAL', + severityNumber: 21, + body: 'Fatal message', + attributes: { error: 'system crash' }, + timestamp: Date.now() * 1000000 +}) + +// Custom log record +logger.emit({ + severityText: 'INFO', + severityNumber: 9, // INFO level + body: 'Custom log message', + attributes: { custom: 'data' }, + timestamp: Date.now() * 1000000 // nanoseconds +}) +``` + +#### OTLP Export + +Logs are exported using the [OTLP (OpenTelemetry Protocol)](https://opentelemetry.io/docs/specs/otlp/) over HTTP. The implementation includes: + +- **Batch Processing**: Logs are batched for efficient transmission +- **Protobuf Serialization**: Uses Protocol Buffers for compact data format +- **Automatic Retries**: Built-in retry logic for failed exports +- **Resource Attributes**: Automatic service metadata injection + +#### References + +For more information about OpenTelemetry logs: + +* [OpenTelemetry Logs Overview](https://opentelemetry.io/docs/specs/otel/logs/overview/) +* [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) +* [OTLP Protocol Specification](https://opentelemetry.io/docs/specs/otlp/) +* [OpenTelemetry Logs SDK](https://opentelemetry.io/docs/specs/otel/logs/sdk/) +

Advanced Configuration

Tracer settings

diff --git a/package.json b/package.json index 2ddf51abb96..0164fdcd47d 100644 --- a/package.json +++ b/package.json @@ -122,6 +122,7 @@ "@datadog/wasm-js-rewriter": "4.0.1", "@isaacs/ttlcache": "^1.4.1", "@opentelemetry/api": ">=1.0.0 <1.10.0", + "@opentelemetry/api-logs": "^0.205.0", "@opentelemetry/core": ">=1.14.0 <1.31.0", "crypto-randomuuid": "^1.0.0", "dc-polyfill": "^0.1.10", diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index fec44bf5cd7..b0f7badc861 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -568,6 +568,7 @@ class Config { DD_INSTRUMENTATION_TELEMETRY_ENABLED, DD_INSTRUMENTATION_CONFIG_ID, DD_LOGS_INJECTION, + DD_LOGS_OTEL_ENABLED, DD_LANGCHAIN_SPAN_CHAR_LIMIT, DD_LANGCHAIN_SPAN_PROMPT_COMPLETION_SAMPLE_RATE, DD_LLMOBS_AGENTLESS_ENABLED, @@ -649,7 +650,15 @@ class Config { OTEL_RESOURCE_ATTRIBUTES, OTEL_SERVICE_NAME, OTEL_TRACES_SAMPLER, - OTEL_TRACES_SAMPLER_ARG + OTEL_TRACES_SAMPLER_ARG, + OTEL_LOGS_EXPORTER, + OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, + OTEL_EXPORTER_OTLP_LOGS_HEADERS, + OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_BSP_SCHEDULE_DELAY, + OTEL_BSP_MAX_EXPORT_BATCH_SIZE, + OTEL_BSP_MAX_QUEUE_SIZE, + OTEL_BSP_EXPORT_TIMEOUT } = getEnvironmentVariables() const tags = {} @@ -778,6 +787,14 @@ class Config { this._setBoolean(env, 'llmobs.enabled', DD_LLMOBS_ENABLED) this._setString(env, 'llmobs.mlApp', DD_LLMOBS_ML_APP) this._setBoolean(env, 'logInjection', DD_LOGS_INJECTION) + this._setBoolean(env, 'otelLogsEnabled', DD_LOGS_OTEL_ENABLED) + this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) + this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS) + this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT) + this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) + this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) + this._setUnit(env, 'otelLogsMaxQueueSize', OTEL_BSP_MAX_QUEUE_SIZE) + this._setUnit(env, 'otelLogsExportTimeoutMillis', OTEL_BSP_EXPORT_TIMEOUT) // Requires an accompanying DD_APM_OBFUSCATION_MEMCACHED_KEEP_COMMAND=true in the agent this._setBoolean(env, 'memcachedCommandEnabled', DD_TRACE_MEMCACHED_COMMAND_ENABLED) this._setBoolean(env, 'middlewareTracingEnabled', DD_TRACE_MIDDLEWARE_TRACING_ENABLED) @@ -1185,6 +1202,8 @@ class Config { calc.testManagementAttemptToFixRetries = coalesce(maybeInt(DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES), 20) this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED)) } + + calc['dogstatsd.hostname'] = this._getHostname() this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 12449b3b8c7..1f1205740be 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -119,6 +119,14 @@ module.exports = { isTestManagementEnabled: false, isImpactedTestsEnabled: false, logInjection: true, + otelLogsEnabled: false, + otelLogsUrl: 'http://localhost:4318/v1/logs', + otelLogsHeaders: {}, + otelLogsTimeout: 10000, + otelLogsBatchTimeout: 5000, + otelLogsMaxExportBatchSize: 512, + otelLogsMaxQueueSize: 2048, + otelLogsExportTimeoutMillis: 30000, lookup: undefined, inferredProxyServicesEnabled: false, memcachedCommandEnabled: false, diff --git a/packages/dd-trace/src/plugin_manager.js b/packages/dd-trace/src/plugin_manager.js index 119417bac17..db1bfef3cce 100644 --- a/packages/dd-trace/src/plugin_manager.js +++ b/packages/dd-trace/src/plugin_manager.js @@ -159,6 +159,7 @@ module.exports = class PluginManager { memcachedCommandEnabled, ciVisibilityTestSessionName, ciVisAgentlessLogSubmissionEnabled, + otelLogsEnabled, isTestDynamicInstrumentationEnabled, isServiceUserProvided, middlewareTracingEnabled, @@ -178,6 +179,7 @@ module.exports = class PluginManager { clientIpHeader, ciVisibilityTestSessionName, ciVisAgentlessLogSubmissionEnabled, + otelLogsEnabled, isTestDynamicInstrumentationEnabled, isServiceUserProvided, traceWebsocketMessagesEnabled, diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 1fbc744b99b..37834e6e8b2 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -201,6 +201,13 @@ class Tracer extends NoopProxy { } } + // Initialize OpenTelemetry logs if enabled via environment variable + try { + this._initializeOpenTelemetryLogs(config) + } catch (error) { + log.error('Error initializing OpenTelemetry logs:', error) + } + if (config.isTestDynamicInstrumentationEnabled) { const getDynamicInstrumentationClient = require('./ci-visibility/dynamic-instrumentation') // We instantiate the client but do not start the Worker here. The worker is started lazily @@ -261,6 +268,55 @@ class Tracer extends NoopProxy { } } + _initializeOpenTelemetryLogs (config) { + try { + // Check if OpenTelemetry logs are enabled via config or environment variable + if (!config.otelLogsEnabled) { + return + } + + const { LoggerProvider, BatchLogProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') + const { logs } = require('@opentelemetry/api-logs') + + // Create logger provider + const loggerProvider = new LoggerProvider({ + resource: { + attributes: { + 'service.name': config.service, + 'service.version': config.version, + 'deployment.environment': config.env + } + } + }) + + // Create OTLP exporter using config values with environment variable fallbacks + const exporter = new OtlpHttpLogExporter({ + url: config.otelLogsUrl || process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, + headers: config.otelLogsHeaders || (process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS ? + JSON.parse(process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS) : {}), + timeout: config.otelLogsTimeout || parseInt(process.env.OTEL_EXPORTER_OTLP_TIMEOUT) || 10000 + }) + + // Create batch processor using config values with environment variable fallbacks + const processor = new BatchLogProcessor([exporter], { + batchTimeout: config.otelLogsBatchTimeout || parseInt(process.env.OTEL_BSP_SCHEDULE_DELAY) || 5000, + maxExportBatchSize: config.otelLogsMaxExportBatchSize || parseInt(process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE) || 512, + maxQueueSize: config.otelLogsMaxQueueSize || parseInt(process.env.OTEL_BSP_MAX_QUEUE_SIZE) || 2048, + exportTimeoutMillis: config.otelLogsExportTimeoutMillis || parseInt(process.env.OTEL_BSP_EXPORT_TIMEOUT) || 30000 + }) + + // Add processor to logger provider + loggerProvider.addLogProcessor(processor) + + // Register the logger provider globally with OpenTelemetry API + logs.setGlobalLoggerProvider(loggerProvider) + + log.debug('OpenTelemetry logs initialized successfully') + } catch (error) { + log.error('Failed to initialize OpenTelemetry logs:', error) + } + } + profilerStarted () { if (!this._profilerStarted) { // injection hardening: this is only ever invoked from tests. @@ -277,6 +333,7 @@ class Tracer extends NoopProxy { get TracerProvider () { return require('./opentelemetry/tracer_provider') } + } module.exports = Tracer diff --git a/packages/dd-trace/src/supported-configurations.json b/packages/dd-trace/src/supported-configurations.json index d7ba7a014a8..ce19de0232b 100644 --- a/packages/dd-trace/src/supported-configurations.json +++ b/packages/dd-trace/src/supported-configurations.json @@ -112,6 +112,14 @@ "DD_LLMOBS_ML_APP": ["A"], "DD_LOG_LEVEL": ["A"], "DD_LOGS_INJECTION": ["A"], + "DD_LOGS_OTEL_ENABLED": ["A"], + "DD_LOGS_OTEL_URL": ["A"], + "DD_LOGS_OTEL_HEADERS": ["A"], + "DD_LOGS_OTEL_TIMEOUT": ["A"], + "DD_LOGS_OTEL_BATCH_TIMEOUT": ["A"], + "DD_LOGS_OTEL_MAX_EXPORT_BATCH_SIZE": ["A"], + "DD_LOGS_OTEL_MAX_QUEUE_SIZE": ["A"], + "DD_LOGS_OTEL_EXPORT_TIMEOUT_MILLIS": ["A"], "DD_MINI_AGENT_PATH": ["A"], "DD_OPENAI_LOGS_ENABLED": ["A"], "DD_OPENAI_SPAN_CHAR_LIMIT": ["A"], @@ -429,6 +437,13 @@ "DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE": ["A"], "OTEL_LOG_LEVEL": ["A"], "OTEL_LOGS_EXPORTER": ["A"], + "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": ["A"], + "OTEL_EXPORTER_OTLP_LOGS_HEADERS": ["A"], + "OTEL_EXPORTER_OTLP_TIMEOUT": ["A"], + "OTEL_BSP_SCHEDULE_DELAY": ["A"], + "OTEL_BSP_MAX_EXPORT_BATCH_SIZE": ["A"], + "OTEL_BSP_MAX_QUEUE_SIZE": ["A"], + "OTEL_BSP_EXPORT_TIMEOUT": ["A"], "OTEL_METRICS_EXPORTER": ["A"], "OTEL_PROPAGATORS": ["A"], "OTEL_RESOURCE_ATTRIBUTES": ["A"], diff --git a/yarn.lock b/yarn.lock index 6c76e3b0c5f..7228b4b7063 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,139 +2,262 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.27.1": +"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.27.2": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" - integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== +"@babel/code-frame@^7.22.13": + version "7.23.5" + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.19.3": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz" + integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.23.5": + version "7.23.5" -"@babel/core@^7.5.5", "@babel/core@^7.7.5": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" - integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== +"@babel/core@^7.0.0-0", "@babel/core@^7.5.5": + version "7.23.6" dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.6" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" - integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== +"@babel/core@^7.0.0", "@babel/core@^7.7.5": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.19.3", "@babel/generator@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz" + integrity sha1-F9Ch6mti81HSgTUKX4C4eoEMR1U=sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== dependencies: - "@babel/parser" "^7.28.0" - "@babel/types" "^7.28.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" + "@babel/types" "^7.23.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.27.1": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== +"@babel/generator@^7.23.6": + version "7.23.6" dependencies: - "@babel/types" "^7.27.3" + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" + integrity sha1-lhWdth00op26RUyVn1rkpkm6kWc=sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" + integrity sha1-H5o829WyaYpnDDDSc1+a+V7VJ1k=sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-module-transforms@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" + "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1": +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.27.6": +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + +"@babel/helpers@^7.19.0", "@babel/helpers@^7.27.6": version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" -"@babel/parser@^7.27.2", "@babel/parser@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" - integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== +"@babel/helpers@^7.23.6": + version "7.23.6" + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.19.3", "@babel/parser@^7.23.5", "@babel/parser@^7.27.2": + version "7.28.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== dependencies: - "@babel/types" "^7.28.0" + "@babel/types" "^7.28.4" + +"@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" "@babel/helper-compilation-targets" "^7.20.7" @@ -142,98 +265,111 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-syntax-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-transform-destructuring@^7.5.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" - integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== + version "7.23.3" dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.0" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-parameters@^7.20.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== + version "7.23.3" dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.3.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" - integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== + version "7.23.4" dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" -"@babel/template@^7.27.2": +"@babel/template@^7.18.10", "@babel/template@^7.22.15", "@babel/template@^7.27.2": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: "@babel/code-frame" "^7.27.1" "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz" + integrity sha1-9Ua/mrqe8rBCwOANJFmQwVUI5+w=sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.5" + "@babel/types" "^7.23.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.23.6": + version "7.23.6" + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" debug "^4.3.1" + globals "^11.1.0" -"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.0", "@babel/types@^7.28.4": +"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5", "@babel/types@^7.27.1", "@babel/types@^7.28.4": version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz" integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.22.15", "@babel/types@^7.23.4", "@babel/types@^7.23.6": + version "7.23.6" + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@datadog/libdatadog@0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@datadog/libdatadog/-/libdatadog-0.7.0.tgz#81e07d3040c628892db697ccd01ae3c4d2a76315" + resolved "https://registry.npmjs.org/@datadog/libdatadog/-/libdatadog-0.7.0.tgz" integrity sha512-VVZLspzQcfEU47gmGCVoRkngn7RgFRR4CHjw4YaX8eWT+xz4Q4l6PvA45b7CMk9nlt3MNN5MtGdYttYMIpo6Sg== "@datadog/native-appsec@10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-10.2.1.tgz#1f62ceefb8e1686b202703ee6c3f245f4dff2d70" + resolved "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-10.2.1.tgz" integrity sha512-FwRVo+otgNaz6vN74XVrBT8GdLwxPwAqOjH4Y9VQJaC1RiHmzRCMr77AhHFme1xi7zPG2LQqQN/cmOzG+sbrtQ== dependencies: node-gyp-build "^3.9.0" "@datadog/native-iast-taint-tracking@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-4.0.0.tgz#a774742e6723b93d58bf31a87728e4da1634074f" + resolved "https://registry.npmjs.org/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-4.0.0.tgz" integrity sha512-2uF8RnQkJO5bmLi26Zkhxg+RFJn/uEsesYTflScI/Cz/BWv+792bxI+OaCKvhgmpLkm8EElenlpidcJyZm7GYw== dependencies: node-gyp-build "^3.9.0" "@datadog/native-metrics@3.1.1": version "3.1.1" - resolved "https://registry.yarnpkg.com/@datadog/native-metrics/-/native-metrics-3.1.1.tgz#4e5c9775751af13e353e64e573ab724104538cee" + resolved "https://registry.npmjs.org/@datadog/native-metrics/-/native-metrics-3.1.1.tgz" integrity sha512-MU1gHrolwryrU4X9g+fylA1KPH3S46oqJPEtVyrO+3Kh29z80fegmtyrU22bNt8LigPUK/EdPCnSbMe88QbnxQ== dependencies: node-addon-api "^6.1.0" @@ -241,7 +377,7 @@ "@datadog/pprof@5.10.0": version "5.10.0" - resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-5.10.0.tgz#47e9589c6d9c423470e312e00def06e249672571" + resolved "https://registry.npmjs.org/@datadog/pprof/-/pprof-5.10.0.tgz" integrity sha512-tEMhLeOM78FHC/rTltDd7pQN8WPAUZ1b0BPadYsKWqo/v6jWTbF6xeIMojdJa5yIW2vHjDU4LFJpkFFNacHpQw== dependencies: delay "^5.0.0" @@ -252,12 +388,12 @@ "@datadog/sketches-js@2.1.1": version "2.1.1" - resolved "https://registry.yarnpkg.com/@datadog/sketches-js/-/sketches-js-2.1.1.tgz#9ec2251b3c932b4f43e1d164461fa6cb6f28b7d0" + resolved "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-2.1.1.tgz" integrity sha512-d5RjycE+MObE/hU+8OM5Zp4VjTwiPLRa8299fj7muOmR16fb942z8byoMbCErnGh0lBevvgkGrLclQDvINbIyg== "@datadog/wasm-js-rewriter@4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@datadog/wasm-js-rewriter/-/wasm-js-rewriter-4.0.1.tgz#883535e97f6b88b15427f93b5dc5d2d3a01c02b6" + resolved "https://registry.npmjs.org/@datadog/wasm-js-rewriter/-/wasm-js-rewriter-4.0.1.tgz" integrity sha512-JRa05Je6gw+9+3yZnm/BroQZrEfNwRYCxms56WCCHzOBnoPihQLB0fWy5coVJS29kneCUueUvBvxGp6NVXgdqw== dependencies: js-yaml "^4.1.0" @@ -266,20 +402,20 @@ node-gyp-build "^4.5.0" "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz#0e3b5e45566d1bce1ec47d8aae2fc2ad77ad0894" - integrity sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q== + version "4.9.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.21.0": version "0.21.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz" integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== dependencies: "@eslint/object-schema" "^2.1.6" @@ -288,19 +424,19 @@ "@eslint/config-helpers@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz#d316e47905bd0a1a931fa50e669b9af4104d1617" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz" integrity sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA== "@eslint/core@^0.15.2": version "0.15.2" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.2.tgz#59386327d7862cc3603ebc7c78159d2dcc4a868f" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz" integrity sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" @@ -313,19 +449,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.35.0", "@eslint/js@^9.29.0": +"@eslint/js@^9.29.0", "@eslint/js@9.35.0": version "9.35.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.35.0.tgz#ffbc7e13cf1204db18552e9cd9d4a8e17c692d07" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz" integrity sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw== "@eslint/object-schema@^2.1.6": version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.3.3", "@eslint/plugin-kit@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz#fd8764f0ee79c8ddab4da65460c641cefee017c5" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz" integrity sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w== dependencies: "@eslint/core" "^0.15.2" @@ -333,35 +469,30 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + version "0.16.7" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== dependencies: "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/retry" "^0.4.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -373,8 +504,6 @@ "@isaacs/import-jsx@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/import-jsx/-/import-jsx-4.0.1.tgz#493cab5fc543a0703dba7c3f5947d6499028a169" - integrity sha512-l34FEsEqpdYdGcQjRCxWy+7rHY6euUbOBz9FI+Mq6oQeVhNegHcXFSJxVxrJvOpO31NbnDjS74quKXDlPDearA== dependencies: "@babel/core" "^7.5.5" "@babel/plugin-proposal-object-rest-spread" "^7.5.5" @@ -388,12 +517,12 @@ "@isaacs/ttlcache@^1.4.1": version "1.4.1" - resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" + resolved "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz" integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -404,56 +533,77 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.12" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" - integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.3" dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" - integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" - integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" + integrity sha1-cuRXB88kD6awgdA2b4JlsM0QGX8=sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@jsep-plugin/assignment@^1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@jsep-plugin/assignment/-/assignment-1.3.0.tgz#fcfc5417a04933f7ceee786e8ab498aa3ce2b242" + resolved "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz" integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== "@jsep-plugin/regex@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@jsep-plugin/regex/-/regex-1.0.4.tgz#cb2fc423220fa71c609323b9ba7f7d344a755fcc" + resolved "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz" integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== "@msgpack/msgpack@^3.1.2": version "3.1.2" - resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-3.1.2.tgz#fdd25cc2202297519798bbaf4689152ad9609e19" + resolved "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz" integrity sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ== "@octokit/app@^16.0.1": - version "16.0.1" - resolved "https://registry.yarnpkg.com/@octokit/app/-/app-16.0.1.tgz#a2a2b7a830dd978c86e6cc4f19da77a1f7964a67" - integrity sha512-kgTeTsWmpUX+s3Fs4EK4w1K+jWCDB6ClxLSWUWTyhlw7+L3jHtuXDR4QtABu2GsmCMdk67xRhruiXotS3ay3Yw== + version "16.1.0" + resolved "https://registry.npmjs.org/@octokit/app/-/app-16.1.0.tgz" + integrity sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA== dependencies: - "@octokit/auth-app" "^8.0.1" + "@octokit/auth-app" "^8.1.0" "@octokit/auth-unauthenticated" "^7.0.1" "@octokit/core" "^7.0.2" "@octokit/oauth-app" "^8.0.1" @@ -461,10 +611,10 @@ "@octokit/types" "^14.0.0" "@octokit/webhooks" "^14.0.0" -"@octokit/auth-app@^8.0.1": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.0.2.tgz#d44d59697421a4456e345e959a96a635e5e73bef" - integrity sha512-dLTmmA9gUlqiAJZgozfOsZFfpN/OldH3xweb7lqSnngax5Rs+PfO5dDlokaBfc41H1xOtsLYV5QqR0DkBAtPmw== +"@octokit/auth-app@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.1.0.tgz" + integrity sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ== dependencies: "@octokit/auth-oauth-app" "^9.0.1" "@octokit/auth-oauth-user" "^6.0.0" @@ -477,7 +627,7 @@ "@octokit/auth-oauth-app@^9.0.1": version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.1.tgz#d8d2e950c95e9fcbe6f2fb98d4539ee8c9871766" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.1.tgz" integrity sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g== dependencies: "@octokit/auth-oauth-device" "^8.0.1" @@ -488,7 +638,7 @@ "@octokit/auth-oauth-device@^8.0.1": version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.1.tgz#232ec13e299dd6bf199fe237527d04ec12decffb" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.1.tgz" integrity sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw== dependencies: "@octokit/oauth-methods" "^6.0.0" @@ -498,7 +648,7 @@ "@octokit/auth-oauth-user@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.0.tgz#ba643060824536cd848c72d835061b1c00007286" + resolved "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.0.tgz" integrity sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A== dependencies: "@octokit/auth-oauth-device" "^8.0.1" @@ -509,33 +659,33 @@ "@octokit/auth-token@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz" integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== "@octokit/auth-unauthenticated@^7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.1.tgz#427b8a52e672318f84757307e766a448c741116b" + resolved "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.1.tgz" integrity sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ== dependencies: "@octokit/request-error" "^7.0.0" "@octokit/types" "^14.0.0" -"@octokit/core@^7.0.2": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.3.tgz#0b5288995fed66920128d41cfeea34979d48a360" - integrity sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ== +"@octokit/core@^7.0.0", "@octokit/core@^7.0.2", "@octokit/core@>=6", "@octokit/core@>=7": + version "7.0.4" + resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.4.tgz" + integrity sha512-jOT8V1Ba5BdC79sKrRWDdMT5l1R+XNHTPR6CPWzUP2EcfAcvIHZWF0eAbmRcpOOP5gVIwnqNg0C4nvh6Abc3OA== dependencies: "@octokit/auth-token" "^6.0.0" "@octokit/graphql" "^9.0.1" "@octokit/request" "^10.0.2" "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" + "@octokit/types" "^15.0.0" before-after-hook "^4.0.0" universal-user-agent "^7.0.0" "@octokit/endpoint@^11.0.0": version "11.0.0" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.0.tgz#189fcc022721b4c49d0307eea6be3de1cfb53026" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz" integrity sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ== dependencies: "@octokit/types" "^14.0.0" @@ -543,7 +693,7 @@ "@octokit/graphql@^9.0.1": version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.1.tgz#eb258fc9981403d2d751720832652c385b6c1613" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz" integrity sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg== dependencies: "@octokit/request" "^10.0.2" @@ -552,7 +702,7 @@ "@octokit/oauth-app@^8.0.1": version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-8.0.1.tgz#7cb889945c3ccacfd0ff9aa9f05e9748b439f7f3" + resolved "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.1.tgz" integrity sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ== dependencies: "@octokit/auth-oauth-app" "^9.0.1" @@ -566,12 +716,12 @@ "@octokit/oauth-authorization-url@^8.0.0": version "8.0.0" - resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz#fdbab39a07d38faaad8621a5fdf04bc0c36d63e7" + resolved "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz" integrity sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ== "@octokit/oauth-methods@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-6.0.0.tgz#a138bbbec6762b52249f7c47d0c548fc1cf6ad7b" + resolved "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.0.tgz" integrity sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA== dependencies: "@octokit/oauth-authorization-url" "^8.0.0" @@ -581,36 +731,41 @@ "@octokit/openapi-types@^25.1.0": version "25.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-25.1.0.tgz#5a72a9dfaaba72b5b7db375fd05e90ca90dc9682" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz" integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== +"@octokit/openapi-types@^26.0.0": + version "26.0.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz" + integrity sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA== + "@octokit/openapi-webhooks-types@12.0.3": version "12.0.3" - resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.0.3.tgz#fa44fb31fbb4c444c5fd640dbbf537f00c20617c" + resolved "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.0.3.tgz" integrity sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA== "@octokit/plugin-paginate-graphql@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz#acdefd7e85ce24716e7ad7352f2df4d29d0e273b" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz" integrity sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ== "@octokit/plugin-paginate-rest@^13.0.0": version "13.1.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz#ca5bb1c7b85a583691263c1f788f607e9bcb74b3" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz" integrity sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw== dependencies: "@octokit/types" "^14.1.0" "@octokit/plugin-rest-endpoint-methods@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz#ba30ca387fc2ac8bd93cf9f951174736babebd97" - integrity sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g== + version "16.1.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz" + integrity sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw== dependencies: - "@octokit/types" "^14.1.0" + "@octokit/types" "^15.0.0" "@octokit/plugin-retry@^8.0.1": version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz#ee4a0487d31b97ad3deaf737faad68abeca3c227" + resolved "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz" integrity sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw== dependencies: "@octokit/request-error" "^7.0.0" @@ -619,7 +774,7 @@ "@octokit/plugin-throttling@^11.0.1": version "11.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz#31a0b5e759f0313514d9522a4103360f17ffc2e4" + resolved "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz" integrity sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw== dependencies: "@octokit/types" "^14.0.0" @@ -627,14 +782,14 @@ "@octokit/request-error@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.0.0.tgz#48ae2cd79008315605d00e83664891a10a5ddb97" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz" integrity sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg== dependencies: "@octokit/types" "^14.0.0" "@octokit/request@^10.0.2": version "10.0.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.3.tgz#2ffdb88105ce20d25dcab8a592a7040ea48306c7" + resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz" integrity sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== dependencies: "@octokit/endpoint" "^11.0.0" @@ -645,70 +800,84 @@ "@octokit/types@^14.0.0", "@octokit/types@^14.1.0": version "14.1.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-14.1.0.tgz#3bf9b3a3e3b5270964a57cc9d98592ed44f840f2" + resolved "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz" integrity sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g== dependencies: "@octokit/openapi-types" "^25.1.0" +"@octokit/types@^15.0.0": + version "15.0.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz" + integrity sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ== + dependencies: + "@octokit/openapi-types" "^26.0.0" + "@octokit/webhooks-methods@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz#34abf78aec6f826fe561cfe79d2ebb1950d1d25f" + resolved "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz" integrity sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ== "@octokit/webhooks@^14.0.0": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-14.1.1.tgz#88b873779acdddcc568a20ebb32aa72c1afa4b7c" - integrity sha512-4kN/yPhcZEP+X7iMMuBTk+dD4ZGOpU57F7kHKrFlD2SSY/Sxh01t79oVn4npchLdPIXvLKrQw0uBXhmEaiZAdw== + version "14.1.3" + resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.1.3.tgz" + integrity sha512-gcK4FNaROM9NjA0mvyfXl0KPusk7a1BeA8ITlYEZVQCXF5gcETTd4yhAU0Kjzd8mXwYHppzJBWgdBVpIR9wUcQ== dependencies: "@octokit/openapi-webhooks-types" "12.0.3" "@octokit/request-error" "^7.0.0" "@octokit/webhooks-methods" "^6.0.0" -"@opentelemetry/api@>=1.0.0 <1.10.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" - integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== +"@opentelemetry/api-logs@^0.205.0": + version "0.205.0" + resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.205.0.tgz" + integrity sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg== + dependencies: + "@opentelemetry/api" "^1.3.0" + +"@opentelemetry/api@^1.3.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.0.0 <1.5.0": + version "1.4.1" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz" + integrity sha1-/yLrLl1Hb7wkUKGW5A3SQ8wgwo8=sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== "@opentelemetry/core@>=1.14.0 <1.31.0": - version "1.30.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27" - integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== + version "1.14.0" + resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz" + integrity sha1-ZOh2spy3NsmE1UFkzUdDP1E+r9M=sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw== sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw== dependencies: - "@opentelemetry/semantic-conventions" "1.28.0" + "@opentelemetry/semantic-conventions" "1.14.0" -"@opentelemetry/semantic-conventions@1.28.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" - integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== +"@opentelemetry/semantic-conventions@1.14.0": + version "1.14.0" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz" + integrity sha1-anKbfzcs4w93o/IXwJvCFvhj/Ms=sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug== sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug== "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -716,72 +885,79 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" + integrity sha1-/UylsGNVQwfoMntFZL1W07c5JKM=sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + "@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" - integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers@^13.0.1": version "13.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz" integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== dependencies: "@sinonjs/commons" "^3.0.1" +"@sinonjs/fake-timers@11.2.2": + version "11.2.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz" + integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/samsam@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" - integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== + version "8.0.0" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz" + integrity sha1-DUiMke+z+hRC4mq+qBdZ38i1rGA=sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== dependencies: - "@sinonjs/commons" "^3.0.1" + "@sinonjs/commons" "^2.0.0" lodash.get "^4.4.2" - type-detect "^4.1.0" + type-detect "^4.0.8" "@sinonjs/text-encoding@^0.7.3": version "0.7.3" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" + resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz" integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== "@stylistic/eslint-plugin@^5.0.0": version "5.3.1" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz#1aead935023b708ca6a27d079b1a96b726a38fe2" + resolved "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz" integrity sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg== dependencies: "@eslint-community/eslint-utils" "^4.7.0" @@ -793,75 +969,60 @@ "@types/aws-lambda@^8.10.83": version "8.10.152" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.152.tgz#f68424a8175f0a54a2a941e65b76c3f51f3bd89d" + resolved "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz" integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== "@types/estree@^1.0.6": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@>=13.7.0": - version "22.13.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" - integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== - dependencies: - undici-types "~6.20.0" - -"@types/node@^18.19.106": - version "18.19.124" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.124.tgz#6f49e4fab8274910691a900e8a14316cbf3c7a31" - integrity sha512-hY4YWZFLs3ku6D2Gqo3RchTd9VRCcrjqp/I0mmohYeUVA5Y8eCXKJEasHxLAJVZRJuQogfd1GiJ9lgogBgKeuQ== +"@types/node@^18.19.106", "@types/node@>=13.7.0": + version "18.19.126" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.126.tgz" + integrity sha512-8AXQlBfrGmtYJEJUPs63F/uZQqVeFiN9o6NUjbDJYfxNxFnArlZufANPw4h6dGhYGKxcyw+TapXFvEsguzIQow== dependencies: undici-types "~5.26.4" "@types/prop-types@*": - version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" - integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + version "15.7.11" -"@types/react@^17.0.52": - version "17.0.87" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.87.tgz#998a5e146fbea449986d95a794c0aff47f12b6e6" - integrity sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g== +"@types/react@^17.0.52", "@types/react@>=16.8.0": + version "17.0.73" dependencies: "@types/prop-types" "*" - "@types/scheduler" "^0.16" + "@types/scheduler" "*" csstype "^3.0.2" -"@types/scheduler@^0.16": +"@types/scheduler@*": version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/yoga-layout@1.9.2": version "1.9.2" - resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" - integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== "@typescript-eslint/types@^8.41.0": - version "8.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.42.0.tgz#ae15c09cebda20473772902033328e87372db008" - integrity sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw== + version "8.44.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz" + integrity sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== accepts@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== dependencies: mime-types "^3.0.0" @@ -869,22 +1030,22 @@ accepts@^2.0.0: acorn-import-attributes@^1.9.5: version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.14.0, acorn@^8.15.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.14.0, acorn@^8.15.0: version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -892,7 +1053,7 @@ aggregate-error@^3.0.0: ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -902,41 +1063,42 @@ ajv@^6.12.4: ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^3.2.1: + version "3.2.1" + dependencies: + color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== ansicolors@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -944,36 +1106,36 @@ anymatch@~3.1.2: append-field@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== append-transform@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: default-require-extensions "^3.0.0" archy@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -981,7 +1143,7 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-includes@^3.1.9: version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== dependencies: call-bind "^1.0.8" @@ -995,7 +1157,7 @@ array-includes@^3.1.9: array.prototype.findlastindex@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== dependencies: call-bind "^1.0.8" @@ -1008,7 +1170,7 @@ array.prototype.findlastindex@^1.2.6: array.prototype.flat@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: call-bind "^1.0.8" @@ -1018,7 +1180,7 @@ array.prototype.flat@^1.3.3: array.prototype.flatmap@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: call-bind "^1.0.8" @@ -1028,7 +1190,7 @@ array.prototype.flatmap@^1.3.3: arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -1041,44 +1203,40 @@ arraybuffer.prototype.slice@^1.0.4: assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-function@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-hook-domain@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/async-hook-domain/-/async-hook-domain-2.0.4.tgz#5a24910982c04394ea33dd442860f80cce2d972c" + resolved "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz" integrity sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== auto-bind@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" - integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axios@^1.12.2: version "1.12.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" + resolved "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz" integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== dependencies: follow-redirects "^1.15.6" @@ -1087,35 +1245,40 @@ axios@^1.12.2: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +baseline-browser-mapping@^2.8.3: + version "2.8.5" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.5.tgz" + integrity sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q== + before-after-hook@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz" integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== benchmark@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + resolved "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz" integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== dependencies: lodash "^4.17.4" platform "^1.3.3" binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bind-obj-methods@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz#65b66544d9d668d80dfefe2089dd347ad1dbcaed" + resolved "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz" integrity sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw== body-parser@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== dependencies: bytes "^3.1.2" @@ -1130,71 +1293,80 @@ body-parser@^2.2.0: bottleneck@^2.15.3: version "2.19.5" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz" integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - fill-range "^7.1.1" + fill-range "^7.0.1" browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.24.0, browserslist@^4.25.1: - version "4.25.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" - integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== +browserslist@^4.21.3, browserslist@^4.25.3, "browserslist@>= 4.21.0": + version "4.26.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz" + integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== dependencies: - caniuse-lite "^1.0.30001726" - electron-to-chromium "^1.5.173" - node-releases "^2.0.19" + baseline-browser-mapping "^2.8.3" + caniuse-lite "^1.0.30001741" + electron-to-chromium "^1.5.218" + node-releases "^2.0.21" update-browserslist-db "^1.1.3" +browserslist@^4.22.2: + version "4.22.2" + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== builtin-modules@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-5.0.0.tgz#9be95686dedad2e9eed05592b07733db87dcff1a" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz" integrity sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg== busboy@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" -bytes@3.1.2, bytes@^3.1.2: +bytes@^3.1.2, bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== caching-transform@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: hasha "^5.0.0" @@ -1204,7 +1376,7 @@ caching-transform@^4.0.0: call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -1212,7 +1384,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -1222,7 +1394,7 @@ call-bind@^1.0.7, call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1230,49 +1402,49 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: caller-callsite@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-4.1.0.tgz#3e33cb1d910e7b09332d59a3503b9af7462f7295" - integrity sha512-99nnnGlJexTc41xwQTr+mWl15OI5PPczUJzM4YRE7QjkefMKCXGa5gfQjCOuVrD+1TjI/fevIDHg2nz3iYN5Ig== dependencies: callsites "^3.1.0" caller-path@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-3.0.1.tgz#bc932ecec3f943e10c2f8922146e23b132f932e4" - integrity sha512-fhmztL4wURO/BzwJUJ4aVRdnKEFskPBbrJ8fNgl7XdUiD1ygzzlt+nhPgUBSRq2ciEVubo6x+W8vJQzm55QLLQ== dependencies: caller-callsite "^4.1.0" -callsites@^3.0.0, callsites@^3.1.0: +callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +callsites@^3.1.0: + version "3.1.0" + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001726: - version "1.0.30001727" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" - integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== +caniuse-lite@^1.0.30001565: + version "1.0.30001570" + +caniuse-lite@^1.0.30001741: + version "1.0.30001743" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz" + integrity sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw== cardinal@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== dependencies: ansicolors "~0.3.2" redeyed "~2.1.0" -chai@^4.5.0: +chai@^4.0.0, chai@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz" integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" @@ -1283,17 +1455,30 @@ chai@^4.5.0: pathval "^1.1.1" type-detect "^4.1.0" +chalk@^2.4.2: + version "2.4.2" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1301,20 +1486,20 @@ chalk@^4.0.0, chalk@^4.1.0: change-case@^5.4.4: version "5.4.4" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" + resolved "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz" integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== check-error@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" chokidar@^3.3.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1328,61 +1513,53 @@ chokidar@^3.3.0: chokidar@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz" integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== cjs-module-lexer@^1.2.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha1-bDcKsZ+KM5TjGP5oJobsCsaE0Qc=sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== clean-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + resolved "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz" integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== dependencies: escape-string-regexp "^1.0.5" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" string-width "^4.2.0" cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -1391,7 +1568,7 @@ cliui@^6.0.0: cliui@^7.0.4: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1400,7 +1577,7 @@ cliui@^7.0.4: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -1409,53 +1586,59 @@ cliui@^8.0.1: code-excerpt@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" - integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== dependencies: convert-to-spaces "^1.0.1" +color-convert@^1.9.0: + version "1.9.3" + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + color-support@^1.1.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -1465,56 +1648,54 @@ concat-stream@^2.0.0: content-disposition@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== dependencies: safe-buffer "5.2.1" content-type@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha1-i3cxYmVtHRCGeEyPI6VM5tc9eRg=sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== convert-to-spaces@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== cookie-signature@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== cookie@^0.7.1: version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== core-js-compat@^3.44.0: - version "3.44.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" - integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== + version "3.45.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz" + integrity sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== dependencies: - browserslist "^4.25.1" + browserslist "^4.25.3" core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1523,17 +1704,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: crypto-randomuuid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz#acf583e5e085e867ae23e107ff70279024f9e9e7" + resolved "https://registry.npmjs.org/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz" integrity sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA== csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -1542,7 +1721,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -1551,7 +1730,7 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -1560,55 +1739,55 @@ data-view-byte-offset@^1.0.1: dc-polyfill@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.10.tgz#6f2ada1a9e449587c363ca98cfb79b443cf74b70" + resolved "https://registry.npmjs.org/dc-polyfill/-/dc-polyfill-0.1.10.tgz" integrity sha512-9iSbB8XZ7aIrhUtWI5ulEOJ+IyUN+axquodHK+bZO4r7HfY/xwmo6I4fYYf+aiDom+WMcN/wnzCz+pKvHDDCug== debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5, debug@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + version "4.1.3" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" + integrity sha1-fHd1UTCS99+Y2N+Zlt0IXrZozG0=sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== + version "3.0.0" + resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== dependencies: strip-bom "^4.0.0" define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1617,7 +1796,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1626,49 +1805,54 @@ define-properties@^1.2.1: delay@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@^2.0.0: +depd@^2.0.0, depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE=sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^4.0.1, diff@^4.0.2: +diff@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diff@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + resolved "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1677,45 +1861,48 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.173: - version "1.5.189" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.189.tgz#a5c41d2e5c64e2e6cd11bdf4eeeebc1ec8601e08" - integrity sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ== +electron-to-chromium@^1.4.601: + version "1.4.614" + +electron-to-chromium@^1.5.218: + version "1.5.221" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.221.tgz" + integrity sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== encodeurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== enhanced-resolve@^5.17.1: - version "5.18.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464" - integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== + version "5.18.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: version "1.24.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== dependencies: array-buffer-byte-length "^1.0.2" @@ -1775,24 +1962,24 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24 es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1802,14 +1989,14 @@ es-set-tostringtag@^2.1.0: es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: hasown "^2.0.2" es-to-primitive@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" @@ -1818,44 +2005,44 @@ es-to-primitive@^1.3.0: es6-error@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-compat-utils@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" + resolved "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz" integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== dependencies: semver "^7.5.4" eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -1864,21 +2051,21 @@ eslint-import-resolver-node@^0.3.9: eslint-module-utils@^2.12.1: version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz" integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== dependencies: debug "^3.2.7" eslint-plugin-cypress@^5.1.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-5.1.1.tgz#186dd252b4520ce81f59a7d7213050e5f748fa9f" + resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.1.1.tgz" integrity sha512-LxTmZf1LLh9EklZBVvKNEZj71X9tCJnlYDviAJGsOgEVc6jz+tBODSpm02CS/9eJOfRqGsmVyvIw7LHXQ13RaA== dependencies: globals "^16.2.0" eslint-plugin-es-x@^7.8.0: version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" + resolved "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz" integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== dependencies: "@eslint-community/eslint-utils" "^4.1.2" @@ -1887,7 +2074,7 @@ eslint-plugin-es-x@^7.8.0: eslint-plugin-import@^2.32.0: version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== dependencies: "@rtsao/scc" "^1.1.0" @@ -1912,7 +2099,7 @@ eslint-plugin-import@^2.32.0: eslint-plugin-mocha@^10.5.0: version "10.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz#0aca8d709e7cddef566e0dc252f6b02e307a2b7e" + resolved "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz" integrity sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw== dependencies: eslint-utils "^3.0.0" @@ -1920,9 +2107,9 @@ eslint-plugin-mocha@^10.5.0: rambda "^7.4.0" eslint-plugin-n@^17.20.0: - version "17.21.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz#a07592c28390ac742bf52acae89048c997a7b91c" - integrity sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw== + version "17.23.0" + resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.0.tgz" + integrity sha512-aPePGxUr5LezcXmMRBF83eK1MmqUYY1NdLdHC+jdpfc5b98eL7yDXY20gXJ6DcTxrHBhrLsfYYqo7J+m0h9YXQ== dependencies: "@eslint-community/eslint-utils" "^4.5.0" enhanced-resolve "^5.17.1" @@ -1936,14 +2123,14 @@ eslint-plugin-n@^17.20.0: eslint-plugin-promise@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz#a0652195700aea40b926dc3c74b38e373377bfb0" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz" integrity sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" eslint-plugin-unicorn@^60.0.0: version "60.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz#68f712bcb17e94bd176cce7312647ba1d1409c3c" + resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz" integrity sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" @@ -1967,7 +2154,7 @@ eslint-plugin-unicorn@^60.0.0: eslint-scope@^8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" @@ -1975,29 +2162,29 @@ eslint-scope@^8.4.0: eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@^9.29.0: +"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", eslint@^9.29.0, eslint@>=5, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=8, eslint@>=8.23.0, eslint@>=9, eslint@>=9.0.0, eslint@>=9.29.0: version "9.35.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.35.0.tgz#7a89054b7b9ee1dfd1b62035d8ce75547773f47e" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz" integrity sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg== dependencies: "@eslint-community/eslint-utils" "^4.8.0" @@ -2038,55 +2225,58 @@ eslint@^9.29.0: espree@^10.0.1, espree@^10.4.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: acorn "^8.15.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esprima@~4.0.0: + version "4.0.1" + esquery@^1.5.0, esquery@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== events-to-array@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" + resolved "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz" integrity sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA== express@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" + resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz" integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== dependencies: accepts "^2.0.0" @@ -2119,54 +2309,54 @@ express@^5.1.0: fast-content-type-parse@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz#5590b6c807cc598be125e6740a9fde589d2b7afb" + resolved "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz" integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-fifo@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-keys@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + resolved "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz" integrity sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA== dependencies: is-object "~1.0.1" merge-descriptors "~1.0.0" -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz" integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== dependencies: debug "^4.4.0" @@ -2178,7 +2368,7 @@ finalhandler@^2.1.0: find-cache-dir@^3.2.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -2187,12 +2377,20 @@ find-cache-dir@^3.2.0: find-up-simple@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" + resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz" integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2200,7 +2398,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2208,12 +2406,12 @@ find-up@^5.0.0: findit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" + resolved "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz" integrity sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg== flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -2221,29 +2419,29 @@ flat-cache@^4.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + version "1.15.11" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" foreground-child@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: cross-spawn "^7.0.0" @@ -2251,7 +2449,7 @@ foreground-child@^2.0.0: foreground-child@^3.1.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: cross-spawn "^7.0.6" @@ -2259,7 +2457,7 @@ foreground-child@^3.1.0: form-data@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" @@ -2270,47 +2468,47 @@ form-data@^4.0.4: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== fromentries@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-exists-cached@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" + resolved "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz" integrity sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function-loop@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/function-loop/-/function-loop-2.0.1.tgz#799c56ced01698cf12a1b80e4802e9dafc2ebada" + resolved "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz" integrity sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -2322,27 +2520,27 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -2358,17 +2556,17 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-port@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-proto@^1.0.0, get-proto@^1.0.1: +get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -2376,7 +2574,7 @@ get-proto@^1.0.0, get-proto@^1.0.1: get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -2385,28 +2583,28 @@ get-symbol-description@^1.1.0: get-tsconfig@^4.8.1: version "4.10.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz" integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^10.4.5: version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" @@ -2418,7 +2616,7 @@ glob@^10.4.5: glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2428,31 +2626,36 @@ glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^13.24.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.11.0: version "15.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== globals@^16.2.0, globals@^16.3.0: - version "16.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" - integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== + version "16.4.0" + resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz" + integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2460,63 +2663,68 @@ globalthis@^1.0.4: globrex@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.15, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== graphql@*: - version "16.11.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" - integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== + version "0.13.2" + resolved "https://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz" + integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog== + dependencies: + iterall "^1.2.1" has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.2: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasha@^5.0.0: version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" @@ -2524,24 +2732,24 @@ hasha@^5.0.0: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@2.0.0, http-errors@^2.0.0: +http-errors@^2.0.0, http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -2550,39 +2758,51 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -iconv-lite@0.6.3, iconv-lite@^0.6.3: +iconv-lite@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ignore@^5.2.0, ignore@^5.3.2: +iconv-lite@0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" + integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@^7.0.5: version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-in-the-middle@^1.14.2: version "1.14.2" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz#283661625a88ff7c0462bd2984f77715c3bc967c" + resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz" integrity sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw== dependencies: acorn "^8.14.0" @@ -2592,36 +2812,34 @@ import-in-the-middle@^1.14.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indent-string@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ink@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" - integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== dependencies: ansi-escapes "^4.2.1" auto-bind "4.0.0" @@ -2649,7 +2867,7 @@ ink@^3.2.0: internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -2658,12 +2876,12 @@ internal-slot@^1.1.0: ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -2672,7 +2890,7 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-async-function@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -2683,21 +2901,21 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -2705,33 +2923,31 @@ is-boolean-object@^1.2.1: is-builtin-module@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz#19df4b9c7451149b68176b0e06d18646db6308dd" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz" integrity sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA== dependencies: builtin-modules "^5.0.0" is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -2740,7 +2956,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -2748,51 +2964,48 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha1-8VWLrxrBfg3up8BBXEODUf8rPHI=sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" + has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -2800,27 +3013,27 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-object@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-promise@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -2830,24 +3043,24 @@ is-regex@^1.2.1: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -2855,7 +3068,7 @@ is-string@^1.1.1: is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -2864,36 +3077,36 @@ is-symbol@^1.0.4, is-symbol@^1.1.1: is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -2901,39 +3114,39 @@ is-weakset@^2.0.3: is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-hook@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: append-transform "^2.0.0" istanbul-lib-instrument@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -2943,7 +3156,7 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-processinfo@^2.0.2, istanbul-lib-processinfo@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: archy "^1.0.0" @@ -2954,17 +3167,17 @@ istanbul-lib-processinfo@^2.0.2, istanbul-lib-processinfo@^2.0.3: uuid "^8.3.2" istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" + make-dir "^3.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -2972,23 +3185,28 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterall@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + jackspeak@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-1.4.2.tgz#30ad5e4b7b36f9f3ae580e23272b1a386b4f6b93" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz" integrity sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q== dependencies: cliui "^7.0.4" jackspeak@^3.1.2: version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" @@ -2997,19 +3215,19 @@ jackspeak@^3.1.2: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" + integrity sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo=sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3017,61 +3235,69 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsep@^1.4.0: +jsep@^0.4.0||^1.0.0, jsep@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" + resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== -jsesc@^3.0.2, jsesc@^3.1.0: +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonpath-plus@^10.3.0: version "10.3.0" - resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz#59e22e4fa2298c68dfcd70659bb47f0cad525238" + resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz" integrity sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA== dependencies: "@jsep-plugin/assignment" "^1.3.0" @@ -3080,7 +3306,7 @@ jsonpath-plus@^10.3.0: jszip@^3.10.1: version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -3090,33 +3316,33 @@ jszip@^3.10.1: just-extend@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" + resolved "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz" integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" koalas@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/koalas/-/koalas-1.0.2.tgz#318433f074235db78fae5661a02a8ca53ee295cd" + resolved "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz" integrity sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" libtap@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/libtap/-/libtap-1.4.1.tgz#6e2ba70ddc39c676c9f887333c354fab6d359613" - integrity sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw== + version "1.4.0" + resolved "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz" + integrity sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg== dependencies: async-hook-domain "^2.0.4" bind-obj-methods "^3.0.0" @@ -3134,218 +3360,215 @@ libtap@^1.4.0: lie@~3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" limiter@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + resolved "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz" integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.sortby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.20: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + +lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" long@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96" - integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== + version "5.2.0" + resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" + integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== loose-envify@^1.1.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^7.14.0: version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - media-typer@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + merge-descriptors@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== merge-descriptors@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== mime-db@^1.54.0: version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@^2.1.12, mime-types@~2.1.24: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime-types@^3.0.0, mime-types@^3.0.1: +mime-types@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +mime-types@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== dependencies: mime-db "^1.54.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^3.1.5, minipass@^3.1.6, minipass@^3.3.4: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@^0.5.6: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@^11.6.0: version "11.7.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5" + resolved "https://registry.npmjs.org/mocha/-/mocha-11.7.2.tgz" integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ== dependencies: browser-stdout "^1.3.1" @@ -3371,22 +3594,25 @@ mocha@^11.6.0: module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" + resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz" integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== module-not-found-error@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + resolved "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz" integrity sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g== -ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@^2.1.2, ms@2.1.2: + version "2.1.2" + multer@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/multer/-/multer-2.0.2.tgz#08a8aa8255865388c387aaf041426b0c87bf58dd" + resolved "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz" integrity sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw== dependencies: append-field "^1.0.0" @@ -3399,24 +3625,24 @@ multer@^2.0.2: mutexify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/mutexify/-/mutexify-1.4.0.tgz#b7f4ac0273c81824b840887c6a6e0bfab14bbe94" + resolved "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz" integrity sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg== dependencies: queue-tick "^1.0.0" natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== nise@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a" + resolved "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz" integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g== dependencies: "@sinonjs/commons" "^3.0.1" @@ -3427,7 +3653,7 @@ nise@^6.0.0: nock@^13.5.6: version "13.5.6" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" + resolved "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz" integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" @@ -3436,39 +3662,42 @@ nock@^13.5.6: node-addon-api@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-gyp-build@<4.0, node-gyp-build@^3.9.0: +node-gyp-build@^3.9.0, node-gyp-build@<4.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz" integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== node-gyp-build@^4.5.0: version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== node-preload@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.14: + version "2.0.14" + +node-releases@^2.0.21: + version "2.0.21" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz" + integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== nyc@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" @@ -3501,22 +3730,22 @@ nyc@^15.1.0: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -3528,7 +3757,7 @@ object.assign@^4.1.7: object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -3538,7 +3767,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -3547,7 +3776,7 @@ object.groupby@^1.0.3: object.values@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: call-bind "^1.0.8" @@ -3557,7 +3786,7 @@ object.values@^1.2.1: octokit@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/octokit/-/octokit-5.0.3.tgz#1e4f110e28218ab9676c28da5f28ab403fe5b643" + resolved "https://registry.npmjs.org/octokit/-/octokit-5.0.3.tgz" integrity sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ== dependencies: "@octokit/app" "^16.0.1" @@ -3574,38 +3803,36 @@ octokit@^5.0.3: on-finished@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.0, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" opener@^1.5.1: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== opentracing@>=0.14.7: version "0.14.7" - resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" + resolved "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz" integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -3617,7 +3844,7 @@ optionator@^0.9.3: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -3626,59 +3853,59 @@ own-keys@^1.0.1: own-or-env@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/own-or-env/-/own-or-env-1.0.2.tgz#84e78d2d5128f7ee8a59f741ad5aafb4256a7c89" + resolved "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz" integrity sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw== dependencies: own-or "^1.0.0" own-or@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/own-or/-/own-or-1.0.0.tgz#4e877fbeda9a2ec8000fbc0bcae39645ee8bf8dc" + resolved "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz" integrity sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-hash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" @@ -3688,54 +3915,52 @@ package-hash@^4.0.0: package-json-from-dist@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== pako@~1.0.2: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parseurl@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== patch-console@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" - integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -3743,86 +3968,99 @@ path-scurry@^1.11.1: path-to-regexp@^0.1.12: version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -path-to-regexp@^8.0.0, path-to-regexp@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" - integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== +path-to-regexp@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" + integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== + +path-to-regexp@^8.1.0: + version "8.3.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" + integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +picocolors@^1.0.0: + version "1.0.0" + picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2, picomatch@^4.0.3: +picomatch@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pkg-dir@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" platform@^1.3.3: version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== pprof-format@^2.1.1, pprof-format@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/pprof-format/-/pprof-format-2.2.1.tgz#64d32207fb46990349eb52825defb449d6ccc9b4" + resolved "https://registry.npmjs.org/pprof-format/-/pprof-format-2.2.1.tgz" integrity sha512-p4tVN7iK19ccDqQv8heyobzUmbHyds4N2FI6aBMcXz6y99MglTWDxIyhFkNaLeEXs6IFUEzT0zya0icbSLLY0g== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" - integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== + version "1.0.0" + resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== dependencies: fromentries "^1.2.0" propagate@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" + resolved "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== protobufjs@^7.5.3: version "7.5.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz" integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -3840,7 +4078,7 @@ protobufjs@^7.5.3: proxy-addr@^2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -3848,12 +4086,12 @@ proxy-addr@^2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== proxyquire@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" + resolved "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz" integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== dependencies: fill-keys "^1.0.2" @@ -3861,77 +4099,71 @@ proxyquire@^2.1.3: resolve "^1.11.1" punycode@^2.0.0, punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@^6.14.0: version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: side-channel "^1.1.0" queue-tick@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz" integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== rambda@^7.4.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.5.0.tgz#1865044c59bc0b16f63026c6e5a97e4b1bbe98fe" - integrity sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA== + version "7.4.0" + resolved "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz" + integrity sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" - integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + version "3.0.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz" + integrity sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA== dependencies: bytes "3.1.2" http-errors "2.0.0" - iconv-lite "0.6.3" + iconv-lite "0.7.0" unpipe "1.0.0" react-devtools-core@^4.19.1: version "4.28.5" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" - integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== dependencies: shell-quote "^1.6.1" ws "^7" react-reconciler@^0.26.2: version "0.26.2" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" - integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" scheduler "^0.20.2" -react@^17.0.2: +react@^17.0.2, react@>=16.8.0: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" readable-stream@^3.0.2: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3939,9 +4171,9 @@ readable-stream@^3.0.2: util-deprecate "^1.0.1" readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -3953,26 +4185,24 @@ readable-stream@~2.3.6: readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redeyed@~2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== dependencies: esprima "~4.0.0" reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -3986,12 +4216,12 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: regexp-tree@^0.1.27: version "0.1.27" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== regexp.prototype.flags@^1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -4003,51 +4233,49 @@ regexp.prototype.flags@^1.5.4: regjsparser@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" release-zalgo@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: es6-error "^4.0.1" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== resolve-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.11.1, resolve@^1.22.4: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -4056,32 +4284,30 @@ resolve@^1.11.1, resolve@^1.22.4: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" signal-exit "^3.0.2" retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg=sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" router@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== dependencies: debug "^4.4.0" @@ -4092,7 +4318,7 @@ router@^2.2.0: safe-array-concat@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -4101,19 +4327,24 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0, safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -4121,7 +4352,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -4130,35 +4361,38 @@ safe-regex-test@^1.1.0: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" semifies@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semifies/-/semifies-1.0.0.tgz#b69569f32c2ba2ac04f705ea82831364289b2ae2" + resolved "https://registry.npmjs.org/semifies/-/semifies-1.0.0.tgz" integrity sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.0: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: +semver@^7.5.0, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== send@^1.1.0, send@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" + resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== dependencies: debug "^4.3.5" @@ -4175,14 +4409,14 @@ send@^1.1.0, send@^1.2.0: serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" serve-static@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz" integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== dependencies: encodeurl "^2.0.0" @@ -4192,12 +4426,12 @@ serve-static@^2.2.0: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -4209,7 +4443,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -4219,7 +4453,7 @@ set-function-name@^2.0.2: set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" @@ -4228,34 +4462,37 @@ set-proto@^1.0.0: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1, shell-quote@^1.8.2: +shell-quote@^1.6.1: + version "1.8.1" + +shell-quote@^1.8.2: version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -4263,7 +4500,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -4273,7 +4510,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -4284,7 +4521,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -4295,22 +4532,22 @@ side-channel@^1.1.0: signal-exit@^3.0.2, signal-exit@^3.0.4, signal-exit@^3.0.6: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sinon-chai@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.7.0.tgz#cfb7dec1c50990ed18c153f1840721cf13139783" + resolved "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz" integrity sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g== -sinon@^18.0.1: +sinon@^18.0.1, sinon@>=4.0.0: version "18.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.1.tgz#464334cdfea2cddc5eda9a4ea7e2e3f0c7a91c5e" + resolved "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz" integrity sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw== dependencies: "@sinonjs/commons" "^3.0.1" @@ -4322,8 +4559,6 @@ sinon@^18.0.1: slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" @@ -4331,25 +4566,30 @@ slice-ansi@^3.0.0: source-map-support@^0.5.16: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.4: - version "0.7.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== spawn-wrap@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: foreground-child "^2.0.0" @@ -4361,29 +4601,29 @@ spawn-wrap@^2.0.0: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stack-utils@^2.0.2, stack-utils@^2.0.4: +stack-utils@^2.0.2: + version "2.0.6" + dependencies: + escape-string-regexp "^2.0.0" + +stack-utils@^2.0.4: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -statuses@2.0.1: +statuses@^2.0.1, statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -statuses@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - stop-iteration-iterator@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: es-errors "^1.3.0" @@ -4391,12 +4631,28 @@ stop-iteration-iterator@^1.1.0: streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4405,7 +4661,7 @@ streamsearch@^1.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -4414,7 +4670,7 @@ string-width@^5.0.1, string-width@^5.1.2: string.prototype.trim@^1.2.10: version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -4427,7 +4683,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -4437,86 +4693,89 @@ string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^5.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" - integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== - dependencies: - min-indent "^1.0.1" + version "4.1.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz" + integrity sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^7, supports-color@^7.1.0: +supports-color@^5.3.0: + version "5.5.0" + dependencies: + has-flag "^3.0.0" + +supports-color@^7: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tap-mocha-reporter@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz#666edb15c9b6b3ca7fe3af9908961d903f81c25b" - integrity sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw== + version "5.0.3" + resolved "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz" + integrity sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g== dependencies: color-support "^1.1.0" debug "^4.1.1" @@ -4529,7 +4788,7 @@ tap-mocha-reporter@^5.0.3: tap-parser@^11.0.0, tap-parser@^11.0.2: version "11.0.2" - resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-11.0.2.tgz#5d3e76e2cc521e23a8c50201487b273ca0fba800" + resolved "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz" integrity sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg== dependencies: events-to-array "^1.0.1" @@ -4538,14 +4797,14 @@ tap-parser@^11.0.0, tap-parser@^11.0.2: tap-yaml@^1.0.0, tap-yaml@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/tap-yaml/-/tap-yaml-1.0.2.tgz#62032a459e5524e10661c19ee9df5d33d78812fa" + resolved "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz" integrity sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg== dependencies: yaml "^1.10.2" tap@^16.3.10: version "16.3.10" - resolved "https://registry.yarnpkg.com/tap/-/tap-16.3.10.tgz#cf246b56af02d34bdfffa576636a9e34b55aaa5f" + resolved "https://registry.npmjs.org/tap/-/tap-16.3.10.tgz" integrity sha512-q5Am+PpGHS6JSjk/Zn4bCRBihmZVM15v/MYXUy60wenw5HDe7pVrevLCEoMEz7tuw6jaPOJJqni1y8apN23IGw== dependencies: "@isaacs/import-jsx" "^4.0.1" @@ -4576,20 +4835,20 @@ tap@^16.3.10: which "^2.0.2" tapable@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" - integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== + version "2.2.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz" + integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg== tcompare@^5.0.6, tcompare@^5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/tcompare/-/tcompare-5.0.7.tgz#8c2d647208031ed5cac5e573428149e16f795bbf" + resolved "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz" integrity sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w== dependencies: diff "^4.0.2" test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4598,35 +4857,36 @@ test-exclude@^6.0.0: tiktoken@^1.0.21: version "1.0.22" - resolved "https://registry.yarnpkg.com/tiktoken/-/tiktoken-1.0.22.tgz#a6c674839228bb88f32dfe646dff47193762f7d3" + resolved "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz" integrity sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA== tlhunter-sorted-set@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz#1c3eae28c0fa4dff97e9501d2e3c204b86406f4b" + resolved "https://registry.npmjs.org/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz" integrity sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw== +to-fast-properties@^2.0.0: + version "2.0.0" + to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toad-cache@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/toad-cache/-/toad-cache-3.7.0.tgz#b9b63304ea7c45ec34d91f1d2fa513517025c441" + resolved "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz" integrity sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== treport@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/treport/-/treport-3.0.4.tgz#05247fa7820ad3afe92355e4cf08fe41a933084b" - integrity sha512-zUw1sfJypuoZi0I54woo6CNsfvMrv+OwLBD0/wc4LhMW8MA0MbSE+4fNObn22JSR8x9lOYccuAzfBfZ2IemzoQ== dependencies: "@isaacs/import-jsx" "^4.0.1" cardinal "^2.1.1" @@ -4638,20 +4898,20 @@ treport@^3.0.4: unicode-length "^2.0.2" trivial-deferred@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/trivial-deferred/-/trivial-deferred-1.1.2.tgz#6b07aa1eb045f6128b8b30673b040f99bfe64a2e" - integrity sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g== + version "1.0.1" + resolved "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz" + integrity sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw== sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw== ts-declaration-location@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz#d4068fe9975828b3b453b3ab112b4711d8267688" + resolved "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz" integrity sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA== dependencies: picomatch "^4.0.2" tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -4661,64 +4921,69 @@ tsconfig-paths@^3.15.0: tslib@^2.5.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== ttl-set@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/ttl-set/-/ttl-set-1.0.0.tgz#e7895d946ad9cedfadcf6e3384ea97322a86dd3b" + resolved "https://registry.npmjs.org/ttl-set/-/ttl-set-1.0.0.tgz" integrity sha512-2fuHn/UR+8Z9HK49r97+p2Ru1b5Eewg2QqPrU14BVCQ9QoyU3+vLLZk2WEiyZ9sgJh6W8G1cZr9I2NBLywAHrA== dependencies: fast-fifo "^1.3.2" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: +type-detect@^4.0.0, type-detect@^4.0.8, type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-detect@^4.0.0, type-detect@^4.1.0: +type-detect@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" - integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.8.0: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-is@^1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -type-is@^2.0.0, type-is@^2.0.1: +type-is@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +type-is@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== dependencies: content-type "^1.0.5" @@ -4727,7 +4992,7 @@ type-is@^2.0.0, type-is@^2.0.1: typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -4736,7 +5001,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -4747,7 +5012,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -4760,7 +5025,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -4772,19 +5037,24 @@ typed-array-length@^1.0.7: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript@>=3.7.2, typescript@>=4.0.0: + version "5.9.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -4794,39 +5064,40 @@ unbox-primitive@^1.1.0: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - unicode-length@^2.0.2: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-length/-/unicode-length-2.1.0.tgz#425202b99f21854f5ca3530cc2a08dc262ce619f" + resolved "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz" integrity sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw== dependencies: punycode "^2.0.0" universal-github-app-jwt@^2.2.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz#38537e5a7d154085a35f97601a5e30e9e17717df" + resolved "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz" integrity sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw== universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz" integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.0.13: + version "1.0.13" + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-browserslist-db@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" @@ -4834,29 +5105,29 @@ update-browserslist-db@^1.1.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== vary@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -4867,7 +5138,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -4886,7 +5157,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -4895,13 +5166,13 @@ which-collection@^1.0.2: is-weakset "^2.0.3" which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" @@ -4914,31 +5185,29 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" widest-line@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workerpool@^9.2.0: - version "9.3.3" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.3.tgz#e75281fe62e851afb21cdeef8fa85f6a62ec3583" - integrity sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw== + version "9.3.4" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz" + integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4947,16 +5216,25 @@ workerpool@^9.2.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -4965,12 +5243,12 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -4979,48 +5257,44 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7, ws@^7.5.5: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + version "7.5.9" xtend@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.8.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz" integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -5028,12 +5302,12 @@ yargs-parser@^18.1.2: yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -5043,7 +5317,7 @@ yargs-unparser@^2.0.0: yargs@^15.0.2: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -5060,7 +5334,7 @@ yargs@^15.0.2: yargs@^17.7.2: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -5073,7 +5347,7 @@ yargs@^17.7.2: yarn-deduplicate@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz#63498d2d4c3a8567e992a994ce0ab51aa5681f2e" + resolved "https://registry.npmjs.org/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz" integrity sha512-Efx4XEj82BgbRJe5gvQbZmEO7pU5DgHgxohYZp98/+GwPqdU90RXtzvHirb7hGlde0sQqk5G3J3Woyjai8hVqA== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -5083,12 +5357,10 @@ yarn-deduplicate@^6.0.2: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yoga-layout-prebuilt@^1.9.6: version "1.10.0" - resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6" - integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g== dependencies: "@types/yoga-layout" "1.9.2" From b3a29731f9f4d45226e90d2955244ec9fdaad0db Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 17 Sep 2025 20:10:12 -0400 Subject: [PATCH 02/61] lint files and centralize configs --- LICENSE-3rdparty.csv | 1 + packages/dd-trace/src/config.js | 29 +++++++++++++----------- packages/dd-trace/src/config_defaults.js | 4 ++-- packages/dd-trace/src/proxy.js | 21 ++++++++--------- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 9b2483261c4..ecc6be1ae83 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -7,6 +7,7 @@ require,@datadog/pprof,Apache license 2.0,Copyright 2019 Google Inc. require,@datadog/sketches-js,Apache license 2.0,Copyright 2020 Datadog Inc. require,@datadog/wasm-js-rewriter,Apache license 2.0,Copyright 2018 Datadog Inc. require,@opentelemetry/api,Apache license 2.0,Copyright OpenTelemetry Authors +require,@opentelemetry/api-logs,Apache license 2.0,Copyright OpenTelemetry Authors require,@opentelemetry/core,Apache license 2.0,Copyright OpenTelemetry Authors require,@isaacs/ttlcache,ISC,Copyright (c) 2022-2023 - Isaac Z. Schlueter and Contributors require,crypto-randomuuid,MIT,Copyright 2021 Node.js Foundation and contributors diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index b0f7badc861..ae9cdbb1888 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -58,8 +58,7 @@ const otelDdEnvMapping = { OTEL_TRACES_EXPORTER: 'DD_TRACE_ENABLED', OTEL_METRICS_EXPORTER: 'DD_RUNTIME_METRICS_ENABLED', OTEL_RESOURCE_ATTRIBUTES: 'DD_TAGS', - OTEL_SDK_DISABLED: 'DD_TRACE_OTEL_ENABLED', - OTEL_LOGS_EXPORTER: undefined + OTEL_SDK_DISABLED: 'DD_TRACE_OTEL_ENABLED' } const VALID_PROPAGATION_STYLES = new Set(['datadog', 'tracecontext', 'b3', 'b3 single header', 'none']) @@ -111,7 +110,6 @@ function validateEnvVarType (envVar) { return value.toLowerCase() === 'true' || value.toLowerCase() === 'false' case 'OTEL_TRACES_EXPORTER': case 'OTEL_METRICS_EXPORTER': - case 'OTEL_LOGS_EXPORTER': return value.toLowerCase() === 'none' default: return false @@ -651,10 +649,12 @@ class Config { OTEL_SERVICE_NAME, OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG, - OTEL_LOGS_EXPORTER, OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_EXPORTERS_OTLP_ENDPOINT, + OTEL_EXPORTERS_OTLP_HEADERS, + OTEL_EXPORTERS_OTLP_TIMEOUT, OTEL_BSP_SCHEDULE_DELAY, OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, @@ -672,6 +672,18 @@ class Config { tagger.add(tags, DD_TRACE_TAGS) tagger.add(tags, DD_TRACE_GLOBAL_TAGS) + // OpenTelemetry logs configuration - processed after OTEL_RESOURCE_ATTRIBUTES + // Enable logs if DD_LOGS_OTEL_ENABLED is true + this._setBoolean(env, 'otelLogsEnabled', isTrue(DD_LOGS_OTEL_ENABLED)) + // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars + this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTERS_OTLP_ENDPOINT) + this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTERS_OTLP_HEADERS) + this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT || OTEL_EXPORTERS_OTLP_TIMEOUT) + this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) + this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) + this._setUnit(env, 'otelLogsMaxQueueSize', OTEL_BSP_MAX_QUEUE_SIZE) + this._setUnit(env, 'otelLogsExportTimeoutMillis', OTEL_BSP_EXPORT_TIMEOUT) + this._setBoolean(env, 'apmTracingEnabled', coalesce( DD_APM_TRACING_ENABLED, DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED) @@ -787,14 +799,6 @@ class Config { this._setBoolean(env, 'llmobs.enabled', DD_LLMOBS_ENABLED) this._setString(env, 'llmobs.mlApp', DD_LLMOBS_ML_APP) this._setBoolean(env, 'logInjection', DD_LOGS_INJECTION) - this._setBoolean(env, 'otelLogsEnabled', DD_LOGS_OTEL_ENABLED) - this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) - this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS) - this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT) - this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) - this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) - this._setUnit(env, 'otelLogsMaxQueueSize', OTEL_BSP_MAX_QUEUE_SIZE) - this._setUnit(env, 'otelLogsExportTimeoutMillis', OTEL_BSP_EXPORT_TIMEOUT) // Requires an accompanying DD_APM_OBFUSCATION_MEMCACHED_KEEP_COMMAND=true in the agent this._setBoolean(env, 'memcachedCommandEnabled', DD_TRACE_MEMCACHED_COMMAND_ENABLED) this._setBoolean(env, 'middlewareTracingEnabled', DD_TRACE_MIDDLEWARE_TRACING_ENABLED) @@ -1203,7 +1207,6 @@ class Config { this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED)) } - calc['dogstatsd.hostname'] = this._getHostname() this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 1f1205740be..062165ebf4d 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -122,11 +122,11 @@ module.exports = { otelLogsEnabled: false, otelLogsUrl: 'http://localhost:4318/v1/logs', otelLogsHeaders: {}, - otelLogsTimeout: 10000, + otelLogsTimeout: 10_000, otelLogsBatchTimeout: 5000, otelLogsMaxExportBatchSize: 512, otelLogsMaxQueueSize: 2048, - otelLogsExportTimeoutMillis: 30000, + otelLogsExportTimeoutMillis: 30_000, lookup: undefined, inferredProxyServicesEnabled: false, memcachedCommandEnabled: false, diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 37834e6e8b2..36dedad7187 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -277,7 +277,6 @@ class Tracer extends NoopProxy { const { LoggerProvider, BatchLogProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') const { logs } = require('@opentelemetry/api-logs') - // Create logger provider const loggerProvider = new LoggerProvider({ resource: { @@ -289,20 +288,19 @@ class Tracer extends NoopProxy { } }) - // Create OTLP exporter using config values with environment variable fallbacks + // Create OTLP exporter using resolved config values const exporter = new OtlpHttpLogExporter({ - url: config.otelLogsUrl || process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, - headers: config.otelLogsHeaders || (process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS ? - JSON.parse(process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS) : {}), - timeout: config.otelLogsTimeout || parseInt(process.env.OTEL_EXPORTER_OTLP_TIMEOUT) || 10000 + url: config.otelLogsUrl, + headers: config.otelLogsHeaders, + timeout: config.otelLogsTimeout }) - // Create batch processor using config values with environment variable fallbacks + // Create batch processor using resolved config values const processor = new BatchLogProcessor([exporter], { - batchTimeout: config.otelLogsBatchTimeout || parseInt(process.env.OTEL_BSP_SCHEDULE_DELAY) || 5000, - maxExportBatchSize: config.otelLogsMaxExportBatchSize || parseInt(process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE) || 512, - maxQueueSize: config.otelLogsMaxQueueSize || parseInt(process.env.OTEL_BSP_MAX_QUEUE_SIZE) || 2048, - exportTimeoutMillis: config.otelLogsExportTimeoutMillis || parseInt(process.env.OTEL_BSP_EXPORT_TIMEOUT) || 30000 + batchTimeout: config.otelLogsBatchTimeout, + maxExportBatchSize: config.otelLogsMaxExportBatchSize, + maxQueueSize: config.otelLogsMaxQueueSize, + exportTimeoutMillis: config.otelLogsExportTimeoutMillis }) // Add processor to logger provider @@ -333,7 +331,6 @@ class Tracer extends NoopProxy { get TracerProvider () { return require('./opentelemetry/tracer_provider') } - } module.exports = Tracer From 2c0d528ddf893240f35ab4876c4e2754f83de67f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 17 Sep 2025 20:22:46 -0400 Subject: [PATCH 03/61] add tests --- .../dd-trace/test/opentelemetry/logs.spec.js | 185 +++++++++++++++ .../test/opentelemetry/protobuf.spec.js | 220 ++++++++++++++++++ 2 files changed, 405 insertions(+) create mode 100644 packages/dd-trace/test/opentelemetry/logs.spec.js create mode 100644 packages/dd-trace/test/opentelemetry/protobuf.spec.js diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js new file mode 100644 index 00000000000..5cd5eeba92f --- /dev/null +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -0,0 +1,185 @@ +'use strict' + +const { expect } = require('chai') +const { describe, it, beforeEach, afterEach } = require('mocha') +const tracer = require('../../') + +describe('OpenTelemetry Logs', () => { + let originalEnv + + beforeEach(() => { + originalEnv = { ...process.env } + process.env.DD_SERVICE = 'test-service' + process.env.DD_VERSION = '1.0.0' + process.env.DD_ENV = 'test' + }) + + afterEach(() => { + process.env = originalEnv + // Clean up OpenTelemetry API state + const { logs } = require('@opentelemetry/api-logs') + const loggerProvider = logs.getLoggerProvider() + if (loggerProvider && typeof loggerProvider.shutdown === 'function') { + loggerProvider.shutdown() + } + }) + + it('should initialize OpenTelemetry logs when otelLogsEnabled is true', () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const loggerProvider = logs.getLoggerProvider() + expect(loggerProvider).to.exist + expect(loggerProvider.constructor.name).to.equal('LoggerProvider') + + const logger = logs.getLogger('test-logger') + expect(logger).to.exist + expect(logger.constructor.name).to.equal('Logger') + expect(typeof logger.emit).to.equal('function') + }) + + it('should not initialize OpenTelemetry logs when otelLogsEnabled is false', () => { + // Set environment variable to disable logs BEFORE initialization + process.env.DD_LOGS_OTEL_ENABLED = 'false' + + // Clean up any existing LoggerProvider first + const { logs } = require('@opentelemetry/api-logs') + const existingProvider = logs.getLoggerProvider() + if (existingProvider && typeof existingProvider.shutdown === 'function') { + existingProvider.shutdown() + } + + tracer.init() + + // After initialization with DD_LOGS_OTEL_ENABLED='false', + // we should still be able to get a logger (it will be a no-op logger) + const logger = logs.getLogger('test-logger') + expect(logger).to.exist + expect(typeof logger.emit).to.equal('function') + + // The logger should work without throwing errors + expect(() => { + logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Test message', + timestamp: Date.now() * 1000000 + }) + }).to.not.throw() + }) + + it('should create a logger and emit log records', () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const logger = logs.getLogger('test-logger', '1.0.0') + + // Test that emit method works without throwing + expect(() => { + logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Test log message', + attributes: { test: 'attribute' }, + timestamp: Date.now() * 1000000 + }) + }).to.not.throw() + }) + + it('should handle different log levels', () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const logger = logs.getLogger('test-logger') + + // Test different log levels using emit method + const logLevels = [ + { severityText: 'DEBUG', severityNumber: 5, body: 'Debug message' }, + { severityText: 'INFO', severityNumber: 9, body: 'Info message' }, + { severityText: 'WARN', severityNumber: 13, body: 'Warning message' }, + { severityText: 'ERROR', severityNumber: 17, body: 'Error message' }, + { severityText: 'FATAL', severityNumber: 21, body: 'Fatal message' } + ] + + logLevels.forEach(logLevel => { + expect(() => { + logger.emit({ + ...logLevel, + timestamp: Date.now() * 1000000 + }) + }).to.not.throw() + }) + }) + + it('should support force flush', async () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const loggerProvider = logs.getLoggerProvider() + const activeProcessor = loggerProvider.getActiveLogProcessor() + + expect(activeProcessor).to.exist + expect(typeof activeProcessor.forceFlush).to.equal('function') + + // Test force flush doesn't throw + try { + await activeProcessor.forceFlush() + expect(true).to.be.true // If we get here, forceFlush succeeded + } catch (error) { + expect.fail('forceFlush should not throw an error') + } + }) + + it('should use configuration defaults when environment variables are not set', () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + // Clear environment variables to test defaults + delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT + delete process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS + delete process.env.OTEL_EXPORTER_OTLP_TIMEOUT + delete process.env.OTEL_BSP_SCHEDULE_DELAY + delete process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE + delete process.env.OTEL_BSP_MAX_QUEUE_SIZE + delete process.env.OTEL_BSP_EXPORT_TIMEOUT + + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const loggerProvider = logs.getLoggerProvider() + expect(loggerProvider).to.exist + + const logger = logs.getLogger('test-logger') + expect(logger).to.exist + expect(typeof logger.emit).to.equal('function') + }) + + it('should handle logger provider shutdown', () => { + process.env.DD_LOGS_OTEL_ENABLED = 'true' + tracer.init() + + // Access the logger through OpenTelemetry API + const { logs } = require('@opentelemetry/api-logs') + const loggerProvider = logs.getLoggerProvider() + + expect(loggerProvider).to.exist + expect(typeof loggerProvider.shutdown).to.equal('function') + + // Test shutdown doesn't throw + expect(() => { + loggerProvider.shutdown() + }).to.not.throw() + + // After shutdown, getLogger should return a no-op logger + const logger = logs.getLogger('test-logger') + expect(logger).to.exist + expect(typeof logger.emit).to.equal('function') + }) +}) diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js new file mode 100644 index 00000000000..1e771af271c --- /dev/null +++ b/packages/dd-trace/test/opentelemetry/protobuf.spec.js @@ -0,0 +1,220 @@ +'use strict' + +const { expect } = require('chai') +const { describe, it, beforeEach } = require('mocha') +const sinon = require('sinon') +const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') +const { logs } = require('@opentelemetry/api') + +describe('OTLP Protobuf Serialization', () => { + let transformer + + beforeEach(() => { + transformer = new OtlpTransformer({ + resource: { + attributes: { + 'service.name': 'test-service', + 'service.version': '1.0.0', + 'deployment.environment': 'test' + } + } + }) + }) + + it('should serialize log records to protobuf format', () => { + const logRecords = [ + { + timestamp: Date.now() * 1000000, + severityNumber: logs.SeverityNumber.INFO, + severityText: 'INFO', + body: 'Test log message', + attributes: { + 'test.attribute': 'test-value', + 'user.id': '12345' + } + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should handle different severity levels', () => { + const logRecords = [ + { + severityNumber: logs.SeverityNumber.DEBUG, + severityText: 'DEBUG', + body: 'Debug message' + }, + { + severityNumber: logs.SeverityNumber.ERROR, + severityText: 'ERROR', + body: 'Error message' + }, + { + severityNumber: logs.SeverityNumber.FATAL, + severityText: 'FATAL', + body: 'Fatal message' + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should handle trace and span IDs', () => { + const logRecords = [ + { + body: 'Test message with trace context', + traceId: '12345678901234567890123456789012', + spanId: '1234567890123456' + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should handle different body types', () => { + const logRecords = [ + { + body: 'String message', + severityNumber: logs.SeverityNumber.INFO + }, + { + body: 42, + severityNumber: logs.SeverityNumber.INFO + }, + { + body: true, + severityNumber: logs.SeverityNumber.INFO + }, + { + body: { nested: { value: 'object' } }, + severityNumber: logs.SeverityNumber.INFO + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should handle array attributes', () => { + const logRecords = [ + { + body: 'Message with array attributes', + attributes: { + tags: ['tag1', 'tag2', 'tag3'], + numbers: [1, 2, 3, 4, 5], + mixed: ['string', 42, true, { nested: 'object' }] + } + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should fallback to JSON if protobuf serialization fails', () => { + // Mock the protobuf loader to throw an error + const originalRequire = require + const mockRequire = sinon.stub().callsFake((path) => { + if (path === './protobuf_loader') { + return { + getProtobufTypes: () => { + throw new Error('Protobuf loading failed') + } + } + } + return originalRequire(path) + }) + // eslint-disable-next-line no-global-assign + require = mockRequire + + const transformer = new OtlpTransformer() + const logRecords = [ + { + body: 'Test message', + severityNumber: logs.SeverityNumber.INFO + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + + // Should be JSON (starts with {) + expect(result.toString('utf8').startsWith('{')).to.be.true + + // Restore require + // eslint-disable-next-line no-global-assign + require = originalRequire + }) + + it('should handle empty log records', () => { + const result = transformer.transformLogRecords([]) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should handle missing instrumentation library', () => { + const logRecords = [ + { + body: 'Message without instrumentation library', + severityNumber: logs.SeverityNumber.INFO + } + ] + + const result = transformer.transformLogRecords(logRecords) + + expect(result).to.be.instanceOf(Buffer) + expect(result.length).to.be.greaterThan(0) + }) + + it('should convert hex strings to bytes correctly', () => { + const transformer = new OtlpTransformer() + + // Test empty string + expect(transformer._hexToBytes('')).to.deep.equal(Buffer.alloc(0)) + + // Test with 0x prefix + const result1 = transformer._hexToBytes('0x1234') + expect(result1).to.deep.equal(Buffer.from('1234', 'hex')) + + // Test without 0x prefix + const result2 = transformer._hexToBytes('1234') + expect(result2).to.deep.equal(Buffer.from('1234', 'hex')) + + // Test odd length (should be padded) + const result3 = transformer._hexToBytes('123') + expect(result3).to.deep.equal(Buffer.from('0123', 'hex')) + }) + + it('should map severity numbers correctly', () => { + const transformer = new OtlpTransformer() + + // Test INFO mapping + const infoSeverity = transformer._mapSeverityNumber(logs.SeverityNumber.INFO) + expect(infoSeverity).to.be.a('number') + + // Test ERROR mapping + const errorSeverity = transformer._mapSeverityNumber(logs.SeverityNumber.ERROR) + expect(errorSeverity).to.be.a('number') + + // Test unknown severity (should default to INFO) + const unknownSeverity = transformer._mapSeverityNumber(999) + expect(unknownSeverity).to.be.a('number') + }) +}) From 6c359ce14881837a04b1c727192ebd05298c36e7 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 18 Sep 2025 16:10:51 -0400 Subject: [PATCH 04/61] clean up yarn.lock --- yarn.lock | 2477 ++++++++++++++++++++++++----------------------------- 1 file changed, 1106 insertions(+), 1371 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7228b4b7063..e50775e8ff2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,262 +2,139 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.27.1": +"@babel/code-frame@^7.27.1": version "7.27.1" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/code-frame@^7.22.13": - version "7.23.5" - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== - -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.23.5": - version "7.23.5" +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.27.2": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.0.0-0", "@babel/core@^7.5.5": - version "7.23.6" +"@babel/core@^7.5.5", "@babel/core@^7.7.5": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.6" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.0.0", "@babel/core@^7.7.5": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.19.3", "@babel/generator@^7.23.5": - version "7.23.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz" - integrity sha1-F9Ch6mti81HSgTUKX4C4eoEMR1U=sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== +"@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== dependencies: - "@babel/types" "^7.23.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" -"@babel/generator@^7.23.6": - version "7.23.6" +"@babel/helper-annotate-as-pure@^7.27.1": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== - dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" + "@babel/types" "^7.27.3" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" - integrity sha1-lhWdth00op26RUyVn1rkpkm6kWc=sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" - integrity sha1-H5o829WyaYpnDDDSc1+a+V7VJ1k=sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== +"@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: - "@babel/types" "^7.22.5" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" +"@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.27.1": +"@babel/helper-validator-identifier@^7.27.1": version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.19.0", "@babel/helpers@^7.27.6": +"@babel/helpers@^7.27.6": version "7.28.4" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" -"@babel/helpers@^7.23.6": - version "7.23.6" - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" - -"@babel/highlight@^7.23.4": - version "7.23.4" - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.19.3", "@babel/parser@^7.23.5", "@babel/parser@^7.27.2": - version "7.28.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz" - integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== +"@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== dependencies: - "@babel/types" "^7.28.4" - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.6": - version "7.23.6" + "@babel/types" "^7.28.0" "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" "@babel/helper-compilation-targets" "^7.20.7" @@ -265,111 +142,98 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.23.3" +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-transform-destructuring@^7.5.0": - version "7.23.3" + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" + integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.0" "@babel/plugin-transform-parameters@^7.20.7": - version "7.23.3" + version "7.27.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" + integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-jsx@^7.3.0": - version "7.23.4" + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/template@^7.18.10", "@babel/template@^7.22.15", "@babel/template@^7.27.2": +"@babel/template@^7.27.2": version "7.27.2" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: "@babel/code-frame" "^7.27.1" "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": - version "7.23.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz" - integrity sha1-9Ua/mrqe8rBCwOANJFmQwVUI5+w=sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.6": - version "7.23.6" - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" debug "^4.3.1" - globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5", "@babel/types@^7.27.1", "@babel/types@^7.28.4": +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.0", "@babel/types@^7.28.4": version "7.28.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.22.15", "@babel/types@^7.23.4", "@babel/types@^7.23.6": - version "7.23.6" - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - "@datadog/libdatadog@0.7.0": version "0.7.0" - resolved "https://registry.npmjs.org/@datadog/libdatadog/-/libdatadog-0.7.0.tgz" + resolved "https://registry.yarnpkg.com/@datadog/libdatadog/-/libdatadog-0.7.0.tgz#81e07d3040c628892db697ccd01ae3c4d2a76315" integrity sha512-VVZLspzQcfEU47gmGCVoRkngn7RgFRR4CHjw4YaX8eWT+xz4Q4l6PvA45b7CMk9nlt3MNN5MtGdYttYMIpo6Sg== "@datadog/native-appsec@10.2.1": version "10.2.1" - resolved "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-10.2.1.tgz" + resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-10.2.1.tgz#1f62ceefb8e1686b202703ee6c3f245f4dff2d70" integrity sha512-FwRVo+otgNaz6vN74XVrBT8GdLwxPwAqOjH4Y9VQJaC1RiHmzRCMr77AhHFme1xi7zPG2LQqQN/cmOzG+sbrtQ== dependencies: node-gyp-build "^3.9.0" "@datadog/native-iast-taint-tracking@4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-4.0.0.tgz#a774742e6723b93d58bf31a87728e4da1634074f" integrity sha512-2uF8RnQkJO5bmLi26Zkhxg+RFJn/uEsesYTflScI/Cz/BWv+792bxI+OaCKvhgmpLkm8EElenlpidcJyZm7GYw== dependencies: node-gyp-build "^3.9.0" "@datadog/native-metrics@3.1.1": version "3.1.1" - resolved "https://registry.npmjs.org/@datadog/native-metrics/-/native-metrics-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/@datadog/native-metrics/-/native-metrics-3.1.1.tgz#4e5c9775751af13e353e64e573ab724104538cee" integrity sha512-MU1gHrolwryrU4X9g+fylA1KPH3S46oqJPEtVyrO+3Kh29z80fegmtyrU22bNt8LigPUK/EdPCnSbMe88QbnxQ== dependencies: node-addon-api "^6.1.0" @@ -377,7 +241,7 @@ "@datadog/pprof@5.10.0": version "5.10.0" - resolved "https://registry.npmjs.org/@datadog/pprof/-/pprof-5.10.0.tgz" + resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-5.10.0.tgz#47e9589c6d9c423470e312e00def06e249672571" integrity sha512-tEMhLeOM78FHC/rTltDd7pQN8WPAUZ1b0BPadYsKWqo/v6jWTbF6xeIMojdJa5yIW2vHjDU4LFJpkFFNacHpQw== dependencies: delay "^5.0.0" @@ -388,12 +252,12 @@ "@datadog/sketches-js@2.1.1": version "2.1.1" - resolved "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/@datadog/sketches-js/-/sketches-js-2.1.1.tgz#9ec2251b3c932b4f43e1d164461fa6cb6f28b7d0" integrity sha512-d5RjycE+MObE/hU+8OM5Zp4VjTwiPLRa8299fj7muOmR16fb942z8byoMbCErnGh0lBevvgkGrLclQDvINbIyg== "@datadog/wasm-js-rewriter@4.0.1": version "4.0.1" - resolved "https://registry.npmjs.org/@datadog/wasm-js-rewriter/-/wasm-js-rewriter-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/@datadog/wasm-js-rewriter/-/wasm-js-rewriter-4.0.1.tgz#883535e97f6b88b15427f93b5dc5d2d3a01c02b6" integrity sha512-JRa05Je6gw+9+3yZnm/BroQZrEfNwRYCxms56WCCHzOBnoPihQLB0fWy5coVJS29kneCUueUvBvxGp6NVXgdqw== dependencies: js-yaml "^4.1.0" @@ -402,20 +266,20 @@ node-gyp-build "^4.5.0" "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": - version "4.9.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" - integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz#0e3b5e45566d1bce1ec47d8aae2fc2ad77ad0894" + integrity sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.1": version "4.12.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.21.0": version "0.21.0" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636" integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== dependencies: "@eslint/object-schema" "^2.1.6" @@ -424,19 +288,19 @@ "@eslint/config-helpers@^0.3.1": version "0.3.1" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz#d316e47905bd0a1a931fa50e669b9af4104d1617" integrity sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA== "@eslint/core@^0.15.2": version "0.15.2" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.2.tgz#59386327d7862cc3603ebc7c78159d2dcc4a868f" integrity sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": version "3.3.1" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" @@ -449,19 +313,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.29.0", "@eslint/js@9.35.0": +"@eslint/js@9.35.0", "@eslint/js@^9.29.0": version "9.35.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.35.0.tgz#ffbc7e13cf1204db18552e9cd9d4a8e17c692d07" integrity sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw== "@eslint/object-schema@^2.1.6": version "2.1.6" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.3.3", "@eslint/plugin-kit@^0.3.5": version "0.3.5" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz#fd8764f0ee79c8ddab4da65460c641cefee017c5" integrity sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w== dependencies: "@eslint/core" "^0.15.2" @@ -469,30 +333,35 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": - version "0.16.7" - resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz" - integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.4.0" + "@humanwhocodes/retry" "^0.3.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -504,6 +373,8 @@ "@isaacs/import-jsx@^4.0.1": version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/import-jsx/-/import-jsx-4.0.1.tgz#493cab5fc543a0703dba7c3f5947d6499028a169" + integrity sha512-l34FEsEqpdYdGcQjRCxWy+7rHY6euUbOBz9FI+Mq6oQeVhNegHcXFSJxVxrJvOpO31NbnDjS74quKXDlPDearA== dependencies: "@babel/core" "^7.5.5" "@babel/plugin-proposal-object-rest-spread" "^7.5.5" @@ -517,12 +388,12 @@ "@isaacs/ttlcache@^1.4.1": version "1.4.1" - resolved "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -533,77 +404,56 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" - integrity sha1-cuRXB88kD6awgdA2b4JlsM0QGX8=sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@jsep-plugin/assignment@^1.3.0": version "1.3.0" - resolved "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/@jsep-plugin/assignment/-/assignment-1.3.0.tgz#fcfc5417a04933f7ceee786e8ab498aa3ce2b242" integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== "@jsep-plugin/regex@^1.0.4": version "1.0.4" - resolved "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/@jsep-plugin/regex/-/regex-1.0.4.tgz#cb2fc423220fa71c609323b9ba7f7d344a755fcc" integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== "@msgpack/msgpack@^3.1.2": version "3.1.2" - resolved "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-3.1.2.tgz#fdd25cc2202297519798bbaf4689152ad9609e19" integrity sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ== "@octokit/app@^16.0.1": - version "16.1.0" - resolved "https://registry.npmjs.org/@octokit/app/-/app-16.1.0.tgz" - integrity sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA== + version "16.0.1" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-16.0.1.tgz#a2a2b7a830dd978c86e6cc4f19da77a1f7964a67" + integrity sha512-kgTeTsWmpUX+s3Fs4EK4w1K+jWCDB6ClxLSWUWTyhlw7+L3jHtuXDR4QtABu2GsmCMdk67xRhruiXotS3ay3Yw== dependencies: - "@octokit/auth-app" "^8.1.0" + "@octokit/auth-app" "^8.0.1" "@octokit/auth-unauthenticated" "^7.0.1" "@octokit/core" "^7.0.2" "@octokit/oauth-app" "^8.0.1" @@ -611,10 +461,10 @@ "@octokit/types" "^14.0.0" "@octokit/webhooks" "^14.0.0" -"@octokit/auth-app@^8.1.0": - version "8.1.0" - resolved "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.1.0.tgz" - integrity sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ== +"@octokit/auth-app@^8.0.1": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.0.2.tgz#d44d59697421a4456e345e959a96a635e5e73bef" + integrity sha512-dLTmmA9gUlqiAJZgozfOsZFfpN/OldH3xweb7lqSnngax5Rs+PfO5dDlokaBfc41H1xOtsLYV5QqR0DkBAtPmw== dependencies: "@octokit/auth-oauth-app" "^9.0.1" "@octokit/auth-oauth-user" "^6.0.0" @@ -627,7 +477,7 @@ "@octokit/auth-oauth-app@^9.0.1": version "9.0.1" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.1.tgz#d8d2e950c95e9fcbe6f2fb98d4539ee8c9871766" integrity sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g== dependencies: "@octokit/auth-oauth-device" "^8.0.1" @@ -638,7 +488,7 @@ "@octokit/auth-oauth-device@^8.0.1": version "8.0.1" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.1.tgz#232ec13e299dd6bf199fe237527d04ec12decffb" integrity sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw== dependencies: "@octokit/oauth-methods" "^6.0.0" @@ -648,7 +498,7 @@ "@octokit/auth-oauth-user@^6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.0.tgz#ba643060824536cd848c72d835061b1c00007286" integrity sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A== dependencies: "@octokit/auth-oauth-device" "^8.0.1" @@ -659,33 +509,33 @@ "@octokit/auth-token@^6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== "@octokit/auth-unauthenticated@^7.0.1": version "7.0.1" - resolved "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.1.tgz#427b8a52e672318f84757307e766a448c741116b" integrity sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ== dependencies: "@octokit/request-error" "^7.0.0" "@octokit/types" "^14.0.0" -"@octokit/core@^7.0.0", "@octokit/core@^7.0.2", "@octokit/core@>=6", "@octokit/core@>=7": - version "7.0.4" - resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.4.tgz" - integrity sha512-jOT8V1Ba5BdC79sKrRWDdMT5l1R+XNHTPR6CPWzUP2EcfAcvIHZWF0eAbmRcpOOP5gVIwnqNg0C4nvh6Abc3OA== +"@octokit/core@^7.0.2": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.3.tgz#0b5288995fed66920128d41cfeea34979d48a360" + integrity sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ== dependencies: "@octokit/auth-token" "^6.0.0" "@octokit/graphql" "^9.0.1" "@octokit/request" "^10.0.2" "@octokit/request-error" "^7.0.0" - "@octokit/types" "^15.0.0" + "@octokit/types" "^14.0.0" before-after-hook "^4.0.0" universal-user-agent "^7.0.0" "@octokit/endpoint@^11.0.0": version "11.0.0" - resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.0.tgz#189fcc022721b4c49d0307eea6be3de1cfb53026" integrity sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ== dependencies: "@octokit/types" "^14.0.0" @@ -693,7 +543,7 @@ "@octokit/graphql@^9.0.1": version "9.0.1" - resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.1.tgz#eb258fc9981403d2d751720832652c385b6c1613" integrity sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg== dependencies: "@octokit/request" "^10.0.2" @@ -702,7 +552,7 @@ "@octokit/oauth-app@^8.0.1": version "8.0.1" - resolved "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-8.0.1.tgz#7cb889945c3ccacfd0ff9aa9f05e9748b439f7f3" integrity sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ== dependencies: "@octokit/auth-oauth-app" "^9.0.1" @@ -716,12 +566,12 @@ "@octokit/oauth-authorization-url@^8.0.0": version "8.0.0" - resolved "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz#fdbab39a07d38faaad8621a5fdf04bc0c36d63e7" integrity sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ== "@octokit/oauth-methods@^6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-6.0.0.tgz#a138bbbec6762b52249f7c47d0c548fc1cf6ad7b" integrity sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA== dependencies: "@octokit/oauth-authorization-url" "^8.0.0" @@ -731,41 +581,36 @@ "@octokit/openapi-types@^25.1.0": version "25.1.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-25.1.0.tgz#5a72a9dfaaba72b5b7db375fd05e90ca90dc9682" integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== -"@octokit/openapi-types@^26.0.0": - version "26.0.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz" - integrity sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA== - "@octokit/openapi-webhooks-types@12.0.3": version "12.0.3" - resolved "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.0.3.tgz" + resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.0.3.tgz#fa44fb31fbb4c444c5fd640dbbf537f00c20617c" integrity sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA== "@octokit/plugin-paginate-graphql@^6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz#acdefd7e85ce24716e7ad7352f2df4d29d0e273b" integrity sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ== "@octokit/plugin-paginate-rest@^13.0.0": version "13.1.1" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz#ca5bb1c7b85a583691263c1f788f607e9bcb74b3" integrity sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw== dependencies: "@octokit/types" "^14.1.0" "@octokit/plugin-rest-endpoint-methods@^16.0.0": - version "16.1.0" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz" - integrity sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw== + version "16.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz#ba30ca387fc2ac8bd93cf9f951174736babebd97" + integrity sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g== dependencies: - "@octokit/types" "^15.0.0" + "@octokit/types" "^14.1.0" "@octokit/plugin-retry@^8.0.1": version "8.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz#ee4a0487d31b97ad3deaf737faad68abeca3c227" integrity sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw== dependencies: "@octokit/request-error" "^7.0.0" @@ -774,7 +619,7 @@ "@octokit/plugin-throttling@^11.0.1": version "11.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz#31a0b5e759f0313514d9522a4103360f17ffc2e4" integrity sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw== dependencies: "@octokit/types" "^14.0.0" @@ -782,14 +627,14 @@ "@octokit/request-error@^7.0.0": version "7.0.0" - resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.0.0.tgz#48ae2cd79008315605d00e83664891a10a5ddb97" integrity sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg== dependencies: "@octokit/types" "^14.0.0" "@octokit/request@^10.0.2": version "10.0.3" - resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.3.tgz#2ffdb88105ce20d25dcab8a592a7040ea48306c7" integrity sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== dependencies: "@octokit/endpoint" "^11.0.0" @@ -800,27 +645,20 @@ "@octokit/types@^14.0.0", "@octokit/types@^14.1.0": version "14.1.0" - resolved "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-14.1.0.tgz#3bf9b3a3e3b5270964a57cc9d98592ed44f840f2" integrity sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g== dependencies: "@octokit/openapi-types" "^25.1.0" -"@octokit/types@^15.0.0": - version "15.0.0" - resolved "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz" - integrity sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ== - dependencies: - "@octokit/openapi-types" "^26.0.0" - "@octokit/webhooks-methods@^6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz#34abf78aec6f826fe561cfe79d2ebb1950d1d25f" integrity sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ== "@octokit/webhooks@^14.0.0": - version "14.1.3" - resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.1.3.tgz" - integrity sha512-gcK4FNaROM9NjA0mvyfXl0KPusk7a1BeA8ITlYEZVQCXF5gcETTd4yhAU0Kjzd8mXwYHppzJBWgdBVpIR9wUcQ== + version "14.1.1" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-14.1.1.tgz#88b873779acdddcc568a20ebb32aa72c1afa4b7c" + integrity sha512-4kN/yPhcZEP+X7iMMuBTk+dD4ZGOpU57F7kHKrFlD2SSY/Sxh01t79oVn4npchLdPIXvLKrQw0uBXhmEaiZAdw== dependencies: "@octokit/openapi-webhooks-types" "12.0.3" "@octokit/request-error" "^7.0.0" @@ -833,51 +671,51 @@ dependencies: "@opentelemetry/api" "^1.3.0" -"@opentelemetry/api@^1.3.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.0.0 <1.5.0": - version "1.4.1" - resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz" - integrity sha1-/yLrLl1Hb7wkUKGW5A3SQ8wgwo8=sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== +"@opentelemetry/api@>=1.0.0 <1.10.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== "@opentelemetry/core@>=1.14.0 <1.31.0": - version "1.14.0" - resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz" - integrity sha1-ZOh2spy3NsmE1UFkzUdDP1E+r9M=sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw== sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27" + integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== dependencies: - "@opentelemetry/semantic-conventions" "1.14.0" + "@opentelemetry/semantic-conventions" "1.28.0" -"@opentelemetry/semantic-conventions@1.14.0": - version "1.14.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz" - integrity sha1-anKbfzcs4w93o/IXwJvCFvhj/Ms=sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug== sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug== +"@opentelemetry/semantic-conventions@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -885,79 +723,72 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" - integrity sha1-/UylsGNVQwfoMntFZL1W07c5JKM=sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - "@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": version "3.0.1" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^13.0.1": - version "13.0.5" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz" - integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers@11.2.2": version "11.2.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== dependencies: "@sinonjs/commons" "^3.0.0" +"@sinonjs/fake-timers@^13.0.1": + version "13.0.5" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" + integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz" - integrity sha1-DUiMke+z+hRC4mq+qBdZ38i1rGA=sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + version "8.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" + integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.1" lodash.get "^4.4.2" - type-detect "^4.0.8" + type-detect "^4.1.0" "@sinonjs/text-encoding@^0.7.3": version "0.7.3" - resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== "@stylistic/eslint-plugin@^5.0.0": version "5.3.1" - resolved "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.3.1.tgz#1aead935023b708ca6a27d079b1a96b726a38fe2" integrity sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg== dependencies: "@eslint-community/eslint-utils" "^4.7.0" @@ -969,60 +800,75 @@ "@types/aws-lambda@^8.10.83": version "8.10.152" - resolved "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.152.tgz#f68424a8175f0a54a2a941e65b76c3f51f3bd89d" integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== "@types/estree@^1.0.6": version "1.0.8" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@^18.19.106", "@types/node@>=13.7.0": - version "18.19.126" - resolved "https://registry.npmjs.org/@types/node/-/node-18.19.126.tgz" - integrity sha512-8AXQlBfrGmtYJEJUPs63F/uZQqVeFiN9o6NUjbDJYfxNxFnArlZufANPw4h6dGhYGKxcyw+TapXFvEsguzIQow== +"@types/node@>=13.7.0": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== + dependencies: + undici-types "~6.20.0" + +"@types/node@^18.19.106": + version "18.19.124" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.124.tgz#6f49e4fab8274910691a900e8a14316cbf3c7a31" + integrity sha512-hY4YWZFLs3ku6D2Gqo3RchTd9VRCcrjqp/I0mmohYeUVA5Y8eCXKJEasHxLAJVZRJuQogfd1GiJ9lgogBgKeuQ== dependencies: undici-types "~5.26.4" "@types/prop-types@*": - version "15.7.11" + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== -"@types/react@^17.0.52", "@types/react@>=16.8.0": - version "17.0.73" +"@types/react@^17.0.52": + version "17.0.87" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.87.tgz#998a5e146fbea449986d95a794c0aff47f12b6e6" + integrity sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" + "@types/scheduler" "^0.16" csstype "^3.0.2" -"@types/scheduler@*": +"@types/scheduler@^0.16": version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/yoga-layout@1.9.2": version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" + integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== "@typescript-eslint/types@^8.41.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz" - integrity sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA== + version "8.42.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.42.0.tgz#ae15c09cebda20473772902033328e87372db008" + integrity sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== accepts@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== dependencies: mime-types "^3.0.0" @@ -1030,22 +876,22 @@ accepts@^2.0.0: acorn-import-attributes@^1.9.5: version "1.9.5" - resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.14.0, acorn@^8.15.0: +acorn@^8.14.0, acorn@^8.15.0: version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1053,7 +899,7 @@ aggregate-error@^3.0.0: ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1063,42 +909,41 @@ ajv@^6.12.4: ansi-escapes@^4.2.1: version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^3.2.1: - version "3.2.1" - dependencies: - color-convert "^1.9.0" + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== ansicolors@~0.3.2: version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1106,36 +951,36 @@ anymatch@~3.1.2: append-field@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== append-transform@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: default-require-extensions "^3.0.0" archy@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -1143,7 +988,7 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-includes@^3.1.9: version "3.1.9" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== dependencies: call-bind "^1.0.8" @@ -1157,7 +1002,7 @@ array-includes@^3.1.9: array.prototype.findlastindex@^1.2.6: version "1.2.6" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== dependencies: call-bind "^1.0.8" @@ -1170,7 +1015,7 @@ array.prototype.findlastindex@^1.2.6: array.prototype.flat@^1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: call-bind "^1.0.8" @@ -1180,7 +1025,7 @@ array.prototype.flat@^1.3.3: array.prototype.flatmap@^1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: call-bind "^1.0.8" @@ -1190,7 +1035,7 @@ array.prototype.flatmap@^1.3.3: arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -1203,40 +1048,44 @@ arraybuffer.prototype.slice@^1.0.4: assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-function@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-hook-domain@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/async-hook-domain/-/async-hook-domain-2.0.4.tgz#5a24910982c04394ea33dd442860f80cce2d972c" integrity sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== auto-bind@4.0.0: version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axios@^1.12.2: version "1.12.2" - resolved "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== dependencies: follow-redirects "^1.15.6" @@ -1245,40 +1094,35 @@ axios@^1.12.2: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -baseline-browser-mapping@^2.8.3: - version "2.8.5" - resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.5.tgz" - integrity sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q== - before-after-hook@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== benchmark@^2.1.4: version "2.1.4" - resolved "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== dependencies: lodash "^4.17.4" platform "^1.3.3" binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bind-obj-methods@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz#65b66544d9d668d80dfefe2089dd347ad1dbcaed" integrity sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw== body-parser@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== dependencies: bytes "^3.1.2" @@ -1293,80 +1137,71 @@ body-parser@^2.2.0: bottleneck@^2.15.3: version "2.19.5" - resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.21.3, browserslist@^4.25.3, "browserslist@>= 4.21.0": - version "4.26.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz" - integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== +browserslist@^4.24.0, browserslist@^4.25.1: + version "4.25.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== dependencies: - baseline-browser-mapping "^2.8.3" - caniuse-lite "^1.0.30001741" - electron-to-chromium "^1.5.218" - node-releases "^2.0.21" + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" update-browserslist-db "^1.1.3" -browserslist@^4.22.2: - version "4.22.2" - dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== builtin-modules@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-5.0.0.tgz#9be95686dedad2e9eed05592b07733db87dcff1a" integrity sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg== busboy@^1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" -bytes@^3.1.2, bytes@3.1.2: +bytes@3.1.2, bytes@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== caching-transform@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: hasha "^5.0.0" @@ -1376,7 +1211,7 @@ caching-transform@^4.0.0: call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -1384,7 +1219,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -1394,7 +1229,7 @@ call-bind@^1.0.7, call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1402,49 +1237,49 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: caller-callsite@^4.1.0: version "4.1.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-4.1.0.tgz#3e33cb1d910e7b09332d59a3503b9af7462f7295" + integrity sha512-99nnnGlJexTc41xwQTr+mWl15OI5PPczUJzM4YRE7QjkefMKCXGa5gfQjCOuVrD+1TjI/fevIDHg2nz3iYN5Ig== dependencies: callsites "^3.1.0" caller-path@^3.0.1: version "3.0.1" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-3.0.1.tgz#bc932ecec3f943e10c2f8922146e23b132f932e4" + integrity sha512-fhmztL4wURO/BzwJUJ4aVRdnKEFskPBbrJ8fNgl7XdUiD1ygzzlt+nhPgUBSRq2ciEVubo6x+W8vJQzm55QLLQ== dependencies: caller-callsite "^4.1.0" -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -callsites@^3.1.0: - version "3.1.0" - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001565: - version "1.0.30001570" - -caniuse-lite@^1.0.30001741: - version "1.0.30001743" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz" - integrity sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw== +caniuse-lite@^1.0.30001726: + version "1.0.30001727" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== cardinal@^2.1.1: version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== dependencies: ansicolors "~0.3.2" redeyed "~2.1.0" -chai@^4.0.0, chai@^4.5.0: +chai@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" @@ -1455,30 +1290,17 @@ chai@^4.0.0, chai@^4.5.0: pathval "^1.1.1" type-detect "^4.1.0" -chalk@^2.4.2: - version "2.4.2" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^3.0.0: version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1486,20 +1308,20 @@ chalk@^4.1.0: change-case@^5.4.4: version "5.4.4" - resolved "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== check-error@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" chokidar@^3.3.0: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1513,53 +1335,61 @@ chokidar@^3.3.0: chokidar@^4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" ci-info@^2.0.0: version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== cjs-module-lexer@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" - integrity sha1-bDcKsZ+KM5TjGP5oJobsCsaE0Qc=sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== clean-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== dependencies: escape-string-regexp "^1.0.5" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.0: version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^3.1.0: version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" string-width "^4.2.0" cliui@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -1568,7 +1398,7 @@ cliui@^6.0.0: cliui@^7.0.4: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1577,7 +1407,7 @@ cliui@^7.0.4: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -1586,59 +1416,53 @@ cliui@^8.0.1: code-excerpt@^3.0.0: version "3.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" + integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== dependencies: convert-to-spaces "^1.0.1" -color-convert@^1.9.0: - version "1.9.3" - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-name@1.1.3: - version "1.1.3" - color-support@^1.1.0: version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^10.0.1: version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -1648,54 +1472,56 @@ concat-stream@^2.0.0: content-disposition@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== dependencies: safe-buffer "5.2.1" content-type@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha1-i3cxYmVtHRCGeEyPI6VM5tc9eRg=sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== convert-to-spaces@^1.0.1: version "1.0.2" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" + integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== cookie-signature@^1.2.1: version "1.2.2" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== cookie@^0.7.1: version "0.7.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== core-js-compat@^3.44.0: - version "3.45.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz" - integrity sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== + version "3.44.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" + integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== dependencies: - browserslist "^4.25.3" + browserslist "^4.25.1" core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1704,15 +1530,17 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: crypto-randomuuid@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz#acf583e5e085e867ae23e107ff70279024f9e9e7" integrity sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA== csstype@^3.0.2: version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -1721,7 +1549,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -1730,7 +1558,7 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" @@ -1739,55 +1567,55 @@ data-view-byte-offset@^1.0.1: dc-polyfill@^0.1.10: version "0.1.10" - resolved "https://registry.npmjs.org/dc-polyfill/-/dc-polyfill-0.1.10.tgz" + resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.10.tgz#6f2ada1a9e449587c363ca98cfb79b443cf74b70" integrity sha512-9iSbB8XZ7aIrhUtWI5ulEOJ+IyUN+axquodHK+bZO4r7HfY/xwmo6I4fYYf+aiDom+WMcN/wnzCz+pKvHDDCug== debug@^3.2.7: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5, debug@^4.4.0: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" - integrity sha1-fHd1UTCS99+Y2N+Zlt0IXrZozG0=sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: strip-bom "^4.0.0" define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1796,7 +1624,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1805,54 +1633,49 @@ define-properties@^1.2.1: delay@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@^2.0.0, depd@2.0.0: +depd@2.0.0, depd@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE=sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff@^4.0.1: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diff@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1861,48 +1684,45 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.601: - version "1.4.614" - -electron-to-chromium@^1.5.218: - version "1.5.221" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.221.tgz" - integrity sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ== +electron-to-chromium@^1.5.173: + version "1.5.189" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.189.tgz#a5c41d2e5c64e2e6cd11bdf4eeeebc1ec8601e08" + integrity sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== encodeurl@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== enhanced-resolve@^5.17.1: - version "5.18.3" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== + version "5.18.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464" + integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: version "1.24.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== dependencies: array-buffer-byte-length "^1.0.2" @@ -1962,24 +1782,24 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24 es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1989,14 +1809,14 @@ es-set-tostringtag@^2.1.0: es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: hasown "^2.0.2" es-to-primitive@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" @@ -2005,44 +1825,44 @@ es-to-primitive@^1.3.0: es6-error@^4.0.1: version "4.1.1" - resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-compat-utils@^0.5.1: version "0.5.1" - resolved "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== dependencies: semver "^7.5.4" eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -2051,21 +1871,21 @@ eslint-import-resolver-node@^0.3.9: eslint-module-utils@^2.12.1: version "2.12.1" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== dependencies: debug "^3.2.7" eslint-plugin-cypress@^5.1.0: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-5.1.1.tgz#186dd252b4520ce81f59a7d7213050e5f748fa9f" integrity sha512-LxTmZf1LLh9EklZBVvKNEZj71X9tCJnlYDviAJGsOgEVc6jz+tBODSpm02CS/9eJOfRqGsmVyvIw7LHXQ13RaA== dependencies: globals "^16.2.0" eslint-plugin-es-x@^7.8.0: version "7.8.0" - resolved "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== dependencies: "@eslint-community/eslint-utils" "^4.1.2" @@ -2074,7 +1894,7 @@ eslint-plugin-es-x@^7.8.0: eslint-plugin-import@^2.32.0: version "2.32.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== dependencies: "@rtsao/scc" "^1.1.0" @@ -2099,7 +1919,7 @@ eslint-plugin-import@^2.32.0: eslint-plugin-mocha@^10.5.0: version "10.5.0" - resolved "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz#0aca8d709e7cddef566e0dc252f6b02e307a2b7e" integrity sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw== dependencies: eslint-utils "^3.0.0" @@ -2107,9 +1927,9 @@ eslint-plugin-mocha@^10.5.0: rambda "^7.4.0" eslint-plugin-n@^17.20.0: - version "17.23.0" - resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.0.tgz" - integrity sha512-aPePGxUr5LezcXmMRBF83eK1MmqUYY1NdLdHC+jdpfc5b98eL7yDXY20gXJ6DcTxrHBhrLsfYYqo7J+m0h9YXQ== + version "17.21.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz#a07592c28390ac742bf52acae89048c997a7b91c" + integrity sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw== dependencies: "@eslint-community/eslint-utils" "^4.5.0" enhanced-resolve "^5.17.1" @@ -2123,14 +1943,14 @@ eslint-plugin-n@^17.20.0: eslint-plugin-promise@^7.2.1: version "7.2.1" - resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz#a0652195700aea40b926dc3c74b38e373377bfb0" integrity sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" eslint-plugin-unicorn@^60.0.0: version "60.0.0" - resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz#68f712bcb17e94bd176cce7312647ba1d1409c3c" integrity sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" @@ -2154,7 +1974,7 @@ eslint-plugin-unicorn@^60.0.0: eslint-scope@^8.4.0: version "8.4.0" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" @@ -2162,29 +1982,29 @@ eslint-scope@^8.4.0: eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", eslint@^9.29.0, eslint@>=5, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=8, eslint@>=8.23.0, eslint@>=9, eslint@>=9.0.0, eslint@>=9.29.0: +eslint@^9.29.0: version "9.35.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.35.0.tgz#7a89054b7b9ee1dfd1b62035d8ce75547773f47e" integrity sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg== dependencies: "@eslint-community/eslint-utils" "^4.8.0" @@ -2225,58 +2045,55 @@ eslint-visitor-keys@^4.2.1: espree@^10.0.1, espree@^10.4.0: version "10.4.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: acorn "^8.15.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esprima@~4.0.0: - version "4.0.1" - esquery@^1.5.0, esquery@^1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@^1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== events-to-array@^1.0.1: version "1.1.2" - resolved "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA== express@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== dependencies: accepts "^2.0.0" @@ -2309,54 +2126,54 @@ express@^5.1.0: fast-content-type-parse@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz#5590b6c807cc598be125e6740a9fde589d2b7afb" integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-fifo@^1.3.2: version "1.3.2" - resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-keys@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" integrity sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA== dependencies: is-object "~1.0.1" merge-descriptors "~1.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" finalhandler@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== dependencies: debug "^4.4.0" @@ -2368,7 +2185,7 @@ finalhandler@^2.1.0: find-cache-dir@^3.2.0: version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -2377,20 +2194,12 @@ find-cache-dir@^3.2.0: find-up-simple@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2398,7 +2207,7 @@ find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2406,12 +2215,12 @@ find-up@^5.0.0: findit@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" integrity sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg== flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -2419,29 +2228,29 @@ flat-cache@^4.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: version "3.3.3" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== follow-redirects@^1.15.6: - version "1.15.11" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" foreground-child@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: cross-spawn "^7.0.0" @@ -2449,7 +2258,7 @@ foreground-child@^2.0.0: foreground-child@^3.1.0: version "3.3.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: cross-spawn "^7.0.6" @@ -2457,7 +2266,7 @@ foreground-child@^3.1.0: form-data@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" @@ -2468,47 +2277,47 @@ form-data@^4.0.4: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== fromentries@^1.2.0: version "1.3.2" - resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-exists-cached@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" integrity sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function-loop@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/function-loop/-/function-loop-2.0.1.tgz#799c56ced01698cf12a1b80e4802e9dafc2ebada" integrity sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.1.8" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -2520,27 +2329,27 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -2556,17 +2365,17 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-port@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-proto@^1.0.1: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -2574,7 +2383,7 @@ get-proto@^1.0.1: get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -2583,28 +2392,28 @@ get-symbol-description@^1.1.0: get-tsconfig@^4.8.1: version "4.10.1" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^10.4.5: version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" @@ -2616,7 +2425,7 @@ glob@^10.4.5: glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2626,36 +2435,31 @@ glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.24.0: version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globals@^14.0.0: version "14.0.0" - resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.11.0: version "15.15.0" - resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== globals@^16.2.0, globals@^16.3.0: - version "16.4.0" - resolved "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz" - integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== + version "16.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" + integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2663,68 +2467,63 @@ globalthis@^1.0.4: globrex@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.15, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphql@*: - version "0.13.2" - resolved "https://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz" - integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog== - dependencies: - iterall "^1.2.1" + version "16.11.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" + integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasha@^5.0.0: version "5.2.2" - resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" @@ -2732,24 +2531,24 @@ hasha@^5.0.0: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@^2.0.0, http-errors@2.0.0: +http-errors@2.0.0, http-errors@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -2758,51 +2557,39 @@ http-errors@^2.0.0, http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -iconv-lite@^0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" - integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@^7.0.5: version "7.0.5" - resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-in-the-middle@^1.14.2: version "1.14.2" - resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz#283661625a88ff7c0462bd2984f77715c3bc967c" integrity sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw== dependencies: acorn "^8.14.0" @@ -2812,34 +2599,36 @@ import-in-the-middle@^1.14.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indent-string@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ink@^3.2.0: version "3.2.0" + resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" + integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== dependencies: ansi-escapes "^4.2.1" auto-bind "4.0.0" @@ -2867,7 +2656,7 @@ ink@^3.2.0: internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -2876,12 +2665,12 @@ internal-slot@^1.1.0: ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -2890,7 +2679,7 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-async-function@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -2901,21 +2690,21 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: version "1.2.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -2923,31 +2712,33 @@ is-boolean-object@^1.2.1: is-builtin-module@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz#19df4b9c7451149b68176b0e06d18646db6308dd" integrity sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA== dependencies: builtin-modules "^5.0.0" is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1: version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -2956,7 +2747,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -2964,48 +2755,51 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha1-8VWLrxrBfg3up8BBXEODUf8rPHI=sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -3013,27 +2807,27 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-object@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-promise@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -3043,24 +2837,24 @@ is-regex@^1.2.1: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -3068,7 +2862,7 @@ is-string@^1.1.1: is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -3077,36 +2871,36 @@ is-symbol@^1.0.4, is-symbol@^1.1.1: is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -3114,39 +2908,39 @@ is-weakset@^2.0.3: is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-hook@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: append-transform "^2.0.0" istanbul-lib-instrument@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -3156,7 +2950,7 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-processinfo@^2.0.2, istanbul-lib-processinfo@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: archy "^1.0.0" @@ -3167,17 +2961,17 @@ istanbul-lib-processinfo@^2.0.2, istanbul-lib-processinfo@^2.0.3: uuid "^8.3.2" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -3185,28 +2979,23 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - jackspeak@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-1.4.2.tgz#30ad5e4b7b36f9f3ae580e23272b1a386b4f6b93" integrity sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q== dependencies: cliui "^7.0.4" jackspeak@^3.1.2: version "3.4.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" @@ -3215,19 +3004,19 @@ jackspeak@^3.1.2: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" - integrity sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo=sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3235,69 +3024,61 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsep@^0.4.0||^1.0.0, jsep@^1.4.0: +jsep@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@^3.1.0: +jsesc@^3.0.2, jsesc@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - json5@^2.2.3: version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonpath-plus@^10.3.0: version "10.3.0" - resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz" + resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz#59e22e4fa2298c68dfcd70659bb47f0cad525238" integrity sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA== dependencies: "@jsep-plugin/assignment" "^1.3.0" @@ -3306,7 +3087,7 @@ jsonpath-plus@^10.3.0: jszip@^3.10.1: version "3.10.1" - resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -3316,33 +3097,33 @@ jszip@^3.10.1: just-extend@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" koalas@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/koalas/-/koalas-1.0.2.tgz#318433f074235db78fae5661a02a8ca53ee295cd" integrity sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA== levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" libtap@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz" - integrity sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/libtap/-/libtap-1.4.1.tgz#6e2ba70ddc39c676c9f887333c354fab6d359613" + integrity sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw== dependencies: async-hook-domain "^2.0.4" bind-obj-methods "^3.0.0" @@ -3360,215 +3141,218 @@ libtap@^1.4.0: lie@~3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" limiter@^1.1.5: version "1.1.5" - resolved "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.sortby@^4.7.0: version "4.7.0" - resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash@^4.17.20: - version "4.17.21" - -lodash@^4.17.4: +lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" long@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== + version "5.3.1" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96" + integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== loose-envify@^1.1.0: version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.6: version "2.3.7" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^7.14.0: version "7.18.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + merge-descriptors@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== merge-descriptors@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.12, mime-types@~2.1.24: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime-types@^3.0.0: +mime-types@^3.0.0, mime-types@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" - integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== - dependencies: - mime-db "^1.54.0" - -mime-types@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== dependencies: mime-db "^1.54.0" mimic-fn@^2.1.0: version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^3.1.5, minipass@^3.1.6, minipass@^3.3.4: version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@^0.5.6: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@^11.6.0: version "11.7.2" - resolved "https://registry.npmjs.org/mocha/-/mocha-11.7.2.tgz" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5" integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ== dependencies: browser-stdout "^1.3.1" @@ -3594,25 +3378,22 @@ mocha@^11.6.0: module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== module-not-found-error@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" integrity sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g== -ms@^2.1.1, ms@^2.1.3: +ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -ms@^2.1.2, ms@2.1.2: - version "2.1.2" - multer@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/multer/-/multer-2.0.2.tgz#08a8aa8255865388c387aaf041426b0c87bf58dd" integrity sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw== dependencies: append-field "^1.0.0" @@ -3625,24 +3406,24 @@ multer@^2.0.2: mutexify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/mutexify/-/mutexify-1.4.0.tgz#b7f4ac0273c81824b840887c6a6e0bfab14bbe94" integrity sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg== dependencies: queue-tick "^1.0.0" natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== nise@^6.0.0: version "6.1.1" - resolved "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a" integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g== dependencies: "@sinonjs/commons" "^3.0.1" @@ -3653,7 +3434,7 @@ nise@^6.0.0: nock@^13.5.6: version "13.5.6" - resolved "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" @@ -3662,42 +3443,39 @@ nock@^13.5.6: node-addon-api@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-gyp-build@^3.9.0, node-gyp-build@<4.0: +node-gyp-build@<4.0, node-gyp-build@^3.9.0: version "3.9.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== node-gyp-build@^4.5.0: version "4.8.4" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== node-preload@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.14: - version "2.0.14" - -node-releases@^2.0.21: - version "2.0.21" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz" - integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== nyc@^15.1.0: version "15.1.0" - resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" @@ -3730,22 +3508,22 @@ nyc@^15.1.0: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -3757,7 +3535,7 @@ object.assign@^4.1.7: object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -3767,7 +3545,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -3776,7 +3554,7 @@ object.groupby@^1.0.3: object.values@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: call-bind "^1.0.8" @@ -3786,7 +3564,7 @@ object.values@^1.2.1: octokit@^5.0.3: version "5.0.3" - resolved "https://registry.npmjs.org/octokit/-/octokit-5.0.3.tgz" + resolved "https://registry.yarnpkg.com/octokit/-/octokit-5.0.3.tgz#1e4f110e28218ab9676c28da5f28ab403fe5b643" integrity sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ== dependencies: "@octokit/app" "^16.0.1" @@ -3803,36 +3581,38 @@ octokit@^5.0.3: on-finished@^2.4.1: version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.0, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" opener@^1.5.1: version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== opentracing@>=0.14.7: version "0.14.7" - resolved "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== optionator@^0.9.3: version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -3844,7 +3624,7 @@ optionator@^0.9.3: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -3853,59 +3633,59 @@ own-keys@^1.0.1: own-or-env@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/own-or-env/-/own-or-env-1.0.2.tgz#84e78d2d5128f7ee8a59f741ad5aafb4256a7c89" integrity sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw== dependencies: own-or "^1.0.0" own-or@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/own-or/-/own-or-1.0.0.tgz#4e877fbeda9a2ec8000fbc0bcae39645ee8bf8dc" integrity sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-hash@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" @@ -3915,52 +3695,54 @@ package-hash@^4.0.0: package-json-from-dist@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== pako@~1.0.2: version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parseurl@^1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== patch-console@^1.0.0: version "1.0.0" + resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" + integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -3968,99 +3750,86 @@ path-scurry@^1.11.1: path-to-regexp@^0.1.12: version "0.1.12" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -path-to-regexp@^8.0.0: - version "8.3.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" - integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== - -path-to-regexp@^8.1.0: - version "8.3.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" - integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== +path-to-regexp@^8.0.0, path-to-regexp@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -picocolors@^1.0.0: - version "1.0.0" - picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== - -picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pkg-dir@^4.1.0: version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" platform@^1.3.3: version "1.3.6" - resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== pprof-format@^2.1.1, pprof-format@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/pprof-format/-/pprof-format-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/pprof-format/-/pprof-format-2.2.1.tgz#64d32207fb46990349eb52825defb449d6ccc9b4" integrity sha512-p4tVN7iK19ccDqQv8heyobzUmbHyds4N2FI6aBMcXz6y99MglTWDxIyhFkNaLeEXs6IFUEzT0zya0icbSLLY0g== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" + integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== dependencies: fromentries "^1.2.0" propagate@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== protobufjs@^7.5.3: version "7.5.4" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -4078,7 +3847,7 @@ protobufjs@^7.5.3: proxy-addr@^2.0.7: version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -4086,12 +3855,12 @@ proxy-addr@^2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== proxyquire@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== dependencies: fill-keys "^1.0.2" @@ -4099,71 +3868,77 @@ proxyquire@^2.1.3: resolve "^1.11.1" punycode@^2.0.0, punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.14.0: version "6.14.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: side-channel "^1.1.0" queue-tick@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== rambda@^7.4.0: - version "7.4.0" - resolved "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz" - integrity sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ== + version "7.5.0" + resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.5.0.tgz#1865044c59bc0b16f63026c6e5a97e4b1bbe98fe" + integrity sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz" - integrity sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA== + version "3.0.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== dependencies: bytes "3.1.2" http-errors "2.0.0" - iconv-lite "0.7.0" + iconv-lite "0.6.3" unpipe "1.0.0" react-devtools-core@^4.19.1: version "4.28.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" + integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== dependencies: shell-quote "^1.6.1" ws "^7" react-reconciler@^0.26.2: version "0.26.2" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" + integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" scheduler "^0.20.2" -react@^17.0.2, react@>=16.8.0: +react@^17.0.2: version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" readable-stream@^3.0.2: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4171,9 +3946,9 @@ readable-stream@^3.0.2: util-deprecate "^1.0.1" readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -4185,24 +3960,26 @@ readable-stream@~2.3.6: readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redeyed@~2.1.0: version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== dependencies: esprima "~4.0.0" reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -4216,12 +3993,12 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: regexp-tree@^0.1.27: version "0.1.27" - resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== regexp.prototype.flags@^1.5.4: version "1.5.4" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -4233,49 +4010,51 @@ regexp.prototype.flags@^1.5.4: regjsparser@^0.12.0: version "0.12.0" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" release-zalgo@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: es6-error "^4.0.1" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== resolve-from@^3.0.0: version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.11.1, resolve@^1.22.4: version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -4284,30 +4063,32 @@ resolve@^1.11.1, resolve@^1.22.4: restore-cursor@^3.1.0: version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" signal-exit "^3.0.2" retry@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg=sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" router@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== dependencies: debug "^4.4.0" @@ -4318,7 +4099,7 @@ router@^2.2.0: safe-array-concat@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -4327,24 +4108,19 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.1.0, safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -4352,7 +4128,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -4361,38 +4137,35 @@ safe-regex-test@^1.1.0: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scheduler@^0.20.2: version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" semifies@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/semifies/-/semifies-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/semifies/-/semifies-1.0.0.tgz#b69569f32c2ba2ac04f705ea82831364289b2ae2" integrity sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw== -semver@^6.0.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.0, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: +semver@^7.5.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== send@^1.1.0, send@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== dependencies: debug "^4.3.5" @@ -4409,14 +4182,14 @@ send@^1.1.0, send@^1.2.0: serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" serve-static@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== dependencies: encodeurl "^2.0.0" @@ -4426,12 +4199,12 @@ serve-static@^2.2.0: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -4443,7 +4216,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -4453,7 +4226,7 @@ set-function-name@^2.0.2: set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" @@ -4462,37 +4235,34 @@ set-proto@^1.0.0: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1: - version "1.8.1" - -shell-quote@^1.8.2: +shell-quote@^1.6.1, shell-quote@^1.8.2: version "1.8.3" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -4500,7 +4270,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -4510,7 +4280,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -4521,7 +4291,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -4532,22 +4302,22 @@ side-channel@^1.1.0: signal-exit@^3.0.2, signal-exit@^3.0.4, signal-exit@^3.0.6: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sinon-chai@^3.7.0: version "3.7.0" - resolved "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.7.0.tgz#cfb7dec1c50990ed18c153f1840721cf13139783" integrity sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g== -sinon@^18.0.1, sinon@>=4.0.0: +sinon@^18.0.1: version "18.0.1" - resolved "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.1.tgz#464334cdfea2cddc5eda9a4ea7e2e3f0c7a91c5e" integrity sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw== dependencies: "@sinonjs/commons" "^3.0.1" @@ -4559,6 +4329,8 @@ sinon@^18.0.1, sinon@>=4.0.0: slice-ansi@^3.0.0: version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" @@ -4566,30 +4338,25 @@ slice-ansi@^3.0.0: source-map-support@^0.5.16: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== spawn-wrap@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: foreground-child "^2.0.0" @@ -4601,29 +4368,29 @@ spawn-wrap@^2.0.0: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stack-utils@^2.0.2: - version "2.0.6" - dependencies: - escape-string-regexp "^2.0.0" - -stack-utils@^2.0.4: +stack-utils@^2.0.2, stack-utils@^2.0.4: version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -statuses@^2.0.1, statuses@2.0.1: +statuses@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + stop-iteration-iterator@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: es-errors "^1.3.0" @@ -4631,28 +4398,12 @@ stop-iteration-iterator@^1.1.0: streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4661,7 +4412,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -4670,7 +4421,7 @@ string-width@^5.0.1, string-width@^5.1.2: string.prototype.trim@^1.2.10: version "1.2.10" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -4683,7 +4434,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.9: version "1.0.9" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -4693,89 +4444,86 @@ string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - ansi-regex "^5.0.1" + safe-buffer "~5.2.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-indent@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz" - integrity sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w== + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - dependencies: - has-flag "^3.0.0" - -supports-color@^7: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: +supports-color@^7, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tap-mocha-reporter@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz" - integrity sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g== + version "5.0.4" + resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz#666edb15c9b6b3ca7fe3af9908961d903f81c25b" + integrity sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw== dependencies: color-support "^1.1.0" debug "^4.1.1" @@ -4788,7 +4536,7 @@ tap-mocha-reporter@^5.0.3: tap-parser@^11.0.0, tap-parser@^11.0.2: version "11.0.2" - resolved "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-11.0.2.tgz#5d3e76e2cc521e23a8c50201487b273ca0fba800" integrity sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg== dependencies: events-to-array "^1.0.1" @@ -4797,14 +4545,14 @@ tap-parser@^11.0.0, tap-parser@^11.0.2: tap-yaml@^1.0.0, tap-yaml@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/tap-yaml/-/tap-yaml-1.0.2.tgz#62032a459e5524e10661c19ee9df5d33d78812fa" integrity sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg== dependencies: yaml "^1.10.2" tap@^16.3.10: version "16.3.10" - resolved "https://registry.npmjs.org/tap/-/tap-16.3.10.tgz" + resolved "https://registry.yarnpkg.com/tap/-/tap-16.3.10.tgz#cf246b56af02d34bdfffa576636a9e34b55aaa5f" integrity sha512-q5Am+PpGHS6JSjk/Zn4bCRBihmZVM15v/MYXUy60wenw5HDe7pVrevLCEoMEz7tuw6jaPOJJqni1y8apN23IGw== dependencies: "@isaacs/import-jsx" "^4.0.1" @@ -4835,20 +4583,20 @@ tap@^16.3.10: which "^2.0.2" tapable@^2.2.0: - version "2.2.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz" - integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg== + version "2.2.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== tcompare@^5.0.6, tcompare@^5.0.7: version "5.0.7" - resolved "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz" + resolved "https://registry.yarnpkg.com/tcompare/-/tcompare-5.0.7.tgz#8c2d647208031ed5cac5e573428149e16f795bbf" integrity sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w== dependencies: diff "^4.0.2" test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4857,36 +4605,35 @@ test-exclude@^6.0.0: tiktoken@^1.0.21: version "1.0.22" - resolved "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz" + resolved "https://registry.yarnpkg.com/tiktoken/-/tiktoken-1.0.22.tgz#a6c674839228bb88f32dfe646dff47193762f7d3" integrity sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA== tlhunter-sorted-set@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz#1c3eae28c0fa4dff97e9501d2e3c204b86406f4b" integrity sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw== -to-fast-properties@^2.0.0: - version "2.0.0" - to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toad-cache@^3.7.0: version "3.7.0" - resolved "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz" + resolved "https://registry.yarnpkg.com/toad-cache/-/toad-cache-3.7.0.tgz#b9b63304ea7c45ec34d91f1d2fa513517025c441" integrity sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== treport@^3.0.4: version "3.0.4" + resolved "https://registry.yarnpkg.com/treport/-/treport-3.0.4.tgz#05247fa7820ad3afe92355e4cf08fe41a933084b" + integrity sha512-zUw1sfJypuoZi0I54woo6CNsfvMrv+OwLBD0/wc4LhMW8MA0MbSE+4fNObn22JSR8x9lOYccuAzfBfZ2IemzoQ== dependencies: "@isaacs/import-jsx" "^4.0.1" cardinal "^2.1.1" @@ -4898,20 +4645,20 @@ treport@^3.0.4: unicode-length "^2.0.2" trivial-deferred@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz" - integrity sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw== sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/trivial-deferred/-/trivial-deferred-1.1.2.tgz#6b07aa1eb045f6128b8b30673b040f99bfe64a2e" + integrity sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g== ts-declaration-location@^1.0.6: version "1.0.7" - resolved "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz#d4068fe9975828b3b453b3ab112b4711d8267688" integrity sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA== dependencies: picomatch "^4.0.2" tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -4921,69 +4668,64 @@ tsconfig-paths@^3.15.0: tslib@^2.5.0: version "2.8.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== ttl-set@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/ttl-set/-/ttl-set-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/ttl-set/-/ttl-set-1.0.0.tgz#e7895d946ad9cedfadcf6e3384ea97322a86dd3b" integrity sha512-2fuHn/UR+8Z9HK49r97+p2Ru1b5Eewg2QqPrU14BVCQ9QoyU3+vLLZk2WEiyZ9sgJh6W8G1cZr9I2NBLywAHrA== dependencies: fast-fifo "^1.3.2" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.8, type-detect@4.0.8: +type-detect@4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-detect@^4.1.0: +type-detect@^4.0.0, type-detect@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.12.0: version "0.12.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" + integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.8.0: version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-is@^1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -type-is@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - -type-is@^2.0.1: +type-is@^2.0.0, type-is@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== dependencies: content-type "^1.0.5" @@ -4992,7 +4734,7 @@ type-is@^2.0.1: typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -5001,7 +4743,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -5012,7 +4754,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -5025,7 +4767,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -5037,24 +4779,19 @@ typed-array-length@^1.0.7: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@>=3.7.2, typescript@>=4.0.0: - version "5.9.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== - unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -5064,40 +4801,39 @@ unbox-primitive@^1.1.0: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicode-length@^2.0.2: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-length/-/unicode-length-2.1.0.tgz#425202b99f21854f5ca3530cc2a08dc262ce619f" integrity sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw== dependencies: punycode "^2.0.0" universal-github-app-jwt@^2.2.0: version "2.2.2" - resolved "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz#38537e5a7d154085a35f97601a5e30e9e17717df" integrity sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw== universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.3" - resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.13: - version "1.0.13" - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - update-browserslist-db@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" @@ -5105,29 +4841,29 @@ update-browserslist-db@^1.1.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== vary@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -5138,7 +4874,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -5157,7 +4893,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -5166,13 +4902,13 @@ which-collection@^1.0.2: is-weakset "^2.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.19" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" @@ -5185,29 +4921,31 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" widest-line@^3.1.0: version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workerpool@^9.2.0: - version "9.3.4" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz" - integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== + version "9.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.3.tgz#e75281fe62e851afb21cdeef8fa85f6a62ec3583" + integrity sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -5216,25 +4954,16 @@ workerpool@^9.2.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -5243,12 +4972,12 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -5257,44 +4986,48 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7, ws@^7.5.5: - version "7.5.9" + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xtend@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.2: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.8.0: version "2.8.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -5302,12 +5035,12 @@ yargs-parser@^18.1.2: yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -5317,7 +5050,7 @@ yargs-unparser@^2.0.0: yargs@^15.0.2: version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -5334,7 +5067,7 @@ yargs@^15.0.2: yargs@^17.7.2: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -5347,7 +5080,7 @@ yargs@^17.7.2: yarn-deduplicate@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz#63498d2d4c3a8567e992a994ce0ab51aa5681f2e" integrity sha512-Efx4XEj82BgbRJe5gvQbZmEO7pU5DgHgxohYZp98/+GwPqdU90RXtzvHirb7hGlde0sQqk5G3J3Woyjai8hVqA== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -5357,10 +5090,12 @@ yarn-deduplicate@^6.0.2: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yoga-layout-prebuilt@^1.9.6: version "1.10.0" + resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6" + integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g== dependencies: "@types/yoga-layout" "1.9.2" From 7dc148024c468d47d9407f94c0f40b7f2891e133 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 10:53:52 -0400 Subject: [PATCH 05/61] clean up logs --- README.md | 2 +- docs/API.md | 2 +- integration-tests/opentelemetry.spec.js | 4 ++-- packages/dd-trace/src/config.js | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 32a7b8210df..a73df9e0f64 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ Enable OpenTelemetry logs using standard OpenTelemetry environment variables: ```bash # Enable OpenTelemetry logs -export OTEL_LOGS_EXPORTER=otlp +export DD_LOGS_OTEL_ENABLED=true # OTLP endpoint URL export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs diff --git a/docs/API.md b/docs/API.md index ba106b24642..9a2734152c2 100644 --- a/docs/API.md +++ b/docs/API.md @@ -389,7 +389,7 @@ Enable OpenTelemetry logs using standard OpenTelemetry environment variables: ```bash # Enable OpenTelemetry logs -export OTEL_LOGS_EXPORTER=otlp +export DD_LOGS_OTEL_ENABLED=true # OTLP endpoint URL export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs diff --git a/integration-tests/opentelemetry.spec.js b/integration-tests/opentelemetry.spec.js index b5d5a46f4ce..90dcbf19f30 100644 --- a/integration-tests/opentelemetry.spec.js +++ b/integration-tests/opentelemetry.spec.js @@ -133,7 +133,7 @@ describe('opentelemetry', () => { OTEL_RESOURCE_ATTRIBUTES: 'foo+bar13baz+qux1', DD_TRACE_PROPAGATION_STYLE: 'datadog, tracecontext', OTEL_PROPAGATORS: 'datadog, tracecontext', - OTEL_LOGS_EXPORTER: 'none', + DD_LOGS_OTEL_ENABLED: 'false', OTEL_SDK_DISABLED: 'false' } }) @@ -206,7 +206,7 @@ describe('opentelemetry', () => { OTEL_METRICS_EXPORTER: 'foo', OTEL_RESOURCE_ATTRIBUTES: 'foo', OTEL_PROPAGATORS: 'foo', - OTEL_LOGS_EXPORTER: 'foo', + DD_LOGS_OTEL_ENABLED: 'foo', OTEL_SDK_DISABLED: 'foo' } }) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index ae9cdbb1888..c7b30db5726 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -58,6 +58,7 @@ const otelDdEnvMapping = { OTEL_TRACES_EXPORTER: 'DD_TRACE_ENABLED', OTEL_METRICS_EXPORTER: 'DD_RUNTIME_METRICS_ENABLED', OTEL_RESOURCE_ATTRIBUTES: 'DD_TAGS', + OTEL_LOGS_EXPORTER: undefined, OTEL_SDK_DISABLED: 'DD_TRACE_OTEL_ENABLED' } @@ -110,6 +111,7 @@ function validateEnvVarType (envVar) { return value.toLowerCase() === 'true' || value.toLowerCase() === 'false' case 'OTEL_TRACES_EXPORTER': case 'OTEL_METRICS_EXPORTER': + case 'OTEL_LOGS_EXPORTER': return value.toLowerCase() === 'none' default: return false From 2c60dfc817bd1f234d38b3005c273e65fec78106 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 10:56:08 -0400 Subject: [PATCH 06/61] add back log exporter logic --- docs/API.md | 60 ++--------------------------------------------------- 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/docs/API.md b/docs/API.md index 9a2734152c2..3cfe923415f 100644 --- a/docs/API.md +++ b/docs/API.md @@ -421,64 +421,8 @@ The LoggerProvider is the main entry point for creating loggers. It follows the const tracer = require('dd-trace').init() const { logs } = require('@opentelemetry/api-logs') -// Get a logger from OpenTelemetry API -const logger = logs.getLogger('my-service', '1.0.0') -``` - -#### Logger Usage - -Loggers support the standard OpenTelemetry log levels and methods: - -```javascript -// Different log levels -logger.emit({ - severityText: 'DEBUG', - severityNumber: 5, - body: 'Debug message', - attributes: { debug: 'info' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Info message', - attributes: { user: 'john' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'WARN', - severityNumber: 13, - body: 'Warning message', - attributes: { warning: 'deprecated' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'ERROR', - severityNumber: 17, - body: 'Error message', - attributes: { error: 'connection failed' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'FATAL', - severityNumber: 21, - body: 'Fatal message', - attributes: { error: 'system crash' }, - timestamp: Date.now() * 1000000 -}) - -// Custom log record -logger.emit({ - severityText: 'INFO', - severityNumber: 9, // INFO level - body: 'Custom log message', - attributes: { custom: 'data' }, - timestamp: Date.now() * 1000000 // nanoseconds -}) +// Get a logger from OpenTelemetry API OR logging library with builtin otel support +// Ex: const logger = logs.getLogger('my-service', '1.0.0') ``` #### OTLP Export From dabe98f2ac0e482266ef19400d6d383825285d51 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 12:36:06 -0400 Subject: [PATCH 07/61] clean up docs --- docs/API.md | 71 +++++++++++++++-------------------------------------- 1 file changed, 20 insertions(+), 51 deletions(-) diff --git a/docs/API.md b/docs/API.md index 3cfe923415f..04df6e3f6d6 100644 --- a/docs/API.md +++ b/docs/API.md @@ -381,67 +381,36 @@ The following attributes are available to override Datadog-specific options:

OpenTelemetry Logs

-dd-trace-js includes experimental support for OpenTelemetry logs, implementing the [OpenTelemetry Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) specification. This allows you to send structured log data using the OpenTelemetry standard. - -#### Configuration - -Enable OpenTelemetry logs using standard OpenTelemetry environment variables: - -```bash -# Enable OpenTelemetry logs -export DD_LOGS_OTEL_ENABLED=true - -# OTLP endpoint URL -export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs - -# Optional headers (JSON format) -export OTEL_EXPORTER_OTLP_LOGS_HEADERS='{"Authorization": "Bearer token"}' - -# Request timeout in milliseconds -export OTEL_EXPORTER_OTLP_TIMEOUT=10000 - -# Batch timeout in milliseconds -export OTEL_BSP_SCHEDULE_DELAY=5000 - -# Maximum number of log records per batch -export OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512 - -# Maximum queue size -export OTEL_BSP_MAX_QUEUE_SIZE=2048 - -# Export timeout in milliseconds -export OTEL_BSP_EXPORT_TIMEOUT=30000 -``` - -#### LoggerProvider - -The LoggerProvider is the main entry point for creating loggers. It follows the [OpenTelemetry LoggerProvider specification](https://opentelemetry.io/docs/specs/otel/logs/sdk/#loggerprovider): +dd-trace-js includes experimental support for OpenTelemetry logs, designed as a drop-in replacement for the OpenTelemetry SDK. This support is primarily intended for logging libraries rather than direct user configuration. Enable it by setting `DD_LOGS_OTEL_ENABLED=true` and use the [OpenTelemetry Logs API](https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_api-logs.html) to emit structured log data: ```javascript const tracer = require('dd-trace').init() const { logs } = require('@opentelemetry/api-logs') -// Get a logger from OpenTelemetry API OR logging library with builtin otel support -// Ex: const logger = logs.getLogger('my-service', '1.0.0') +const logger = logs.getLogger('my-service', '1.0.0') +logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Application started', + attributes: { version: '1.0.0' }, + timestamp: Date.now() * 1000000 +}) ``` -#### OTLP Export - -Logs are exported using the [OTLP (OpenTelemetry Protocol)](https://opentelemetry.io/docs/specs/otlp/) over HTTP. The implementation includes: - -- **Batch Processing**: Logs are batched for efficient transmission -- **Protobuf Serialization**: Uses Protocol Buffers for compact data format -- **Automatic Retries**: Built-in retry logic for failed exports -- **Resource Attributes**: Automatic service metadata injection +#### Supported Configuration -#### References +The Datadog SDK supports many of the configurations supported by the OpenTelemetry SDK. The following environment variables are supported: -For more information about OpenTelemetry logs: +- `DD_LOGS_OTEL_ENABLED` - Enable OpenTelemetry logs (default: `false`) +- `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL (default: `http://localhost:4318/v1/logs`) +- `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - Optional headers in JSON format (default: `{}`) +- `OTEL_EXPORTER_OTLP_TIMEOUT` - Request timeout in milliseconds (default: `10000`) +- `OTEL_BSP_SCHEDULE_DELAY` - Batch timeout in milliseconds (default: `5000`) +- `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` - Maximum logs per batch (default: `512`) +- `OTEL_BSP_MAX_QUEUE_SIZE` - Maximum queue size (default: `2048`) +- `OTEL_BSP_EXPORT_TIMEOUT` - Export timeout in milliseconds (default: `30000`) -* [OpenTelemetry Logs Overview](https://opentelemetry.io/docs/specs/otel/logs/overview/) -* [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) -* [OTLP Protocol Specification](https://opentelemetry.io/docs/specs/otlp/) -* [OpenTelemetry Logs SDK](https://opentelemetry.io/docs/specs/otel/logs/sdk/) +Logs are exported via OTLP over HTTP with protobuf serialization. For complete OTLP exporter configuration options, see the [OpenTelemetry OTLP Exporter documentation](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/).

Advanced Configuration

From b7ae33d5dfddaa8b64b860856ae16acbcfe6fd84 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 13:04:43 -0400 Subject: [PATCH 08/61] clean up docs and fix otlp protocol --- README.md | 72 +---------------- docs/API.md | 4 +- packages/dd-trace/src/config.js | 12 +++ packages/dd-trace/src/config_defaults.js | 1 + packages/dd-trace/src/proxy.js | 3 +- .../src/supported-configurations.json | 2 + .../dd-trace/test/opentelemetry/logs.spec.js | 78 +++++++++++++++++++ 7 files changed, 100 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index a73df9e0f64..b452c200814 100644 --- a/README.md +++ b/README.md @@ -96,78 +96,10 @@ Please refer to the [SECURITY.md](https://github.com/DataDog/dd-trace-js/blob/ma ## Datadog With OpenTelemetry +### OpenTelemetry Tracing Support + Please refer to the [Node.js Custom Instrumentation using OpenTelemetry API](https://docs.datadoghq.com/tracing/trace_collection/custom_instrumentation/nodejs/otel/) document. It includes information on how to use the OpenTelemetry API with dd-trace-js. ### OpenTelemetry Logs Support dd-trace-js includes experimental support for OpenTelemetry logs, allowing you to send log data using the OpenTelemetry Logs API. This implementation is based on the [OpenTelemetry Logs specification](https://opentelemetry.io/docs/specs/otel/logs/overview/) and follows the [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/). - -#### Configuration - -Enable OpenTelemetry logs using standard OpenTelemetry environment variables: - -```bash -# Enable OpenTelemetry logs -export DD_LOGS_OTEL_ENABLED=true - -# OTLP endpoint URL -export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://localhost:4318/v1/logs - -# Optional headers (JSON format) -export OTEL_EXPORTER_OTLP_LOGS_HEADERS='{"Authorization": "Bearer token"}' - -# Request timeout in milliseconds -export OTEL_EXPORTER_OTLP_TIMEOUT=10000 - -# Batch timeout in milliseconds -export OTEL_BSP_SCHEDULE_DELAY=5000 - -# Maximum number of log records per batch -export OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512 - -# Maximum queue size -export OTEL_BSP_MAX_QUEUE_SIZE=2048 - -# Export timeout in milliseconds -export OTEL_BSP_EXPORT_TIMEOUT=30000 -``` - -#### Usage - -```javascript -const tracer = require('dd-trace').init() -const { logs } = require('@opentelemetry/api-logs') - -// Get a logger from OpenTelemetry API -const logger = logs.getLogger('my-service', '1.0.0') - -// Log messages -logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Application started', - attributes: { version: '1.0.0' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'ERROR', - severityNumber: 17, - body: 'Database connection failed', - attributes: { error: 'timeout' }, - timestamp: Date.now() * 1000000 -}) - -logger.emit({ - severityText: 'DEBUG', - severityNumber: 5, - body: 'Processing request', - attributes: { requestId: '123' }, - timestamp: Date.now() * 1000000 -}) -``` - -For more information about OpenTelemetry logs, see: -- [OpenTelemetry Logs Overview](https://opentelemetry.io/docs/specs/otel/logs/overview/) -- [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/) -- [OTLP Protocol](https://opentelemetry.io/docs/specs/otlp/) diff --git a/docs/API.md b/docs/API.md index 04df6e3f6d6..0d0809e8cbf 100644 --- a/docs/API.md +++ b/docs/API.md @@ -404,13 +404,15 @@ The Datadog SDK supports many of the configurations supported by the OpenTelemet - `DD_LOGS_OTEL_ENABLED` - Enable OpenTelemetry logs (default: `false`) - `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL (default: `http://localhost:4318/v1/logs`) - `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - Optional headers in JSON format (default: `{}`) +- `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` - OTLP protocol for logs (default: `http/protobuf`) +- `OTEL_EXPORTER_OTLP_PROTOCOL` - OTLP protocol fallback (default: `http/protobuf`) - `OTEL_EXPORTER_OTLP_TIMEOUT` - Request timeout in milliseconds (default: `10000`) - `OTEL_BSP_SCHEDULE_DELAY` - Batch timeout in milliseconds (default: `5000`) - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` - Maximum logs per batch (default: `512`) - `OTEL_BSP_MAX_QUEUE_SIZE` - Maximum queue size (default: `2048`) - `OTEL_BSP_EXPORT_TIMEOUT` - Export timeout in milliseconds (default: `30000`) -Logs are exported via OTLP over HTTP with protobuf serialization. For complete OTLP exporter configuration options, see the [OpenTelemetry OTLP Exporter documentation](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/). +Logs are exported via OTLP over HTTP. The protocol can be configured using `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` or `OTEL_EXPORTER_OTLP_PROTOCOL` environment variables. Supported protocols are `http/protobuf` (default) and `http/json`. For complete OTLP exporter configuration options, see the [OpenTelemetry OTLP Exporter documentation](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/).

Advanced Configuration

diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index c7b30db5726..83215993966 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -653,6 +653,8 @@ class Config { OTEL_TRACES_SAMPLER_ARG, OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_HEADERS, + OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, + OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTERS_OTLP_ENDPOINT, OTEL_EXPORTERS_OTLP_HEADERS, @@ -680,6 +682,16 @@ class Config { // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTERS_OTLP_ENDPOINT) this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTERS_OTLP_HEADERS) + // Handle OTLP protocol with grpc warning + const requestedProtocol = OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || OTEL_EXPORTER_OTLP_PROTOCOL + if (requestedProtocol === 'grpc') { + // eslint-disable-next-line no-console + console.warn('OTLP gRPC protocol is not supported for logs. ' + + 'Defaulting to http/protobuf. gRPC protobuf support may be added in a future release.') + this._setString(env, 'otelLogsProtocol', 'http/protobuf') + } else { + this._setString(env, 'otelLogsProtocol', requestedProtocol || 'http/protobuf') + } this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT || OTEL_EXPORTERS_OTLP_TIMEOUT) this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 062165ebf4d..24e293b7ba4 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -122,6 +122,7 @@ module.exports = { otelLogsEnabled: false, otelLogsUrl: 'http://localhost:4318/v1/logs', otelLogsHeaders: {}, + otelLogsProtocol: 'http/protobuf', otelLogsTimeout: 10_000, otelLogsBatchTimeout: 5000, otelLogsMaxExportBatchSize: 512, diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 36dedad7187..7e6e8a9f430 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -292,7 +292,8 @@ class Tracer extends NoopProxy { const exporter = new OtlpHttpLogExporter({ url: config.otelLogsUrl, headers: config.otelLogsHeaders, - timeout: config.otelLogsTimeout + timeout: config.otelLogsTimeout, + protocol: config.otelLogsProtocol }) // Create batch processor using resolved config values diff --git a/packages/dd-trace/src/supported-configurations.json b/packages/dd-trace/src/supported-configurations.json index ce19de0232b..efbcb3d5fd5 100644 --- a/packages/dd-trace/src/supported-configurations.json +++ b/packages/dd-trace/src/supported-configurations.json @@ -439,6 +439,8 @@ "OTEL_LOGS_EXPORTER": ["A"], "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": ["A"], "OTEL_EXPORTER_OTLP_LOGS_HEADERS": ["A"], + "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": ["A"], + "OTEL_EXPORTER_OTLP_PROTOCOL": ["A"], "OTEL_EXPORTER_OTLP_TIMEOUT": ["A"], "OTEL_BSP_SCHEDULE_DELAY": ["A"], "OTEL_BSP_MAX_EXPORT_BATCH_SIZE": ["A"], diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 5cd5eeba92f..b80e297a824 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -182,4 +182,82 @@ describe('OpenTelemetry Logs', () => { expect(logger).to.exist expect(typeof logger.emit).to.equal('function') }) + + describe('OTLP Protocol Configuration', () => { + it('should use default protocol when no environment variables are set', () => { + const Config = require('../../src/config') + delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL + delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL + + const config = new Config() + expect(config.otelLogsProtocol).to.equal('http/protobuf') + }) + + it('should use OTEL_EXPORTER_OTLP_LOGS_PROTOCOL when set', () => { + const Config = require('../../src/config') + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' + delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL + + const config = new Config() + expect(config.otelLogsProtocol).to.equal('http/json') + }) + + it('should fallback to OTEL_EXPORTER_OTLP_PROTOCOL when logs protocol not set', () => { + const Config = require('../../src/config') + delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/json' + + const config = new Config() + expect(config.otelLogsProtocol).to.equal('http/json') + }) + + it('should prioritize logs protocol over generic protocol', () => { + const Config = require('../../src/config') + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf' + + const config = new Config() + expect(config.otelLogsProtocol).to.equal('http/json') + }) + + it('should handle invalid protocol values', () => { + const Config = require('../../src/config') + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'invalid-protocol' + + const config = new Config() + expect(config.otelLogsProtocol).to.equal('invalid-protocol') + }) + + it('should work with both http/protobuf and http/json protocols', () => { + const Config = require('../../src/config') + + // Test protobuf protocol + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/protobuf' + const config1 = new Config() + expect(config1.otelLogsProtocol).to.equal('http/protobuf') + + // Test JSON protocol + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' + const config2 = new Config() + expect(config2.otelLogsProtocol).to.equal('http/json') + }) + + it('should warn and default to http/protobuf when grpc protocol is set', () => { + const Config = require('../../src/config') + const originalWarn = console.warn + let warningMessage = '' + // eslint-disable-next-line no-console + console.warn = (msg) => { warningMessage = msg } + + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc' + const config = new Config() + + expect(config.otelLogsProtocol).to.equal('http/protobuf') + expect(warningMessage).to.include('OTLP gRPC protocol is not supported for logs') + expect(warningMessage).to.include('Defaulting to http/protobuf') + + // eslint-disable-next-line no-console + console.warn = originalWarn + }) + }) }) From f73d4257d1290aeff432ce375fe88eac26facb0b Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 13:20:19 -0400 Subject: [PATCH 09/61] revert readme docs --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index b452c200814..c434aeb846a 100644 --- a/README.md +++ b/README.md @@ -94,12 +94,6 @@ If you would like to trace your bundled application then please read this page o Please refer to the [SECURITY.md](https://github.com/DataDog/dd-trace-js/blob/master/SECURITY.md) document if you have found a security issue. -## Datadog With OpenTelemetry - -### OpenTelemetry Tracing Support +## Datadog With OpenTelemetery Please refer to the [Node.js Custom Instrumentation using OpenTelemetry API](https://docs.datadoghq.com/tracing/trace_collection/custom_instrumentation/nodejs/otel/) document. It includes information on how to use the OpenTelemetry API with dd-trace-js. - -### OpenTelemetry Logs Support - -dd-trace-js includes experimental support for OpenTelemetry logs, allowing you to send log data using the OpenTelemetry Logs API. This implementation is based on the [OpenTelemetry Logs specification](https://opentelemetry.io/docs/specs/otel/logs/overview/) and follows the [OpenTelemetry JavaScript Logs API](https://opentelemetry.io/docs/instrumentation/js/logs/). From 543805a940ae97c518784bf6db13b052f7662280 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 14:08:12 -0400 Subject: [PATCH 10/61] add new otel files --- .../opentelemetry/logs/batch_log_processor.js | 174 ++++++++++++ .../src/opentelemetry/logs/common.proto | 59 +++++ .../dd-trace/src/opentelemetry/logs/index.js | 40 +++ .../dd-trace/src/opentelemetry/logs/logger.js | 142 ++++++++++ .../src/opentelemetry/logs/logger_provider.js | 142 ++++++++++ .../src/opentelemetry/logs/logs.proto | 177 +++++++++++++ .../src/opentelemetry/logs/otlp.proto | 51 ++++ .../logs/otlp_http_log_exporter.js | 147 ++++++++++ .../opentelemetry/logs/otlp_transformer.js | 250 ++++++++++++++++++ .../src/opentelemetry/logs/protobuf_loader.js | 76 ++++++ .../src/opentelemetry/logs/resource.proto | 19 ++ packages/dd-trace/src/proxy.js | 6 +- .../dd-trace/test/opentelemetry/logs.spec.js | 3 +- 13 files changed, 1282 insertions(+), 4 deletions(-) create mode 100644 packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/common.proto create mode 100644 packages/dd-trace/src/opentelemetry/logs/index.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/logger.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/logger_provider.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/logs.proto create mode 100644 packages/dd-trace/src/opentelemetry/logs/otlp.proto create mode 100644 packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js create mode 100644 packages/dd-trace/src/opentelemetry/logs/resource.proto diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js new file mode 100644 index 00000000000..83d1723324f --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -0,0 +1,174 @@ +'use strict' + +/** + * @fileoverview BatchLogRecordProcessor implementation for OpenTelemetry logs + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the + * OpenTelemetry SDK and includes many dependencies we don't need. To avoid + * pulling in the full SDK, we provide our own implementation that is heavily inspired + * by the existing OpenTelemetry prior art. + * + * This implementation is based on: + * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html + * - BatchLogRecordProcessor Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.BatchLogRecordProcessor.html + * - OpenTelemetry Logs SDK Specification: https://opentelemetry.io/docs/specs/otel/logs/sdk/ + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs + * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + */ + +// const { logs } = require('@opentelemetry/api') +const log = require('../../log') + +/** + * BatchLogRecordProcessor processes log records in batches for efficient export. + * + * This implementation follows the OpenTelemetry JavaScript SDK BatchLogRecordProcessor: + * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.BatchLogRecordProcessor.html + * + * @class BatchLogRecordProcessor + */ +class BatchLogRecordProcessor { + /** + * Creates a new BatchLogRecordProcessor instance. + * + * @param {Array} processors - Array of log processors to process batches + * @param {Object} config - Configuration options + * @param {number} [config.batchTimeout=5000] - Timeout in milliseconds for batch processing + * @param {number} [config.maxExportBatchSize=512] - Maximum number of log records per batch + * @param {number} [config.maxQueueSize=2048] - Maximum number of log records in queue + * @param {number} [config.exportTimeoutMillis=30000] - Timeout for export operations + */ + constructor (processors, config) { + this._processors = processors + this._config = config + this._isShutdown = false + this._batchTimeout = config.batchTimeout || 5000 // 5 seconds default + this._maxExportBatchSize = config.maxExportBatchSize || 512 + this._maxQueueSize = config.maxQueueSize || 2048 + this._exportTimeoutMillis = config.exportTimeoutMillis || 30_000 // 30 seconds default + + this._logRecords = [] + this._timer = null + this._shutdownPromise = null + } + + /** + * Processes a single log record. + * + * This method is called by the Logger when a log record is emitted. + * It adds the record to the batch and triggers export if conditions are met. + * + * @param {Object} logRecord - The log record to process + * @param {string} logRecord.severityText - Severity text (e.g., 'INFO', 'ERROR') + * @param {number} logRecord.severityNumber - Severity number + * @param {string} logRecord.body - Log message body + * @param {Object} logRecord.attributes - Log attributes + * @param {number} logRecord.timestamp - Timestamp in nanoseconds + */ + onEmit (logRecord) { + if (this._isShutdown) { + return + } + + this._logRecords.push(logRecord) + + // If we've reached the max batch size, export immediately + if (this._logRecords.length >= this._maxExportBatchSize) { + this._export() + } else if (this._logRecords.length === 1) { + // Start the timer for the first log record + this._startTimer() + } + } + + _startTimer () { + if (this._timer) { + return + } + + this._timer = setTimeout(() => { + this._export() + }, this._batchTimeout) + } + + _export () { + if (this._logRecords.length === 0) { + return + } + + const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) + this._clearTimer() + + // Process through all registered processors + for (const processor of this._processors) { + try { + processor.export(logRecords, () => { + // Export callback - could be used for error handling + }) + } catch (error) { + log.error('Error in log processor export:', error) + } + } + + // If there are more records, start the timer again + if (this._logRecords.length > 0) { + this._startTimer() + } + } + + _clearTimer () { + if (this._timer) { + clearTimeout(this._timer) + this._timer = null + } + } + + forceFlush () { + return new Promise((resolve) => { + if (this._isShutdown) { + resolve() + return + } + + this._export() + resolve() + }) + } + + shutdown () { + if (this._isShutdown) { + return this._shutdownPromise || Promise.resolve() + } + + this._isShutdown = true + this._shutdownPromise = new Promise((resolve) => { + this._clearTimer() + + // Export any remaining log records + this._export() + + // Shutdown all processors + const shutdownPromises = this._processors.map(processor => { + if (typeof processor.shutdown === 'function') { + return processor.shutdown() + } + return Promise.resolve() + }) + + Promise.all(shutdownPromises).then(() => { + resolve() + }) + }) + + return this._shutdownPromise + } +} + +module.exports = BatchLogRecordProcessor diff --git a/packages/dd-trace/src/opentelemetry/logs/common.proto b/packages/dd-trace/src/opentelemetry/logs/common.proto new file mode 100644 index 00000000000..6b3c0deee5a --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/common.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +package opentelemetry.proto.common.v1; + +option go_package = "go.opentelemetry.io/collector/pdata/pcommon"; + +// AnyValue is used to represent any type of attribute value. AnyValue may contain a +// simple scalar or an arbitrary complex structure including arrays and nested objects. +// AnyValue is a oneof type and can be one of the following: +// - string_value: A string value. +// - bool_value: A boolean value. +// - int_value: An integer value. +// - double_value: A double value. +// - array_value: An array of AnyValue values. +// - kvlist_value: A key-value list of AnyValue values. +// - bytes_value: A bytes value. +message AnyValue { + oneof value { + string string_value = 1; + bool bool_value = 2; + int64 int_value = 3; + double double_value = 4; + ArrayValue array_value = 5; + KeyValueList kvlist_value = 6; + bytes bytes_value = 7; + } +} + +// ArrayValue is a list of AnyValue messages. We need ArrayValue as a message +// since oneof in AnyValue does not allow repeated fields. +message ArrayValue { + // Array of values. The array may be empty (contain 0 elements). + repeated AnyValue values = 1; +} + +// KeyValueList is a list of KeyValue messages. We need KeyValueList as a message +// since oneof in AnyValue does not allow repeated fields. +message KeyValueList { + // A collection of key/value pairs of key-value pairs. The list may be empty (may + // contain 0 elements). + repeated KeyValue values = 1; +} + +// KeyValue is a key-value pair that is used to store metadata about the telemetry +// record. +message KeyValue { + string key = 1; + AnyValue value = 2; +} + +// InstrumentationScope is a message representing the instrumentation scope information +// such as the fully qualified name and version. +message InstrumentationScope { + // An empty instrumentation scope name means the name is unknown. + string name = 1; + string version = 2; + repeated KeyValue attributes = 3; + uint32 dropped_attributes_count = 4; +} diff --git a/packages/dd-trace/src/opentelemetry/logs/index.js b/packages/dd-trace/src/opentelemetry/logs/index.js new file mode 100644 index 00000000000..0df0bd5df04 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/index.js @@ -0,0 +1,40 @@ +'use strict' + +/** + * @fileoverview OpenTelemetry Logs Implementation for dd-trace-js + * + * This module provides OpenTelemetry logs functionality for dd-trace-js. + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * TESTING: + * Run the OpenTelemetry logs tests with: + * npx mocha packages/dd-trace/test/opentelemetry/logs.spec.js --timeout 30000 + * + * NOTE: The official @opentelemetry/sdk-logs and @opentelemetry/otlp-transformer + * packages are tightly coupled to the OpenTelemetry SDK and require @opentelemetry/sdk-logs + * as a dependency. To avoid pulling in the full SDK, we provide our own implementation + * that is heavily inspired by the existing OpenTelemetry prior art. + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/otlp-transformer + * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + */ + +const LoggerProvider = require('./logger_provider') +const Logger = require('./logger') +const BatchLogRecordProcessor = require('./batch_log_processor') +const OtlpHttpLogExporter = require('./otlp_http_log_exporter') +const OtlpTransformer = require('./otlp_transformer') + +module.exports = { + LoggerProvider, + Logger, + BatchLogRecordProcessor, + OtlpHttpLogExporter, + OtlpTransformer +} diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js new file mode 100644 index 00000000000..6d0ec4947cb --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -0,0 +1,142 @@ +'use strict' + +/** + * @fileoverview Logger implementation for OpenTelemetry logs + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the + * OpenTelemetry SDK and includes many dependencies we don't need. To avoid + * pulling in the full SDK, we provide our own implementation that is heavily inspired + * by the existing OpenTelemetry prior art. + * + * This implementation is based on: + * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html + * - Logger Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.Logger.html + * - OpenTelemetry Logs API Specification: https://opentelemetry.io/docs/specs/otel/logs/api/ + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs + * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + */ + +const { SeverityNumber } = require('@opentelemetry/api-logs') +const { sanitizeAttributes } = require('@opentelemetry/core') + +/** + * Logger provides methods to emit log records. + * + * This implementation follows the OpenTelemetry JavaScript SDK Logger: + * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.Logger.html + * + * @class Logger + */ +class Logger { + /** + * Creates a new Logger instance. + * + * @param {Object} library - Instrumentation library information + * @param {string} library.name - Library name + * @param {string} library.version - Library version + * @param {Object} config - Logger configuration + * @param {LoggerProvider} loggerProvider - Parent logger provider + */ + constructor (library, config, loggerProvider) { + this._config = config + this._loggerProvider = loggerProvider + this.instrumentationLibrary = library + } + + get resource () { + return this._loggerProvider.resource + } + + /** + * Emits a log record. + * + * @param {Object} logRecord - The log record to emit + * @param {string} logRecord.severityText - Severity text (e.g., 'INFO', 'ERROR') + * @param {number} logRecord.severityNumber - Severity number + * @param {string} logRecord.body - Log message body + * @param {Object} [logRecord.attributes] - Log attributes + * @param {number} [logRecord.timestamp] - Timestamp in nanoseconds + * @param {string} [logRecord.traceId] - Associated trace ID + * @param {string} [logRecord.spanId] - Associated span ID + */ + emit (logRecord) { + if (this._loggerProvider._isShutdown) { + return + } + + const processor = this._loggerProvider.getActiveLogRecordProcessor() + if (!processor) { + return + } + + // Sanitize attributes to ensure they conform to OpenTelemetry spec + if (logRecord.attributes) { + logRecord.attributes = sanitizeAttributes(logRecord.attributes) + } + + // Add instrumentation library information + logRecord.instrumentationLibrary = this.instrumentationLibrary + + processor.onEmit(logRecord) + } + + // Convenience methods for common log levels + debug (message, attributes = {}) { + this.emit({ + severityText: 'DEBUG', + severityNumber: SeverityNumber.DEBUG, + body: message, + attributes, + timestamp: Date.now() * 1_000_000 // Convert to nanoseconds + }) + } + + info (message, attributes = {}) { + this.emit({ + severityText: 'INFO', + severityNumber: SeverityNumber.INFO, + body: message, + attributes, + timestamp: Date.now() * 1_000_000 + }) + } + + warn (message, attributes = {}) { + this.emit({ + severityText: 'WARN', + severityNumber: SeverityNumber.WARN, + body: message, + attributes, + timestamp: Date.now() * 1_000_000 + }) + } + + error (message, attributes = {}) { + this.emit({ + severityText: 'ERROR', + severityNumber: SeverityNumber.ERROR, + body: message, + attributes, + timestamp: Date.now() * 1_000_000 + }) + } + + fatal (message, attributes = {}) { + this.emit({ + severityText: 'FATAL', + severityNumber: SeverityNumber.FATAL, + body: message, + attributes, + timestamp: Date.now() * 1_000_000 + }) + } +} + +module.exports = Logger diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js new file mode 100644 index 00000000000..ca7824d0442 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -0,0 +1,142 @@ +'use strict' + +/** + * @fileoverview LoggerProvider implementation for OpenTelemetry logs + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the + * OpenTelemetry SDK and includes many dependencies we don't need. To avoid + * pulling in the full SDK, we provide our own implementation that is heavily inspired + * by the existing OpenTelemetry prior art. + * + * This implementation is based on: + * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html + * - LoggerProvider Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.LoggerProvider.html + * - OpenTelemetry Logs SDK Specification: https://opentelemetry.io/docs/specs/otel/logs/sdk/ + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs + * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + */ + +const { logs } = require('@opentelemetry/api-logs') +// const BatchLogProcessor = require('./batch_log_processor') +// const OtlpHttpLogExporter = require('./otlp_http_log_exporter') +const Logger = require('./logger') +const log = require('../../log') + +/** + * LoggerProvider is the main entry point for creating loggers. + * + * This implementation follows the OpenTelemetry JavaScript SDK LoggerProvider: + * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.LoggerProvider.html + * + * @class LoggerProvider + */ +class LoggerProvider { + /** + * Creates a new LoggerProvider instance. + * + * @param {Object} [config={}] - Configuration options + * @param {Object} [config.resource] - Resource attributes + * @param {Object} [config.resource.attributes] - Resource attribute key-value pairs + * @param {Array} [config.processors] - Array of LogRecordProcessor instances + */ + constructor (config = {}) { + this.config = config + this.resource = config.resource + this._processors = config.processors || [] + this._loggers = new Map() + this._activeProcessor = null + this._isShutdown = false + } + + /** + * Gets or creates a logger instance. + * + * @param {string} name - Logger name (typically the instrumentation library name) + * @param {string} [version='1.0.0'] - Logger version + * @param {Object} [options={}] - Additional options + * @returns {Logger} Logger instance + */ + getLogger (name, version = '1.0.0', options = {}) { + if (this._isShutdown) { + // Return a no-op logger when shutdown + return { + emit: () => {}, + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {}, + fatal: () => {} + } + } + + const key = `${name}@${version}` + if (!this._loggers.has(key)) { + this._loggers.set(key, new Logger( + { ...options, name, version }, + this.config, + this + )) + } + return this._loggers.get(key) + } + + addLogRecordProcessor (logRecordProcessor) { + if (this._isShutdown) { + log.warn('Cannot add log record processor after shutdown') + return + } + + this._processors.push(logRecordProcessor) + this._activeProcessor = logRecordProcessor + } + + getActiveLogRecordProcessor () { + return this._activeProcessor + } + + register (config = {}) { + if (this._isShutdown) { + log.warn('Cannot register after shutdown') + return + } + + if (!logs.setGlobalLoggerProvider(this)) { + logs.getLoggerProvider().setDelegate(this) + } + } + + forceFlush () { + if (this._isShutdown) { + return Promise.reject(new Error('LoggerProvider is shutdown')) + } + + if (!this._activeProcessor) { + return Promise.resolve() + } + + return this._activeProcessor.forceFlush() + } + + shutdown () { + if (this._isShutdown) { + return Promise.resolve() + } + + this._isShutdown = true + + if (!this._activeProcessor) { + return Promise.resolve() + } + + return this._activeProcessor.shutdown() + } +} + +module.exports = LoggerProvider diff --git a/packages/dd-trace/src/opentelemetry/logs/logs.proto b/packages/dd-trace/src/opentelemetry/logs/logs.proto new file mode 100644 index 00000000000..0d462732915 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/logs.proto @@ -0,0 +1,177 @@ +syntax = "proto3"; + +package opentelemetry.proto.logs.v1; + +import "opentelemetry/proto/common/v1/common.proto"; +import "opentelemetry/proto/resource/v1/resource.proto"; + +option go_package = "go.opentelemetry.io/collector/pdata/plog"; + +// A collection of logs from a Resource. +message ResourceLogs { + // The resource for the logs in this message. + // If this field is not set then no resource info is known. + opentelemetry.proto.resource.v1.Resource resource = 1; + + // A list of ScopeLogs that originate from a resource. + repeated ScopeLogs scope_logs = 2; + + // This schema_url applies to the data in the "resource" field. It does not apply + // to the data in the "scope_logs" field which have their own schema_url field. + string schema_url = 3; +} + +// A collection of logs from a Scope. +message ScopeLogs { + // The instrumentation scope information for the logs in this message. + // Semantically when InstrumentationScope isn't set, it is equivalent with + // an empty instrumentation scope name (unknown). + opentelemetry.proto.common.v1.InstrumentationScope scope = 1; + + // A list of log records. + repeated LogRecord log_records = 2; + + // This schema_url applies to all the log records in the "log_records" field. + string schema_url = 3; +} + +// A log record according to OpenTelemetry Log Data Model: +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md +message LogRecord { + // time_unix_nano is the time when the event occurred. + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // Value of 0 indicates unknown or missing timestamp. + fixed64 time_unix_nano = 1; + + // Time when the event was observed by the collection system. + // For events that originate in OpenTelemetry (e.g. using OpenTelemetry Logging + // SDK) this timestamp is typically set at the generation time and is equal to + // Timestamp. For events that originate externally and collected by OpenTelemetry + // (e.g. using Collector) this is the time when OpenTelemetry's code observed the + // event measured by the clock of the OpenTelemetry code. This field MUST be set + // once the event is observed by OpenTelemetry. + // + // For converting OpenTelemetry log data to formats that support only one + // timestamp per log entry (such as Fluent Bit Logstash or Splunk) this field + // SHOULD be used as the "log timestamp". + // An implementation of the OpenTelemetry API SHOULD NOT set this field + // if the corresponding event did not happen in this process. + fixed64 observed_time_unix_nano = 2; + + // Numerical value of the severity, normalized to values described in Log Data Model. + // [Optional]. + opentelemetry.proto.logs.v1.SeverityNumber severity_number = 3; + + // The severity text (also known as log level). The original string representation as + // it is known at the source. [Optional]. + string severity_text = 4; + + // A value containing the body of the log record. Can be for example a human-readable + // string message (including multi-line text) or a structured object in a format + // that is known to the logging SDK. + opentelemetry.proto.common.v1.AnyValue body = 5; + + // Additional attributes that describe the specific event occurrence. [Optional]. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + repeated opentelemetry.proto.common.v1.KeyValue attributes = 6; + + // Flags, a bit field. 8 least significant bits are the trace flags as + // defined in W3C Trace Context specification. 24 most significant bits are reserved + // and must be set to 0. Readers must not assume that 24 most significant bits + // will be zero and must correctly mask the bits when reading 8-bit trace flag + // (use flags & TRACE_FLAGS_MASK). [Optional]. + fixed32 flags = 7; + + // A unique identifier for a trace. All logs from the same trace share + // the same trace_id. The ID is a 16-byte array. An ID with all zeroes + // is considered invalid. Can be set for logs that are part of request processing + // and are associated with a particular trace, or if the log record is a + // standalone log record that is not part of a request processing. + // The value is an array of bytes. [Optional]. + bytes trace_id = 8; + + // A unique identifier for a span within a trace, assigned when the span + // is created. The ID is an 8-byte array. An ID with all zeroes is considered + // invalid. Can be set for logs that are part of a particular processing + // within a trace. The value is an array of bytes. [Optional]. + bytes span_id = 9; +} + +// Possible values for LogRecord.SeverityNumber. +enum SeverityNumber { + // UNSPECIFIED is the default SeverityNumber, it MUST NOT be used. + SEVERITY_NUMBER_UNSPECIFIED = 0; + + // TRACE is SeverityNumber for TRACE level. + SEVERITY_NUMBER_TRACE = 1; + + // TRACE2 is SeverityNumber for TRACE2 level. + SEVERITY_NUMBER_TRACE2 = 2; + + // TRACE3 is SeverityNumber for TRACE3 level. + SEVERITY_NUMBER_TRACE3 = 3; + + // TRACE4 is SeverityNumber for TRACE4 level. + SEVERITY_NUMBER_TRACE4 = 4; + + // DEBUG is SeverityNumber for DEBUG level. + SEVERITY_NUMBER_DEBUG = 5; + + // DEBUG2 is SeverityNumber for DEBUG2 level. + SEVERITY_NUMBER_DEBUG2 = 6; + + // DEBUG3 is SeverityNumber for DEBUG3 level. + SEVERITY_NUMBER_DEBUG3 = 7; + + // DEBUG4 is SeverityNumber for DEBUG4 level. + SEVERITY_NUMBER_DEBUG4 = 8; + + // INFO is SeverityNumber for INFO level. + SEVERITY_NUMBER_INFO = 9; + + // INFO2 is SeverityNumber for INFO2 level. + SEVERITY_NUMBER_INFO2 = 10; + + // INFO3 is SeverityNumber for INFO3 level. + SEVERITY_NUMBER_INFO3 = 11; + + // INFO4 is SeverityNumber for INFO4 level. + SEVERITY_NUMBER_INFO4 = 12; + + // WARN is SeverityNumber for WARN level. + SEVERITY_NUMBER_WARN = 13; + + // WARN2 is SeverityNumber for WARN2 level. + SEVERITY_NUMBER_WARN2 = 14; + + // WARN3 is SeverityNumber for WARN3 level. + SEVERITY_NUMBER_WARN3 = 15; + + // WARN4 is SeverityNumber for WARN4 level. + SEVERITY_NUMBER_WARN4 = 16; + + // ERROR is SeverityNumber for ERROR level. + SEVERITY_NUMBER_ERROR = 17; + + // ERROR2 is SeverityNumber for ERROR2 level. + SEVERITY_NUMBER_ERROR2 = 18; + + // ERROR3 is SeverityNumber for ERROR3 level. + SEVERITY_NUMBER_ERROR3 = 19; + + // ERROR4 is SeverityNumber for ERROR4 level. + SEVERITY_NUMBER_ERROR4 = 20; + + // FATAL is SeverityNumber for FATAL level. + SEVERITY_NUMBER_FATAL = 21; + + // FATAL2 is SeverityNumber for FATAL2 level. + SEVERITY_NUMBER_FATAL2 = 22; + + // FATAL3 is SeverityNumber for FATAL3 level. + SEVERITY_NUMBER_FATAL3 = 23; + + // FATAL4 is SeverityNumber for FATAL4 level. + SEVERITY_NUMBER_FATAL4 = 24; +} diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp.proto b/packages/dd-trace/src/opentelemetry/logs/otlp.proto new file mode 100644 index 00000000000..f91682d4170 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/otlp.proto @@ -0,0 +1,51 @@ +syntax = "proto3"; + +package opentelemetry.proto.collector.logs.v1; + +import "opentelemetry/proto/logs/v1/logs.proto"; + +option go_package = "go.opentelemetry.io/collector/pdata/plog/plogotlp"; + +// Service that can be used to push logs between one Application instrumented with +// OpenTelemetry and an collector, or between a collector and a central collector. +service LogsService { + // For performance reasons, it is recommended to keep this RPC + // alive for the entire life of the application. + rpc Export(ExportLogsServiceRequest) returns (ExportLogsServiceResponse); +} + +message ExportLogsServiceRequest { + // An array of ResourceLogs. + // For data coming from a single resource this array will typically contain + // one element. Intermediary nodes that receive data from multiple origins + // and batch this data before sending further, will send data from multiple + // resources in a single request. + repeated opentelemetry.proto.logs.v1.ResourceLogs resource_logs = 1; +} + +message ExportLogsServiceResponse { + // The details of a partially successful export request. + // + // If the request is only partially accepted + // (i.e. when the server accepts only parts of the data and rejects the rest) + // the server MUST initialize the `partial_success` field and MUST + // set the `rejected_*` fields accordingly. + // + // If the request is fully accepted, the server MUST NOT initialize the + // `partial_success` field. + ExportLogsPartialSuccess partial_success = 1; +} + +message ExportLogsPartialSuccess { + // The number of rejected log records. + // + // A `rejected_` field holding a `0` value indicates that the + // request was fully accepted. + int64 rejected_log_records = 1; + + // A developer-facing human-readable message in English. It should be used + // either to explain why the server rejected parts of the data during a partial + // success or to convey failure/warning information when the request was fully + // accepted. A message should be concise and should not exceed 255 characters. + string error_message = 2; +} diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js new file mode 100644 index 00000000000..6f170f5ab57 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -0,0 +1,147 @@ +'use strict' + +/** + * @fileoverview OTLP HTTP Log Exporter implementation for OpenTelemetry logs + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * NOTE: The official @opentelemetry/exporter-logs-otlp-http package is tightly coupled to the + * OpenTelemetry SDK and requires @opentelemetry/sdk-logs as a dependency. To avoid + * pulling in the full SDK, we provide our own implementation that is heavily inspired + * by the existing OpenTelemetry prior art. + * + * This implementation is based on: + * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html + * - LogRecordExporter Interface: https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_sdk-logs.LogRecordExporter.html + * - OTLP Protocol Specification: https://opentelemetry.io/docs/specs/otlp/ + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/packages/opentelemetry-exporter-logs-otlp-http + * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + */ + +const https = require('https') +const http = require('http') +const { URL } = require('url') +const log = require('../../log') +const OtlpTransformer = require('./otlp_transformer') + +/** + * OtlpHttpLogExporter exports log records via OTLP over HTTP. + * + * This implementation follows the OTLP HTTP specification: + * https://opentelemetry.io/docs/specs/otlp/#otlphttp + * + * @class OtlpHttpLogExporter + */ +class OtlpHttpLogExporter { + /** + * Creates a new OtlpHttpLogExporter instance. + * + * @param {Object} [config={}] - Configuration options + * @param {string} [config.url='http://localhost:4318/v1/logs'] - OTLP endpoint URL + * @param {Object} [config.headers={}] - Additional HTTP headers + * @param {number} [config.timeout=10000] - Request timeout in milliseconds + * @param {string} [config.protocol='http/protobuf'] - OTLP protocol (http/protobuf or http/json) + */ + constructor (config = {}) { + this._config = config + this._url = config.url || 'http://localhost:4318/v1/logs' + this._protocol = config.protocol || 'http/protobuf' + + // Set Content-Type based on protocol + const contentType = this._protocol === 'http/json' + ? 'application/json' + : 'application/x-protobuf' + + this._headers = { + 'Content-Type': contentType, + 'User-Agent': 'dd-trace-js/otlp-exporter', + ...config.headers + } + this._timeout = config.timeout || 10_000 + this._transformer = new OtlpTransformer(config) + } + + /** + * Exports log records via OTLP over HTTP. + * + * @param {Array} logRecords - Array of log records to export + * @param {Function} resultCallback - Callback function for export result + * @param {number} resultCallback.code - Result code (0 = success, 1 = error) + * @param {Error} [resultCallback.error] - Error object if export failed + */ + export (logRecords, resultCallback) { + if (logRecords.length === 0) { + resultCallback({ code: 0 }) + return + } + + try { + const payload = this._transformer.transformLogRecords(logRecords) + this._sendPayload(payload, resultCallback) + } catch (error) { + log.error('Error transforming log records:', error) + resultCallback({ code: 1, error }) + } + } + + _sendPayload (payload, resultCallback) { + const url = new URL(this._url) + const isHttps = url.protocol === 'https:' + const client = isHttps ? https : http + + const options = { + hostname: url.hostname, + port: url.port || (isHttps ? 443 : 80), + path: url.pathname + url.search, + method: 'POST', + headers: { + ...this._headers, + 'Content-Length': payload.length + }, + timeout: this._timeout + } + + const req = client.request(options, (res) => { + let data = '' + + res.on('data', (chunk) => { + data += chunk + }) + + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + resultCallback({ code: 0 }) + } else { + const error = new Error(`HTTP ${res.statusCode}: ${data}`) + resultCallback({ code: 1, error }) + } + }) + }) + + req.on('error', (error) => { + log.error('Error sending OTLP logs:', error) + resultCallback({ code: 1, error }) + }) + + req.on('timeout', () => { + req.destroy() + const error = new Error('Request timeout') + resultCallback({ code: 1, error }) + }) + + req.write(payload) + req.end() + } + + shutdown () { + // No cleanup needed for HTTP exporter + return Promise.resolve() + } +} + +module.exports = OtlpHttpLogExporter diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js new file mode 100644 index 00000000000..c6f938f309a --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -0,0 +1,250 @@ +'use strict' + +/** + * @fileoverview OTLP Transformer for OpenTelemetry logs + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * NOTE: The official @opentelemetry/otlp-transformer package is tightly coupled to the + * OpenTelemetry SDK and requires @opentelemetry/sdk-logs as a dependency. To avoid + * pulling in the full SDK, we provide our own implementation that is heavily inspired + * by the existing OpenTelemetry prior art. + * + * This implementation is based on: + * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html + * - OTLP Transformer: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-otlp-transformer + * - OTLP Protocol Specification: https://opentelemetry.io/docs/specs/otlp/ + * + * Reference implementation (heavily inspired by): + * - https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-otlp-transformer + * - https://github.com/open-telemetry/opentelemetry-proto (v1.7.0) + */ + +const { SeverityNumber } = require('@opentelemetry/api-logs') +const { getProtobufTypes } = require('./protobuf_loader') + +/** + * OtlpTransformer transforms log records to OTLP format. + * + * This implementation follows the OTLP Logs Data Model specification: + * https://opentelemetry.io/docs/specs/otlp/#log-data-model + * + * @class OtlpTransformer + */ +class OtlpTransformer { + constructor (config = {}) { + this._config = config + this._protocol = config.protocol || 'http/protobuf' + this._protobufTypes = null + } + + _getProtobufTypes () { + if (!this._protobufTypes) { + this._protobufTypes = getProtobufTypes() + } + return this._protobufTypes + } + + transformLogRecords (logRecords) { + // Use the configured protocol to determine serialization format + if (this._protocol === 'http/json') { + return this._transformToJson(logRecords) + } + // Default to protobuf for http/protobuf or any other protocol + return this._transformToProtobuf(logRecords) + } + + _transformToProtobuf (logRecords) { + const { _logsService } = this._getProtobufTypes() + + // Create the OTLP LogsData structure + const logsData = { + resourceLogs: [{ + resource: this._transformResource(), + scopeLogs: [{ + scope: this._transformScope(logRecords[0]?.instrumentationLibrary), + logRecords: logRecords.map(record => this._transformLogRecord(record)) + }] + }] + } + + // Serialize to protobuf + const message = _logsService.create(logsData) + const buffer = _logsService.encode(message).finish() + + return buffer + } + + _transformToJson (logRecords) { + // JSON transformation for http/json protocol + const logsData = { + resourceLogs: [{ + resource: this._transformResource(), + scopeLogs: [{ + scope: this._transformScope(logRecords[0]?.instrumentationLibrary), + logRecords: logRecords.map(record => this._transformLogRecord(record)) + }] + }] + } + return Buffer.from(JSON.stringify(logsData)) + } + + _transformResource () { + return { + attributes: this._transformAttributes(this._config.resource?.attributes || {}), + droppedAttributesCount: 0 + } + } + + _transformScope (instrumentationLibrary) { + if (!instrumentationLibrary) { + return { + name: 'dd-trace-js', + version: '1.0.0', + attributes: [], + droppedAttributesCount: 0 + } + } + + return { + name: instrumentationLibrary.name || 'dd-trace-js', + version: instrumentationLibrary.version || '1.0.0', + attributes: [], + droppedAttributesCount: 0 + } + } + + _transformLogRecord (logRecord) { + // const { _severityNumber } = this._getProtobufTypes() + + return { + timeUnixNano: logRecord.timestamp || Date.now() * 1_000_000, + observedTimeUnixNano: logRecord.timestamp || Date.now() * 1_000_000, + severityNumber: this._mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), + severityText: logRecord.severityText || 'INFO', + body: this._transformBody(logRecord.body), + attributes: this._transformAttributes(logRecord.attributes || {}), + droppedAttributesCount: 0, + flags: logRecord.flags || 0, + traceId: this._hexToBytes(logRecord.traceId || ''), + spanId: this._hexToBytes(logRecord.spanId || '') + } + } + + _mapSeverityNumber (severityNumber) { + const { _severityNumber } = this._getProtobufTypes() + + // Map OpenTelemetry API severity numbers to protobuf enum values + const severityMap = { + [SeverityNumber.TRACE]: _severityNumber.SEVERITY_NUMBER_TRACE, + [SeverityNumber.TRACE2]: _severityNumber.SEVERITY_NUMBER_TRACE2, + [SeverityNumber.TRACE3]: _severityNumber.SEVERITY_NUMBER_TRACE3, + [SeverityNumber.TRACE4]: _severityNumber.SEVERITY_NUMBER_TRACE4, + [SeverityNumber.DEBUG]: _severityNumber.SEVERITY_NUMBER_DEBUG, + [SeverityNumber.DEBUG2]: _severityNumber.SEVERITY_NUMBER_DEBUG2, + [SeverityNumber.DEBUG3]: _severityNumber.SEVERITY_NUMBER_DEBUG3, + [SeverityNumber.DEBUG4]: _severityNumber.SEVERITY_NUMBER_DEBUG4, + [SeverityNumber.INFO]: _severityNumber.SEVERITY_NUMBER_INFO, + [SeverityNumber.INFO2]: _severityNumber.SEVERITY_NUMBER_INFO2, + [SeverityNumber.INFO3]: _severityNumber.SEVERITY_NUMBER_INFO3, + [SeverityNumber.INFO4]: _severityNumber.SEVERITY_NUMBER_INFO4, + [SeverityNumber.WARN]: _severityNumber.SEVERITY_NUMBER_WARN, + [SeverityNumber.WARN2]: _severityNumber.SEVERITY_NUMBER_WARN2, + [SeverityNumber.WARN3]: _severityNumber.SEVERITY_NUMBER_WARN3, + [SeverityNumber.WARN4]: _severityNumber.SEVERITY_NUMBER_WARN4, + [SeverityNumber.ERROR]: _severityNumber.SEVERITY_NUMBER_ERROR, + [SeverityNumber.ERROR2]: _severityNumber.SEVERITY_NUMBER_ERROR2, + [SeverityNumber.ERROR3]: _severityNumber.SEVERITY_NUMBER_ERROR3, + [SeverityNumber.ERROR4]: _severityNumber.SEVERITY_NUMBER_ERROR4, + [SeverityNumber.FATAL]: _severityNumber.SEVERITY_NUMBER_FATAL, + [SeverityNumber.FATAL2]: _severityNumber.SEVERITY_NUMBER_FATAL2, + [SeverityNumber.FATAL3]: _severityNumber.SEVERITY_NUMBER_FATAL3, + [SeverityNumber.FATAL4]: _severityNumber.SEVERITY_NUMBER_FATAL4 + } + + return severityMap[severityNumber] || _severityNumber.SEVERITY_NUMBER_INFO + } + + _hexToBytes (hexString) { + if (!hexString || hexString.length === 0) { + return Buffer.alloc(0) + } + + // Remove any '0x' prefix + const cleanHex = hexString.startsWith('0x') ? hexString.slice(2) : hexString + + // Ensure even length + const paddedHex = cleanHex.length % 2 === 0 ? cleanHex : '0' + cleanHex + + return Buffer.from(paddedHex, 'hex') + } + + _transformBody (body) { + if (typeof body === 'string') { + return { + stringValue: body + } + } else if (typeof body === 'number') { + return { + intValue: body + } + } else if (typeof body === 'boolean') { + return { + boolValue: body + } + } else if (body && typeof body === 'object') { + return { + kvlistValue: { + values: Object.entries(body).map(([key, value]) => ({ + key, + value: this._transformAnyValue(value) + })) + } + } + } + return { + stringValue: String(body) + } + } + + _transformAttributes (attributes) { + return Object.entries(attributes).map(([key, value]) => ({ + key, + value: this._transformAnyValue(value) + })) + } + + _transformAnyValue (value) { + if (typeof value === 'string') { + return { stringValue: value } + } else if (typeof value === 'number') { + if (Number.isInteger(value)) { + return { intValue: value } + } + return { doubleValue: value } + } else if (typeof value === 'boolean') { + return { boolValue: value } + } else if (Array.isArray(value)) { + return { + arrayValue: { + values: value.map(v => this._transformAnyValue(v)) + } + } + } else if (value && typeof value === 'object') { + return { + kvlistValue: { + values: Object.entries(value).map(([k, v]) => ({ + key: k, + value: this._transformAnyValue(v) + })) + } + } + } + return { stringValue: String(value) } + } +} + +module.exports = OtlpTransformer diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js new file mode 100644 index 00000000000..c9f6e869ad5 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js @@ -0,0 +1,76 @@ +'use strict' + +/** + * @fileoverview Protobuf Loader for OpenTelemetry Logs + * + * This module loads protobuf definitions for OpenTelemetry logs. + * + * VERSION SUPPORT: + * - OTLP Protocol: v1.7.0 + * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) + * - Other versions are not supported + * + * Reference: + * - https://github.com/open-telemetry/opentelemetry-proto (v1.7.0) + */ + +const protobuf = require('protobufjs') +const path = require('path') +const fs = require('fs') + +let _root = null +let _logsService = null +let _resourceLogs = null +let _scopeLogs = null +let _logRecord = null +let _severityNumber = null + +function loadProtobufDefinitions () { + if (_root) { + return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } + } + + try { + // Load the proto files + const protoDir = __dirname + const commonProto = path.join(protoDir, 'common.proto') + const resourceProto = path.join(protoDir, 'resource.proto') + const logsProto = path.join(protoDir, 'logs.proto') + const otlpProto = path.join(protoDir, 'otlp.proto') + + // Check if proto files exist + if (!fs.existsSync(commonProto) || !fs.existsSync(resourceProto) || + !fs.existsSync(logsProto) || !fs.existsSync(otlpProto)) { + throw new Error('Proto files not found') + } + + // Load the root + _root = protobuf.loadSync([ + commonProto, + resourceProto, + logsProto, + otlpProto + ]) + + // Get the message types + _logsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') + _resourceLogs = _root.lookupType('opentelemetry.proto.logs.v1.ResourceLogs') + _scopeLogs = _root.lookupType('opentelemetry.proto.logs.v1.ScopeLogs') + _logRecord = _root.lookupType('opentelemetry.proto.logs.v1.LogRecord') + _severityNumber = _root.lookupEnum('opentelemetry.proto.logs.v1.SeverityNumber') + + return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } + } catch (error) { + throw new Error(`Failed to load protobuf definitions: ${error.message}`) + } +} + +// Lazy load the protobuf definitions +function getProtobufTypes () { + return loadProtobufDefinitions() +} + +module.exports = { + getProtobufTypes, + loadProtobufDefinitions +} diff --git a/packages/dd-trace/src/opentelemetry/logs/resource.proto b/packages/dd-trace/src/opentelemetry/logs/resource.proto new file mode 100644 index 00000000000..ae25c22f836 --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/logs/resource.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +package opentelemetry.proto.resource.v1; + +import "opentelemetry/proto/common/v1/common.proto"; + +option go_package = "go.opentelemetry.io/collector/pdata/pcommon"; + +// Resource information. +message Resource { + // Set of attributes that describe the resource. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + repeated opentelemetry.proto.common.v1.KeyValue attributes = 1; + + // dropped_attributes_count is the number of dropped attributes. If the value is 0, + // then no attributes were dropped. + uint32 dropped_attributes_count = 2; +} diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 7e6e8a9f430..a276226a94b 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -275,7 +275,7 @@ class Tracer extends NoopProxy { return } - const { LoggerProvider, BatchLogProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') + const { LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') const { logs } = require('@opentelemetry/api-logs') // Create logger provider const loggerProvider = new LoggerProvider({ @@ -297,7 +297,7 @@ class Tracer extends NoopProxy { }) // Create batch processor using resolved config values - const processor = new BatchLogProcessor([exporter], { + const processor = new BatchLogRecordProcessor([exporter], { batchTimeout: config.otelLogsBatchTimeout, maxExportBatchSize: config.otelLogsMaxExportBatchSize, maxQueueSize: config.otelLogsMaxQueueSize, @@ -305,7 +305,7 @@ class Tracer extends NoopProxy { }) // Add processor to logger provider - loggerProvider.addLogProcessor(processor) + loggerProvider.addLogRecordProcessor(processor) // Register the logger provider globally with OpenTelemetry API logs.setGlobalLoggerProvider(loggerProvider) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index b80e297a824..2e0cbe91878 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -124,7 +124,7 @@ describe('OpenTelemetry Logs', () => { // Access the logger through OpenTelemetry API const { logs } = require('@opentelemetry/api-logs') const loggerProvider = logs.getLoggerProvider() - const activeProcessor = loggerProvider.getActiveLogProcessor() + const activeProcessor = loggerProvider.getActiveLogRecordProcessor() expect(activeProcessor).to.exist expect(typeof activeProcessor.forceFlush).to.equal('function') @@ -244,6 +244,7 @@ describe('OpenTelemetry Logs', () => { it('should warn and default to http/protobuf when grpc protocol is set', () => { const Config = require('../../src/config') + // eslint-disable-next-line no-console const originalWarn = console.warn let warningMessage = '' // eslint-disable-next-line no-console From c63e20eb08277fd278e073c7f40e15d19914acd2 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 14:53:53 -0400 Subject: [PATCH 11/61] working version --- .../opentelemetry/logs/batch_log_processor.js | 50 ++-------- .../dd-trace/src/opentelemetry/logs/index.js | 22 +---- .../dd-trace/src/opentelemetry/logs/logger.js | 71 +++------------ .../src/opentelemetry/logs/logger_provider.js | 45 +++------ .../src/opentelemetry/logs/logs.proto | 4 +- .../logs/otlp_http_log_exporter.js | 23 +---- .../opentelemetry/logs/otlp_transformer.js | 91 ++++++++----------- .../logs/{otlp.proto => payload.proto} | 2 +- .../src/opentelemetry/logs/protobuf_loader.js | 22 ++--- .../src/opentelemetry/logs/resource.proto | 2 +- .../test/opentelemetry/protobuf.spec.js | 49 ++++------ 11 files changed, 109 insertions(+), 272 deletions(-) rename packages/dd-trace/src/opentelemetry/logs/{otlp.proto => payload.proto} (97%) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 83d1723324f..1251f72ce58 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -3,27 +3,10 @@ /** * @fileoverview BatchLogRecordProcessor implementation for OpenTelemetry logs * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the - * OpenTelemetry SDK and includes many dependencies we don't need. To avoid - * pulling in the full SDK, we provide our own implementation that is heavily inspired - * by the existing OpenTelemetry prior art. - * - * This implementation is based on: - * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html - * - BatchLogRecordProcessor Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.BatchLogRecordProcessor.html - * - OpenTelemetry Logs SDK Specification: https://opentelemetry.io/docs/specs/otel/logs/sdk/ - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs - * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ -// const { logs } = require('@opentelemetry/api') const log = require('../../log') /** @@ -62,15 +45,7 @@ class BatchLogRecordProcessor { /** * Processes a single log record. * - * This method is called by the Logger when a log record is emitted. - * It adds the record to the batch and triggers export if conditions are met. - * * @param {Object} logRecord - The log record to process - * @param {string} logRecord.severityText - Severity text (e.g., 'INFO', 'ERROR') - * @param {number} logRecord.severityNumber - Severity number - * @param {string} logRecord.body - Log message body - * @param {Object} logRecord.attributes - Log attributes - * @param {number} logRecord.timestamp - Timestamp in nanoseconds */ onEmit (logRecord) { if (this._isShutdown) { @@ -79,11 +54,9 @@ class BatchLogRecordProcessor { this._logRecords.push(logRecord) - // If we've reached the max batch size, export immediately if (this._logRecords.length >= this._maxExportBatchSize) { this._export() } else if (this._logRecords.length === 1) { - // Start the timer for the first log record this._startTimer() } } @@ -106,18 +79,14 @@ class BatchLogRecordProcessor { const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) this._clearTimer() - // Process through all registered processors for (const processor of this._processors) { try { - processor.export(logRecords, () => { - // Export callback - could be used for error handling - }) + processor.export(logRecords, () => {}) } catch (error) { log.error('Error in log processor export:', error) } } - // If there are more records, start the timer again if (this._logRecords.length > 0) { this._startTimer() } @@ -151,20 +120,15 @@ class BatchLogRecordProcessor { this._shutdownPromise = new Promise((resolve) => { this._clearTimer() - // Export any remaining log records this._export() - // Shutdown all processors const shutdownPromises = this._processors.map(processor => { - if (typeof processor.shutdown === 'function') { - return processor.shutdown() - } - return Promise.resolve() + return typeof processor.shutdown === 'function' + ? processor.shutdown() + : Promise.resolve() }) - Promise.all(shutdownPromises).then(() => { - resolve() - }) + Promise.all(shutdownPromises).then(resolve) }) return this._shutdownPromise diff --git a/packages/dd-trace/src/opentelemetry/logs/index.js b/packages/dd-trace/src/opentelemetry/logs/index.js index 0df0bd5df04..d9bf86988dc 100644 --- a/packages/dd-trace/src/opentelemetry/logs/index.js +++ b/packages/dd-trace/src/opentelemetry/logs/index.js @@ -3,26 +3,8 @@ /** * @fileoverview OpenTelemetry Logs Implementation for dd-trace-js * - * This module provides OpenTelemetry logs functionality for dd-trace-js. - * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * TESTING: - * Run the OpenTelemetry logs tests with: - * npx mocha packages/dd-trace/test/opentelemetry/logs.spec.js --timeout 30000 - * - * NOTE: The official @opentelemetry/sdk-logs and @opentelemetry/otlp-transformer - * packages are tightly coupled to the OpenTelemetry SDK and require @opentelemetry/sdk-logs - * as a dependency. To avoid pulling in the full SDK, we provide our own implementation - * that is heavily inspired by the existing OpenTelemetry prior art. - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/otlp-transformer - * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ const LoggerProvider = require('./logger_provider') diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 6d0ec4947cb..4826314ea94 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -3,24 +3,8 @@ /** * @fileoverview Logger implementation for OpenTelemetry logs * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the - * OpenTelemetry SDK and includes many dependencies we don't need. To avoid - * pulling in the full SDK, we provide our own implementation that is heavily inspired - * by the existing OpenTelemetry prior art. - * - * This implementation is based on: - * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html - * - Logger Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.Logger.html - * - OpenTelemetry Logs API Specification: https://opentelemetry.io/docs/specs/otel/logs/api/ - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs - * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ const { SeverityNumber } = require('@opentelemetry/api-logs') @@ -58,13 +42,6 @@ class Logger { * Emits a log record. * * @param {Object} logRecord - The log record to emit - * @param {string} logRecord.severityText - Severity text (e.g., 'INFO', 'ERROR') - * @param {number} logRecord.severityNumber - Severity number - * @param {string} logRecord.body - Log message body - * @param {Object} [logRecord.attributes] - Log attributes - * @param {number} [logRecord.timestamp] - Timestamp in nanoseconds - * @param {string} [logRecord.traceId] - Associated trace ID - * @param {string} [logRecord.spanId] - Associated span ID */ emit (logRecord) { if (this._loggerProvider._isShutdown) { @@ -76,62 +53,38 @@ class Logger { return } - // Sanitize attributes to ensure they conform to OpenTelemetry spec if (logRecord.attributes) { logRecord.attributes = sanitizeAttributes(logRecord.attributes) } - // Add instrumentation library information logRecord.instrumentationLibrary = this.instrumentationLibrary - processor.onEmit(logRecord) } - // Convenience methods for common log levels debug (message, attributes = {}) { - this.emit({ - severityText: 'DEBUG', - severityNumber: SeverityNumber.DEBUG, - body: message, - attributes, - timestamp: Date.now() * 1_000_000 // Convert to nanoseconds - }) + this._emitLog('DEBUG', SeverityNumber.DEBUG, message, attributes) } info (message, attributes = {}) { - this.emit({ - severityText: 'INFO', - severityNumber: SeverityNumber.INFO, - body: message, - attributes, - timestamp: Date.now() * 1_000_000 - }) + this._emitLog('INFO', SeverityNumber.INFO, message, attributes) } warn (message, attributes = {}) { - this.emit({ - severityText: 'WARN', - severityNumber: SeverityNumber.WARN, - body: message, - attributes, - timestamp: Date.now() * 1_000_000 - }) + this._emitLog('WARN', SeverityNumber.WARN, message, attributes) } error (message, attributes = {}) { - this.emit({ - severityText: 'ERROR', - severityNumber: SeverityNumber.ERROR, - body: message, - attributes, - timestamp: Date.now() * 1_000_000 - }) + this._emitLog('ERROR', SeverityNumber.ERROR, message, attributes) } fatal (message, attributes = {}) { + this._emitLog('FATAL', SeverityNumber.FATAL, message, attributes) + } + + _emitLog (severityText, severityNumber, message, attributes) { this.emit({ - severityText: 'FATAL', - severityNumber: SeverityNumber.FATAL, + severityText, + severityNumber, body: message, attributes, timestamp: Date.now() * 1_000_000 diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index ca7824d0442..fa9e988619c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -3,29 +3,11 @@ /** * @fileoverview LoggerProvider implementation for OpenTelemetry logs * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * NOTE: The official @opentelemetry/sdk-logs package is tightly coupled to the - * OpenTelemetry SDK and includes many dependencies we don't need. To avoid - * pulling in the full SDK, we provide our own implementation that is heavily inspired - * by the existing OpenTelemetry prior art. - * - * This implementation is based on: - * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html - * - LoggerProvider Class: https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.LoggerProvider.html - * - OpenTelemetry Logs SDK Specification: https://opentelemetry.io/docs/specs/otel/logs/sdk/ - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/experimental/packages/sdk-logs - * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ const { logs } = require('@opentelemetry/api-logs') -// const BatchLogProcessor = require('./batch_log_processor') -// const OtlpHttpLogExporter = require('./otlp_http_log_exporter') const Logger = require('./logger') const log = require('../../log') @@ -58,22 +40,14 @@ class LoggerProvider { /** * Gets or creates a logger instance. * - * @param {string} name - Logger name (typically the instrumentation library name) + * @param {string} name - Logger name * @param {string} [version='1.0.0'] - Logger version * @param {Object} [options={}] - Additional options * @returns {Logger} Logger instance */ getLogger (name, version = '1.0.0', options = {}) { if (this._isShutdown) { - // Return a no-op logger when shutdown - return { - emit: () => {}, - debug: () => {}, - info: () => {}, - warn: () => {}, - error: () => {}, - fatal: () => {} - } + return this._createNoOpLogger() } const key = `${name}@${version}` @@ -87,6 +61,17 @@ class LoggerProvider { return this._loggers.get(key) } + _createNoOpLogger () { + return { + emit: () => {}, + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {}, + fatal: () => {} + } + } + addLogRecordProcessor (logRecordProcessor) { if (this._isShutdown) { log.warn('Cannot add log record processor after shutdown') diff --git a/packages/dd-trace/src/opentelemetry/logs/logs.proto b/packages/dd-trace/src/opentelemetry/logs/logs.proto index 0d462732915..2cfb8710c1d 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logs.proto +++ b/packages/dd-trace/src/opentelemetry/logs/logs.proto @@ -2,8 +2,8 @@ syntax = "proto3"; package opentelemetry.proto.logs.v1; -import "opentelemetry/proto/common/v1/common.proto"; -import "opentelemetry/proto/resource/v1/resource.proto"; +import "common.proto"; +import "resource.proto"; option go_package = "go.opentelemetry.io/collector/pdata/plog"; diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 6f170f5ab57..0c8c25f1511 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -3,24 +3,8 @@ /** * @fileoverview OTLP HTTP Log Exporter implementation for OpenTelemetry logs * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * NOTE: The official @opentelemetry/exporter-logs-otlp-http package is tightly coupled to the - * OpenTelemetry SDK and requires @opentelemetry/sdk-logs as a dependency. To avoid - * pulling in the full SDK, we provide our own implementation that is heavily inspired - * by the existing OpenTelemetry prior art. - * - * This implementation is based on: - * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html - * - LogRecordExporter Interface: https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_sdk-logs.LogRecordExporter.html - * - OTLP Protocol Specification: https://opentelemetry.io/docs/specs/otlp/ - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/v2.1.0/packages/opentelemetry-exporter-logs-otlp-http - * - https://github.com/open-telemetry/opentelemetry-proto/tree/v1.7.0 + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ const https = require('https') @@ -71,8 +55,6 @@ class OtlpHttpLogExporter { * * @param {Array} logRecords - Array of log records to export * @param {Function} resultCallback - Callback function for export result - * @param {number} resultCallback.code - Result code (0 = success, 1 = error) - * @param {Error} [resultCallback.error] - Error object if export failed */ export (logRecords, resultCallback) { if (logRecords.length === 0) { @@ -139,7 +121,6 @@ class OtlpHttpLogExporter { } shutdown () { - // No cleanup needed for HTTP exporter return Promise.resolve() } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index c6f938f309a..ecc2e51070e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -3,24 +3,8 @@ /** * @fileoverview OTLP Transformer for OpenTelemetry logs * - * VERSION SUPPORT: - * - OTLP Protocol: v1.7.0 - * - Protobuf Definitions: v1.7.0 (vendored from opentelemetry-proto) - * - Other versions are not supported - * - * NOTE: The official @opentelemetry/otlp-transformer package is tightly coupled to the - * OpenTelemetry SDK and requires @opentelemetry/sdk-logs as a dependency. To avoid - * pulling in the full SDK, we provide our own implementation that is heavily inspired - * by the existing OpenTelemetry prior art. - * - * This implementation is based on: - * - Official SDK Documentation: https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_sdk-logs.html - * - OTLP Transformer: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-otlp-transformer - * - OTLP Protocol Specification: https://opentelemetry.io/docs/specs/otlp/ - * - * Reference implementation (heavily inspired by): - * - https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-otlp-transformer - * - https://github.com/open-telemetry/opentelemetry-proto (v1.7.0) + * Custom implementation to avoid pulling in the full OpenTelemetry SDK. + * Based on OTLP Protocol v1.7.0. */ const { SeverityNumber } = require('@opentelemetry/api-logs') @@ -118,11 +102,11 @@ class OtlpTransformer { } _transformLogRecord (logRecord) { - // const { _severityNumber } = this._getProtobufTypes() + const timestamp = logRecord.timestamp || Date.now() * 1_000_000 return { - timeUnixNano: logRecord.timestamp || Date.now() * 1_000_000, - observedTimeUnixNano: logRecord.timestamp || Date.now() * 1_000_000, + timeUnixNano: timestamp, + observedTimeUnixNano: timestamp, severityNumber: this._mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), severityText: logRecord.severityText || 'INFO', body: this._transformBody(logRecord.body), @@ -137,35 +121,43 @@ class OtlpTransformer { _mapSeverityNumber (severityNumber) { const { _severityNumber } = this._getProtobufTypes() - // Map OpenTelemetry API severity numbers to protobuf enum values - const severityMap = { - [SeverityNumber.TRACE]: _severityNumber.SEVERITY_NUMBER_TRACE, - [SeverityNumber.TRACE2]: _severityNumber.SEVERITY_NUMBER_TRACE2, - [SeverityNumber.TRACE3]: _severityNumber.SEVERITY_NUMBER_TRACE3, - [SeverityNumber.TRACE4]: _severityNumber.SEVERITY_NUMBER_TRACE4, - [SeverityNumber.DEBUG]: _severityNumber.SEVERITY_NUMBER_DEBUG, - [SeverityNumber.DEBUG2]: _severityNumber.SEVERITY_NUMBER_DEBUG2, - [SeverityNumber.DEBUG3]: _severityNumber.SEVERITY_NUMBER_DEBUG3, - [SeverityNumber.DEBUG4]: _severityNumber.SEVERITY_NUMBER_DEBUG4, - [SeverityNumber.INFO]: _severityNumber.SEVERITY_NUMBER_INFO, - [SeverityNumber.INFO2]: _severityNumber.SEVERITY_NUMBER_INFO2, - [SeverityNumber.INFO3]: _severityNumber.SEVERITY_NUMBER_INFO3, - [SeverityNumber.INFO4]: _severityNumber.SEVERITY_NUMBER_INFO4, - [SeverityNumber.WARN]: _severityNumber.SEVERITY_NUMBER_WARN, - [SeverityNumber.WARN2]: _severityNumber.SEVERITY_NUMBER_WARN2, - [SeverityNumber.WARN3]: _severityNumber.SEVERITY_NUMBER_WARN3, - [SeverityNumber.WARN4]: _severityNumber.SEVERITY_NUMBER_WARN4, - [SeverityNumber.ERROR]: _severityNumber.SEVERITY_NUMBER_ERROR, - [SeverityNumber.ERROR2]: _severityNumber.SEVERITY_NUMBER_ERROR2, - [SeverityNumber.ERROR3]: _severityNumber.SEVERITY_NUMBER_ERROR3, - [SeverityNumber.ERROR4]: _severityNumber.SEVERITY_NUMBER_ERROR4, - [SeverityNumber.FATAL]: _severityNumber.SEVERITY_NUMBER_FATAL, - [SeverityNumber.FATAL2]: _severityNumber.SEVERITY_NUMBER_FATAL2, - [SeverityNumber.FATAL3]: _severityNumber.SEVERITY_NUMBER_FATAL3, - [SeverityNumber.FATAL4]: _severityNumber.SEVERITY_NUMBER_FATAL4 + if (!_severityNumber) { + // eslint-disable-next-line no-console + console.error('_severityNumber is undefined') + return 9 // Default to INFO } - return severityMap[severityNumber] || _severityNumber.SEVERITY_NUMBER_INFO + const severityMap = this._createSeverityMap(_severityNumber) + return severityMap[severityNumber] || _severityNumber.values.SEVERITY_NUMBER_INFO + } + + _createSeverityMap (severityEnum) { + const map = {} + map[SeverityNumber.TRACE] = severityEnum.values.SEVERITY_NUMBER_TRACE + map[SeverityNumber.TRACE2] = severityEnum.values.SEVERITY_NUMBER_TRACE2 + map[SeverityNumber.TRACE3] = severityEnum.values.SEVERITY_NUMBER_TRACE3 + map[SeverityNumber.TRACE4] = severityEnum.values.SEVERITY_NUMBER_TRACE4 + map[SeverityNumber.DEBUG] = severityEnum.values.SEVERITY_NUMBER_DEBUG + map[SeverityNumber.DEBUG2] = severityEnum.values.SEVERITY_NUMBER_DEBUG2 + map[SeverityNumber.DEBUG3] = severityEnum.values.SEVERITY_NUMBER_DEBUG3 + map[SeverityNumber.DEBUG4] = severityEnum.values.SEVERITY_NUMBER_DEBUG4 + map[SeverityNumber.INFO] = severityEnum.values.SEVERITY_NUMBER_INFO + map[SeverityNumber.INFO2] = severityEnum.values.SEVERITY_NUMBER_INFO2 + map[SeverityNumber.INFO3] = severityEnum.values.SEVERITY_NUMBER_INFO3 + map[SeverityNumber.INFO4] = severityEnum.values.SEVERITY_NUMBER_INFO4 + map[SeverityNumber.WARN] = severityEnum.values.SEVERITY_NUMBER_WARN + map[SeverityNumber.WARN2] = severityEnum.values.SEVERITY_NUMBER_WARN2 + map[SeverityNumber.WARN3] = severityEnum.values.SEVERITY_NUMBER_WARN3 + map[SeverityNumber.WARN4] = severityEnum.values.SEVERITY_NUMBER_WARN4 + map[SeverityNumber.ERROR] = severityEnum.values.SEVERITY_NUMBER_ERROR + map[SeverityNumber.ERROR2] = severityEnum.values.SEVERITY_NUMBER_ERROR2 + map[SeverityNumber.ERROR3] = severityEnum.values.SEVERITY_NUMBER_ERROR3 + map[SeverityNumber.ERROR4] = severityEnum.values.SEVERITY_NUMBER_ERROR4 + map[SeverityNumber.FATAL] = severityEnum.values.SEVERITY_NUMBER_FATAL + map[SeverityNumber.FATAL2] = severityEnum.values.SEVERITY_NUMBER_FATAL2 + map[SeverityNumber.FATAL3] = severityEnum.values.SEVERITY_NUMBER_FATAL3 + map[SeverityNumber.FATAL4] = severityEnum.values.SEVERITY_NUMBER_FATAL4 + return map } _hexToBytes (hexString) { @@ -173,10 +165,7 @@ class OtlpTransformer { return Buffer.alloc(0) } - // Remove any '0x' prefix const cleanHex = hexString.startsWith('0x') ? hexString.slice(2) : hexString - - // Ensure even length const paddedHex = cleanHex.length % 2 === 0 ? cleanHex : '0' + cleanHex return Buffer.from(paddedHex, 'hex') diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp.proto b/packages/dd-trace/src/opentelemetry/logs/payload.proto similarity index 97% rename from packages/dd-trace/src/opentelemetry/logs/otlp.proto rename to packages/dd-trace/src/opentelemetry/logs/payload.proto index f91682d4170..74b5cb1dd23 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp.proto +++ b/packages/dd-trace/src/opentelemetry/logs/payload.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package opentelemetry.proto.collector.logs.v1; -import "opentelemetry/proto/logs/v1/logs.proto"; +import "logs.proto"; option go_package = "go.opentelemetry.io/collector/pdata/plog/plogotlp"; diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js index c9f6e869ad5..65e7d01217f 100644 --- a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js @@ -33,24 +33,18 @@ function loadProtobufDefinitions () { try { // Load the proto files const protoDir = __dirname - const commonProto = path.join(protoDir, 'common.proto') - const resourceProto = path.join(protoDir, 'resource.proto') - const logsProto = path.join(protoDir, 'logs.proto') - const otlpProto = path.join(protoDir, 'otlp.proto') + const protoFiles = [ + 'common.proto', + 'resource.proto', + 'logs.proto', + 'payload.proto' + ].map(file => path.join(protoDir, file)) - // Check if proto files exist - if (!fs.existsSync(commonProto) || !fs.existsSync(resourceProto) || - !fs.existsSync(logsProto) || !fs.existsSync(otlpProto)) { + if (!protoFiles.every(file => fs.existsSync(file))) { throw new Error('Proto files not found') } - // Load the root - _root = protobuf.loadSync([ - commonProto, - resourceProto, - logsProto, - otlpProto - ]) + _root = protobuf.loadSync(protoFiles) // Get the message types _logsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') diff --git a/packages/dd-trace/src/opentelemetry/logs/resource.proto b/packages/dd-trace/src/opentelemetry/logs/resource.proto index ae25c22f836..73e0419a5e7 100644 --- a/packages/dd-trace/src/opentelemetry/logs/resource.proto +++ b/packages/dd-trace/src/opentelemetry/logs/resource.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package opentelemetry.proto.resource.v1; -import "opentelemetry/proto/common/v1/common.proto"; +import "common.proto"; option go_package = "go.opentelemetry.io/collector/pdata/pcommon"; diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js index 1e771af271c..f5caf532bc9 100644 --- a/packages/dd-trace/test/opentelemetry/protobuf.spec.js +++ b/packages/dd-trace/test/opentelemetry/protobuf.spec.js @@ -2,9 +2,8 @@ const { expect } = require('chai') const { describe, it, beforeEach } = require('mocha') -const sinon = require('sinon') const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') -const { logs } = require('@opentelemetry/api') +const { SeverityNumber } = require('@opentelemetry/api-logs') describe('OTLP Protobuf Serialization', () => { let transformer @@ -25,7 +24,7 @@ describe('OTLP Protobuf Serialization', () => { const logRecords = [ { timestamp: Date.now() * 1000000, - severityNumber: logs.SeverityNumber.INFO, + severityNumber: SeverityNumber.INFO, severityText: 'INFO', body: 'Test log message', attributes: { @@ -44,17 +43,17 @@ describe('OTLP Protobuf Serialization', () => { it('should handle different severity levels', () => { const logRecords = [ { - severityNumber: logs.SeverityNumber.DEBUG, + severityNumber: SeverityNumber.DEBUG, severityText: 'DEBUG', body: 'Debug message' }, { - severityNumber: logs.SeverityNumber.ERROR, + severityNumber: SeverityNumber.ERROR, severityText: 'ERROR', body: 'Error message' }, { - severityNumber: logs.SeverityNumber.FATAL, + severityNumber: SeverityNumber.FATAL, severityText: 'FATAL', body: 'Fatal message' } @@ -85,19 +84,19 @@ describe('OTLP Protobuf Serialization', () => { const logRecords = [ { body: 'String message', - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO }, { body: 42, - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO }, { body: true, - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO }, { body: { nested: { value: 'object' } }, - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO } ] @@ -126,26 +125,20 @@ describe('OTLP Protobuf Serialization', () => { }) it('should fallback to JSON if protobuf serialization fails', () => { - // Mock the protobuf loader to throw an error - const originalRequire = require - const mockRequire = sinon.stub().callsFake((path) => { - if (path === './protobuf_loader') { - return { - getProtobufTypes: () => { - throw new Error('Protobuf loading failed') - } + // Create a transformer with JSON protocol to test fallback + const transformer = new OtlpTransformer({ + protocol: 'http/json', + resource: { + attributes: { + 'service.name': 'test-service' } } - return originalRequire(path) }) - // eslint-disable-next-line no-global-assign - require = mockRequire - const transformer = new OtlpTransformer() const logRecords = [ { body: 'Test message', - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO } ] @@ -156,10 +149,6 @@ describe('OTLP Protobuf Serialization', () => { // Should be JSON (starts with {) expect(result.toString('utf8').startsWith('{')).to.be.true - - // Restore require - // eslint-disable-next-line no-global-assign - require = originalRequire }) it('should handle empty log records', () => { @@ -173,7 +162,7 @@ describe('OTLP Protobuf Serialization', () => { const logRecords = [ { body: 'Message without instrumentation library', - severityNumber: logs.SeverityNumber.INFO + severityNumber: SeverityNumber.INFO } ] @@ -206,11 +195,11 @@ describe('OTLP Protobuf Serialization', () => { const transformer = new OtlpTransformer() // Test INFO mapping - const infoSeverity = transformer._mapSeverityNumber(logs.SeverityNumber.INFO) + const infoSeverity = transformer._mapSeverityNumber(SeverityNumber.INFO) expect(infoSeverity).to.be.a('number') // Test ERROR mapping - const errorSeverity = transformer._mapSeverityNumber(logs.SeverityNumber.ERROR) + const errorSeverity = transformer._mapSeverityNumber(SeverityNumber.ERROR) expect(errorSeverity).to.be.a('number') // Test unknown severity (should default to INFO) From d4d8aac596ddee04e866981a5f22a70379ad9d29 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 15:07:33 -0400 Subject: [PATCH 12/61] fmy --- packages/dd-trace/src/opentelemetry/logs/logger.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 4826314ea94..471ac4bcecd 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -13,8 +13,8 @@ const { sanitizeAttributes } = require('@opentelemetry/core') /** * Logger provides methods to emit log records. * - * This implementation follows the OpenTelemetry JavaScript SDK Logger: - * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.Logger.html + * This implementation follows the OpenTelemetry JavaScript API Logger: + * https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api-logs.Logger.html * * @class Logger */ From 9514e68538e74208f61b5c996a36b882513ccbde Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 16:16:19 -0400 Subject: [PATCH 13/61] fmt --- packages/dd-trace/test/opentelemetry/logs.spec.js | 2 +- packages/dd-trace/test/opentelemetry/protobuf.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 2e0cbe91878..53317be688d 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -1,7 +1,7 @@ 'use strict' const { expect } = require('chai') -const { describe, it, beforeEach, afterEach } = require('mocha') +const { describe, it, beforeEach, afterEach } = require('tap').mocha const tracer = require('../../') describe('OpenTelemetry Logs', () => { diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js index f5caf532bc9..886c36458da 100644 --- a/packages/dd-trace/test/opentelemetry/protobuf.spec.js +++ b/packages/dd-trace/test/opentelemetry/protobuf.spec.js @@ -1,7 +1,7 @@ 'use strict' const { expect } = require('chai') -const { describe, it, beforeEach } = require('mocha') +const { describe, it, beforeEach } = require('tap').mocha const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') const { SeverityNumber } = require('@opentelemetry/api-logs') From df7cbca2ab69d8381d3143a20c83083f49d3ee06 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 16:43:23 -0400 Subject: [PATCH 14/61] Update packages/dd-trace/src/config_defaults.js --- packages/dd-trace/src/config_defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 24e293b7ba4..672bc841093 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -121,7 +121,7 @@ module.exports = { logInjection: true, otelLogsEnabled: false, otelLogsUrl: 'http://localhost:4318/v1/logs', - otelLogsHeaders: {}, + otelLogsHeaders: '', otelLogsProtocol: 'http/protobuf', otelLogsTimeout: 10_000, otelLogsBatchTimeout: 5000, From 2c0a5a5996edc578091f9a298a44b738ec851ca8 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 16:55:21 -0400 Subject: [PATCH 15/61] fix tests --- integration-tests/opentelemetry.spec.js | 4 ++-- packages/dd-trace/src/config.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/opentelemetry.spec.js b/integration-tests/opentelemetry.spec.js index 90dcbf19f30..b5d5a46f4ce 100644 --- a/integration-tests/opentelemetry.spec.js +++ b/integration-tests/opentelemetry.spec.js @@ -133,7 +133,7 @@ describe('opentelemetry', () => { OTEL_RESOURCE_ATTRIBUTES: 'foo+bar13baz+qux1', DD_TRACE_PROPAGATION_STYLE: 'datadog, tracecontext', OTEL_PROPAGATORS: 'datadog, tracecontext', - DD_LOGS_OTEL_ENABLED: 'false', + OTEL_LOGS_EXPORTER: 'none', OTEL_SDK_DISABLED: 'false' } }) @@ -206,7 +206,7 @@ describe('opentelemetry', () => { OTEL_METRICS_EXPORTER: 'foo', OTEL_RESOURCE_ATTRIBUTES: 'foo', OTEL_PROPAGATORS: 'foo', - DD_LOGS_OTEL_ENABLED: 'foo', + OTEL_LOGS_EXPORTER: 'foo', OTEL_SDK_DISABLED: 'foo' } }) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 83215993966..76b02873256 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -58,8 +58,8 @@ const otelDdEnvMapping = { OTEL_TRACES_EXPORTER: 'DD_TRACE_ENABLED', OTEL_METRICS_EXPORTER: 'DD_RUNTIME_METRICS_ENABLED', OTEL_RESOURCE_ATTRIBUTES: 'DD_TAGS', - OTEL_LOGS_EXPORTER: undefined, - OTEL_SDK_DISABLED: 'DD_TRACE_OTEL_ENABLED' + OTEL_SDK_DISABLED: 'DD_TRACE_OTEL_ENABLED', + OTEL_LOGS_EXPORTER: undefined } const VALID_PROPAGATION_STYLES = new Set(['datadog', 'tracecontext', 'b3', 'b3 single header', 'none']) From f109cf3796c4c3025b33f84e08bac94ae5cac8b2 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 19 Sep 2025 17:08:20 -0400 Subject: [PATCH 16/61] allow any version of logs api, let opentelemetry api determine the version --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0164fdcd47d..486b389fc49 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "@datadog/wasm-js-rewriter": "4.0.1", "@isaacs/ttlcache": "^1.4.1", "@opentelemetry/api": ">=1.0.0 <1.10.0", - "@opentelemetry/api-logs": "^0.205.0", + "@opentelemetry/api-logs": "*", "@opentelemetry/core": ">=1.14.0 <1.31.0", "crypto-randomuuid": "^1.0.0", "dc-polyfill": "^0.1.10", diff --git a/yarn.lock b/yarn.lock index e50775e8ff2..785086423df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -664,7 +664,7 @@ "@octokit/request-error" "^7.0.0" "@octokit/webhooks-methods" "^6.0.0" -"@opentelemetry/api-logs@^0.205.0": +"@opentelemetry/api-logs@*": version "0.205.0" resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.205.0.tgz" integrity sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg== From 0c29478118ae881242000a7a8d5b8955b1cba7fe Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Sun, 21 Sep 2025 14:53:53 -0400 Subject: [PATCH 17/61] add otlp payload tests --- packages/dd-trace/src/proxy.js | 30 +++- .../dd-trace/test/opentelemetry/logs.spec.js | 136 +++++++++++++++++- 2 files changed, 155 insertions(+), 11 deletions(-) diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index a276226a94b..d0149b4cd26 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -277,14 +277,29 @@ class Tracer extends NoopProxy { const { LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') const { logs } = require('@opentelemetry/api-logs') + const os = require('os') + + // Build resource attributes + const resourceAttributes = { + 'service.name': config.service, + 'service.version': config.version, + 'deployment.environment': config.env + } + + // Add all tracer tags (includes DD_TAGS, OTEL_RESOURCE_ATTRIBUTES, DD_TRACE_TAGS, etc.) + if (config.tags && Object.keys(config.tags).length > 0) { + Object.assign(resourceAttributes, config.tags) + } + + // Add host.name if reportHostname is enabled + if (config.reportHostname) { + resourceAttributes['host.name'] = os.hostname() + } + // Create logger provider const loggerProvider = new LoggerProvider({ resource: { - attributes: { - 'service.name': config.service, - 'service.version': config.version, - 'deployment.environment': config.env - } + attributes: resourceAttributes } }) @@ -293,7 +308,10 @@ class Tracer extends NoopProxy { url: config.otelLogsUrl, headers: config.otelLogsHeaders, timeout: config.otelLogsTimeout, - protocol: config.otelLogsProtocol + protocol: config.otelLogsProtocol, + resource: { + attributes: resourceAttributes + } }) // Create batch processor using resolved config values diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 53317be688d..5e9789e7240 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -2,21 +2,17 @@ const { expect } = require('chai') const { describe, it, beforeEach, afterEach } = require('tap').mocha -const tracer = require('../../') describe('OpenTelemetry Logs', () => { let originalEnv beforeEach(() => { originalEnv = { ...process.env } - process.env.DD_SERVICE = 'test-service' - process.env.DD_VERSION = '1.0.0' - process.env.DD_ENV = 'test' }) afterEach(() => { process.env = originalEnv - // Clean up OpenTelemetry API state + // Clean up OpenTelemetry API state by shutting down the current logger provider const { logs } = require('@opentelemetry/api-logs') const loggerProvider = logs.getLoggerProvider() if (loggerProvider && typeof loggerProvider.shutdown === 'function') { @@ -26,6 +22,7 @@ describe('OpenTelemetry Logs', () => { it('should initialize OpenTelemetry logs when otelLogsEnabled is true', () => { process.env.DD_LOGS_OTEL_ENABLED = 'true' + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -51,6 +48,7 @@ describe('OpenTelemetry Logs', () => { existingProvider.shutdown() } + const tracer = require('../../') tracer.init() // After initialization with DD_LOGS_OTEL_ENABLED='false', @@ -72,6 +70,7 @@ describe('OpenTelemetry Logs', () => { it('should create a logger and emit log records', () => { process.env.DD_LOGS_OTEL_ENABLED = 'true' + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -92,6 +91,7 @@ describe('OpenTelemetry Logs', () => { it('should handle different log levels', () => { process.env.DD_LOGS_OTEL_ENABLED = 'true' + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -119,6 +119,7 @@ describe('OpenTelemetry Logs', () => { it('should support force flush', async () => { process.env.DD_LOGS_OTEL_ENABLED = 'true' + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -149,6 +150,7 @@ describe('OpenTelemetry Logs', () => { delete process.env.OTEL_BSP_MAX_QUEUE_SIZE delete process.env.OTEL_BSP_EXPORT_TIMEOUT + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -163,6 +165,7 @@ describe('OpenTelemetry Logs', () => { it('should handle logger provider shutdown', () => { process.env.DD_LOGS_OTEL_ENABLED = 'true' + const tracer = require('../../') tracer.init() // Access the logger through OpenTelemetry API @@ -261,4 +264,127 @@ describe('OpenTelemetry Logs', () => { console.warn = originalWarn }) }) + + describe('Resource Attributes', () => { + it('should set resource attributes from DD_TAGS', () => { + const Config = require('../../src/config') + process.env.DD_LOGS_OTEL_ENABLED = 'true' + process.env.DD_TAGS = 'team:backend,region:us-west-2' + + const config = new Config() + + expect(config.tags).to.include({ + team: 'backend', + region: 'us-west-2' + }) + }) + + it('should set resource attributes from OTEL_RESOURCE_ATTRIBUTES', () => { + const Config = require('../../src/config') + process.env.DD_LOGS_OTEL_ENABLED = 'true' + process.env.OTEL_RESOURCE_ATTRIBUTES = 'deployment.environment=production,service.namespace=api' + // Override DD_ENV to avoid conflict + process.env.DD_ENV = 'production' + + const config = new Config() + + // Check that service.namespace is in tags (from OTEL_RESOURCE_ATTRIBUTES) + expect(config.tags).to.include({ + 'service.namespace': 'api' + }) + + // Check that env is set correctly (which maps to deployment.environment in proxy.js) + expect(config.env).to.equal('production') + }) + + it('should set hostname when reportHostname is enabled', () => { + const Config = require('../../src/config') + process.env.DD_LOGS_OTEL_ENABLED = 'true' + process.env.DD_TRACE_REPORT_HOSTNAME = 'true' + + const config = new Config() + + expect(config.hostname).to.exist + expect(config.hostname).to.be.a('string') + }) + }) + + describe('OTLP Payload Structure', () => { + const { OtlpTransformer } = require('../../src/opentelemetry/logs') + const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') + + const testData = { + resource: { + attributes: { + 'service.name': 'test-service', + 'service.version': '1.0.0', + 'deployment.environment': 'test', + team: 'backend', + region: 'us-west-2' + } + }, + logRecords: [{ + body: 'Test message', + severityNumber: 9, + severityText: 'INFO', + attributes: { 'test.attr': 'test-value' } + }] + } + + // Shared verification function + const verifyPayload = (payload) => { + expect(payload).to.have.property('resourceLogs') + expect(payload.resourceLogs[0]).to.have.property('resource') + expect(payload.resourceLogs[0]).to.have.property('scopeLogs') + + const resource = payload.resourceLogs[0].resource + expect(resource).to.have.property('attributes') + expect(resource).to.have.property('droppedAttributesCount', 0) + + const resourceAttrs = resource.attributes.reduce((acc, attr) => { + acc[attr.key] = attr.value.stringValue + return acc + }, {}) + expect(resourceAttrs).to.include({ + 'service.name': 'test-service', + 'service.version': '1.0.0', + 'deployment.environment': 'test', + team: 'backend', + region: 'us-west-2' + }) + + const scope = payload.resourceLogs[0].scopeLogs[0].scope + expect(scope).to.have.property('name', 'dd-trace-js') + expect(scope).to.have.property('version', '1.0.0') + expect(scope).to.have.property('droppedAttributesCount', 0) + + const logRecord = payload.resourceLogs[0].scopeLogs[0].logRecords[0] + expect(logRecord).to.have.property('body') + expect(logRecord.body).to.have.property('stringValue', 'Test message') + expect(logRecord).to.have.property('severityNumber', 9) + expect(logRecord).to.have.property('severityText', 'INFO') + // droppedAttributesCount may not be present in decoded protobuf + if (logRecord.droppedAttributesCount !== undefined) { + expect(logRecord.droppedAttributesCount).to.equal(0) + } + + const logAttrs = logRecord.attributes.reduce((acc, attr) => { + acc[attr.key] = attr.value.stringValue + return acc + }, {}) + expect(logAttrs).to.include({ 'test.attr': 'test-value' }) + } + + it('should generate correct JSON payload structure', () => { + const transformer = new OtlpTransformer({ protocol: 'http/json', ...testData }) + const result = JSON.parse(transformer.transformLogRecords(testData.logRecords).toString()) + verifyPayload(result) + }) + + it('should generate correct protobuf payload structure', () => { + const transformer = new OtlpTransformer({ protocol: 'http/protobuf', ...testData }) + const result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(testData.logRecords)) + verifyPayload(result) + }) + }) }) From 8b1ce46c68788844eafa8ae9947bebb6dc4b9c50 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Sun, 21 Sep 2025 21:46:47 -0400 Subject: [PATCH 18/61] add telemetry metrics --- .../logs/otlp_http_log_exporter.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 0c8c25f1511..ba4fde0ce39 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -12,6 +12,9 @@ const http = require('http') const { URL } = require('url') const log = require('../../log') const OtlpTransformer = require('./otlp_transformer') +const telemetryMetrics = require('../../telemetry/metrics') + +const tracerMetrics = telemetryMetrics.manager.namespace('tracers') /** * OtlpHttpLogExporter exports log records via OTLP over HTTP. @@ -48,6 +51,12 @@ class OtlpHttpLogExporter { } this._timeout = config.timeout || 10_000 this._transformer = new OtlpTransformer(config) + + // Pre-compute telemetry tags for efficiency + this._telemetryTags = [ + `protocol:${this._protocol.startsWith('grpc') ? 'grpc' : 'http'}`, + `encoding:${this._protocol === 'http/json' ? 'json' : 'protobuf'}` + ] } /** @@ -64,6 +73,15 @@ class OtlpHttpLogExporter { try { const payload = this._transformer.transformLogRecords(logRecords) + + // Track telemetry metric for OTLP log records + try { + tracerMetrics.count('dd.instrumentation_telemetry_data.tracers.otel.log_records', this._telemetryTags) + .inc(logRecords.length) + } catch (telemetryError) { + log.debug('Error tracking OTLP log records telemetry:', telemetryError) + } + this._sendPayload(payload, resultCallback) } catch (error) { log.error('Error transforming log records:', error) From 432ec8956f21493ffaf39c721ec91ec2c2df0b67 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Sun, 21 Sep 2025 21:54:38 -0400 Subject: [PATCH 19/61] some other clean ups --- .../opentelemetry/logs/batch_log_processor.js | 8 ++++---- .../logs/otlp_http_log_exporter.js | 18 +++++++++--------- .../src/opentelemetry/logs/otlp_transformer.js | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 1251f72ce58..ed767d7d3ba 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -32,10 +32,10 @@ class BatchLogRecordProcessor { this._processors = processors this._config = config this._isShutdown = false - this._batchTimeout = config.batchTimeout || 5000 // 5 seconds default - this._maxExportBatchSize = config.maxExportBatchSize || 512 - this._maxQueueSize = config.maxQueueSize || 2048 - this._exportTimeoutMillis = config.exportTimeoutMillis || 30_000 // 30 seconds default + this._batchTimeout = config.batchTimeout + this._maxExportBatchSize = config.maxExportBatchSize + this._maxQueueSize = config.maxQueueSize + this._exportTimeoutMillis = config.exportTimeoutMillis this._logRecords = [] this._timer = null diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index ba4fde0ce39..c750d5d7d8e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -28,16 +28,16 @@ class OtlpHttpLogExporter { /** * Creates a new OtlpHttpLogExporter instance. * - * @param {Object} [config={}] - Configuration options - * @param {string} [config.url='http://localhost:4318/v1/logs'] - OTLP endpoint URL - * @param {Object} [config.headers={}] - Additional HTTP headers - * @param {number} [config.timeout=10000] - Request timeout in milliseconds - * @param {string} [config.protocol='http/protobuf'] - OTLP protocol (http/protobuf or http/json) + * @param {Object} config - Configuration options + * @param {string} config.url - OTLP endpoint URL + * @param {Object} config.headers - Additional HTTP headers + * @param {number} config.timeout - Request timeout in milliseconds + * @param {string} config.protocol - OTLP protocol (http/protobuf or http/json) */ - constructor (config = {}) { + constructor (config) { this._config = config - this._url = config.url || 'http://localhost:4318/v1/logs' - this._protocol = config.protocol || 'http/protobuf' + this._url = config.url + this._protocol = config.protocol // Set Content-Type based on protocol const contentType = this._protocol === 'http/json' @@ -49,7 +49,7 @@ class OtlpHttpLogExporter { 'User-Agent': 'dd-trace-js/otlp-exporter', ...config.headers } - this._timeout = config.timeout || 10_000 + this._timeout = config.timeout this._transformer = new OtlpTransformer(config) // Pre-compute telemetry tags for efficiency diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index ecc2e51070e..936afa62a74 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -21,7 +21,7 @@ const { getProtobufTypes } = require('./protobuf_loader') class OtlpTransformer { constructor (config = {}) { this._config = config - this._protocol = config.protocol || 'http/protobuf' + this._protocol = config.protocol this._protobufTypes = null } From 036776a0bf4c1a1ef2b174b35d0a4ebe0933a84d Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Sun, 21 Sep 2025 22:27:32 -0400 Subject: [PATCH 20/61] simplify tests --- .../logs/otlp_http_log_exporter.js | 2 +- .../dd-trace/test/opentelemetry/logs.spec.js | 499 +++++++----------- 2 files changed, 206 insertions(+), 295 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index c750d5d7d8e..450c2898370 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -76,7 +76,7 @@ class OtlpHttpLogExporter { // Track telemetry metric for OTLP log records try { - tracerMetrics.count('dd.instrumentation_telemetry_data.tracers.otel.log_records', this._telemetryTags) + tracerMetrics.count('otel.log_records', this._telemetryTags) .inc(logRecords.length) } catch (telemetryError) { log.debug('Error tracking OTLP log records telemetry:', telemetryError) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 5e9789e7240..e35bf9715ed 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -2,6 +2,28 @@ const { expect } = require('chai') const { describe, it, beforeEach, afterEach } = require('tap').mocha +const sinon = require('sinon') +const proxyquire = require('proxyquire') + +// Helper function to create mocked telemetry metrics +function createMockedTelemetryMetrics () { + return { + manager: { + namespace: sinon.stub().returns({ + count: sinon.stub().returns({ + inc: sinon.spy() + }) + }) + } + } +} + +// Helper function to create OTLP HTTP log exporter with mocked telemetry metrics +function createMockedOtlpHttpLogExporter (telemetryMetrics) { + return proxyquire('../../src/opentelemetry/logs/otlp_http_log_exporter', { + '../../telemetry/metrics': telemetryMetrics + }) +} describe('OpenTelemetry Logs', () => { let originalEnv @@ -20,307 +42,220 @@ describe('OpenTelemetry Logs', () => { } }) - it('should initialize OpenTelemetry logs when otelLogsEnabled is true', () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - const tracer = require('../../') - tracer.init() - - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const loggerProvider = logs.getLoggerProvider() - expect(loggerProvider).to.exist - expect(loggerProvider.constructor.name).to.equal('LoggerProvider') - - const logger = logs.getLogger('test-logger') - expect(logger).to.exist - expect(logger.constructor.name).to.equal('Logger') - expect(typeof logger.emit).to.equal('function') - }) - - it('should not initialize OpenTelemetry logs when otelLogsEnabled is false', () => { - // Set environment variable to disable logs BEFORE initialization - process.env.DD_LOGS_OTEL_ENABLED = 'false' - - // Clean up any existing LoggerProvider first - const { logs } = require('@opentelemetry/api-logs') - const existingProvider = logs.getLoggerProvider() - if (existingProvider && typeof existingProvider.shutdown === 'function') { - existingProvider.shutdown() + describe('Basic Functionality', () => { + // Helper function to setup tracer and get logger + function setupTracerAndLogger (enabled = true) { + process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' + const tracer = require('../../') + tracer.init() + const { logs } = require('@opentelemetry/api-logs') + return { tracer, logs, loggerProvider: logs.getLoggerProvider(), logger: logs.getLogger('test-logger') } } - const tracer = require('../../') - tracer.init() - - // After initialization with DD_LOGS_OTEL_ENABLED='false', - // we should still be able to get a logger (it will be a no-op logger) - const logger = logs.getLogger('test-logger') - expect(logger).to.exist - expect(typeof logger.emit).to.equal('function') - - // The logger should work without throwing errors - expect(() => { - logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Test message', - timestamp: Date.now() * 1000000 - }) - }).to.not.throw() - }) - - it('should create a logger and emit log records', () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - const tracer = require('../../') - tracer.init() - - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const logger = logs.getLogger('test-logger', '1.0.0') + it('should initialize OpenTelemetry logs when enabled', () => { + const { loggerProvider, logger } = setupTracerAndLogger(true) - // Test that emit method works without throwing - expect(() => { - logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Test log message', - attributes: { test: 'attribute' }, - timestamp: Date.now() * 1000000 - }) - }).to.not.throw() - }) + expect(loggerProvider).to.exist + expect(logger).to.exist + expect(typeof logger.emit).to.equal('function') + expect(typeof logger.info).to.equal('function') + }) - it('should handle different log levels', () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - const tracer = require('../../') - tracer.init() + it('should emit log records without errors', () => { + const { logger } = setupTracerAndLogger(true) - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const logger = logs.getLogger('test-logger') - - // Test different log levels using emit method - const logLevels = [ - { severityText: 'DEBUG', severityNumber: 5, body: 'Debug message' }, - { severityText: 'INFO', severityNumber: 9, body: 'Info message' }, - { severityText: 'WARN', severityNumber: 13, body: 'Warning message' }, - { severityText: 'ERROR', severityNumber: 17, body: 'Error message' }, - { severityText: 'FATAL', severityNumber: 21, body: 'Fatal message' } - ] - - logLevels.forEach(logLevel => { expect(() => { logger.emit({ - ...logLevel, + severityText: 'INFO', + severityNumber: 9, + body: 'Test message', timestamp: Date.now() * 1000000 }) }).to.not.throw() }) - }) - it('should support force flush', async () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - const tracer = require('../../') - tracer.init() + it('should handle logger provider shutdown', () => { + const { loggerProvider } = setupTracerAndLogger(true) - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const loggerProvider = logs.getLoggerProvider() - const activeProcessor = loggerProvider.getActiveLogRecordProcessor() - - expect(activeProcessor).to.exist - expect(typeof activeProcessor.forceFlush).to.equal('function') - - // Test force flush doesn't throw - try { - await activeProcessor.forceFlush() - expect(true).to.be.true // If we get here, forceFlush succeeded - } catch (error) { - expect.fail('forceFlush should not throw an error') - } - }) - - it('should use configuration defaults when environment variables are not set', () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - // Clear environment variables to test defaults - delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT - delete process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS - delete process.env.OTEL_EXPORTER_OTLP_TIMEOUT - delete process.env.OTEL_BSP_SCHEDULE_DELAY - delete process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE - delete process.env.OTEL_BSP_MAX_QUEUE_SIZE - delete process.env.OTEL_BSP_EXPORT_TIMEOUT - - const tracer = require('../../') - tracer.init() - - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const loggerProvider = logs.getLoggerProvider() - expect(loggerProvider).to.exist - - const logger = logs.getLogger('test-logger') - expect(logger).to.exist - expect(typeof logger.emit).to.equal('function') - }) - - it('should handle logger provider shutdown', () => { - process.env.DD_LOGS_OTEL_ENABLED = 'true' - const tracer = require('../../') - tracer.init() - - // Access the logger through OpenTelemetry API - const { logs } = require('@opentelemetry/api-logs') - const loggerProvider = logs.getLoggerProvider() - - expect(loggerProvider).to.exist - expect(typeof loggerProvider.shutdown).to.equal('function') - - // Test shutdown doesn't throw - expect(() => { - loggerProvider.shutdown() - }).to.not.throw() - - // After shutdown, getLogger should return a no-op logger - const logger = logs.getLogger('test-logger') - expect(logger).to.exist - expect(typeof logger.emit).to.equal('function') - }) - - describe('OTLP Protocol Configuration', () => { - it('should use default protocol when no environment variables are set', () => { - const Config = require('../../src/config') - delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL - delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL - - const config = new Config() - expect(config.otelLogsProtocol).to.equal('http/protobuf') + expect(() => { + loggerProvider.shutdown() + }).to.not.throw() }) - it('should use OTEL_EXPORTER_OTLP_LOGS_PROTOCOL when set', () => { - const Config = require('../../src/config') - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' - delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL + it('should work when disabled', () => { + const { logger } = setupTracerAndLogger(false) - const config = new Config() - expect(config.otelLogsProtocol).to.equal('http/json') + expect(() => { + logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: 'Test message' + }) + }).to.not.throw() }) + }) - it('should fallback to OTEL_EXPORTER_OTLP_PROTOCOL when logs protocol not set', () => { + describe('Protocol Configuration', () => { + // Helper function to test protocol configuration + function testProtocolConfig (envVars, expectedProtocol, expectedWarning = null) { const Config = require('../../src/config') - delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL - process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/json' - const config = new Config() - expect(config.otelLogsProtocol).to.equal('http/json') - }) + // Setup environment variables + Object.entries(envVars).forEach(([key, value]) => { + if (value === null) { + delete process.env[key] + } else { + process.env[key] = value + } + }) - it('should prioritize logs protocol over generic protocol', () => { - const Config = require('../../src/config') - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' - process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf' + let warningMessage = '' + if (expectedWarning) { + // eslint-disable-next-line no-console + const originalWarn = console.warn + // eslint-disable-next-line no-console + console.warn = (msg) => { warningMessage = msg } + + const config = new Config() + expect(config.otelLogsProtocol).to.equal(expectedProtocol) + expect(warningMessage).to.include(expectedWarning) + + // eslint-disable-next-line no-console + console.warn = originalWarn + } else { + const config = new Config() + expect(config.otelLogsProtocol).to.equal(expectedProtocol) + } + } - const config = new Config() - expect(config.otelLogsProtocol).to.equal('http/json') + it('should use default protocol when no environment variables are set', () => { + testProtocolConfig({ + OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: null, + OTEL_EXPORTER_OTLP_PROTOCOL: null + }, 'http/protobuf') }) - it('should handle invalid protocol values', () => { - const Config = require('../../src/config') - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'invalid-protocol' - - const config = new Config() - expect(config.otelLogsProtocol).to.equal('invalid-protocol') + it('should prioritize logs-specific protocol over generic protocol', () => { + testProtocolConfig({ + OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/json', + OTEL_EXPORTER_OTLP_PROTOCOL: 'http/protobuf' + }, 'http/json') }) - it('should work with both http/protobuf and http/json protocols', () => { - const Config = require('../../src/config') - - // Test protobuf protocol - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/protobuf' - const config1 = new Config() - expect(config1.otelLogsProtocol).to.equal('http/protobuf') - - // Test JSON protocol - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' - const config2 = new Config() - expect(config2.otelLogsProtocol).to.equal('http/json') + it('should fallback to generic protocol when logs protocol not set', () => { + testProtocolConfig({ + OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: null, + OTEL_EXPORTER_OTLP_PROTOCOL: 'http/json' + }, 'http/json') }) it('should warn and default to http/protobuf when grpc protocol is set', () => { - const Config = require('../../src/config') - // eslint-disable-next-line no-console - const originalWarn = console.warn - let warningMessage = '' - // eslint-disable-next-line no-console - console.warn = (msg) => { warningMessage = msg } - - process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc' - const config = new Config() - - expect(config.otelLogsProtocol).to.equal('http/protobuf') - expect(warningMessage).to.include('OTLP gRPC protocol is not supported for logs') - expect(warningMessage).to.include('Defaulting to http/protobuf') - - // eslint-disable-next-line no-console - console.warn = originalWarn + testProtocolConfig({ + OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'grpc' + }, 'http/protobuf', 'OTLP gRPC protocol is not supported for logs') }) }) describe('Resource Attributes', () => { - it('should set resource attributes from DD_TAGS', () => { + // Helper function to test resource attribute configuration + function testResourceConfig (envVars, assertions) { const Config = require('../../src/config') - process.env.DD_LOGS_OTEL_ENABLED = 'true' - process.env.DD_TAGS = 'team:backend,region:us-west-2' - - const config = new Config() - expect(config.tags).to.include({ - team: 'backend', - region: 'us-west-2' + // Setup environment variables + Object.entries(envVars).forEach(([key, value]) => { + if (value === null) { + delete process.env[key] + } else { + process.env[key] = value + } }) - }) - - it('should set resource attributes from OTEL_RESOURCE_ATTRIBUTES', () => { - const Config = require('../../src/config') - process.env.DD_LOGS_OTEL_ENABLED = 'true' - process.env.OTEL_RESOURCE_ATTRIBUTES = 'deployment.environment=production,service.namespace=api' - // Override DD_ENV to avoid conflict - process.env.DD_ENV = 'production' const config = new Config() + assertions(config) + } - // Check that service.namespace is in tags (from OTEL_RESOURCE_ATTRIBUTES) - expect(config.tags).to.include({ - 'service.namespace': 'api' + it('should parse DD_TAGS into resource attributes', () => { + testResourceConfig({ + DD_LOGS_OTEL_ENABLED: 'true', + DD_TAGS: 'team:backend,region:us-west-2' + }, (config) => { + expect(config.tags).to.include({ + team: 'backend', + region: 'us-west-2' + }) }) + }) - // Check that env is set correctly (which maps to deployment.environment in proxy.js) - expect(config.env).to.equal('production') + it('should parse OTEL_RESOURCE_ATTRIBUTES into resource attributes', () => { + testResourceConfig({ + DD_LOGS_OTEL_ENABLED: 'true', + OTEL_RESOURCE_ATTRIBUTES: 'deployment.environment=production,service.namespace=api', + DD_ENV: 'production' + }, (config) => { + expect(config.tags).to.include({ + 'service.namespace': 'api' + }) + expect(config.env).to.equal('production') + }) }) it('should set hostname when reportHostname is enabled', () => { - const Config = require('../../src/config') - process.env.DD_LOGS_OTEL_ENABLED = 'true' - process.env.DD_TRACE_REPORT_HOSTNAME = 'true' + testResourceConfig({ + DD_LOGS_OTEL_ENABLED: 'true', + DD_TRACE_REPORT_HOSTNAME: 'true' + }, (config) => { + expect(config.hostname).to.exist + expect(config.hostname).to.be.a('string') + expect(config.hostname.length).to.be.greaterThan(0) + }) + }) + }) - const config = new Config() + describe('Telemetry Metrics', () => { + // Helper function to test telemetry metrics for a given protocol + function testTelemetryMetricsForProtocol (protocol, expectedEncoding) { + require('../setup/core') // For sinon-chai - expect(config.hostname).to.exist - expect(config.hostname).to.be.a('string') + const telemetryMetrics = createMockedTelemetryMetrics() + const OtlpHttpLogExporter = createMockedOtlpHttpLogExporter(telemetryMetrics) + + const exporter = new OtlpHttpLogExporter({ protocol }) + const mockLogRecords = [{ + body: 'Test message', + severityNumber: 9, + severityText: 'INFO', + timestamp: Date.now() * 1000000 + }] + + exporter.export(mockLogRecords, () => {}) + + // Verify telemetry metric was called with correct name and tags + expect(telemetryMetrics.manager.namespace).to.have.been.calledWith('tracers') + expect(telemetryMetrics.manager.namespace().count).to.have.been.calledWith( + 'otel.log_records', [ + 'protocol:http', + `encoding:${expectedEncoding}` + ]) + expect(telemetryMetrics.manager.namespace().count().inc).to.have.been.calledWith(1) + } + + it('should track telemetry metrics for protobuf protocol', () => { + testTelemetryMetricsForProtocol('http/protobuf', 'protobuf') + }) + + it('should track telemetry metrics for JSON protocol', () => { + testTelemetryMetricsForProtocol('http/json', 'json') }) }) describe('OTLP Payload Structure', () => { - const { OtlpTransformer } = require('../../src/opentelemetry/logs') - const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') - + // Common test data for payload structure tests const testData = { resource: { attributes: { 'service.name': 'test-service', 'service.version': '1.0.0', - 'deployment.environment': 'test', - team: 'backend', - region: 'us-west-2' + 'deployment.environment': 'test' } }, logRecords: [{ @@ -331,60 +266,36 @@ describe('OpenTelemetry Logs', () => { }] } - // Shared verification function - const verifyPayload = (payload) => { - expect(payload).to.have.property('resourceLogs') - expect(payload.resourceLogs[0]).to.have.property('resource') - expect(payload.resourceLogs[0]).to.have.property('scopeLogs') - - const resource = payload.resourceLogs[0].resource - expect(resource).to.have.property('attributes') - expect(resource).to.have.property('droppedAttributesCount', 0) - - const resourceAttrs = resource.attributes.reduce((acc, attr) => { - acc[attr.key] = attr.value.stringValue - return acc - }, {}) - expect(resourceAttrs).to.include({ - 'service.name': 'test-service', - 'service.version': '1.0.0', - 'deployment.environment': 'test', - team: 'backend', - region: 'us-west-2' - }) - - const scope = payload.resourceLogs[0].scopeLogs[0].scope - expect(scope).to.have.property('name', 'dd-trace-js') - expect(scope).to.have.property('version', '1.0.0') - expect(scope).to.have.property('droppedAttributesCount', 0) - - const logRecord = payload.resourceLogs[0].scopeLogs[0].logRecords[0] - expect(logRecord).to.have.property('body') - expect(logRecord.body).to.have.property('stringValue', 'Test message') - expect(logRecord).to.have.property('severityNumber', 9) - expect(logRecord).to.have.property('severityText', 'INFO') - // droppedAttributesCount may not be present in decoded protobuf - if (logRecord.droppedAttributesCount !== undefined) { - expect(logRecord.droppedAttributesCount).to.equal(0) + // Helper function to test payload structure + function testPayloadStructure (protocol, expectedStructure) { + const { OtlpTransformer } = require('../../src/opentelemetry/logs') + const transformer = new OtlpTransformer({ protocol, ...testData }) + + let result + if (protocol === 'http/json') { + result = JSON.parse(transformer.transformLogRecords(testData.logRecords).toString()) + } else { + const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') + result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(testData.logRecords)) } - const logAttrs = logRecord.attributes.reduce((acc, attr) => { - acc[attr.key] = attr.value.stringValue - return acc - }, {}) - expect(logAttrs).to.include({ 'test.attr': 'test-value' }) + expectedStructure(result) } - it('should generate correct JSON payload structure', () => { - const transformer = new OtlpTransformer({ protocol: 'http/json', ...testData }) - const result = JSON.parse(transformer.transformLogRecords(testData.logRecords).toString()) - verifyPayload(result) + it('should generate correct JSON OTLP payload structure', () => { + testPayloadStructure('http/json', (result) => { + expect(result).to.have.property('resourceLogs') + expect(result.resourceLogs[0]).to.have.property('resource') + expect(result.resourceLogs[0]).to.have.property('scopeLogs') + }) }) - it('should generate correct protobuf payload structure', () => { - const transformer = new OtlpTransformer({ protocol: 'http/protobuf', ...testData }) - const result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(testData.logRecords)) - verifyPayload(result) + it('should generate correct protobuf OTLP payload structure', () => { + testPayloadStructure('http/protobuf', (result) => { + expect(result).to.have.property('resourceLogs') + expect(result.resourceLogs[0]).to.have.property('resource') + expect(result.resourceLogs[0]).to.have.property('scopeLogs') + }) }) }) }) From 8abbe95d208b957f44a49f757069db1a983071f0 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 09:30:23 -0400 Subject: [PATCH 21/61] use agent hostname to resolve otlp endpoints --- packages/dd-trace/src/config.js | 11 +++++- packages/dd-trace/src/config_defaults.js | 2 +- .../logs/otlp_http_log_exporter.js | 2 +- .../dd-trace/test/opentelemetry/logs.spec.js | 34 +++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 76b02873256..9abf4f5263b 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -680,7 +680,11 @@ class Config { // Enable logs if DD_LOGS_OTEL_ENABLED is true this._setBoolean(env, 'otelLogsEnabled', isTrue(DD_LOGS_OTEL_ENABLED)) // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars - this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTERS_OTLP_ENDPOINT) + // Only set if there's a custom URL, otherwise let calc phase handle the default + const customOtelLogsUrl = OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTERS_OTLP_ENDPOINT + if (customOtelLogsUrl) { + this._setString(env, 'otelLogsUrl', customOtelLogsUrl) + } this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTERS_OTLP_HEADERS) // Handle OTLP protocol with grpc warning const requestedProtocol = OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || OTEL_EXPORTER_OTLP_PROTOCOL @@ -1222,6 +1226,11 @@ class Config { } calc['dogstatsd.hostname'] = this._getHostname() + + // Compute OTLP logs URL to send payloads to the active Datadog Agent + const agentHostname = this._getHostname() + calc.otelLogsUrl = `http://${agentHostname}:4318/v1/logs` + this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) this._setBoolean(calc, 'spanComputePeerService', this._getSpanComputePeerService()) diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 672bc841093..4c16ec338c4 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -120,7 +120,7 @@ module.exports = { isImpactedTestsEnabled: false, logInjection: true, otelLogsEnabled: false, - otelLogsUrl: 'http://localhost:4318/v1/logs', + otelLogsUrl: undefined, // Will be computed using agent host otelLogsHeaders: '', otelLogsProtocol: 'http/protobuf', otelLogsTimeout: 10_000, diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 450c2898370..f915b795348 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -96,7 +96,7 @@ class OtlpHttpLogExporter { const options = { hostname: url.hostname, - port: url.port || (isHttps ? 443 : 80), + port: url.port || (isHttps ? 443 : 4318), path: url.pathname + url.search, method: 'POST', headers: { diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index e35bf9715ed..9ddafbebbbf 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -298,4 +298,38 @@ describe('OpenTelemetry Logs', () => { }) }) }) + + describe('OTLP Endpoint Configuration', () => { + it('should use environment value when set', () => { + const Config = require('../../src/config') + + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://explicit-agent:4318/v1/logs' + process.env.DD_AGENT_HOST = 'different-agent.example.com' + + const config = new Config() + expect(config.otelLogsUrl).to.equal('http://explicit-agent:4318/v1/logs') + }) + + it('should use calculated default when no environment variables are set', () => { + const Config = require('../../src/config') + + delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT + delete process.env.OTEL_EXPORTERS_OTLP_ENDPOINT + process.env.DD_AGENT_HOST = 'default-agent.example.com' + + const config = new Config() + expect(config.otelLogsUrl).to.equal('http://default-agent.example.com:4318/v1/logs') + }) + + it('should use fallback default when no environment variables and no DD_AGENT_HOST', () => { + const Config = require('../../src/config') + + delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT + delete process.env.OTEL_EXPORTERS_OTLP_ENDPOINT + delete process.env.DD_AGENT_HOST + + const config = new Config() + expect(config.otelLogsUrl).to.equal('http://127.0.0.1:4318/v1/logs') + }) + }) }) From e9456e3cca7abc1fddf6f5355a96b0497e84de59 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 09:34:18 -0400 Subject: [PATCH 22/61] clean up initalization --- packages/dd-trace/src/proxy.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index d0149b4cd26..15a30e00b86 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -201,11 +201,8 @@ class Tracer extends NoopProxy { } } - // Initialize OpenTelemetry logs if enabled via environment variable - try { + if (config.otelLogsEnabled) { this._initializeOpenTelemetryLogs(config) - } catch (error) { - log.error('Error initializing OpenTelemetry logs:', error) } if (config.isTestDynamicInstrumentationEnabled) { @@ -270,11 +267,6 @@ class Tracer extends NoopProxy { _initializeOpenTelemetryLogs (config) { try { - // Check if OpenTelemetry logs are enabled via config or environment variable - if (!config.otelLogsEnabled) { - return - } - const { LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') const { logs } = require('@opentelemetry/api-logs') const os = require('os') From 4bc66fc20a27cd11592388d8ad245111da246fba Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 11:03:21 -0400 Subject: [PATCH 23/61] parse additional otlp headers --- .../logs/otlp_http_log_exporter.js | 21 ++++++++++++++++--- .../dd-trace/test/opentelemetry/logs.spec.js | 18 ++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index f915b795348..7c95df7c5e0 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -35,7 +35,6 @@ class OtlpHttpLogExporter { * @param {string} config.protocol - OTLP protocol (http/protobuf or http/json) */ constructor (config) { - this._config = config this._url = config.url this._protocol = config.protocol @@ -44,10 +43,12 @@ class OtlpHttpLogExporter { ? 'application/json' : 'application/x-protobuf' + // Parse OTLP headers from comma-separated key=value string + const headers = this._parseAdditionalHeaders(config.otelLogsHeaders) + this._headers = { 'Content-Type': contentType, - 'User-Agent': 'dd-trace-js/otlp-exporter', - ...config.headers + ...headers } this._timeout = config.timeout this._transformer = new OtlpTransformer(config) @@ -89,6 +90,20 @@ class OtlpHttpLogExporter { } } + _parseAdditionalHeaders (headersString) { + if (!headersString || typeof headersString !== 'string') { + return {} + } + + return Object.fromEntries( + headersString + .split(',') + .map(pair => pair.trim().split('=')) + .filter(([key, value]) => key && value) + .map(([key, value]) => [key.trim(), value.trim()]) + ) + } + _sendPayload (payload, resultCallback) { const url = new URL(this._url) const isHttps = url.protocol === 'https:' diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 9ddafbebbbf..10e6f8b1909 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -332,4 +332,22 @@ describe('OpenTelemetry Logs', () => { expect(config.otelLogsUrl).to.equal('http://127.0.0.1:4318/v1/logs') }) }) + + describe('OTLP Headers Configuration', () => { + it('should parse OTLP headers from comma-separated key=value string', () => { + const { OtlpHttpLogExporter } = require('../../src/opentelemetry/logs') + + const exporter = new OtlpHttpLogExporter({ + url: 'http://localhost:4318/v1/logs', + protocol: 'http/protobuf', + timeout: 1000, + otelLogsHeaders: 'api-key=key,other-config-value=value' + }) + + expect(exporter._headers).to.include({ + 'api-key': 'key', + 'other-config-value': 'value' + }) + }) + }) }) From d505cab06158426f0b57b2dbc57c800dfe67da06 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 11:21:02 -0400 Subject: [PATCH 24/61] clean up component args --- .../opentelemetry/logs/batch_log_processor.js | 36 ++++++++----------- .../dd-trace/src/opentelemetry/logs/logger.js | 8 +---- .../src/opentelemetry/logs/logger_provider.js | 22 +++++------- .../logs/otlp_http_log_exporter.js | 7 ++-- .../opentelemetry/logs/otlp_transformer.js | 7 ++-- packages/dd-trace/src/proxy.js | 17 +++++---- 6 files changed, 38 insertions(+), 59 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index ed767d7d3ba..67ff1fcab2a 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -21,25 +21,23 @@ class BatchLogRecordProcessor { /** * Creates a new BatchLogRecordProcessor instance. * - * @param {Array} processors - Array of log processors to process batches - * @param {Object} config - Configuration options - * @param {number} [config.batchTimeout=5000] - Timeout in milliseconds for batch processing - * @param {number} [config.maxExportBatchSize=512] - Maximum number of log records per batch - * @param {number} [config.maxQueueSize=2048] - Maximum number of log records in queue - * @param {number} [config.exportTimeoutMillis=30000] - Timeout for export operations + * @param {Object} processor - Log processor to process batches + * @param {number} batchTimeout - Timeout in milliseconds for batch processing + * @param {number} maxExportBatchSize - Maximum number of log records per batch + * @param {number} maxQueueSize - Maximum number of log records in queue + * @param {number} exportTimeoutMillis - Timeout for export operations */ - constructor (processors, config) { - this._processors = processors - this._config = config - this._isShutdown = false - this._batchTimeout = config.batchTimeout - this._maxExportBatchSize = config.maxExportBatchSize - this._maxQueueSize = config.maxQueueSize - this._exportTimeoutMillis = config.exportTimeoutMillis + constructor (processor, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { + this._processor = processor + this._batchTimeout = batchTimeout + this._maxExportBatchSize = maxExportBatchSize + this._maxQueueSize = maxQueueSize + this._exportTimeoutMillis = exportTimeoutMillis this._logRecords = [] this._timer = null this._shutdownPromise = null + this._isShutdown = false } /** @@ -79,9 +77,9 @@ class BatchLogRecordProcessor { const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) this._clearTimer() - for (const processor of this._processors) { + if (this._processor) { try { - processor.export(logRecords, () => {}) + this._processor.export(logRecords, () => {}) } catch (error) { log.error('Error in log processor export:', error) } @@ -122,11 +120,7 @@ class BatchLogRecordProcessor { this._export() - const shutdownPromises = this._processors.map(processor => { - return typeof processor.shutdown === 'function' - ? processor.shutdown() - : Promise.resolve() - }) + const shutdownPromises = this._processor ? [this._processor.shutdown()] : [] Promise.all(shutdownPromises).then(resolve) }) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 471ac4bcecd..7a30e90aee3 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -22,16 +22,10 @@ class Logger { /** * Creates a new Logger instance. * - * @param {Object} library - Instrumentation library information - * @param {string} library.name - Library name - * @param {string} library.version - Library version - * @param {Object} config - Logger configuration * @param {LoggerProvider} loggerProvider - Parent logger provider */ - constructor (library, config, loggerProvider) { - this._config = config + constructor (loggerProvider) { this._loggerProvider = loggerProvider - this.instrumentationLibrary = library } get resource () { diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index fa9e988619c..de504b090c2 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -23,15 +23,13 @@ class LoggerProvider { /** * Creates a new LoggerProvider instance. * - * @param {Object} [config={}] - Configuration options - * @param {Object} [config.resource] - Resource attributes - * @param {Object} [config.resource.attributes] - Resource attribute key-value pairs - * @param {Array} [config.processors] - Array of LogRecordProcessor instances + * @param {Object} [resource] - Resource attributes + * @param {Object} [resource.attributes] - Resource attribute key-value pairs + * @param {Array} [processors] - Array of LogRecordProcessor instances */ - constructor (config = {}) { - this.config = config - this.resource = config.resource - this._processors = config.processors || [] + constructor (resource, processors = []) { + this.resource = resource + this._processors = processors this._loggers = new Map() this._activeProcessor = null this._isShutdown = false @@ -52,11 +50,7 @@ class LoggerProvider { const key = `${name}@${version}` if (!this._loggers.has(key)) { - this._loggers.set(key, new Logger( - { ...options, name, version }, - this.config, - this - )) + this._loggers.set(key, new Logger(this)) } return this._loggers.get(key) } @@ -86,7 +80,7 @@ class LoggerProvider { return this._activeProcessor } - register (config = {}) { + register () { if (this._isShutdown) { log.warn('Cannot register after shutdown') return diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 7c95df7c5e0..856838c0d31 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -4,7 +4,7 @@ * @fileoverview OTLP HTTP Log Exporter implementation for OpenTelemetry logs * * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. + * Serializes log records to OTLP Protocol v1.7.0 specification. */ const https = require('https') @@ -43,12 +43,9 @@ class OtlpHttpLogExporter { ? 'application/json' : 'application/x-protobuf' - // Parse OTLP headers from comma-separated key=value string - const headers = this._parseAdditionalHeaders(config.otelLogsHeaders) - this._headers = { 'Content-Type': contentType, - ...headers + ...this._parseAdditionalHeaders(config.otelLogsHeaders) } this._timeout = config.timeout this._transformer = new OtlpTransformer(config) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 936afa62a74..79bf59a42b8 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -9,6 +9,7 @@ const { SeverityNumber } = require('@opentelemetry/api-logs') const { getProtobufTypes } = require('./protobuf_loader') +const tracerVersion = require('../../../../../package.json').version /** * OtlpTransformer transforms log records to OTLP format. @@ -20,7 +21,7 @@ const { getProtobufTypes } = require('./protobuf_loader') */ class OtlpTransformer { constructor (config = {}) { - this._config = config + this._resource = config.resource this._protocol = config.protocol this._protobufTypes = null } @@ -78,7 +79,7 @@ class OtlpTransformer { _transformResource () { return { - attributes: this._transformAttributes(this._config.resource?.attributes || {}), + attributes: this._transformAttributes(this._resource?.attributes || {}), droppedAttributesCount: 0 } } @@ -87,7 +88,7 @@ class OtlpTransformer { if (!instrumentationLibrary) { return { name: 'dd-trace-js', - version: '1.0.0', + version: tracerVersion, attributes: [], droppedAttributesCount: 0 } diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 15a30e00b86..650d7f5f89c 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -290,9 +290,7 @@ class Tracer extends NoopProxy { // Create logger provider const loggerProvider = new LoggerProvider({ - resource: { - attributes: resourceAttributes - } + attributes: resourceAttributes }) // Create OTLP exporter using resolved config values @@ -307,12 +305,13 @@ class Tracer extends NoopProxy { }) // Create batch processor using resolved config values - const processor = new BatchLogRecordProcessor([exporter], { - batchTimeout: config.otelLogsBatchTimeout, - maxExportBatchSize: config.otelLogsMaxExportBatchSize, - maxQueueSize: config.otelLogsMaxQueueSize, - exportTimeoutMillis: config.otelLogsExportTimeoutMillis - }) + const processor = new BatchLogRecordProcessor( + exporter, + config.otelLogsBatchTimeout, + config.otelLogsMaxExportBatchSize, + config.otelLogsMaxQueueSize, + config.otelLogsExportTimeoutMillis + ) // Add processor to logger provider loggerProvider.addLogRecordProcessor(processor) From 0f2bd21d9bd086ee12974c858e0489901ccaea41 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 11:28:45 -0400 Subject: [PATCH 25/61] clean up docs --- .../opentelemetry/logs/batch_log_processor.js | 19 +------------------ .../dd-trace/src/opentelemetry/logs/index.js | 18 ++++++++++++++++-- .../dd-trace/src/opentelemetry/logs/logger.js | 7 ------- .../src/opentelemetry/logs/logger_provider.js | 8 -------- .../logs/otlp_http_log_exporter.js | 7 ------- .../opentelemetry/logs/otlp_transformer.js | 7 ------- 6 files changed, 17 insertions(+), 49 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 67ff1fcab2a..342f43b5952 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -1,14 +1,4 @@ 'use strict' - -/** - * @fileoverview BatchLogRecordProcessor implementation for OpenTelemetry logs - * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. - */ - -const log = require('../../log') - /** * BatchLogRecordProcessor processes log records in batches for efficient export. * @@ -76,14 +66,7 @@ class BatchLogRecordProcessor { const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) this._clearTimer() - - if (this._processor) { - try { - this._processor.export(logRecords, () => {}) - } catch (error) { - log.error('Error in log processor export:', error) - } - } + this._processor.export(logRecords, () => {}) if (this._logRecords.length > 0) { this._startTimer() diff --git a/packages/dd-trace/src/opentelemetry/logs/index.js b/packages/dd-trace/src/opentelemetry/logs/index.js index d9bf86988dc..defac5ece9d 100644 --- a/packages/dd-trace/src/opentelemetry/logs/index.js +++ b/packages/dd-trace/src/opentelemetry/logs/index.js @@ -3,8 +3,22 @@ /** * @fileoverview OpenTelemetry Logs Implementation for dd-trace-js * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. + * This package provides a custom OpenTelemetry Logs implementation that integrates + * with the Datadog tracing library. It includes all necessary components for + * emitting, processing, and exporting log records via OTLP (OpenTelemetry Protocol). + * + * Key Components: + * - LoggerProvider: Main entry point for creating loggers + * - Logger: Provides methods to emit log records + * - BatchLogRecordProcessor: Processes log records in batches for efficient export + * - OtlpHttpLogExporter: Exports log records via OTLP over HTTP + * - OtlpTransformer: Transforms log records to OTLP format + * + * This is a custom implementation to avoid pulling in the full OpenTelemetry SDK, + * based on OTLP Protocol v1.7.0. It supports both protobuf and JSON serialization + * formats and integrates with Datadog's configuration system. + * + * @package */ const LoggerProvider = require('./logger_provider') diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 7a30e90aee3..bc911fdd4cf 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -1,12 +1,5 @@ 'use strict' -/** - * @fileoverview Logger implementation for OpenTelemetry logs - * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. - */ - const { SeverityNumber } = require('@opentelemetry/api-logs') const { sanitizeAttributes } = require('@opentelemetry/core') diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index de504b090c2..453ede745b9 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -1,12 +1,4 @@ 'use strict' - -/** - * @fileoverview LoggerProvider implementation for OpenTelemetry logs - * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. - */ - const { logs } = require('@opentelemetry/api-logs') const Logger = require('./logger') const log = require('../../log') diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 856838c0d31..8455365f95e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -1,12 +1,5 @@ 'use strict' -/** - * @fileoverview OTLP HTTP Log Exporter implementation for OpenTelemetry logs - * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Serializes log records to OTLP Protocol v1.7.0 specification. - */ - const https = require('https') const http = require('http') const { URL } = require('url') diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 79bf59a42b8..eb6fd5247a0 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -1,12 +1,5 @@ 'use strict' -/** - * @fileoverview OTLP Transformer for OpenTelemetry logs - * - * Custom implementation to avoid pulling in the full OpenTelemetry SDK. - * Based on OTLP Protocol v1.7.0. - */ - const { SeverityNumber } = require('@opentelemetry/api-logs') const { getProtobufTypes } = require('./protobuf_loader') const tracerVersion = require('../../../../../package.json').version From 3af50801733cde8893e6cfe2f95997e52f5eaf92 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 12:35:34 -0400 Subject: [PATCH 26/61] clean up component args --- .../logs/otlp_http_log_exporter.js | 22 +++++----- .../opentelemetry/logs/otlp_transformer.js | 41 ++++++++++--------- packages/dd-trace/src/proxy.js | 16 ++++---- .../dd-trace/test/opentelemetry/logs.spec.js | 17 ++++---- .../test/opentelemetry/protobuf.spec.js | 12 ++---- 5 files changed, 52 insertions(+), 56 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 8455365f95e..4a7561146c7 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -21,15 +21,15 @@ class OtlpHttpLogExporter { /** * Creates a new OtlpHttpLogExporter instance. * - * @param {Object} config - Configuration options - * @param {string} config.url - OTLP endpoint URL - * @param {Object} config.headers - Additional HTTP headers - * @param {number} config.timeout - Request timeout in milliseconds - * @param {string} config.protocol - OTLP protocol (http/protobuf or http/json) + * @param {string} url - OTLP endpoint URL + * @param {string} headers - Additional HTTP headers as comma-separated key=value string + * @param {number} timeout - Request timeout in milliseconds + * @param {string} protocol - OTLP protocol (http/protobuf or http/json) + * @param {Object} resource - Resource attributes */ - constructor (config) { - this._url = config.url - this._protocol = config.protocol + constructor (url, headers, timeout, protocol, resource) { + this._url = url + this._protocol = protocol // Set Content-Type based on protocol const contentType = this._protocol === 'http/json' @@ -38,10 +38,10 @@ class OtlpHttpLogExporter { this._headers = { 'Content-Type': contentType, - ...this._parseAdditionalHeaders(config.otelLogsHeaders) + ...this._parseAdditionalHeaders(headers) } - this._timeout = config.timeout - this._transformer = new OtlpTransformer(config) + this._timeout = timeout + this._transformer = new OtlpTransformer(resource, protocol) // Pre-compute telemetry tags for efficiency this._telemetryTags = [ diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index eb6fd5247a0..95fdddf8e92 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -13,13 +13,20 @@ const tracerVersion = require('../../../../../package.json').version * @class OtlpTransformer */ class OtlpTransformer { - constructor (config = {}) { - this._resource = config.resource - this._protocol = config.protocol + /** + * Creates a new OtlpTransformer instance. + * + * @param {Object} resourceAttributes - Resource attributes + * @param {string} protocol - OTLP protocol (http/protobuf or http/json) + */ + constructor (resourceAttributes, protocol) { + this._resourceAttributes = this._transformAttributes(resourceAttributes) + this._protocol = protocol this._protobufTypes = null } _getProtobufTypes () { + // Delay the loading of protobuf types to reduce startup overhead if (!this._protobufTypes) { this._protobufTypes = getProtobufTypes() } @@ -62,7 +69,7 @@ class OtlpTransformer { resourceLogs: [{ resource: this._transformResource(), scopeLogs: [{ - scope: this._transformScope(logRecords[0]?.instrumentationLibrary), + scope: this._transformScope(), logRecords: logRecords.map(record => this._transformLogRecord(record)) }] }] @@ -70,27 +77,18 @@ class OtlpTransformer { return Buffer.from(JSON.stringify(logsData)) } - _transformResource () { + _transformScope () { return { - attributes: this._transformAttributes(this._resource?.attributes || {}), + name: 'dd-trace-js', + version: tracerVersion, + attributes: [], droppedAttributesCount: 0 } } - _transformScope (instrumentationLibrary) { - if (!instrumentationLibrary) { - return { - name: 'dd-trace-js', - version: tracerVersion, - attributes: [], - droppedAttributesCount: 0 - } - } - + _transformResource () { return { - name: instrumentationLibrary.name || 'dd-trace-js', - version: instrumentationLibrary.version || '1.0.0', - attributes: [], + attributes: this._resourceAttributes, droppedAttributesCount: 0 } } @@ -104,7 +102,7 @@ class OtlpTransformer { severityNumber: this._mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), severityText: logRecord.severityText || 'INFO', body: this._transformBody(logRecord.body), - attributes: this._transformAttributes(logRecord.attributes || {}), + attributes: this._transformAttributes(logRecord.attributes), droppedAttributesCount: 0, flags: logRecord.flags || 0, traceId: this._hexToBytes(logRecord.traceId || ''), @@ -194,6 +192,9 @@ class OtlpTransformer { } _transformAttributes (attributes) { + if (!attributes) { + return {} + } return Object.entries(attributes).map(([key, value]) => ({ key, value: this._transformAnyValue(value) diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 650d7f5f89c..9540e9db6d5 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -294,15 +294,13 @@ class Tracer extends NoopProxy { }) // Create OTLP exporter using resolved config values - const exporter = new OtlpHttpLogExporter({ - url: config.otelLogsUrl, - headers: config.otelLogsHeaders, - timeout: config.otelLogsTimeout, - protocol: config.otelLogsProtocol, - resource: { - attributes: resourceAttributes - } - }) + const exporter = new OtlpHttpLogExporter( + config.otelLogsUrl, + config.otelLogsHeaders, + config.otelLogsTimeout, + config.otelLogsProtocol, + resourceAttributes + ) // Create batch processor using resolved config values const processor = new BatchLogRecordProcessor( diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 10e6f8b1909..08c46745fff 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -219,7 +219,7 @@ describe('OpenTelemetry Logs', () => { const telemetryMetrics = createMockedTelemetryMetrics() const OtlpHttpLogExporter = createMockedOtlpHttpLogExporter(telemetryMetrics) - const exporter = new OtlpHttpLogExporter({ protocol }) + const exporter = new OtlpHttpLogExporter('http://localhost:4318/v1/logs', '', 1000, protocol, {}) const mockLogRecords = [{ body: 'Test message', severityNumber: 9, @@ -269,7 +269,7 @@ describe('OpenTelemetry Logs', () => { // Helper function to test payload structure function testPayloadStructure (protocol, expectedStructure) { const { OtlpTransformer } = require('../../src/opentelemetry/logs') - const transformer = new OtlpTransformer({ protocol, ...testData }) + const transformer = new OtlpTransformer(testData.resource, protocol) let result if (protocol === 'http/json') { @@ -337,12 +337,13 @@ describe('OpenTelemetry Logs', () => { it('should parse OTLP headers from comma-separated key=value string', () => { const { OtlpHttpLogExporter } = require('../../src/opentelemetry/logs') - const exporter = new OtlpHttpLogExporter({ - url: 'http://localhost:4318/v1/logs', - protocol: 'http/protobuf', - timeout: 1000, - otelLogsHeaders: 'api-key=key,other-config-value=value' - }) + const exporter = new OtlpHttpLogExporter( + 'http://localhost:4318/v1/logs', + 'api-key=key,other-config-value=value', + 1000, + 'http/protobuf', + {} + ) expect(exporter._headers).to.include({ 'api-key': 'key', diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js index 886c36458da..cd663f63be2 100644 --- a/packages/dd-trace/test/opentelemetry/protobuf.spec.js +++ b/packages/dd-trace/test/opentelemetry/protobuf.spec.js @@ -124,16 +124,12 @@ describe('OTLP Protobuf Serialization', () => { expect(result.length).to.be.greaterThan(0) }) - it('should fallback to JSON if protobuf serialization fails', () => { - // Create a transformer with JSON protocol to test fallback + it('hould serialize log records to json format', () => { const transformer = new OtlpTransformer({ - protocol: 'http/json', - resource: { - attributes: { - 'service.name': 'test-service' - } + attributes: { + 'service.name': 'test-service' } - }) + }, 'http/json') const logRecords = [ { From 9578887057d94a12fda959a1dbd1b6e2e37350f6 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 22 Sep 2025 12:57:31 -0400 Subject: [PATCH 27/61] remove addLogProcessor, init provider with a processor --- .../opentelemetry/logs/batch_log_processor.js | 4 +- .../dd-trace/src/opentelemetry/logs/logger.js | 14 ++-- .../src/opentelemetry/logs/logger_provider.js | 72 ++++++++++--------- .../opentelemetry/logs/otlp_transformer.js | 9 ++- packages/dd-trace/src/proxy.js | 14 ++-- .../dd-trace/test/opentelemetry/logs.spec.js | 6 +- .../test/opentelemetry/protobuf.spec.js | 2 +- 7 files changed, 65 insertions(+), 56 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 342f43b5952..b5905524cfa 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -1,6 +1,6 @@ 'use strict' /** - * BatchLogRecordProcessor processes log records in batches for efficient export. + * BatchLogRecordProcessor processes log records in batches for efficient export to Datadog Agent. * * This implementation follows the OpenTelemetry JavaScript SDK BatchLogRecordProcessor: * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.BatchLogRecordProcessor.html @@ -11,7 +11,7 @@ class BatchLogRecordProcessor { /** * Creates a new BatchLogRecordProcessor instance. * - * @param {Object} processor - Log processor to process batches + * @param {Object} processor - Log processor for exporting batches to Datadog Agent * @param {number} batchTimeout - Timeout in milliseconds for batch processing * @param {number} maxExportBatchSize - Maximum number of log records per batch * @param {number} maxQueueSize - Maximum number of log records in queue diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index bc911fdd4cf..12a1ad8b6a6 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -16,9 +16,16 @@ class Logger { * Creates a new Logger instance. * * @param {LoggerProvider} loggerProvider - Parent logger provider + * @param {Object} [instrumentationLibrary] - Instrumentation library information + * @param {string} [instrumentationLibrary.name] - Library name (defaults to 'dd-trace-js') + * @param {string} [instrumentationLibrary.version] - Library version (defaults to tracer version) */ - constructor (loggerProvider) { + constructor (loggerProvider, instrumentationLibrary) { this._loggerProvider = loggerProvider + this.instrumentationLibrary = { + name: instrumentationLibrary?.name || 'dd-trace-js', + version: instrumentationLibrary?.version || require('../../../../../package.json').version + } } get resource () { @@ -35,8 +42,7 @@ class Logger { return } - const processor = this._loggerProvider.getActiveLogRecordProcessor() - if (!processor) { + if (!this._loggerProvider._processor) { return } @@ -45,7 +51,7 @@ class Logger { } logRecord.instrumentationLibrary = this.instrumentationLibrary - processor.onEmit(logRecord) + this._loggerProvider._processor.onEmit(logRecord) } debug (message, attributes = {}) { diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index 453ede745b9..ceff7835d1c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -4,51 +4,67 @@ const Logger = require('./logger') const log = require('../../log') /** - * LoggerProvider is the main entry point for creating loggers. + * LoggerProvider is the main entry point for creating loggers with a single processor for Datadog Agent export. * - * This implementation follows the OpenTelemetry JavaScript SDK LoggerProvider: - * https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_sdk-logs.LoggerProvider.html + * This implementation follows the OpenTelemetry JavaScript API LoggerProvider interface: + * https://github.com/open-telemetry/opentelemetry-js/blob/a7a36499f70f25201949aeabb84c5fd4ca80e860/experimental/packages/api-logs/src/types/LoggerProvider.ts * * @class LoggerProvider + * @implements {import('@opentelemetry/api-logs').LoggerProvider} */ class LoggerProvider { /** - * Creates a new LoggerProvider instance. + * Creates a new LoggerProvider instance with a single processor for Datadog Agent export. * - * @param {Object} [resource] - Resource attributes - * @param {Object} [resource.attributes] - Resource attribute key-value pairs - * @param {Array} [processors] - Array of LogRecordProcessor instances + * @param {Object} [options] - LoggerProvider options + * @param {Object} [options.resource] - Resource attributes + * @param {Object} [options.resource.attributes] - Resource attribute key-value pairs + * @param {Object} [options.processor] - Single LogRecordProcessor instance for exporting logs to Datadog Agent */ - constructor (resource, processors = []) { - this.resource = resource - this._processors = processors + constructor (options = {}) { + this.resource = options.resource + this._processor = options.processor || null this._loggers = new Map() - this._activeProcessor = null this._isShutdown = false } /** * Gets or creates a logger instance. * - * @param {string} name - Logger name - * @param {string} [version='1.0.0'] - Logger version - * @param {Object} [options={}] - Additional options + * @param {string|Object} nameOrOptions - Logger name or options object + * @param {string} [version] - Logger version (when nameOrOptions is a string) + * @param {Object} [options] - Additional options (when nameOrOptions is a string) * @returns {Logger} Logger instance */ - getLogger (name, version = '1.0.0', options = {}) { + getLogger (nameOrOptions, version, options = {}) { if (this._isShutdown) { return this._createNoOpLogger() } - const key = `${name}@${version}` + let name, loggerOptions + if (typeof nameOrOptions === 'string') { + name = nameOrOptions + loggerOptions = { version, ...options } + } else { + name = nameOrOptions.name + loggerOptions = nameOrOptions + } + + const loggerVersion = loggerOptions.version || '' + const key = `${name}@${loggerVersion}` + if (!this._loggers.has(key)) { - this._loggers.set(key, new Logger(this)) + this._loggers.set(key, new Logger(this, { name, version: loggerVersion })) } return this._loggers.get(key) } _createNoOpLogger () { return { + instrumentationLibrary: { + name: 'dd-trace-js', + version: '' + }, emit: () => {}, debug: () => {}, info: () => {}, @@ -58,20 +74,6 @@ class LoggerProvider { } } - addLogRecordProcessor (logRecordProcessor) { - if (this._isShutdown) { - log.warn('Cannot add log record processor after shutdown') - return - } - - this._processors.push(logRecordProcessor) - this._activeProcessor = logRecordProcessor - } - - getActiveLogRecordProcessor () { - return this._activeProcessor - } - register () { if (this._isShutdown) { log.warn('Cannot register after shutdown') @@ -88,11 +90,11 @@ class LoggerProvider { return Promise.reject(new Error('LoggerProvider is shutdown')) } - if (!this._activeProcessor) { + if (!this._processor) { return Promise.resolve() } - return this._activeProcessor.forceFlush() + return this._processor.forceFlush() } shutdown () { @@ -102,11 +104,11 @@ class LoggerProvider { this._isShutdown = true - if (!this._activeProcessor) { + if (!this._processor) { return Promise.resolve() } - return this._activeProcessor.shutdown() + return this._processor.shutdown() } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 95fdddf8e92..a09fcd8a128 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -2,7 +2,6 @@ const { SeverityNumber } = require('@opentelemetry/api-logs') const { getProtobufTypes } = require('./protobuf_loader') -const tracerVersion = require('../../../../../package.json').version /** * OtlpTransformer transforms log records to OTLP format. @@ -69,7 +68,7 @@ class OtlpTransformer { resourceLogs: [{ resource: this._transformResource(), scopeLogs: [{ - scope: this._transformScope(), + scope: this._transformScope(logRecords[0]?.instrumentationLibrary), logRecords: logRecords.map(record => this._transformLogRecord(record)) }] }] @@ -77,10 +76,10 @@ class OtlpTransformer { return Buffer.from(JSON.stringify(logsData)) } - _transformScope () { + _transformScope (instrumentationLibrary) { return { - name: 'dd-trace-js', - version: tracerVersion, + name: instrumentationLibrary?.name || 'dd-trace-js', + version: instrumentationLibrary?.version || '', attributes: [], droppedAttributesCount: 0 } diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 9540e9db6d5..d60d81d81c9 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -288,11 +288,6 @@ class Tracer extends NoopProxy { resourceAttributes['host.name'] = os.hostname() } - // Create logger provider - const loggerProvider = new LoggerProvider({ - attributes: resourceAttributes - }) - // Create OTLP exporter using resolved config values const exporter = new OtlpHttpLogExporter( config.otelLogsUrl, @@ -302,7 +297,7 @@ class Tracer extends NoopProxy { resourceAttributes ) - // Create batch processor using resolved config values + // Create batch processor for exporting logs to Datadog Agent const processor = new BatchLogRecordProcessor( exporter, config.otelLogsBatchTimeout, @@ -311,8 +306,11 @@ class Tracer extends NoopProxy { config.otelLogsExportTimeoutMillis ) - // Add processor to logger provider - loggerProvider.addLogRecordProcessor(processor) + // Create logger provider with processor for Datadog Agent export + const loggerProvider = new LoggerProvider({ + resource: { attributes: resourceAttributes }, + processor + }) // Register the logger provider globally with OpenTelemetry API logs.setGlobalLoggerProvider(loggerProvider) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 08c46745fff..61ee130e361 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -224,7 +224,11 @@ describe('OpenTelemetry Logs', () => { body: 'Test message', severityNumber: 9, severityText: 'INFO', - timestamp: Date.now() * 1000000 + timestamp: Date.now() * 1000000, + instrumentationLibrary: { + name: 'dd-trace-js', + version: '1.0.0' + } }] exporter.export(mockLogRecords, () => {}) diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js index cd663f63be2..4a421051d75 100644 --- a/packages/dd-trace/test/opentelemetry/protobuf.spec.js +++ b/packages/dd-trace/test/opentelemetry/protobuf.spec.js @@ -124,7 +124,7 @@ describe('OTLP Protobuf Serialization', () => { expect(result.length).to.be.greaterThan(0) }) - it('hould serialize log records to json format', () => { + it('Should serialize log records to json format', () => { const transformer = new OtlpTransformer({ attributes: { 'service.name': 'test-service' From c7c15d8c79acc9a4984c656b25cc53f43508adfa Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Tue, 23 Sep 2025 09:38:23 -0400 Subject: [PATCH 28/61] support trace-log correlation --- .../opentelemetry/logs/batch_log_processor.js | 16 +++++- .../dd-trace/src/opentelemetry/logs/logger.js | 19 ++++++- .../dd-trace/test/opentelemetry/logs.spec.js | 56 +++++++++++++++++++ 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index b5905524cfa..3aa3d07db0a 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -34,13 +34,25 @@ class BatchLogRecordProcessor { * Processes a single log record. * * @param {Object} logRecord - The log record to process + * @param {Object} instrumentationLibrary - Instrumentation library information + * @param {Object} spanContext - Span context containing traceId and spanId + * @param {string} spanContext.traceId - Trace ID for correlation + * @param {string} spanContext.spanId - Span ID for correlation */ - onEmit (logRecord) { + onEmit (logRecord, instrumentationLibrary, spanContext) { if (this._isShutdown) { return } - this._logRecords.push(logRecord) + // Store the additional context with the log record + const enrichedLogRecord = { + ...logRecord, + instrumentationLibrary, + traceId: spanContext?.traceId || '', + spanId: spanContext?.spanId || '' + } + + this._logRecords.push(enrichedLogRecord) if (this._logRecords.length >= this._maxExportBatchSize) { this._export() diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 12a1ad8b6a6..f6f860c4aea 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -2,7 +2,7 @@ const { SeverityNumber } = require('@opentelemetry/api-logs') const { sanitizeAttributes } = require('@opentelemetry/core') - +const { trace, context } = require('@opentelemetry/api') /** * Logger provides methods to emit log records. * @@ -50,8 +50,7 @@ class Logger { logRecord.attributes = sanitizeAttributes(logRecord.attributes) } - logRecord.instrumentationLibrary = this.instrumentationLibrary - this._loggerProvider._processor.onEmit(logRecord) + this._loggerProvider._processor.onEmit(logRecord, this.instrumentationLibrary, this._getSpanContext(logRecord)) } debug (message, attributes = {}) { @@ -83,6 +82,20 @@ class Logger { timestamp: Date.now() * 1_000_000 }) } + + _getSpanContext (logRecord) { + const activeSpan = trace.getSpan(logRecord.context || context.active()) + if (activeSpan) { + const spanContext = activeSpan.spanContext() + if (spanContext && spanContext.traceId && spanContext.spanId) { + return { + traceId: spanContext.traceId, + spanId: spanContext.spanId + } + } + } + return null + } } module.exports = Logger diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 61ee130e361..d690fa51fdc 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -93,6 +93,62 @@ describe('OpenTelemetry Logs', () => { }) }).to.not.throw() }) + + it('should populate trace context when span is active', () => { + const { logs, loggerProvider } = setupTracerAndLogger(true) + loggerProvider._isShutdown = false + + // Mock active span + const { trace } = require('@opentelemetry/api') + const originalGetSpan = trace.getSpan + trace.getSpan = () => ({ + spanContext: () => ({ + traceId: '1234567890abcdef1234567890abcdef', + spanId: '1234567890abcdef' + }) + }) + + // Capture log records + const logRecords = [] + loggerProvider._processor = { + onEmit: (record, instrumentationLibrary, spanContext) => { + logRecords.push({ ...record, traceId: spanContext?.traceId || '', spanId: spanContext?.spanId || '' }) + }, + shutdown: () => Promise.resolve() + } + + logs.getLogger('test-logger').info('Test message') + + expect(logRecords[0].traceId).to.equal('1234567890abcdef1234567890abcdef') + expect(logRecords[0].spanId).to.equal('1234567890abcdef') + + trace.getSpan = originalGetSpan + }) + + it('should serialize traceId and spanId in OTLP payload', () => { + // Test OTLP transformation directly + const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') + const transformer = new OtlpTransformer({}, 'http/protobuf') + + const logRecords = [{ + body: 'Test message', + severityNumber: 9, + severityText: 'INFO', + timestamp: Date.now() * 1000000, + instrumentationLibrary: { name: 'test-logger', version: '1.0.0' }, + traceId: '1234567890abcdef1234567890abcdef', + spanId: '1234567890abcdef' + }] + + const protobufPayload = transformer.transformLogRecords(logRecords) + const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') + const { _logsService } = getProtobufTypes() + const decodedPayload = _logsService.decode(protobufPayload) + const logRecord = decodedPayload.resourceLogs[0].scopeLogs[0].logRecords[0] + + expect(logRecord.traceId.toString('hex')).to.equal('1234567890abcdef1234567890abcdef') + expect(logRecord.spanId.toString('hex')).to.equal('1234567890abcdef') + }) }) describe('Protocol Configuration', () => { From f6f58fec6ba7e1a09f3754073e56a6828b02bb6b Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 24 Sep 2025 12:03:21 -0400 Subject: [PATCH 29/61] clean up registering provider in tests, and rename exporter arg --- .../opentelemetry/logs/batch_log_processor.js | 10 +-- .../dd-trace/test/opentelemetry/logs.spec.js | 86 +++++++++---------- 2 files changed, 47 insertions(+), 49 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 3aa3d07db0a..b6f0b46531f 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -11,14 +11,14 @@ class BatchLogRecordProcessor { /** * Creates a new BatchLogRecordProcessor instance. * - * @param {Object} processor - Log processor for exporting batches to Datadog Agent + * @param {Object} exporter - Log processor for exporting batches to Datadog Agent * @param {number} batchTimeout - Timeout in milliseconds for batch processing * @param {number} maxExportBatchSize - Maximum number of log records per batch * @param {number} maxQueueSize - Maximum number of log records in queue * @param {number} exportTimeoutMillis - Timeout for export operations */ - constructor (processor, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { - this._processor = processor + constructor (exporter, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { + this._exporter = exporter this._batchTimeout = batchTimeout this._maxExportBatchSize = maxExportBatchSize this._maxQueueSize = maxQueueSize @@ -78,7 +78,7 @@ class BatchLogRecordProcessor { const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) this._clearTimer() - this._processor.export(logRecords, () => {}) + this._exporter.export(logRecords, () => {}) if (this._logRecords.length > 0) { this._startTimer() @@ -115,7 +115,7 @@ class BatchLogRecordProcessor { this._export() - const shutdownPromises = this._processor ? [this._processor.shutdown()] : [] + const shutdownPromises = this._exporter ? [this._exporter.shutdown()] : [] Promise.all(shutdownPromises).then(resolve) }) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index d690fa51fdc..555b6d65420 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -36,10 +36,8 @@ describe('OpenTelemetry Logs', () => { process.env = originalEnv // Clean up OpenTelemetry API state by shutting down the current logger provider const { logs } = require('@opentelemetry/api-logs') - const loggerProvider = logs.getLoggerProvider() - if (loggerProvider && typeof loggerProvider.shutdown === 'function') { - loggerProvider.shutdown() - } + // Unregister the logger provider from OpenTelemetry API by resetting global state + logs.disable() }) describe('Basic Functionality', () => { @@ -47,9 +45,10 @@ describe('OpenTelemetry Logs', () => { function setupTracerAndLogger (enabled = true) { process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' const tracer = require('../../') + tracer._initialized = false tracer.init() const { logs } = require('@opentelemetry/api-logs') - return { tracer, logs, loggerProvider: logs.getLoggerProvider(), logger: logs.getLogger('test-logger') } + return { logs, loggerProvider: logs.getLoggerProvider(), logger: logs.getLogger('test-logger') } } it('should initialize OpenTelemetry logs when enabled', () => { @@ -77,6 +76,9 @@ describe('OpenTelemetry Logs', () => { it('should handle logger provider shutdown', () => { const { loggerProvider } = setupTracerAndLogger(true) + expect(loggerProvider).to.exist + expect(typeof loggerProvider.shutdown).to.equal('function') + expect(() => { loggerProvider.shutdown() }).to.not.throw() @@ -309,53 +311,49 @@ describe('OpenTelemetry Logs', () => { }) describe('OTLP Payload Structure', () => { - // Common test data for payload structure tests - const testData = { - resource: { - attributes: { - 'service.name': 'test-service', - 'service.version': '1.0.0', - 'deployment.environment': 'test' - } - }, - logRecords: [{ + it('should generate correct JSON OTLP payload structure', () => { + const { OtlpTransformer } = require('../../src/opentelemetry/logs') + const transformer = new OtlpTransformer({ + attributes: { 'service.name': 'test-service' } + }, 'http/json') + + const logRecords = [{ body: 'Test message', severityNumber: 9, severityText: 'INFO', - attributes: { 'test.attr': 'test-value' } + attributes: { 'test.attr': 'test-value' }, + timestamp: Date.now() * 1000000, + instrumentationLibrary: { name: 'test-service', version: '1.0.0' } }] - } - - // Helper function to test payload structure - function testPayloadStructure (protocol, expectedStructure) { - const { OtlpTransformer } = require('../../src/opentelemetry/logs') - const transformer = new OtlpTransformer(testData.resource, protocol) - - let result - if (protocol === 'http/json') { - result = JSON.parse(transformer.transformLogRecords(testData.logRecords).toString()) - } else { - const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') - result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(testData.logRecords)) - } - expectedStructure(result) - } - - it('should generate correct JSON OTLP payload structure', () => { - testPayloadStructure('http/json', (result) => { - expect(result).to.have.property('resourceLogs') - expect(result.resourceLogs[0]).to.have.property('resource') - expect(result.resourceLogs[0]).to.have.property('scopeLogs') - }) + const result = JSON.parse(transformer.transformLogRecords(logRecords).toString()) + expect(result).to.have.property('resourceLogs') + expect(result.resourceLogs[0]).to.have.property('resource') + expect(result.resourceLogs[0]).to.have.property('scopeLogs') + expect(result.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue).to.equal('Test message') }) it('should generate correct protobuf OTLP payload structure', () => { - testPayloadStructure('http/protobuf', (result) => { - expect(result).to.have.property('resourceLogs') - expect(result.resourceLogs[0]).to.have.property('resource') - expect(result.resourceLogs[0]).to.have.property('scopeLogs') - }) + const { OtlpTransformer } = require('../../src/opentelemetry/logs') + const transformer = new OtlpTransformer({ + attributes: { 'service.name': 'test-service' } + }, 'http/protobuf') + + const logRecords = [{ + body: 'Test message', + severityNumber: 9, + severityText: 'INFO', + attributes: { 'test.attr': 'test-value' }, + timestamp: Date.now() * 1000000, + instrumentationLibrary: { name: 'test-service', version: '1.0.0' } + }] + + const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') + const result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(logRecords)) + expect(result).to.have.property('resourceLogs') + expect(result.resourceLogs[0]).to.have.property('resource') + expect(result.resourceLogs[0]).to.have.property('scopeLogs') + expect(result.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue).to.equal('Test message') }) }) From 434fbc402a1f57893862dd08f9e45293faaa209c Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 25 Sep 2025 16:33:14 -0400 Subject: [PATCH 30/61] first round of clean ups from PR review --- LICENSE-3rdparty.csv | 1 + docs/API.md | 20 +- package.json | 3 +- packages/dd-trace/src/config.js | 7 +- .../opentelemetry/logs/batch_log_processor.js | 41 +- .../dd-trace/src/opentelemetry/logs/logger.js | 81 +-- .../src/opentelemetry/logs/logger_provider.js | 30 +- .../logs/otlp_http_log_exporter.js | 18 +- .../opentelemetry/logs/otlp_transformer.js | 75 +++ .../dd-trace/test/opentelemetry/logs.spec.js | 491 +++++------------- yarn.lock | 10 +- 11 files changed, 359 insertions(+), 418 deletions(-) diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index ecc6be1ae83..2de33ac866a 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -9,6 +9,7 @@ require,@datadog/wasm-js-rewriter,Apache license 2.0,Copyright 2018 Datadog Inc. require,@opentelemetry/api,Apache license 2.0,Copyright OpenTelemetry Authors require,@opentelemetry/api-logs,Apache license 2.0,Copyright OpenTelemetry Authors require,@opentelemetry/core,Apache license 2.0,Copyright OpenTelemetry Authors +require,@opentelemetry/resources,Apache license 2.0,Copyright OpenTelemetry Authors require,@isaacs/ttlcache,ISC,Copyright (c) 2022-2023 - Isaac Z. Schlueter and Contributors require,crypto-randomuuid,MIT,Copyright 2021 Node.js Foundation and contributors require,dc-polyfill,MIT,Copyright 2023 Datadog Inc. diff --git a/docs/API.md b/docs/API.md index 0d0809e8cbf..67fc8575e39 100644 --- a/docs/API.md +++ b/docs/API.md @@ -384,17 +384,23 @@ The following attributes are available to override Datadog-specific options: dd-trace-js includes experimental support for OpenTelemetry logs, designed as a drop-in replacement for the OpenTelemetry SDK. This support is primarily intended for logging libraries rather than direct user configuration. Enable it by setting `DD_LOGS_OTEL_ENABLED=true` and use the [OpenTelemetry Logs API](https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_api-logs.html) to emit structured log data: ```javascript -const tracer = require('dd-trace').init() +require('dd-trace').init() const { logs } = require('@opentelemetry/api-logs') +const express = require('express') +const app = express() const logger = logs.getLogger('my-service', '1.0.0') -logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Application started', - attributes: { version: '1.0.0' }, - timestamp: Date.now() * 1000000 + +app.get('/api/users/:id', (req, res) => { + logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: `Processing user request for ID: ${req.params.id}`, + }) + res.json({ id: req.params.id, name: 'John Doe' }) }) + +app.listen(3000) ``` #### Supported Configuration diff --git a/package.json b/package.json index afbc0359e63..46b0a36fd79 100644 --- a/package.json +++ b/package.json @@ -122,8 +122,9 @@ "@datadog/wasm-js-rewriter": "4.0.1", "@isaacs/ttlcache": "^1.4.1", "@opentelemetry/api": ">=1.0.0 <1.10.0", - "@opentelemetry/api-logs": "*", + "@opentelemetry/api-logs": "<1.0.0", "@opentelemetry/core": ">=1.14.0 <1.31.0", + "@opentelemetry/resources": ">=1.0.0 <1.10.0", "crypto-randomuuid": "^1.0.0", "dc-polyfill": "^0.1.10", "ignore": "^7.0.5", diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 9abf4f5263b..5d99e1a535b 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -657,7 +657,7 @@ class Config { OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTERS_OTLP_ENDPOINT, - OTEL_EXPORTERS_OTLP_HEADERS, + OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTERS_OTLP_TIMEOUT, OTEL_BSP_SCHEDULE_DELAY, OTEL_BSP_MAX_EXPORT_BATCH_SIZE, @@ -685,12 +685,11 @@ class Config { if (customOtelLogsUrl) { this._setString(env, 'otelLogsUrl', customOtelLogsUrl) } - this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTERS_OTLP_HEADERS) + this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTER_OTLP_HEADERS) // Handle OTLP protocol with grpc warning const requestedProtocol = OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || OTEL_EXPORTER_OTLP_PROTOCOL if (requestedProtocol === 'grpc') { - // eslint-disable-next-line no-console - console.warn('OTLP gRPC protocol is not supported for logs. ' + + log.warn('OTLP gRPC protocol is not supported for logs. ' + 'Defaulting to http/protobuf. gRPC protobuf support may be added in a future release.') this._setString(env, 'otelLogsProtocol', 'http/protobuf') } else { diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index b6f0b46531f..015e9362c75 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -11,7 +11,7 @@ class BatchLogRecordProcessor { /** * Creates a new BatchLogRecordProcessor instance. * - * @param {Object} exporter - Log processor for exporting batches to Datadog Agent + * @param {OtlpHttpLogExporter} exporter - Log processor for exporting batches to Datadog Agent * @param {number} batchTimeout - Timeout in milliseconds for batch processing * @param {number} maxExportBatchSize - Maximum number of log records per batch * @param {number} maxQueueSize - Maximum number of log records in queue @@ -33,26 +33,15 @@ class BatchLogRecordProcessor { /** * Processes a single log record. * - * @param {Object} logRecord - The log record to process - * @param {Object} instrumentationLibrary - Instrumentation library information - * @param {Object} spanContext - Span context containing traceId and spanId - * @param {string} spanContext.traceId - Trace ID for correlation - * @param {string} spanContext.spanId - Span ID for correlation + * @param {Object} logRecord - The enriched log record with trace correlation and metadata */ - onEmit (logRecord, instrumentationLibrary, spanContext) { + onEmit (logRecord) { if (this._isShutdown) { return } - // Store the additional context with the log record - const enrichedLogRecord = { - ...logRecord, - instrumentationLibrary, - traceId: spanContext?.traceId || '', - spanId: spanContext?.spanId || '' - } - - this._logRecords.push(enrichedLogRecord) + // Store the log record (already enriched by Logger.emit) + this._logRecords.push(logRecord) if (this._logRecords.length >= this._maxExportBatchSize) { this._export() @@ -61,6 +50,10 @@ class BatchLogRecordProcessor { } } + /** + * Starts the batch timeout timer. + * @private + */ _startTimer () { if (this._timer) { return @@ -71,6 +64,10 @@ class BatchLogRecordProcessor { }, this._batchTimeout) } + /** + * Exports the current batch of log records. + * @private + */ _export () { if (this._logRecords.length === 0) { return @@ -85,6 +82,10 @@ class BatchLogRecordProcessor { } } + /** + * Clears the batch timeout timer. + * @private + */ _clearTimer () { if (this._timer) { clearTimeout(this._timer) @@ -92,6 +93,10 @@ class BatchLogRecordProcessor { } } + /** + * Forces an immediate flush of all pending log records. + * @returns {Promise} Promise that resolves when flush is complete + */ forceFlush () { return new Promise((resolve) => { if (this._isShutdown) { @@ -104,6 +109,10 @@ class BatchLogRecordProcessor { }) } + /** + * Shuts down the processor and exports any remaining log records. + * @returns {Promise} Promise that resolves when shutdown is complete + */ shutdown () { if (this._isShutdown) { return this._shutdownPromise || Promise.resolve() diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index f6f860c4aea..bef558c72da 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -1,8 +1,14 @@ 'use strict' -const { SeverityNumber } = require('@opentelemetry/api-logs') const { sanitizeAttributes } = require('@opentelemetry/core') const { trace, context } = require('@opentelemetry/api') + +/** + * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord + * @typedef {import('@opentelemetry/api').SpanContext} SpanContext + * @typedef {import('@opentelemetry/api').Attributes} Attributes + * @typedef {import('@opentelemetry/resources').Resource} Resource + */ /** * Logger provides methods to emit log records. * @@ -19,6 +25,8 @@ class Logger { * @param {Object} [instrumentationLibrary] - Instrumentation library information * @param {string} [instrumentationLibrary.name] - Library name (defaults to 'dd-trace-js') * @param {string} [instrumentationLibrary.version] - Library version (defaults to tracer version) + * @param {Attributes[]} [instrumentationLibrary.attributes] - Additional attributes + * @param {number} [instrumentationLibrary.dropped_attributes_count] - Number of dropped attributes */ constructor (loggerProvider, instrumentationLibrary) { this._loggerProvider = loggerProvider @@ -28,6 +36,10 @@ class Logger { } } + /** + * Gets the resource associated with this logger. + * @returns {Resource} The resource attributes + */ get resource () { return this._loggerProvider.resource } @@ -35,7 +47,7 @@ class Logger { /** * Emits a log record. * - * @param {Object} logRecord - The log record to emit + * @param {LogRecord} logRecord - The log record to emit */ emit (logRecord) { if (this._loggerProvider._isShutdown) { @@ -50,41 +62,50 @@ class Logger { logRecord.attributes = sanitizeAttributes(logRecord.attributes) } - this._loggerProvider._processor.onEmit(logRecord, this.instrumentationLibrary, this._getSpanContext(logRecord)) - } - - debug (message, attributes = {}) { - this._emitLog('DEBUG', SeverityNumber.DEBUG, message, attributes) - } + // Set default timestamp if not provided + if (!logRecord.timestamp) { + logRecord.timestamp = Date.now() * 1_000_000 + } - info (message, attributes = {}) { - this._emitLog('INFO', SeverityNumber.INFO, message, attributes) - } + // Set observed timestamp if not provided + if (!logRecord.observedTimestamp) { + logRecord.observedTimestamp = logRecord.timestamp + } - warn (message, attributes = {}) { - this._emitLog('WARN', SeverityNumber.WARN, message, attributes) - } + // Use the provided context or get the current active context + const activeContext = logRecord.context || context.active() - error (message, attributes = {}) { - this._emitLog('ERROR', SeverityNumber.ERROR, message, attributes) - } + // Extract span context from the active context for trace correlation + const spanContext = this._getSpanContext(activeContext) - fatal (message, attributes = {}) { - this._emitLog('FATAL', SeverityNumber.FATAL, message, attributes) - } + // Create enriched log record with all expected fields + // Contains: severityText, severityNumber, body, timestamp, observedTimestamp, + // attributes, resource, instrumentationLibrary, traceId, spanId, traceFlags + const enrichedLogRecord = { + timestamp: logRecord.timestamp, + observedTimestamp: logRecord.observedTimestamp, + severityText: logRecord.severityText || '', + severityNumber: logRecord.severityNumber || 0, + body: logRecord.body || '', + attributes: logRecord.attributes, + resource: this._loggerProvider.resource, + instrumentationLibrary: this.instrumentationLibrary, + traceId: spanContext?.traceId || '', + spanId: spanContext?.spanId || '', + traceFlags: spanContext?.traceFlags || 0 + } - _emitLog (severityText, severityNumber, message, attributes) { - this.emit({ - severityText, - severityNumber, - body: message, - attributes, - timestamp: Date.now() * 1_000_000 - }) + this._loggerProvider._processor.onEmit(enrichedLogRecord) } - _getSpanContext (logRecord) { - const activeSpan = trace.getSpan(logRecord.context || context.active()) + /** + * Extracts span context from the OpenTelemetry context for trace correlation. + * @param {Object} activeContext - The OpenTelemetry context + * @returns {SpanContext|null} Span context or null if not available + * @private + */ + _getSpanContext (activeContext) { + const activeSpan = trace.getSpan(activeContext) if (activeSpan) { const spanContext = activeSpan.spanContext() if (spanContext && spanContext.traceId && spanContext.spanId) { diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index ceff7835d1c..bca4cdc4c0c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -3,6 +3,12 @@ const { logs } = require('@opentelemetry/api-logs') const Logger = require('./logger') const log = require('../../log') +/** + * @typedef {import('@opentelemetry/resources').Resource} Resource + * @typedef {import('@opentelemetry/api-logs').Logger} Logger + * @typedef {import('./batch_log_processor')} BatchLogRecordProcessor + */ + /** * LoggerProvider is the main entry point for creating loggers with a single processor for Datadog Agent export. * @@ -17,13 +23,13 @@ class LoggerProvider { * Creates a new LoggerProvider instance with a single processor for Datadog Agent export. * * @param {Object} [options] - LoggerProvider options - * @param {Object} [options.resource] - Resource attributes - * @param {Object} [options.resource.attributes] - Resource attribute key-value pairs - * @param {Object} [options.processor] - Single LogRecordProcessor instance for exporting logs to Datadog Agent + * @param {Resource} [options.resource] - Resource attributes + * @param {BatchLogRecordProcessor} [options.processor] - Single LogRecordProcessor instance for + * exporting logs to Datadog Agent */ constructor (options = {}) { this.resource = options.resource - this._processor = options.processor || null + this._processor = options.processor this._loggers = new Map() this._isShutdown = false } @@ -59,6 +65,11 @@ class LoggerProvider { return this._loggers.get(key) } + /** + * Creates a no-op logger for use when the provider is shutdown. + * @returns {Logger} A no-op logger instance + * @private + */ _createNoOpLogger () { return { instrumentationLibrary: { @@ -74,6 +85,9 @@ class LoggerProvider { } } + /** + * Registers this logger provider as the global provider. + */ register () { if (this._isShutdown) { log.warn('Cannot register after shutdown') @@ -85,6 +99,10 @@ class LoggerProvider { } } + /** + * Forces a flush of all pending log records. + * @returns {Promise} Promise that resolves when flush is complete + */ forceFlush () { if (this._isShutdown) { return Promise.reject(new Error('LoggerProvider is shutdown')) @@ -97,6 +115,10 @@ class LoggerProvider { return this._processor.forceFlush() } + /** + * Shuts down the logger provider and all associated processors. + * @returns {Promise} Promise that resolves when shutdown is complete + */ shutdown () { if (this._isShutdown) { return Promise.resolve() diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 4a7561146c7..776657c70fa 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -53,7 +53,7 @@ class OtlpHttpLogExporter { /** * Exports log records via OTLP over HTTP. * - * @param {Array} logRecords - Array of log records to export + * @param {Object[]} logRecords - Array of enriched log records to export * @param {Function} resultCallback - Callback function for export result */ export (logRecords, resultCallback) { @@ -80,6 +80,12 @@ class OtlpHttpLogExporter { } } + /** + * Parses additional HTTP headers from a comma-separated string. + * @param {string} headersString - Comma-separated key=value pairs + * @returns {Record} Parsed headers object + * @private + */ _parseAdditionalHeaders (headersString) { if (!headersString || typeof headersString !== 'string') { return {} @@ -94,6 +100,12 @@ class OtlpHttpLogExporter { ) } + /** + * Sends the payload via HTTP request. + * @param {Buffer|string} payload - The payload to send + * @param {Function} resultCallback - Callback for the result + * @private + */ _sendPayload (payload, resultCallback) { const url = new URL(this._url) const isHttps = url.protocol === 'https:' @@ -143,6 +155,10 @@ class OtlpHttpLogExporter { req.end() } + /** + * Shuts down the exporter. + * @returns {Promise} Promise that resolves when shutdown is complete + */ shutdown () { return Promise.resolve() } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index a09fcd8a128..473ad8aa517 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -24,6 +24,11 @@ class OtlpTransformer { this._protobufTypes = null } + /** + * Gets the protobuf types, loading them lazily to reduce startup overhead. + * @returns {Object} Protobuf types object + * @private + */ _getProtobufTypes () { // Delay the loading of protobuf types to reduce startup overhead if (!this._protobufTypes) { @@ -32,6 +37,11 @@ class OtlpTransformer { return this._protobufTypes } + /** + * Transforms log records to OTLP format based on the configured protocol. + * @param {Object[]} logRecords - Array of enriched log records to transform + * @returns {Buffer} Transformed log records in the appropriate format + */ transformLogRecords (logRecords) { // Use the configured protocol to determine serialization format if (this._protocol === 'http/json') { @@ -41,6 +51,12 @@ class OtlpTransformer { return this._transformToProtobuf(logRecords) } + /** + * Transforms log records to protobuf format. + * @param {Object[]} logRecords - Array of enriched log records to transform + * @returns {Buffer} Protobuf-encoded log records + * @private + */ _transformToProtobuf (logRecords) { const { _logsService } = this._getProtobufTypes() @@ -62,6 +78,12 @@ class OtlpTransformer { return buffer } + /** + * Transforms log records to JSON format. + * @param {Object[]} logRecords - Array of enriched log records to transform + * @returns {Buffer} JSON-encoded log records + * @private + */ _transformToJson (logRecords) { // JSON transformation for http/json protocol const logsData = { @@ -76,6 +98,12 @@ class OtlpTransformer { return Buffer.from(JSON.stringify(logsData)) } + /** + * Transforms instrumentation library information to OTLP scope format. + * @param {Object} instrumentationLibrary - Instrumentation library info + * @returns {Object} OTLP scope object + * @private + */ _transformScope (instrumentationLibrary) { return { name: instrumentationLibrary?.name || 'dd-trace-js', @@ -85,6 +113,11 @@ class OtlpTransformer { } } + /** + * Transforms resource attributes to OTLP resource format. + * @returns {Object} OTLP resource object + * @private + */ _transformResource () { return { attributes: this._resourceAttributes, @@ -92,6 +125,12 @@ class OtlpTransformer { } } + /** + * Transforms a single log record to OTLP format. + * @param {Object} logRecord - Log record to transform + * @returns {Object} OTLP log record object + * @private + */ _transformLogRecord (logRecord) { const timestamp = logRecord.timestamp || Date.now() * 1_000_000 @@ -109,6 +148,12 @@ class OtlpTransformer { } } + /** + * Maps OpenTelemetry severity number to protobuf severity number. + * @param {number} severityNumber - OpenTelemetry severity number + * @returns {number} Protobuf severity number + * @private + */ _mapSeverityNumber (severityNumber) { const { _severityNumber } = this._getProtobufTypes() @@ -122,6 +167,12 @@ class OtlpTransformer { return severityMap[severityNumber] || _severityNumber.values.SEVERITY_NUMBER_INFO } + /** + * Creates a mapping from OpenTelemetry severity numbers to protobuf severity numbers. + * @param {Object} severityEnum - Protobuf severity enum + * @returns {Object} Severity mapping object + * @private + */ _createSeverityMap (severityEnum) { const map = {} map[SeverityNumber.TRACE] = severityEnum.values.SEVERITY_NUMBER_TRACE @@ -151,6 +202,12 @@ class OtlpTransformer { return map } + /** + * Converts a hex string to a Buffer. + * @param {string} hexString - Hex string to convert + * @returns {Buffer} Buffer containing the hex data + * @private + */ _hexToBytes (hexString) { if (!hexString || hexString.length === 0) { return Buffer.alloc(0) @@ -162,6 +219,12 @@ class OtlpTransformer { return Buffer.from(paddedHex, 'hex') } + /** + * Transforms log body to OTLP AnyValue format. + * @param {any} body - Log body to transform + * @returns {Object} OTLP AnyValue object + * @private + */ _transformBody (body) { if (typeof body === 'string') { return { @@ -190,6 +253,12 @@ class OtlpTransformer { } } + /** + * Transforms attributes to OTLP KeyValue format. + * @param {Object} attributes - Attributes to transform + * @returns {Object[]} Array of OTLP KeyValue objects + * @private + */ _transformAttributes (attributes) { if (!attributes) { return {} @@ -200,6 +269,12 @@ class OtlpTransformer { })) } + /** + * Transforms any value to OTLP AnyValue format. + * @param {any} value - Value to transform + * @returns {Object} OTLP AnyValue object + * @private + */ _transformAnyValue (value) { if (typeof value === 'string') { return { stringValue: value } diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 555b6d65420..01c12d61479 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -1,32 +1,49 @@ 'use strict' -const { expect } = require('chai') +const assert = require('assert') const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') -// Helper function to create mocked telemetry metrics -function createMockedTelemetryMetrics () { - return { - manager: { - namespace: sinon.stub().returns({ - count: sinon.stub().returns({ - inc: sinon.spy() - }) - }) - } +describe('OpenTelemetry Logs', () => { + let originalEnv + + function setupTracer (enabled = true) { + process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '1' + const tracer = require('../../') + tracer._initialized = false + tracer.init() + const { logs } = require('@opentelemetry/api-logs') + return { logs, loggerProvider: logs.getLoggerProvider() } } -} -// Helper function to create OTLP HTTP log exporter with mocked telemetry metrics -function createMockedOtlpHttpLogExporter (telemetryMetrics) { - return proxyquire('../../src/opentelemetry/logs/otlp_http_log_exporter', { - '../../telemetry/metrics': telemetryMetrics - }) -} + function mockOtlpExport (validator, protocol = 'protobuf') { + const OtlpHttpLogExporter = require('../../src/opentelemetry/logs/otlp_http_log_exporter') + sinon.stub(OtlpHttpLogExporter.prototype, '_sendPayload').callsFake((payload, callback) => { + try { + const decoded = protocol === 'json' + ? JSON.parse(payload.toString()) + : require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes()._logsService.decode(payload) + validator(decoded) + callback({ code: 0 }) + } catch (error) { + callback({ code: 1, error }) + } + }) + } -describe('OpenTelemetry Logs', () => { - let originalEnv + function mockLogWarn () { + const log = require('../../src/log') + const originalWarn = log.warn + let warningMessage = '' + log.warn = (msg) => { warningMessage = msg } + return { restore: () => { log.warn = originalWarn }, getMessage: () => warningMessage } + } + + function createMockSpan (traceId = '1234567890abcdef1234567890abcdef', spanId = '1234567890abcdef') { + return { spanContext: () => ({ traceId, spanId, traceFlags: 1, isRemote: false }) } + } beforeEach(() => { originalEnv = { ...process.env } @@ -34,379 +51,145 @@ describe('OpenTelemetry Logs', () => { afterEach(() => { process.env = originalEnv - // Clean up OpenTelemetry API state by shutting down the current logger provider - const { logs } = require('@opentelemetry/api-logs') - // Unregister the logger provider from OpenTelemetry API by resetting global state - logs.disable() + require('@opentelemetry/api-logs').logs.disable() + sinon.restore() }) - describe('Basic Functionality', () => { - // Helper function to setup tracer and get logger - function setupTracerAndLogger (enabled = true) { - process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' - const tracer = require('../../') - tracer._initialized = false - tracer.init() - const { logs } = require('@opentelemetry/api-logs') - return { logs, loggerProvider: logs.getLoggerProvider(), logger: logs.getLogger('test-logger') } - } - - it('should initialize OpenTelemetry logs when enabled', () => { - const { loggerProvider, logger } = setupTracerAndLogger(true) - - expect(loggerProvider).to.exist - expect(logger).to.exist - expect(typeof logger.emit).to.equal('function') - expect(typeof logger.info).to.equal('function') - }) - - it('should emit log records without errors', () => { - const { logger } = setupTracerAndLogger(true) - - expect(() => { - logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Test message', - timestamp: Date.now() * 1000000 - }) - }).to.not.throw() - }) - - it('should handle logger provider shutdown', () => { - const { loggerProvider } = setupTracerAndLogger(true) - - expect(loggerProvider).to.exist - expect(typeof loggerProvider.shutdown).to.equal('function') - - expect(() => { - loggerProvider.shutdown() - }).to.not.throw() - }) - - it('should work when disabled', () => { - const { logger } = setupTracerAndLogger(false) - - expect(() => { - logger.emit({ - severityText: 'INFO', - severityNumber: 9, - body: 'Test message' - }) - }).to.not.throw() - }) - - it('should populate trace context when span is active', () => { - const { logs, loggerProvider } = setupTracerAndLogger(true) - loggerProvider._isShutdown = false - - // Mock active span - const { trace } = require('@opentelemetry/api') - const originalGetSpan = trace.getSpan - trace.getSpan = () => ({ - spanContext: () => ({ - traceId: '1234567890abcdef1234567890abcdef', - spanId: '1234567890abcdef' - }) + describe('Core Functionality', () => { + it('exports logs with complete OTLP structure and trace correlation', () => { + mockOtlpExport((decoded) => { + const { resource } = decoded.resourceLogs[0] + const resourceAttrs = {} + resource.attributes.forEach(attr => { resourceAttrs[attr.key] = attr.value.stringValue }) + assert(resourceAttrs['service.name']) + + const { scope, logRecords } = decoded.resourceLogs[0].scopeLogs[0] + assert.strictEqual(scope.name, 'test-logger') + + const log = logRecords[0] + assert.strictEqual(log.severityText, 'INFO') + assert.strictEqual(log.body.stringValue, 'Test message') + assert.strictEqual(log.traceId.toString('hex'), '1234567890abcdef1234567890abcdef') + assert.strictEqual(log.spanId.toString('hex'), '1234567890abcdef') }) - // Capture log records - const logRecords = [] - loggerProvider._processor = { - onEmit: (record, instrumentationLibrary, spanContext) => { - logRecords.push({ ...record, traceId: spanContext?.traceId || '', spanId: spanContext?.spanId || '' }) - }, - shutdown: () => Promise.resolve() - } - - logs.getLogger('test-logger').info('Test message') - - expect(logRecords[0].traceId).to.equal('1234567890abcdef1234567890abcdef') - expect(logRecords[0].spanId).to.equal('1234567890abcdef') + const { logs } = setupTracer() + const { trace, context } = require('@opentelemetry/api') - trace.getSpan = originalGetSpan - }) - - it('should serialize traceId and spanId in OTLP payload', () => { - // Test OTLP transformation directly - const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') - const transformer = new OtlpTransformer({}, 'http/protobuf') - - const logRecords = [{ - body: 'Test message', - severityNumber: 9, + logs.getLogger('test-logger').emit({ severityText: 'INFO', - timestamp: Date.now() * 1000000, - instrumentationLibrary: { name: 'test-logger', version: '1.0.0' }, - traceId: '1234567890abcdef1234567890abcdef', - spanId: '1234567890abcdef' - }] - - const protobufPayload = transformer.transformLogRecords(logRecords) - const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') - const { _logsService } = getProtobufTypes() - const decodedPayload = _logsService.decode(protobufPayload) - const logRecord = decodedPayload.resourceLogs[0].scopeLogs[0].logRecords[0] - - expect(logRecord.traceId.toString('hex')).to.equal('1234567890abcdef1234567890abcdef') - expect(logRecord.spanId.toString('hex')).to.equal('1234567890abcdef') + body: 'Test message', + context: trace.setSpan(context.active(), createMockSpan()), + attributes: { 'test.key': 'test.value' } + }) }) - }) - - describe('Protocol Configuration', () => { - // Helper function to test protocol configuration - function testProtocolConfig (envVars, expectedProtocol, expectedWarning = null) { - const Config = require('../../src/config') - // Setup environment variables - Object.entries(envVars).forEach(([key, value]) => { - if (value === null) { - delete process.env[key] - } else { - process.env[key] = value - } + it('exports logs using protobuf protocol', () => { + mockOtlpExport((decoded) => { + assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue, 'Protobuf format') }) - let warningMessage = '' - if (expectedWarning) { - // eslint-disable-next-line no-console - const originalWarn = console.warn - // eslint-disable-next-line no-console - console.warn = (msg) => { warningMessage = msg } - - const config = new Config() - expect(config.otelLogsProtocol).to.equal(expectedProtocol) - expect(warningMessage).to.include(expectedWarning) - - // eslint-disable-next-line no-console - console.warn = originalWarn - } else { - const config = new Config() - expect(config.otelLogsProtocol).to.equal(expectedProtocol) - } - } - - it('should use default protocol when no environment variables are set', () => { - testProtocolConfig({ - OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: null, - OTEL_EXPORTER_OTLP_PROTOCOL: null - }, 'http/protobuf') + const { logs } = setupTracer() + logs.getLogger('test').emit({ severityText: 'INFO', body: 'Protobuf format' }) }) - it('should prioritize logs-specific protocol over generic protocol', () => { - testProtocolConfig({ - OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/json', - OTEL_EXPORTER_OTLP_PROTOCOL: 'http/protobuf' - }, 'http/json') - }) + it('exports logs using JSON protocol', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' + mockOtlpExport((decoded) => { + assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue, 'JSON format') + }, 'json') - it('should fallback to generic protocol when logs protocol not set', () => { - testProtocolConfig({ - OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: null, - OTEL_EXPORTER_OTLP_PROTOCOL: 'http/json' - }, 'http/json') + const { logs } = setupTracer() + logs.getLogger('test').emit({ severityText: 'DEBUG', body: 'JSON format' }) }) - it('should warn and default to http/protobuf when grpc protocol is set', () => { - testProtocolConfig({ - OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'grpc' - }, 'http/protobuf', 'OTLP gRPC protocol is not supported for logs') + it('handles shutdown gracefully', () => { + const { loggerProvider } = setupTracer() + loggerProvider.shutdown() + assert.strictEqual(loggerProvider._isShutdown, true) }) }) - describe('Resource Attributes', () => { - // Helper function to test resource attribute configuration - function testResourceConfig (envVars, assertions) { - const Config = require('../../src/config') - - // Setup environment variables - Object.entries(envVars).forEach(([key, value]) => { - if (value === null) { - delete process.env[key] - } else { - process.env[key] = value - } - }) - - const config = new Config() - assertions(config) - } - - it('should parse DD_TAGS into resource attributes', () => { - testResourceConfig({ - DD_LOGS_OTEL_ENABLED: 'true', - DD_TAGS: 'team:backend,region:us-west-2' - }, (config) => { - expect(config.tags).to.include({ - team: 'backend', - region: 'us-west-2' - }) - }) - }) - - it('should parse OTEL_RESOURCE_ATTRIBUTES into resource attributes', () => { - testResourceConfig({ - DD_LOGS_OTEL_ENABLED: 'true', - OTEL_RESOURCE_ATTRIBUTES: 'deployment.environment=production,service.namespace=api', - DD_ENV: 'production' - }, (config) => { - expect(config.tags).to.include({ - 'service.namespace': 'api' - }) - expect(config.env).to.equal('production') - }) + describe('Configuration', () => { + it('uses default protobuf protocol when no environment variables set', () => { + delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL + delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/protobuf') }) - it('should set hostname when reportHostname is enabled', () => { - testResourceConfig({ - DD_LOGS_OTEL_ENABLED: 'true', - DD_TRACE_REPORT_HOSTNAME: 'true' - }, (config) => { - expect(config.hostname).to.exist - expect(config.hostname).to.be.a('string') - expect(config.hostname.length).to.be.greaterThan(0) - }) + it('prioritizes logs-specific protocol over generic protocol', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/json') }) - }) - describe('Telemetry Metrics', () => { - // Helper function to test telemetry metrics for a given protocol - function testTelemetryMetricsForProtocol (protocol, expectedEncoding) { - require('../setup/core') // For sinon-chai + it('warns and falls back to protobuf when gRPC protocol is set', () => { + const logMock = mockLogWarn() + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc' - const telemetryMetrics = createMockedTelemetryMetrics() - const OtlpHttpLogExporter = createMockedOtlpHttpLogExporter(telemetryMetrics) + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/protobuf') + assert(logMock.getMessage().includes('OTLP gRPC protocol is not supported')) - const exporter = new OtlpHttpLogExporter('http://localhost:4318/v1/logs', '', 1000, protocol, {}) - const mockLogRecords = [{ - body: 'Test message', - severityNumber: 9, - severityText: 'INFO', - timestamp: Date.now() * 1000000, - instrumentationLibrary: { - name: 'dd-trace-js', - version: '1.0.0' - } - }] - - exporter.export(mockLogRecords, () => {}) - - // Verify telemetry metric was called with correct name and tags - expect(telemetryMetrics.manager.namespace).to.have.been.calledWith('tracers') - expect(telemetryMetrics.manager.namespace().count).to.have.been.calledWith( - 'otel.log_records', [ - 'protocol:http', - `encoding:${expectedEncoding}` - ]) - expect(telemetryMetrics.manager.namespace().count().inc).to.have.been.calledWith(1) - } - - it('should track telemetry metrics for protobuf protocol', () => { - testTelemetryMetricsForProtocol('http/protobuf', 'protobuf') + logMock.restore() }) - it('should track telemetry metrics for JSON protocol', () => { - testTelemetryMetricsForProtocol('http/json', 'json') + it('configures resource attributes from environment variables', () => { + process.env.DD_TAGS = 'team:backend,region:us-west-2' + process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.namespace=api' + const { loggerProvider } = setupTracer() + const resourceAttrs = loggerProvider.resource.attributes + assert.strictEqual(resourceAttrs.team, 'backend') + assert.strictEqual(resourceAttrs['service.namespace'], 'api') }) - }) - describe('OTLP Payload Structure', () => { - it('should generate correct JSON OTLP payload structure', () => { - const { OtlpTransformer } = require('../../src/opentelemetry/logs') - const transformer = new OtlpTransformer({ - attributes: { 'service.name': 'test-service' } - }, 'http/json') - - const logRecords = [{ - body: 'Test message', - severityNumber: 9, - severityText: 'INFO', - attributes: { 'test.attr': 'test-value' }, - timestamp: Date.now() * 1000000, - instrumentationLibrary: { name: 'test-service', version: '1.0.0' } - }] - - const result = JSON.parse(transformer.transformLogRecords(logRecords).toString()) - expect(result).to.have.property('resourceLogs') - expect(result.resourceLogs[0]).to.have.property('resource') - expect(result.resourceLogs[0]).to.have.property('scopeLogs') - expect(result.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue).to.equal('Test message') + it('includes hostname in resource when reportHostname is enabled', () => { + process.env.DD_TRACE_REPORT_HOSTNAME = 'true' + const { loggerProvider } = setupTracer() + assert(typeof loggerProvider.resource.attributes['host.name'] === 'string') }) - it('should generate correct protobuf OTLP payload structure', () => { - const { OtlpTransformer } = require('../../src/opentelemetry/logs') - const transformer = new OtlpTransformer({ - attributes: { 'service.name': 'test-service' } - }, 'http/protobuf') - - const logRecords = [{ - body: 'Test message', - severityNumber: 9, - severityText: 'INFO', - attributes: { 'test.attr': 'test-value' }, - timestamp: Date.now() * 1000000, - instrumentationLibrary: { name: 'test-service', version: '1.0.0' } - }] - - const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') - const result = getProtobufTypes()._logsService.decode(transformer.transformLogRecords(logRecords)) - expect(result).to.have.property('resourceLogs') - expect(result.resourceLogs[0]).to.have.property('resource') - expect(result.resourceLogs[0]).to.have.property('scopeLogs') - expect(result.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue).to.equal('Test message') + it('configures custom OTLP endpoint', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider._processor._exporter._url, 'http://custom:4318/v1/logs') }) - }) - - describe('OTLP Endpoint Configuration', () => { - it('should use environment value when set', () => { - const Config = require('../../src/config') - - process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://explicit-agent:4318/v1/logs' - process.env.DD_AGENT_HOST = 'different-agent.example.com' - const config = new Config() - expect(config.otelLogsUrl).to.equal('http://explicit-agent:4318/v1/logs') + it('configures OTLP headers from logs-specific environment variable', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'api-key=secret,env=prod' + const { loggerProvider } = setupTracer() + const exporter = loggerProvider._processor._exporter + assert.strictEqual(exporter._headers['api-key'], 'secret') + assert.strictEqual(exporter._headers.env, 'prod') }) - it('should use calculated default when no environment variables are set', () => { - const Config = require('../../src/config') - - delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT - delete process.env.OTEL_EXPORTERS_OTLP_ENDPOINT - process.env.DD_AGENT_HOST = 'default-agent.example.com' - - const config = new Config() - expect(config.otelLogsUrl).to.equal('http://default-agent.example.com:4318/v1/logs') - }) - - it('should use fallback default when no environment variables and no DD_AGENT_HOST', () => { - const Config = require('../../src/config') - - delete process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT - delete process.env.OTEL_EXPORTERS_OTLP_ENDPOINT - delete process.env.DD_AGENT_HOST - - const config = new Config() - expect(config.otelLogsUrl).to.equal('http://127.0.0.1:4318/v1/logs') + it('prioritizes logs-specific headers over generic OTLP headers', () => { + process.env.OTEL_EXPORTER_OTLP_HEADERS = 'generic=value,shared=generic' + process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'logs-specific=value,shared=logs' + const { loggerProvider } = setupTracer() + const exporter = loggerProvider._processor._exporter + assert.strictEqual(exporter._headers['logs-specific'], 'value') + assert.strictEqual(exporter._headers.shared, 'logs') + assert.strictEqual(exporter._headers.generic, undefined) }) }) - describe('OTLP Headers Configuration', () => { - it('should parse OTLP headers from comma-separated key=value string', () => { - const { OtlpHttpLogExporter } = require('../../src/opentelemetry/logs') + describe('Telemetry Metrics', () => { + it('tracks telemetry metrics for exported logs', () => { + require('../setup/core') + const telemetryMetrics = { + manager: { namespace: sinon.stub().returns({ count: sinon.stub().returns({ inc: sinon.spy() }) }) } + } + const MockedExporter = proxyquire('../../src/opentelemetry/logs/otlp_http_log_exporter', { + '../../telemetry/metrics': telemetryMetrics + }) - const exporter = new OtlpHttpLogExporter( - 'http://localhost:4318/v1/logs', - 'api-key=key,other-config-value=value', - 1000, - 'http/protobuf', - {} - ) + const exporter = new MockedExporter('http://localhost:4318/v1/logs', '', 1000, 'http/protobuf', {}) + exporter.export([{ body: 'test', severityNumber: 9, timestamp: Date.now() * 1000000 }], () => {}) - expect(exporter._headers).to.include({ - 'api-key': 'key', - 'other-config-value': 'value' - }) + assert(telemetryMetrics.manager.namespace().count().inc.calledWith(1)) }) }) }) diff --git a/yarn.lock b/yarn.lock index 1df2be4c912..255418c7090 100644 --- a/yarn.lock +++ b/yarn.lock @@ -664,7 +664,7 @@ "@octokit/request-error" "^7.0.0" "@octokit/webhooks-methods" "^6.0.0" -"@opentelemetry/api-logs@*": +"@opentelemetry/api-logs@<1.0.0": version "0.205.0" resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.205.0.tgz" integrity sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg== @@ -688,6 +688,14 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== +"@opentelemetry/resources@>=1.0.0 <1.10.0": + version "1.9.1" + resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.9.1.tgz" + integrity sha512-VqBGbnAfubI+l+yrtYxeLyOoL358JK57btPMJDd3TCOV3mV5TNBmzvOfmesM4NeTyXuGJByd3XvOHvFezLn3rQ== + dependencies: + "@opentelemetry/core" "1.9.1" + "@opentelemetry/semantic-conventions" "1.9.1" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" From 3963ed6910f0e74bac488e5365a31fafad1919d1 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 25 Sep 2025 17:09:08 -0400 Subject: [PATCH 31/61] clean ups part 2 --- .../opentelemetry/logs/batch_log_processor.js | 16 +++---- .../dd-trace/src/opentelemetry/logs/logger.js | 17 +++---- .../src/opentelemetry/logs/logger_provider.js | 22 ++++----- .../logs/otlp_http_log_exporter.js | 24 +++++----- .../opentelemetry/logs/otlp_transformer.js | 4 +- .../dd-trace/test/opentelemetry/logs.spec.js | 45 ++++++++++++------- 6 files changed, 72 insertions(+), 56 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 015e9362c75..b608b25ff8b 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -18,7 +18,7 @@ class BatchLogRecordProcessor { * @param {number} exportTimeoutMillis - Timeout for export operations */ constructor (exporter, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { - this._exporter = exporter + this.exporter = exporter this._batchTimeout = batchTimeout this._maxExportBatchSize = maxExportBatchSize this._maxQueueSize = maxQueueSize @@ -27,7 +27,7 @@ class BatchLogRecordProcessor { this._logRecords = [] this._timer = null this._shutdownPromise = null - this._isShutdown = false + this.isShutdown = false } /** @@ -36,7 +36,7 @@ class BatchLogRecordProcessor { * @param {Object} logRecord - The enriched log record with trace correlation and metadata */ onEmit (logRecord) { - if (this._isShutdown) { + if (this.isShutdown) { return } @@ -75,7 +75,7 @@ class BatchLogRecordProcessor { const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) this._clearTimer() - this._exporter.export(logRecords, () => {}) + this.exporter.export(logRecords, () => {}) if (this._logRecords.length > 0) { this._startTimer() @@ -99,7 +99,7 @@ class BatchLogRecordProcessor { */ forceFlush () { return new Promise((resolve) => { - if (this._isShutdown) { + if (this.isShutdown) { resolve() return } @@ -114,17 +114,17 @@ class BatchLogRecordProcessor { * @returns {Promise} Promise that resolves when shutdown is complete */ shutdown () { - if (this._isShutdown) { + if (this.isShutdown) { return this._shutdownPromise || Promise.resolve() } - this._isShutdown = true + this.isShutdown = true this._shutdownPromise = new Promise((resolve) => { this._clearTimer() this._export() - const shutdownPromises = this._exporter ? [this._exporter.shutdown()] : [] + const shutdownPromises = this.exporter ? [this.exporter.shutdown()] : [] Promise.all(shutdownPromises).then(resolve) }) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index bef558c72da..3afc019ce29 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -29,8 +29,8 @@ class Logger { * @param {number} [instrumentationLibrary.dropped_attributes_count] - Number of dropped attributes */ constructor (loggerProvider, instrumentationLibrary) { - this._loggerProvider = loggerProvider - this.instrumentationLibrary = { + this.loggerProvider = loggerProvider + this._instrumentationLibrary = { name: instrumentationLibrary?.name || 'dd-trace-js', version: instrumentationLibrary?.version || require('../../../../../package.json').version } @@ -41,7 +41,7 @@ class Logger { * @returns {Resource} The resource attributes */ get resource () { - return this._loggerProvider.resource + return this.loggerProvider.resource } /** @@ -50,11 +50,11 @@ class Logger { * @param {LogRecord} logRecord - The log record to emit */ emit (logRecord) { - if (this._loggerProvider._isShutdown) { + if (this.loggerProvider.isShutdown) { return } - if (!this._loggerProvider._processor) { + if (!this.loggerProvider.processor) { return } @@ -88,14 +88,15 @@ class Logger { severityNumber: logRecord.severityNumber || 0, body: logRecord.body || '', attributes: logRecord.attributes, - resource: this._loggerProvider.resource, - instrumentationLibrary: this.instrumentationLibrary, + resource: this.loggerProvider.resource, + // Newer versions of the OpenTelemetry Logs API require instrumentationScope instead of instrumentationLibrary + instrumentationLibrary: logRecord.instrumentationScope || logRecord.instrumentationLibrary || this._instrumentationLibrary, traceId: spanContext?.traceId || '', spanId: spanContext?.spanId || '', traceFlags: spanContext?.traceFlags || 0 } - this._loggerProvider._processor.onEmit(enrichedLogRecord) + this.loggerProvider.processor.onEmit(enrichedLogRecord) } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index bca4cdc4c0c..7f27c2a44d2 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -29,9 +29,9 @@ class LoggerProvider { */ constructor (options = {}) { this.resource = options.resource - this._processor = options.processor + this.processor = options.processor this._loggers = new Map() - this._isShutdown = false + this.isShutdown = false } /** @@ -43,7 +43,7 @@ class LoggerProvider { * @returns {Logger} Logger instance */ getLogger (nameOrOptions, version, options = {}) { - if (this._isShutdown) { + if (this.isShutdown) { return this._createNoOpLogger() } @@ -89,7 +89,7 @@ class LoggerProvider { * Registers this logger provider as the global provider. */ register () { - if (this._isShutdown) { + if (this.isShutdown) { log.warn('Cannot register after shutdown') return } @@ -104,15 +104,15 @@ class LoggerProvider { * @returns {Promise} Promise that resolves when flush is complete */ forceFlush () { - if (this._isShutdown) { + if (this.isShutdown) { return Promise.reject(new Error('LoggerProvider is shutdown')) } - if (!this._processor) { + if (!this.processor) { return Promise.resolve() } - return this._processor.forceFlush() + return this.processor.forceFlush() } /** @@ -120,17 +120,17 @@ class LoggerProvider { * @returns {Promise} Promise that resolves when shutdown is complete */ shutdown () { - if (this._isShutdown) { + if (this.isShutdown) { return Promise.resolve() } - this._isShutdown = true + this.isShutdown = true - if (!this._processor) { + if (!this.processor) { return Promise.resolve() } - return this._processor.shutdown() + return this.processor.shutdown() } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 776657c70fa..37ef5b71c1b 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -28,25 +28,25 @@ class OtlpHttpLogExporter { * @param {Object} resource - Resource attributes */ constructor (url, headers, timeout, protocol, resource) { - this._url = url - this._protocol = protocol + this.url = url + this.protocol = protocol // Set Content-Type based on protocol - const contentType = this._protocol === 'http/json' + const contentType = this.protocol === 'http/json' ? 'application/json' : 'application/x-protobuf' - this._headers = { + this.headers = { 'Content-Type': contentType, ...this._parseAdditionalHeaders(headers) } - this._timeout = timeout - this._transformer = new OtlpTransformer(resource, protocol) + this.timeout = timeout + this.transformer = new OtlpTransformer(resource, protocol) // Pre-compute telemetry tags for efficiency this._telemetryTags = [ - `protocol:${this._protocol.startsWith('grpc') ? 'grpc' : 'http'}`, - `encoding:${this._protocol === 'http/json' ? 'json' : 'protobuf'}` + `protocol:${this.protocol.startsWith('grpc') ? 'grpc' : 'http'}`, + `encoding:${this.protocol === 'http/json' ? 'json' : 'protobuf'}` ] } @@ -63,7 +63,7 @@ class OtlpHttpLogExporter { } try { - const payload = this._transformer.transformLogRecords(logRecords) + const payload = this.transformer.transformLogRecords(logRecords) // Track telemetry metric for OTLP log records try { @@ -107,7 +107,7 @@ class OtlpHttpLogExporter { * @private */ _sendPayload (payload, resultCallback) { - const url = new URL(this._url) + const url = new URL(this.url) const isHttps = url.protocol === 'https:' const client = isHttps ? https : http @@ -117,10 +117,10 @@ class OtlpHttpLogExporter { path: url.pathname + url.search, method: 'POST', headers: { - ...this._headers, + ...this.headers, 'Content-Length': payload.length }, - timeout: this._timeout + timeout: this.timeout } const req = client.request(options, (res) => { diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 473ad8aa517..99348f89bc3 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -20,7 +20,7 @@ class OtlpTransformer { */ constructor (resourceAttributes, protocol) { this._resourceAttributes = this._transformAttributes(resourceAttributes) - this._protocol = protocol + this.protocol = protocol this._protobufTypes = null } @@ -44,7 +44,7 @@ class OtlpTransformer { */ transformLogRecords (logRecords) { // Use the configured protocol to determine serialization format - if (this._protocol === 'http/json') { + if (this.protocol === 'http/json') { return this._transformToJson(logRecords) } // Default to protobuf for http/protobuf or any other protocol diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 01c12d61479..673e4c73ba0 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -56,7 +56,7 @@ describe('OpenTelemetry Logs', () => { }) describe('Core Functionality', () => { - it('exports logs with complete OTLP structure and trace correlation', () => { + it('exports logs with complete OTLP structure, trace correlation, and instrumentation info', () => { mockOtlpExport((decoded) => { const { resource } = decoded.resourceLogs[0] const resourceAttrs = {} @@ -65,6 +65,7 @@ describe('OpenTelemetry Logs', () => { const { scope, logRecords } = decoded.resourceLogs[0].scopeLogs[0] assert.strictEqual(scope.name, 'test-logger') + assert.strictEqual(scope.version, '1.0.0') const log = logRecords[0] assert.strictEqual(log.severityText, 'INFO') @@ -76,7 +77,7 @@ describe('OpenTelemetry Logs', () => { const { logs } = setupTracer() const { trace, context } = require('@opentelemetry/api') - logs.getLogger('test-logger').emit({ + logs.getLogger('test-logger', '1.0.0').emit({ severityText: 'INFO', body: 'Test message', context: trace.setSpan(context.active(), createMockSpan()), @@ -106,23 +107,37 @@ describe('OpenTelemetry Logs', () => { it('handles shutdown gracefully', () => { const { loggerProvider } = setupTracer() loggerProvider.shutdown() - assert.strictEqual(loggerProvider._isShutdown, true) + assert.strictEqual(loggerProvider.isShutdown, true) + }) + + it('supports instrumentationScope for compatibility', () => { + mockOtlpExport((decoded) => { + const log = decoded.resourceLogs[0].scopeLogs[0].logRecords[0] + assert.strictEqual(log.body.stringValue, 'Scope test') + }) + + const { logs } = setupTracer() + logs.getLogger('test-logger').emit({ + body: 'Scope test', + instrumentationScope: { name: 'custom-scope', version: '2.0.0' } + }) }) }) describe('Configuration', () => { - it('uses default protobuf protocol when no environment variables set', () => { + it('uses default protobuf protocol', () => { delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/protobuf') + assert(loggerProvider.processor) + assert.strictEqual(loggerProvider.processor.exporter.transformer.protocol, 'http/protobuf') }) it('prioritizes logs-specific protocol over generic protocol', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/json') + assert.strictEqual(loggerProvider.processor.exporter.transformer.protocol, 'http/json') }) it('warns and falls back to protobuf when gRPC protocol is set', () => { @@ -130,7 +145,7 @@ describe('OpenTelemetry Logs', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider._processor._exporter._transformer._protocol, 'http/protobuf') + assert.strictEqual(loggerProvider.processor.exporter.transformer.protocol, 'http/protobuf') assert(logMock.getMessage().includes('OTLP gRPC protocol is not supported')) logMock.restore() @@ -154,25 +169,25 @@ describe('OpenTelemetry Logs', () => { it('configures custom OTLP endpoint', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider._processor._exporter._url, 'http://custom:4318/v1/logs') + assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4318/v1/logs') }) it('configures OTLP headers from logs-specific environment variable', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'api-key=secret,env=prod' const { loggerProvider } = setupTracer() - const exporter = loggerProvider._processor._exporter - assert.strictEqual(exporter._headers['api-key'], 'secret') - assert.strictEqual(exporter._headers.env, 'prod') + const exporter = loggerProvider.processor.exporter + assert.strictEqual(exporter.headers['api-key'], 'secret') + assert.strictEqual(exporter.headers.env, 'prod') }) it('prioritizes logs-specific headers over generic OTLP headers', () => { process.env.OTEL_EXPORTER_OTLP_HEADERS = 'generic=value,shared=generic' process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'logs-specific=value,shared=logs' const { loggerProvider } = setupTracer() - const exporter = loggerProvider._processor._exporter - assert.strictEqual(exporter._headers['logs-specific'], 'value') - assert.strictEqual(exporter._headers.shared, 'logs') - assert.strictEqual(exporter._headers.generic, undefined) + const exporter = loggerProvider.processor.exporter + assert.strictEqual(exporter.headers['logs-specific'], 'value') + assert.strictEqual(exporter.headers.shared, 'logs') + assert.strictEqual(exporter.headers.generic, undefined) }) }) From 6d10314eaec5099a0a4ab2aa7ea30304ec495831 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 25 Sep 2025 17:37:02 -0400 Subject: [PATCH 32/61] make things private and clean up tests --- .../opentelemetry/logs/batch_log_processor.js | 130 +++++++++--------- .../dd-trace/src/opentelemetry/logs/logger.js | 12 +- .../src/opentelemetry/logs/logger_provider.js | 52 +++---- .../logs/otlp_http_log_exporter.js | 48 +++---- .../opentelemetry/logs/otlp_transformer.js | 97 ++++++------- packages/dd-trace/src/proxy.js | 5 +- .../dd-trace/test/opentelemetry/logs.spec.js | 8 +- 7 files changed, 185 insertions(+), 167 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index b608b25ff8b..7078d3d4888 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -8,25 +8,27 @@ * @class BatchLogRecordProcessor */ class BatchLogRecordProcessor { + #logRecords + #timer + #batchTimeout + #maxExportBatchSize + #shutdownPromise + /** * Creates a new BatchLogRecordProcessor instance. * * @param {OtlpHttpLogExporter} exporter - Log processor for exporting batches to Datadog Agent * @param {number} batchTimeout - Timeout in milliseconds for batch processing * @param {number} maxExportBatchSize - Maximum number of log records per batch - * @param {number} maxQueueSize - Maximum number of log records in queue - * @param {number} exportTimeoutMillis - Timeout for export operations */ constructor (exporter, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { this.exporter = exporter - this._batchTimeout = batchTimeout - this._maxExportBatchSize = maxExportBatchSize - this._maxQueueSize = maxQueueSize - this._exportTimeoutMillis = exportTimeoutMillis - - this._logRecords = [] - this._timer = null - this._shutdownPromise = null + this.#batchTimeout = batchTimeout + this.#maxExportBatchSize = maxExportBatchSize + + this.#logRecords = [] + this.#timer = null + this.#shutdownPromise = null this.isShutdown = false } @@ -41,55 +43,12 @@ class BatchLogRecordProcessor { } // Store the log record (already enriched by Logger.emit) - this._logRecords.push(logRecord) - - if (this._logRecords.length >= this._maxExportBatchSize) { - this._export() - } else if (this._logRecords.length === 1) { - this._startTimer() - } - } + this.#logRecords.push(logRecord) - /** - * Starts the batch timeout timer. - * @private - */ - _startTimer () { - if (this._timer) { - return - } - - this._timer = setTimeout(() => { - this._export() - }, this._batchTimeout) - } - - /** - * Exports the current batch of log records. - * @private - */ - _export () { - if (this._logRecords.length === 0) { - return - } - - const logRecords = this._logRecords.splice(0, this._maxExportBatchSize) - this._clearTimer() - this.exporter.export(logRecords, () => {}) - - if (this._logRecords.length > 0) { - this._startTimer() - } - } - - /** - * Clears the batch timeout timer. - * @private - */ - _clearTimer () { - if (this._timer) { - clearTimeout(this._timer) - this._timer = null + if (this.#logRecords.length >= this.#maxExportBatchSize) { + this.#export() + } else if (this.#logRecords.length === 1) { + this.#startTimer() } } @@ -104,7 +63,7 @@ class BatchLogRecordProcessor { return } - this._export() + this.#export() resolve() }) } @@ -115,21 +74,64 @@ class BatchLogRecordProcessor { */ shutdown () { if (this.isShutdown) { - return this._shutdownPromise || Promise.resolve() + return this.#shutdownPromise || Promise.resolve() } this.isShutdown = true - this._shutdownPromise = new Promise((resolve) => { - this._clearTimer() + this.#shutdownPromise = new Promise((resolve) => { + this.#clearTimer() - this._export() + this.#export() const shutdownPromises = this.exporter ? [this.exporter.shutdown()] : [] Promise.all(shutdownPromises).then(resolve) }) - return this._shutdownPromise + return this.#shutdownPromise + } + + /** + * Starts the batch timeout timer. + * @private + */ + #startTimer () { + if (this.#timer) { + return + } + + this.#timer = setTimeout(() => { + this.#export() + }, this.#batchTimeout) + } + + /** + * Exports the current batch of log records. + * @private + */ + #export () { + if (this.#logRecords.length === 0) { + return + } + + const logRecords = this.#logRecords.splice(0, this.#maxExportBatchSize) + this.#clearTimer() + this.exporter.export(logRecords, () => {}) + + if (this.#logRecords.length > 0) { + this.#startTimer() + } + } + + /** + * Clears the batch timeout timer. + * @private + */ + #clearTimer () { + if (this.#timer) { + clearTimeout(this.#timer) + this.#timer = null + } } } diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 3afc019ce29..a13eb1107c1 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -18,6 +18,8 @@ const { trace, context } = require('@opentelemetry/api') * @class Logger */ class Logger { + #instrumentationLibrary + /** * Creates a new Logger instance. * @@ -30,7 +32,7 @@ class Logger { */ constructor (loggerProvider, instrumentationLibrary) { this.loggerProvider = loggerProvider - this._instrumentationLibrary = { + this.#instrumentationLibrary = { name: instrumentationLibrary?.name || 'dd-trace-js', version: instrumentationLibrary?.version || require('../../../../../package.json').version } @@ -76,7 +78,7 @@ class Logger { const activeContext = logRecord.context || context.active() // Extract span context from the active context for trace correlation - const spanContext = this._getSpanContext(activeContext) + const spanContext = this.#getSpanContext(activeContext) // Create enriched log record with all expected fields // Contains: severityText, severityNumber, body, timestamp, observedTimestamp, @@ -90,7 +92,9 @@ class Logger { attributes: logRecord.attributes, resource: this.loggerProvider.resource, // Newer versions of the OpenTelemetry Logs API require instrumentationScope instead of instrumentationLibrary - instrumentationLibrary: logRecord.instrumentationScope || logRecord.instrumentationLibrary || this._instrumentationLibrary, + instrumentationLibrary: logRecord.instrumentationScope || + logRecord.instrumentationLibrary || + this.#instrumentationLibrary, traceId: spanContext?.traceId || '', spanId: spanContext?.spanId || '', traceFlags: spanContext?.traceFlags || 0 @@ -105,7 +109,7 @@ class Logger { * @returns {SpanContext|null} Span context or null if not available * @private */ - _getSpanContext (activeContext) { + #getSpanContext (activeContext) { const activeSpan = trace.getSpan(activeContext) if (activeSpan) { const spanContext = activeSpan.spanContext() diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index 7f27c2a44d2..5c127f12b6c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -19,6 +19,8 @@ const log = require('../../log') * @implements {import('@opentelemetry/api-logs').LoggerProvider} */ class LoggerProvider { + #loggers + /** * Creates a new LoggerProvider instance with a single processor for Datadog Agent export. * @@ -30,7 +32,7 @@ class LoggerProvider { constructor (options = {}) { this.resource = options.resource this.processor = options.processor - this._loggers = new Map() + this.#loggers = new Map() this.isShutdown = false } @@ -44,7 +46,7 @@ class LoggerProvider { */ getLogger (nameOrOptions, version, options = {}) { if (this.isShutdown) { - return this._createNoOpLogger() + return this.#createNoOpLogger() } let name, loggerOptions @@ -59,30 +61,10 @@ class LoggerProvider { const loggerVersion = loggerOptions.version || '' const key = `${name}@${loggerVersion}` - if (!this._loggers.has(key)) { - this._loggers.set(key, new Logger(this, { name, version: loggerVersion })) - } - return this._loggers.get(key) - } - - /** - * Creates a no-op logger for use when the provider is shutdown. - * @returns {Logger} A no-op logger instance - * @private - */ - _createNoOpLogger () { - return { - instrumentationLibrary: { - name: 'dd-trace-js', - version: '' - }, - emit: () => {}, - debug: () => {}, - info: () => {}, - warn: () => {}, - error: () => {}, - fatal: () => {} + if (!this.#loggers.has(key)) { + this.#loggers.set(key, new Logger(this, { name, version: loggerVersion })) } + return this.#loggers.get(key) } /** @@ -132,6 +114,26 @@ class LoggerProvider { return this.processor.shutdown() } + + /** + * Creates a no-op logger for use when the provider is shutdown. + * @returns {Logger} A no-op logger instance + * @private + */ + #createNoOpLogger () { + return { + instrumentationLibrary: { + name: 'dd-trace-js', + version: '' + }, + emit: () => {}, + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {}, + fatal: () => {} + } + } } module.exports = LoggerProvider diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 37ef5b71c1b..7a05af64598 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -18,6 +18,8 @@ const tracerMetrics = telemetryMetrics.manager.namespace('tracers') * @class OtlpHttpLogExporter */ class OtlpHttpLogExporter { + #telemetryTags + /** * Creates a new OtlpHttpLogExporter instance. * @@ -38,13 +40,13 @@ class OtlpHttpLogExporter { this.headers = { 'Content-Type': contentType, - ...this._parseAdditionalHeaders(headers) + ...this.#parseAdditionalHeaders(headers) } this.timeout = timeout this.transformer = new OtlpTransformer(resource, protocol) // Pre-compute telemetry tags for efficiency - this._telemetryTags = [ + this.#telemetryTags = [ `protocol:${this.protocol.startsWith('grpc') ? 'grpc' : 'http'}`, `encoding:${this.protocol === 'http/json' ? 'json' : 'protobuf'}` ] @@ -67,7 +69,7 @@ class OtlpHttpLogExporter { // Track telemetry metric for OTLP log records try { - tracerMetrics.count('otel.log_records', this._telemetryTags) + tracerMetrics.count('otel.log_records', this.#telemetryTags) .inc(logRecords.length) } catch (telemetryError) { log.debug('Error tracking OTLP log records telemetry:', telemetryError) @@ -80,26 +82,6 @@ class OtlpHttpLogExporter { } } - /** - * Parses additional HTTP headers from a comma-separated string. - * @param {string} headersString - Comma-separated key=value pairs - * @returns {Record} Parsed headers object - * @private - */ - _parseAdditionalHeaders (headersString) { - if (!headersString || typeof headersString !== 'string') { - return {} - } - - return Object.fromEntries( - headersString - .split(',') - .map(pair => pair.trim().split('=')) - .filter(([key, value]) => key && value) - .map(([key, value]) => [key.trim(), value.trim()]) - ) - } - /** * Sends the payload via HTTP request. * @param {Buffer|string} payload - The payload to send @@ -162,6 +144,26 @@ class OtlpHttpLogExporter { shutdown () { return Promise.resolve() } + + /** + * Parses additional HTTP headers from a comma-separated string. + * @param {string} headersString - Comma-separated key=value pairs + * @returns {Record} Parsed headers object + * @private + */ + #parseAdditionalHeaders (headersString) { + if (!headersString || typeof headersString !== 'string') { + return {} + } + + return Object.fromEntries( + headersString + .split(',') + .map(pair => pair.trim().split('=')) + .filter(([key, value]) => key && value) + .map(([key, value]) => [key.trim(), value.trim()]) + ) + } } module.exports = OtlpHttpLogExporter diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 99348f89bc3..053d6c70c6e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -12,6 +12,9 @@ const { getProtobufTypes } = require('./protobuf_loader') * @class OtlpTransformer */ class OtlpTransformer { + #protobufTypes + #resourceAttributes + /** * Creates a new OtlpTransformer instance. * @@ -19,22 +22,9 @@ class OtlpTransformer { * @param {string} protocol - OTLP protocol (http/protobuf or http/json) */ constructor (resourceAttributes, protocol) { - this._resourceAttributes = this._transformAttributes(resourceAttributes) + this.#resourceAttributes = this.#transformAttributes(resourceAttributes) this.protocol = protocol - this._protobufTypes = null - } - - /** - * Gets the protobuf types, loading them lazily to reduce startup overhead. - * @returns {Object} Protobuf types object - * @private - */ - _getProtobufTypes () { - // Delay the loading of protobuf types to reduce startup overhead - if (!this._protobufTypes) { - this._protobufTypes = getProtobufTypes() - } - return this._protobufTypes + this.#protobufTypes = null } /** @@ -45,10 +35,23 @@ class OtlpTransformer { transformLogRecords (logRecords) { // Use the configured protocol to determine serialization format if (this.protocol === 'http/json') { - return this._transformToJson(logRecords) + return this.#transformToJson(logRecords) } // Default to protobuf for http/protobuf or any other protocol - return this._transformToProtobuf(logRecords) + return this.#transformToProtobuf(logRecords) + } + + /** + * Gets the protobuf types, loading them lazily to reduce startup overhead. + * @returns {Object} Protobuf types object + * @private + */ + #getProtobufTypes () { + // Delay the loading of protobuf types to reduce startup overhead + if (!this.#protobufTypes) { + this.#protobufTypes = getProtobufTypes() + } + return this.#protobufTypes } /** @@ -57,16 +60,16 @@ class OtlpTransformer { * @returns {Buffer} Protobuf-encoded log records * @private */ - _transformToProtobuf (logRecords) { - const { _logsService } = this._getProtobufTypes() + #transformToProtobuf (logRecords) { + const { _logsService } = this.#getProtobufTypes() // Create the OTLP LogsData structure const logsData = { resourceLogs: [{ - resource: this._transformResource(), + resource: this.#transformResource(), scopeLogs: [{ - scope: this._transformScope(logRecords[0]?.instrumentationLibrary), - logRecords: logRecords.map(record => this._transformLogRecord(record)) + scope: this.#transformScope(logRecords[0]?.instrumentationLibrary), + logRecords: logRecords.map(record => this.#transformLogRecord(record)) }] }] } @@ -84,14 +87,14 @@ class OtlpTransformer { * @returns {Buffer} JSON-encoded log records * @private */ - _transformToJson (logRecords) { + #transformToJson (logRecords) { // JSON transformation for http/json protocol const logsData = { resourceLogs: [{ - resource: this._transformResource(), + resource: this.#transformResource(), scopeLogs: [{ - scope: this._transformScope(logRecords[0]?.instrumentationLibrary), - logRecords: logRecords.map(record => this._transformLogRecord(record)) + scope: this.#transformScope(logRecords[0]?.instrumentationLibrary), + logRecords: logRecords.map(record => this.#transformLogRecord(record)) }] }] } @@ -104,7 +107,7 @@ class OtlpTransformer { * @returns {Object} OTLP scope object * @private */ - _transformScope (instrumentationLibrary) { + #transformScope (instrumentationLibrary) { return { name: instrumentationLibrary?.name || 'dd-trace-js', version: instrumentationLibrary?.version || '', @@ -118,9 +121,9 @@ class OtlpTransformer { * @returns {Object} OTLP resource object * @private */ - _transformResource () { + #transformResource () { return { - attributes: this._resourceAttributes, + attributes: this.#resourceAttributes, droppedAttributesCount: 0 } } @@ -131,20 +134,20 @@ class OtlpTransformer { * @returns {Object} OTLP log record object * @private */ - _transformLogRecord (logRecord) { + #transformLogRecord (logRecord) { const timestamp = logRecord.timestamp || Date.now() * 1_000_000 return { timeUnixNano: timestamp, observedTimeUnixNano: timestamp, - severityNumber: this._mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), + severityNumber: this.#mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), severityText: logRecord.severityText || 'INFO', - body: this._transformBody(logRecord.body), - attributes: this._transformAttributes(logRecord.attributes), + body: this.#transformBody(logRecord.body), + attributes: this.#transformAttributes(logRecord.attributes), droppedAttributesCount: 0, flags: logRecord.flags || 0, - traceId: this._hexToBytes(logRecord.traceId || ''), - spanId: this._hexToBytes(logRecord.spanId || '') + traceId: this.#hexToBytes(logRecord.traceId || ''), + spanId: this.#hexToBytes(logRecord.spanId || '') } } @@ -154,8 +157,8 @@ class OtlpTransformer { * @returns {number} Protobuf severity number * @private */ - _mapSeverityNumber (severityNumber) { - const { _severityNumber } = this._getProtobufTypes() + #mapSeverityNumber (severityNumber) { + const { _severityNumber } = this.#getProtobufTypes() if (!_severityNumber) { // eslint-disable-next-line no-console @@ -163,7 +166,7 @@ class OtlpTransformer { return 9 // Default to INFO } - const severityMap = this._createSeverityMap(_severityNumber) + const severityMap = this.#createSeverityMap(_severityNumber) return severityMap[severityNumber] || _severityNumber.values.SEVERITY_NUMBER_INFO } @@ -173,7 +176,7 @@ class OtlpTransformer { * @returns {Object} Severity mapping object * @private */ - _createSeverityMap (severityEnum) { + #createSeverityMap (severityEnum) { const map = {} map[SeverityNumber.TRACE] = severityEnum.values.SEVERITY_NUMBER_TRACE map[SeverityNumber.TRACE2] = severityEnum.values.SEVERITY_NUMBER_TRACE2 @@ -208,7 +211,7 @@ class OtlpTransformer { * @returns {Buffer} Buffer containing the hex data * @private */ - _hexToBytes (hexString) { + #hexToBytes (hexString) { if (!hexString || hexString.length === 0) { return Buffer.alloc(0) } @@ -225,7 +228,7 @@ class OtlpTransformer { * @returns {Object} OTLP AnyValue object * @private */ - _transformBody (body) { + #transformBody (body) { if (typeof body === 'string') { return { stringValue: body @@ -243,7 +246,7 @@ class OtlpTransformer { kvlistValue: { values: Object.entries(body).map(([key, value]) => ({ key, - value: this._transformAnyValue(value) + value: this.#transformAnyValue(value) })) } } @@ -259,13 +262,13 @@ class OtlpTransformer { * @returns {Object[]} Array of OTLP KeyValue objects * @private */ - _transformAttributes (attributes) { + #transformAttributes (attributes) { if (!attributes) { return {} } return Object.entries(attributes).map(([key, value]) => ({ key, - value: this._transformAnyValue(value) + value: this.#transformAnyValue(value) })) } @@ -275,7 +278,7 @@ class OtlpTransformer { * @returns {Object} OTLP AnyValue object * @private */ - _transformAnyValue (value) { + #transformAnyValue (value) { if (typeof value === 'string') { return { stringValue: value } } else if (typeof value === 'number') { @@ -288,7 +291,7 @@ class OtlpTransformer { } else if (Array.isArray(value)) { return { arrayValue: { - values: value.map(v => this._transformAnyValue(v)) + values: value.map(v => this.#transformAnyValue(v)) } } } else if (value && typeof value === 'object') { @@ -296,7 +299,7 @@ class OtlpTransformer { kvlistValue: { values: Object.entries(value).map(([k, v]) => ({ key: k, - value: this._transformAnyValue(v) + value: this.#transformAnyValue(v) })) } } diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index d60d81d81c9..a3a1c50b4a3 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -302,8 +302,9 @@ class Tracer extends NoopProxy { exporter, config.otelLogsBatchTimeout, config.otelLogsMaxExportBatchSize, - config.otelLogsMaxQueueSize, - config.otelLogsExportTimeoutMillis + // TODO: add support for max queue size and export timeout + // config.otelLogsMaxQueueSize, + // config.otelLogsExportTimeoutMillis ) // Create logger provider with processor for Datadog Agent export diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 673e4c73ba0..58cc7f0f6c0 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -1,5 +1,8 @@ 'use strict' +// Increase max listeners to avoid warnings in tests +process.setMaxListeners(50) + const assert = require('assert') const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') @@ -20,11 +23,12 @@ describe('OpenTelemetry Logs', () => { function mockOtlpExport (validator, protocol = 'protobuf') { const OtlpHttpLogExporter = require('../../src/opentelemetry/logs/otlp_http_log_exporter') + const { _logsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() sinon.stub(OtlpHttpLogExporter.prototype, '_sendPayload').callsFake((payload, callback) => { try { const decoded = protocol === 'json' ? JSON.parse(payload.toString()) - : require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes()._logsService.decode(payload) + : _logsService.decode(payload) validator(decoded) callback({ code: 0 }) } catch (error) { @@ -117,7 +121,7 @@ describe('OpenTelemetry Logs', () => { }) const { logs } = setupTracer() - logs.getLogger('test-logger').emit({ + logs.getLogger('test-logger').emit({ body: 'Scope test', instrumentationScope: { name: 'custom-scope', version: '2.0.0' } }) From 11161f34717acc18a10862e295de9d038b975979 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 26 Sep 2025 00:36:23 -0400 Subject: [PATCH 33/61] clean up tests --- .../dd-trace/src/opentelemetry/logs/logger.js | 9 +- .../logs/otlp_http_log_exporter.js | 43 ++-- .../opentelemetry/logs/otlp_transformer.js | 71 +++--- .../src/opentelemetry/logs/protobuf_loader.js | 43 ++-- packages/dd-trace/src/plugin_manager.js | 2 - packages/dd-trace/src/proxy.js | 108 ++++----- .../dd-trace/test/opentelemetry/logs.spec.js | 107 +++++++-- .../test/opentelemetry/protobuf.spec.js | 205 ------------------ 8 files changed, 214 insertions(+), 374 deletions(-) delete mode 100644 packages/dd-trace/test/opentelemetry/protobuf.spec.js diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index a13eb1107c1..a7c57b486b9 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -2,7 +2,7 @@ const { sanitizeAttributes } = require('@opentelemetry/core') const { trace, context } = require('@opentelemetry/api') - +const packageVersion = require('../../../../../package.json').version /** * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord * @typedef {import('@opentelemetry/api').SpanContext} SpanContext @@ -34,7 +34,7 @@ class Logger { this.loggerProvider = loggerProvider this.#instrumentationLibrary = { name: instrumentationLibrary?.name || 'dd-trace-js', - version: instrumentationLibrary?.version || require('../../../../../package.json').version + version: instrumentationLibrary?.version || packageVersion } } @@ -113,10 +113,11 @@ class Logger { const activeSpan = trace.getSpan(activeContext) if (activeSpan) { const spanContext = activeSpan.spanContext() - if (spanContext && spanContext.traceId && spanContext.spanId) { + if (spanContext?.traceId && spanContext.spanId) { return { traceId: spanContext.traceId, - spanId: spanContext.spanId + spanId: spanContext.spanId, + traceFlags: spanContext.traceFlags } } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 7a05af64598..15911f24254 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -1,6 +1,5 @@ 'use strict' -const https = require('https') const http = require('http') const { URL } = require('url') const log = require('../../log') @@ -47,7 +46,7 @@ class OtlpHttpLogExporter { // Pre-compute telemetry tags for efficiency this.#telemetryTags = [ - `protocol:${this.protocol.startsWith('grpc') ? 'grpc' : 'http'}`, + 'protocol:http', `encoding:${this.protocol === 'http/json' ? 'json' : 'protobuf'}` ] } @@ -64,22 +63,9 @@ class OtlpHttpLogExporter { return } - try { - const payload = this.transformer.transformLogRecords(logRecords) - - // Track telemetry metric for OTLP log records - try { - tracerMetrics.count('otel.log_records', this.#telemetryTags) - .inc(logRecords.length) - } catch (telemetryError) { - log.debug('Error tracking OTLP log records telemetry:', telemetryError) - } - - this._sendPayload(payload, resultCallback) - } catch (error) { - log.error('Error transforming log records:', error) - resultCallback({ code: 1, error }) - } + const payload = this.transformer.transformLogRecords(logRecords) + this._sendPayload(payload, resultCallback) + tracerMetrics.count('otel.log_records', this.#telemetryTags).inc(logRecords.length) } /** @@ -90,12 +76,10 @@ class OtlpHttpLogExporter { */ _sendPayload (payload, resultCallback) { const url = new URL(this.url) - const isHttps = url.protocol === 'https:' - const client = isHttps ? https : http const options = { hostname: url.hostname, - port: url.port || (isHttps ? 443 : 4318), + port: url.port, path: url.pathname + url.search, method: 'POST', headers: { @@ -105,7 +89,7 @@ class OtlpHttpLogExporter { timeout: this.timeout } - const req = client.request(options, (res) => { + const req = http.request(options, (res) => { let data = '' res.on('data', (chunk) => { @@ -156,13 +140,14 @@ class OtlpHttpLogExporter { return {} } - return Object.fromEntries( - headersString - .split(',') - .map(pair => pair.trim().split('=')) - .filter(([key, value]) => key && value) - .map(([key, value]) => [key.trim(), value.trim()]) - ) + const headers = {} + for (const pair of headersString.split(',')) { + const [key, value] = pair.trim().split('=') + if (key && value) { + headers[key.trim()] = value.trim() + } + } + return headers } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 053d6c70c6e..54082b52add 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -3,6 +3,35 @@ const { SeverityNumber } = require('@opentelemetry/api-logs') const { getProtobufTypes } = require('./protobuf_loader') +// Global severity mapping constant - no need to regenerate +const SEVERITY_MAP = { + [SeverityNumber.TRACE]: 'SEVERITY_NUMBER_TRACE', + [SeverityNumber.TRACE2]: 'SEVERITY_NUMBER_TRACE2', + [SeverityNumber.TRACE3]: 'SEVERITY_NUMBER_TRACE3', + [SeverityNumber.TRACE4]: 'SEVERITY_NUMBER_TRACE4', + [SeverityNumber.DEBUG]: 'SEVERITY_NUMBER_DEBUG', + [SeverityNumber.DEBUG2]: 'SEVERITY_NUMBER_DEBUG2', + [SeverityNumber.DEBUG3]: 'SEVERITY_NUMBER_DEBUG3', + [SeverityNumber.DEBUG4]: 'SEVERITY_NUMBER_DEBUG4', + [SeverityNumber.INFO]: 'SEVERITY_NUMBER_INFO', + [SeverityNumber.INFO2]: 'SEVERITY_NUMBER_INFO2', + [SeverityNumber.INFO3]: 'SEVERITY_NUMBER_INFO3', + [SeverityNumber.INFO4]: 'SEVERITY_NUMBER_INFO4', + [SeverityNumber.WARN]: 'SEVERITY_NUMBER_WARN', + [SeverityNumber.WARN2]: 'SEVERITY_NUMBER_WARN2', + [SeverityNumber.WARN3]: 'SEVERITY_NUMBER_WARN3', + [SeverityNumber.WARN4]: 'SEVERITY_NUMBER_WARN4', + [SeverityNumber.ERROR]: 'SEVERITY_NUMBER_ERROR', + [SeverityNumber.ERROR2]: 'SEVERITY_NUMBER_ERROR2', + [SeverityNumber.ERROR3]: 'SEVERITY_NUMBER_ERROR3', + [SeverityNumber.ERROR4]: 'SEVERITY_NUMBER_ERROR4', + [SeverityNumber.FATAL]: 'SEVERITY_NUMBER_FATAL', + [SeverityNumber.FATAL2]: 'SEVERITY_NUMBER_FATAL2', + [SeverityNumber.FATAL3]: 'SEVERITY_NUMBER_FATAL3', + [SeverityNumber.FATAL4]: 'SEVERITY_NUMBER_FATAL4' +} +const log = require('../../log') + /** * OtlpTransformer transforms log records to OTLP format. * @@ -161,48 +190,12 @@ class OtlpTransformer { const { _severityNumber } = this.#getProtobufTypes() if (!_severityNumber) { - // eslint-disable-next-line no-console - console.error('_severityNumber is undefined') + log.error('_severityNumber is undefined') return 9 // Default to INFO } - const severityMap = this.#createSeverityMap(_severityNumber) - return severityMap[severityNumber] || _severityNumber.values.SEVERITY_NUMBER_INFO - } - - /** - * Creates a mapping from OpenTelemetry severity numbers to protobuf severity numbers. - * @param {Object} severityEnum - Protobuf severity enum - * @returns {Object} Severity mapping object - * @private - */ - #createSeverityMap (severityEnum) { - const map = {} - map[SeverityNumber.TRACE] = severityEnum.values.SEVERITY_NUMBER_TRACE - map[SeverityNumber.TRACE2] = severityEnum.values.SEVERITY_NUMBER_TRACE2 - map[SeverityNumber.TRACE3] = severityEnum.values.SEVERITY_NUMBER_TRACE3 - map[SeverityNumber.TRACE4] = severityEnum.values.SEVERITY_NUMBER_TRACE4 - map[SeverityNumber.DEBUG] = severityEnum.values.SEVERITY_NUMBER_DEBUG - map[SeverityNumber.DEBUG2] = severityEnum.values.SEVERITY_NUMBER_DEBUG2 - map[SeverityNumber.DEBUG3] = severityEnum.values.SEVERITY_NUMBER_DEBUG3 - map[SeverityNumber.DEBUG4] = severityEnum.values.SEVERITY_NUMBER_DEBUG4 - map[SeverityNumber.INFO] = severityEnum.values.SEVERITY_NUMBER_INFO - map[SeverityNumber.INFO2] = severityEnum.values.SEVERITY_NUMBER_INFO2 - map[SeverityNumber.INFO3] = severityEnum.values.SEVERITY_NUMBER_INFO3 - map[SeverityNumber.INFO4] = severityEnum.values.SEVERITY_NUMBER_INFO4 - map[SeverityNumber.WARN] = severityEnum.values.SEVERITY_NUMBER_WARN - map[SeverityNumber.WARN2] = severityEnum.values.SEVERITY_NUMBER_WARN2 - map[SeverityNumber.WARN3] = severityEnum.values.SEVERITY_NUMBER_WARN3 - map[SeverityNumber.WARN4] = severityEnum.values.SEVERITY_NUMBER_WARN4 - map[SeverityNumber.ERROR] = severityEnum.values.SEVERITY_NUMBER_ERROR - map[SeverityNumber.ERROR2] = severityEnum.values.SEVERITY_NUMBER_ERROR2 - map[SeverityNumber.ERROR3] = severityEnum.values.SEVERITY_NUMBER_ERROR3 - map[SeverityNumber.ERROR4] = severityEnum.values.SEVERITY_NUMBER_ERROR4 - map[SeverityNumber.FATAL] = severityEnum.values.SEVERITY_NUMBER_FATAL - map[SeverityNumber.FATAL2] = severityEnum.values.SEVERITY_NUMBER_FATAL2 - map[SeverityNumber.FATAL3] = severityEnum.values.SEVERITY_NUMBER_FATAL3 - map[SeverityNumber.FATAL4] = severityEnum.values.SEVERITY_NUMBER_FATAL4 - return map + const severityName = SEVERITY_MAP[severityNumber] || 'SEVERITY_NUMBER_INFO' + return _severityNumber.values[severityName] } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js index 65e7d01217f..0dd3080e2eb 100644 --- a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js @@ -29,34 +29,29 @@ function loadProtobufDefinitions () { if (_root) { return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } } + // Load the proto files + const protoDir = __dirname + const protoFiles = [ + 'common.proto', + 'resource.proto', + 'logs.proto', + 'payload.proto' + ].map(file => path.join(protoDir, file)) - try { - // Load the proto files - const protoDir = __dirname - const protoFiles = [ - 'common.proto', - 'resource.proto', - 'logs.proto', - 'payload.proto' - ].map(file => path.join(protoDir, file)) - - if (!protoFiles.every(file => fs.existsSync(file))) { - throw new Error('Proto files not found') - } + if (!protoFiles.every(file => fs.existsSync(file))) { + throw new Error('Proto files not found') + } - _root = protobuf.loadSync(protoFiles) + _root = protobuf.loadSync(protoFiles) - // Get the message types - _logsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') - _resourceLogs = _root.lookupType('opentelemetry.proto.logs.v1.ResourceLogs') - _scopeLogs = _root.lookupType('opentelemetry.proto.logs.v1.ScopeLogs') - _logRecord = _root.lookupType('opentelemetry.proto.logs.v1.LogRecord') - _severityNumber = _root.lookupEnum('opentelemetry.proto.logs.v1.SeverityNumber') + // Get the message types + _logsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') + _resourceLogs = _root.lookupType('opentelemetry.proto.logs.v1.ResourceLogs') + _scopeLogs = _root.lookupType('opentelemetry.proto.logs.v1.ScopeLogs') + _logRecord = _root.lookupType('opentelemetry.proto.logs.v1.LogRecord') + _severityNumber = _root.lookupEnum('opentelemetry.proto.logs.v1.SeverityNumber') - return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } - } catch (error) { - throw new Error(`Failed to load protobuf definitions: ${error.message}`) - } + return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } } // Lazy load the protobuf definitions diff --git a/packages/dd-trace/src/plugin_manager.js b/packages/dd-trace/src/plugin_manager.js index cb02ea8399b..deefda3f2af 100644 --- a/packages/dd-trace/src/plugin_manager.js +++ b/packages/dd-trace/src/plugin_manager.js @@ -159,7 +159,6 @@ module.exports = class PluginManager { memcachedCommandEnabled, ciVisibilityTestSessionName, ciVisAgentlessLogSubmissionEnabled, - otelLogsEnabled, isTestDynamicInstrumentationEnabled, isServiceUserProvided, middlewareTracingEnabled, @@ -180,7 +179,6 @@ module.exports = class PluginManager { clientIpHeader, ciVisibilityTestSessionName, ciVisAgentlessLogSubmissionEnabled, - otelLogsEnabled, isTestDynamicInstrumentationEnabled, isServiceUserProvided, traceWebsocketMessagesEnabled, diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index a3a1c50b4a3..ef07987c313 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -11,6 +11,7 @@ const nomenclature = require('./service-naming') const PluginManager = require('./plugin_manager') const NoopDogStatsDClient = require('./noop/dogstatsd') const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper') +let LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter, logs, os const { setBaggageItem, getBaggageItem, @@ -202,7 +203,7 @@ class Tracer extends NoopProxy { } if (config.otelLogsEnabled) { - this._initializeOpenTelemetryLogs(config) + this.#initializeOpenTelemetryLogs(config) } if (config.isTestDynamicInstrumentationEnabled) { @@ -265,61 +266,62 @@ class Tracer extends NoopProxy { } } - _initializeOpenTelemetryLogs (config) { - try { - const { LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter } = require('./opentelemetry/logs') - const { logs } = require('@opentelemetry/api-logs') - const os = require('os') - - // Build resource attributes - const resourceAttributes = { - 'service.name': config.service, - 'service.version': config.version, - 'deployment.environment': config.env - } - - // Add all tracer tags (includes DD_TAGS, OTEL_RESOURCE_ATTRIBUTES, DD_TRACE_TAGS, etc.) - if (config.tags && Object.keys(config.tags).length > 0) { - Object.assign(resourceAttributes, config.tags) - } - - // Add host.name if reportHostname is enabled - if (config.reportHostname) { - resourceAttributes['host.name'] = os.hostname() - } - - // Create OTLP exporter using resolved config values - const exporter = new OtlpHttpLogExporter( - config.otelLogsUrl, - config.otelLogsHeaders, - config.otelLogsTimeout, - config.otelLogsProtocol, - resourceAttributes - ) - - // Create batch processor for exporting logs to Datadog Agent - const processor = new BatchLogRecordProcessor( - exporter, - config.otelLogsBatchTimeout, - config.otelLogsMaxExportBatchSize, - // TODO: add support for max queue size and export timeout - // config.otelLogsMaxQueueSize, - // config.otelLogsExportTimeoutMillis - ) - - // Create logger provider with processor for Datadog Agent export - const loggerProvider = new LoggerProvider({ - resource: { attributes: resourceAttributes }, - processor - }) + #initializeOpenTelemetryLogs (config) { + LoggerProvider ??= require('./opentelemetry/logs').LoggerProvider + BatchLogRecordProcessor ??= require('./opentelemetry/logs').BatchLogRecordProcessor + OtlpHttpLogExporter ??= require('./opentelemetry/logs').OtlpHttpLogExporter + logs ??= require('@opentelemetry/api-logs').logs + os ??= require('os') + + // Build resource attributes + const resourceAttributes = { + 'service.name': config.service, + 'service.version': config.version, + 'deployment.environment': config.env + } - // Register the logger provider globally with OpenTelemetry API - logs.setGlobalLoggerProvider(loggerProvider) + // Add all tracer tags (includes DD_TAGS, OTEL_RESOURCE_ATTRIBUTES, DD_TRACE_TAGS, etc.) + // Exclude Datadog-style keys that duplicate OpenTelemetry standard keys + if (config.tags) { + const filteredTags = { ...config.tags } + delete filteredTags.service + delete filteredTags.version + delete filteredTags.env + Object.assign(resourceAttributes, filteredTags) + } - log.debug('OpenTelemetry logs initialized successfully') - } catch (error) { - log.error('Failed to initialize OpenTelemetry logs:', error) + // Add host.name if reportHostname is enabled + if (config.reportHostname) { + resourceAttributes['host.name'] = os.hostname() } + + // Create OTLP exporter using resolved config values + const exporter = new OtlpHttpLogExporter( + config.otelLogsUrl, + config.otelLogsHeaders, + config.otelLogsTimeout, + config.otelLogsProtocol, + resourceAttributes + ) + + // Create batch processor for exporting logs to Datadog Agent + const processor = new BatchLogRecordProcessor( + exporter, + config.otelLogsBatchTimeout, + config.otelLogsMaxExportBatchSize, + // TODO: add support for max queue size and export timeout + // config.otelLogsMaxQueueSize, + // config.otelLogsExportTimeoutMillis + ) + + // Create logger provider with processor for Datadog Agent export + const loggerProvider = new LoggerProvider({ + resource: { attributes: resourceAttributes }, + processor + }) + + // Register the logger provider globally with OpenTelemetry API + logs.setGlobalLoggerProvider(loggerProvider) } profilerStarted () { diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 58cc7f0f6c0..dffececc9fb 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -7,13 +7,13 @@ const assert = require('assert') const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') +require('../setup/core') describe('OpenTelemetry Logs', () => { let originalEnv function setupTracer (enabled = true) { process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' - process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '1' const tracer = require('../../') tracer._initialized = false tracer.init() @@ -126,9 +126,96 @@ describe('OpenTelemetry Logs', () => { instrumentationScope: { name: 'custom-scope', version: '2.0.0' } }) }) + + it('sends payload with expected format', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'x-api-key=test123' + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '1' + process.env.DD_SERVICE = 'test-service' + process.env.DD_VERSION = 'testversion' + process.env.DD_ENV = 'testenv' + process.env.DD_TAGS = 'testtag:testvalue' + + const http = require('http') + let capturedPayload, capturedHeaders + + sinon.stub(http, 'request').callsFake((options, callback) => { + capturedHeaders = options.headers + const mockReq = { + write: (data) => { capturedPayload = data }, + end: () => {}, + on: () => {} + } + callback({ statusCode: 200, on: () => {} }) + return mockReq + }) + + const { logs } = setupTracer() + const { trace, context } = require('@opentelemetry/api') + + logs.getLogger('test-service', '1.0.0').emit({ + severityText: 'ERROR', + severityNumber: 17, + body: 'HTTP test message', + attributes: { 'test.attr': 'value' }, + context: trace.setSpan(context.active(), createMockSpan()), + }) + + // Validate complete OTLP payload structure as JSON + const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') + const { _logsService } = getProtobufTypes() + const decoded = _logsService.decode(capturedPayload) + const actual = JSON.parse(JSON.stringify(decoded.toJSON())) + + const attrs = actual.resourceLogs[0].resource.attributes + const runtimeId = attrs.find(a => a.key === 'runtime-id').value.stringValue + const clientId = attrs.find(a => a.key === '_dd.rc.client_id').value.stringValue + + const expected = { + resourceLogs: [{ + resource: { + attributes: [ + { key: 'service.name', value: { stringValue: 'test-service' } }, + { key: 'service.version', value: { stringValue: 'testversion' } }, + { key: 'deployment.environment', value: { stringValue: 'testenv' } }, + { key: 'testtag', value: { stringValue: 'testvalue' } }, + { key: 'runtime-id', value: { stringValue: runtimeId } }, + { key: '_dd.rc.client_id', value: { stringValue: clientId } } + ], + droppedAttributesCount: 0 + }, + scopeLogs: [{ + scope: { + name: 'test-service', + version: '1.0.0', + droppedAttributesCount: 0 + }, + logRecords: [{ + body: { stringValue: 'HTTP test message' }, + severityText: 'ERROR', + severityNumber: 'SEVERITY_NUMBER_ERROR', + attributes: [{ key: 'test.attr', value: { stringValue: 'value' } }], + timeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].timeUnixNano, + observedTimeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].observedTimeUnixNano, + flags: 0, + spanId: Buffer.from('1234567890abcdef', 'hex').toString('base64'), + traceId: Buffer.from('1234567890abcdef1234567890abcdef', 'hex').toString('base64') + }] + }] + }] + } + + assert.deepStrictEqual(actual, expected) + // Validate complete headers structure + const expectedHeaders = { + 'Content-Length': capturedHeaders['Content-Length'], + 'Content-Type': 'application/x-protobuf', + 'x-api-key': 'test123' + } + assert.deepStrictEqual(capturedHeaders, expectedHeaders) + }) }) - describe('Configuration', () => { + describe('Configurations', () => { it('uses default protobuf protocol', () => { delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL @@ -155,21 +242,6 @@ describe('OpenTelemetry Logs', () => { logMock.restore() }) - it('configures resource attributes from environment variables', () => { - process.env.DD_TAGS = 'team:backend,region:us-west-2' - process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.namespace=api' - const { loggerProvider } = setupTracer() - const resourceAttrs = loggerProvider.resource.attributes - assert.strictEqual(resourceAttrs.team, 'backend') - assert.strictEqual(resourceAttrs['service.namespace'], 'api') - }) - - it('includes hostname in resource when reportHostname is enabled', () => { - process.env.DD_TRACE_REPORT_HOSTNAME = 'true' - const { loggerProvider } = setupTracer() - assert(typeof loggerProvider.resource.attributes['host.name'] === 'string') - }) - it('configures custom OTLP endpoint', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' const { loggerProvider } = setupTracer() @@ -197,7 +269,6 @@ describe('OpenTelemetry Logs', () => { describe('Telemetry Metrics', () => { it('tracks telemetry metrics for exported logs', () => { - require('../setup/core') const telemetryMetrics = { manager: { namespace: sinon.stub().returns({ count: sinon.stub().returns({ inc: sinon.spy() }) }) } } diff --git a/packages/dd-trace/test/opentelemetry/protobuf.spec.js b/packages/dd-trace/test/opentelemetry/protobuf.spec.js deleted file mode 100644 index 4a421051d75..00000000000 --- a/packages/dd-trace/test/opentelemetry/protobuf.spec.js +++ /dev/null @@ -1,205 +0,0 @@ -'use strict' - -const { expect } = require('chai') -const { describe, it, beforeEach } = require('tap').mocha -const OtlpTransformer = require('../../src/opentelemetry/logs/otlp_transformer') -const { SeverityNumber } = require('@opentelemetry/api-logs') - -describe('OTLP Protobuf Serialization', () => { - let transformer - - beforeEach(() => { - transformer = new OtlpTransformer({ - resource: { - attributes: { - 'service.name': 'test-service', - 'service.version': '1.0.0', - 'deployment.environment': 'test' - } - } - }) - }) - - it('should serialize log records to protobuf format', () => { - const logRecords = [ - { - timestamp: Date.now() * 1000000, - severityNumber: SeverityNumber.INFO, - severityText: 'INFO', - body: 'Test log message', - attributes: { - 'test.attribute': 'test-value', - 'user.id': '12345' - } - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should handle different severity levels', () => { - const logRecords = [ - { - severityNumber: SeverityNumber.DEBUG, - severityText: 'DEBUG', - body: 'Debug message' - }, - { - severityNumber: SeverityNumber.ERROR, - severityText: 'ERROR', - body: 'Error message' - }, - { - severityNumber: SeverityNumber.FATAL, - severityText: 'FATAL', - body: 'Fatal message' - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should handle trace and span IDs', () => { - const logRecords = [ - { - body: 'Test message with trace context', - traceId: '12345678901234567890123456789012', - spanId: '1234567890123456' - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should handle different body types', () => { - const logRecords = [ - { - body: 'String message', - severityNumber: SeverityNumber.INFO - }, - { - body: 42, - severityNumber: SeverityNumber.INFO - }, - { - body: true, - severityNumber: SeverityNumber.INFO - }, - { - body: { nested: { value: 'object' } }, - severityNumber: SeverityNumber.INFO - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should handle array attributes', () => { - const logRecords = [ - { - body: 'Message with array attributes', - attributes: { - tags: ['tag1', 'tag2', 'tag3'], - numbers: [1, 2, 3, 4, 5], - mixed: ['string', 42, true, { nested: 'object' }] - } - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('Should serialize log records to json format', () => { - const transformer = new OtlpTransformer({ - attributes: { - 'service.name': 'test-service' - } - }, 'http/json') - - const logRecords = [ - { - body: 'Test message', - severityNumber: SeverityNumber.INFO - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - - // Should be JSON (starts with {) - expect(result.toString('utf8').startsWith('{')).to.be.true - }) - - it('should handle empty log records', () => { - const result = transformer.transformLogRecords([]) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should handle missing instrumentation library', () => { - const logRecords = [ - { - body: 'Message without instrumentation library', - severityNumber: SeverityNumber.INFO - } - ] - - const result = transformer.transformLogRecords(logRecords) - - expect(result).to.be.instanceOf(Buffer) - expect(result.length).to.be.greaterThan(0) - }) - - it('should convert hex strings to bytes correctly', () => { - const transformer = new OtlpTransformer() - - // Test empty string - expect(transformer._hexToBytes('')).to.deep.equal(Buffer.alloc(0)) - - // Test with 0x prefix - const result1 = transformer._hexToBytes('0x1234') - expect(result1).to.deep.equal(Buffer.from('1234', 'hex')) - - // Test without 0x prefix - const result2 = transformer._hexToBytes('1234') - expect(result2).to.deep.equal(Buffer.from('1234', 'hex')) - - // Test odd length (should be padded) - const result3 = transformer._hexToBytes('123') - expect(result3).to.deep.equal(Buffer.from('0123', 'hex')) - }) - - it('should map severity numbers correctly', () => { - const transformer = new OtlpTransformer() - - // Test INFO mapping - const infoSeverity = transformer._mapSeverityNumber(SeverityNumber.INFO) - expect(infoSeverity).to.be.a('number') - - // Test ERROR mapping - const errorSeverity = transformer._mapSeverityNumber(SeverityNumber.ERROR) - expect(errorSeverity).to.be.a('number') - - // Test unknown severity (should default to INFO) - const unknownSeverity = transformer._mapSeverityNumber(999) - expect(unknownSeverity).to.be.a('number') - }) -}) From 266c936ebdcbb930fe859330bc768acc2652d6f2 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 26 Sep 2025 01:15:53 -0400 Subject: [PATCH 34/61] clean up yarn file --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 255418c7090..f47dc9dcb19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -683,18 +683,18 @@ dependencies: "@opentelemetry/semantic-conventions" "1.28.0" -"@opentelemetry/semantic-conventions@1.28.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" - integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== - "@opentelemetry/resources@>=1.0.0 <1.10.0": version "1.9.1" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.9.1.tgz" integrity sha512-VqBGbnAfubI+l+yrtYxeLyOoL358JK57btPMJDd3TCOV3mV5TNBmzvOfmesM4NeTyXuGJByd3XvOHvFezLn3rQ== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/semantic-conventions" "1.9.1" + "@opentelemetry/core" "1.30.1" + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/semantic-conventions@1.28.0": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== "@pkgjs/parseargs@^0.11.0": version "0.11.0" From d63a4edea58fbfbac2e37316f7be03d735c4a66f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 26 Sep 2025 01:18:35 -0400 Subject: [PATCH 35/61] remove unused configs --- docs/API.md | 2 -- packages/dd-trace/src/config.js | 6 +----- packages/dd-trace/src/config_defaults.js | 2 -- packages/dd-trace/src/proxy.js | 3 --- packages/dd-trace/src/supported-configurations.json | 1 - 5 files changed, 1 insertion(+), 13 deletions(-) diff --git a/docs/API.md b/docs/API.md index 67fc8575e39..a46b39f490e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -415,8 +415,6 @@ The Datadog SDK supports many of the configurations supported by the OpenTelemet - `OTEL_EXPORTER_OTLP_TIMEOUT` - Request timeout in milliseconds (default: `10000`) - `OTEL_BSP_SCHEDULE_DELAY` - Batch timeout in milliseconds (default: `5000`) - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` - Maximum logs per batch (default: `512`) -- `OTEL_BSP_MAX_QUEUE_SIZE` - Maximum queue size (default: `2048`) -- `OTEL_BSP_EXPORT_TIMEOUT` - Export timeout in milliseconds (default: `30000`) Logs are exported via OTLP over HTTP. The protocol can be configured using `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` or `OTEL_EXPORTER_OTLP_PROTOCOL` environment variables. Supported protocols are `http/protobuf` (default) and `http/json`. For complete OTLP exporter configuration options, see the [OpenTelemetry OTLP Exporter documentation](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/). diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 5d99e1a535b..4377138f0ce 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -660,9 +660,7 @@ class Config { OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTERS_OTLP_TIMEOUT, OTEL_BSP_SCHEDULE_DELAY, - OTEL_BSP_MAX_EXPORT_BATCH_SIZE, - OTEL_BSP_MAX_QUEUE_SIZE, - OTEL_BSP_EXPORT_TIMEOUT + OTEL_BSP_MAX_EXPORT_BATCH_SIZE } = getEnvironmentVariables() const tags = {} @@ -698,8 +696,6 @@ class Config { this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT || OTEL_EXPORTERS_OTLP_TIMEOUT) this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) - this._setUnit(env, 'otelLogsMaxQueueSize', OTEL_BSP_MAX_QUEUE_SIZE) - this._setUnit(env, 'otelLogsExportTimeoutMillis', OTEL_BSP_EXPORT_TIMEOUT) this._setBoolean(env, 'apmTracingEnabled', coalesce( DD_APM_TRACING_ENABLED, diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 662a028476e..d91d9a68f61 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -126,8 +126,6 @@ module.exports = { otelLogsTimeout: 10_000, otelLogsBatchTimeout: 5000, otelLogsMaxExportBatchSize: 512, - otelLogsMaxQueueSize: 2048, - otelLogsExportTimeoutMillis: 30_000, lookup: undefined, inferredProxyServicesEnabled: false, memcachedCommandEnabled: false, diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index ef07987c313..f62fd1c244d 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -309,9 +309,6 @@ class Tracer extends NoopProxy { exporter, config.otelLogsBatchTimeout, config.otelLogsMaxExportBatchSize, - // TODO: add support for max queue size and export timeout - // config.otelLogsMaxQueueSize, - // config.otelLogsExportTimeoutMillis ) // Create logger provider with processor for Datadog Agent export diff --git a/packages/dd-trace/src/supported-configurations.json b/packages/dd-trace/src/supported-configurations.json index efbcb3d5fd5..9d307d1fc18 100644 --- a/packages/dd-trace/src/supported-configurations.json +++ b/packages/dd-trace/src/supported-configurations.json @@ -445,7 +445,6 @@ "OTEL_BSP_SCHEDULE_DELAY": ["A"], "OTEL_BSP_MAX_EXPORT_BATCH_SIZE": ["A"], "OTEL_BSP_MAX_QUEUE_SIZE": ["A"], - "OTEL_BSP_EXPORT_TIMEOUT": ["A"], "OTEL_METRICS_EXPORTER": ["A"], "OTEL_PROPAGATORS": ["A"], "OTEL_RESOURCE_ATTRIBUTES": ["A"], From b98cd76bc68b2f0192741d3925abbc3fce091682 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 26 Sep 2025 13:02:43 -0400 Subject: [PATCH 36/61] fix context issues --- packages/dd-trace/src/config.js | 4 +- .../src/opentelemetry/logs/logger_provider.js | 12 +- .../logs/otlp_http_log_exporter.js | 20 +- packages/dd-trace/src/proxy.js | 7 +- .../dd-trace/test/opentelemetry/logs.spec.js | 181 +++++++++--------- 5 files changed, 115 insertions(+), 109 deletions(-) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 4377138f0ce..28e4464790c 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -656,7 +656,7 @@ class Config { OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_EXPORTERS_OTLP_ENDPOINT, + OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTERS_OTLP_TIMEOUT, OTEL_BSP_SCHEDULE_DELAY, @@ -679,7 +679,7 @@ class Config { this._setBoolean(env, 'otelLogsEnabled', isTrue(DD_LOGS_OTEL_ENABLED)) // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars // Only set if there's a custom URL, otherwise let calc phase handle the default - const customOtelLogsUrl = OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTERS_OTLP_ENDPOINT + const customOtelLogsUrl = OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTER_OTLP_ENDPOINT if (customOtelLogsUrl) { this._setString(env, 'otelLogsUrl', customOtelLogsUrl) } diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index 5c127f12b6c..6f351092823 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -1,10 +1,11 @@ 'use strict' const { logs } = require('@opentelemetry/api-logs') +const { context } = require('@opentelemetry/api') const Logger = require('./logger') const log = require('../../log') +const ContextManager = require('../context_manager') /** - * @typedef {import('@opentelemetry/resources').Resource} Resource * @typedef {import('@opentelemetry/api-logs').Logger} Logger * @typedef {import('./batch_log_processor')} BatchLogRecordProcessor */ @@ -20,19 +21,19 @@ const log = require('../../log') */ class LoggerProvider { #loggers + #contextManager /** * Creates a new LoggerProvider instance with a single processor for Datadog Agent export. * * @param {Object} [options] - LoggerProvider options - * @param {Resource} [options.resource] - Resource attributes * @param {BatchLogRecordProcessor} [options.processor] - Single LogRecordProcessor instance for * exporting logs to Datadog Agent */ constructor (options = {}) { - this.resource = options.resource this.processor = options.processor this.#loggers = new Map() + this.#contextManager = new ContextManager() this.isShutdown = false } @@ -75,7 +76,8 @@ class LoggerProvider { log.warn('Cannot register after shutdown') return } - + // Set context manager, this is required to correlate logs to spans + context.setGlobalContextManager(this.#contextManager) if (!logs.setGlobalLoggerProvider(this)) { logs.getLoggerProvider().setDelegate(this) } @@ -83,7 +85,7 @@ class LoggerProvider { /** * Forces a flush of all pending log records. - * @returns {Promise} Promise that resolves when flush is complete + * @returns {Promise} Promise that resolves when flush is n ssue cncomplete */ forceFlush () { if (this.isShutdown) { diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 15911f24254..91384c0ee4c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -64,17 +64,25 @@ class OtlpHttpLogExporter { } const payload = this.transformer.transformLogRecords(logRecords) - this._sendPayload(payload, resultCallback) + this.#sendPayload(payload, resultCallback) tracerMetrics.count('otel.log_records', this.#telemetryTags).inc(logRecords.length) } + /** + * Shuts down the exporter. + * @returns {Promise} Promise that resolves when shutdown is complete + */ + shutdown () { + return Promise.resolve() + } + /** * Sends the payload via HTTP request. * @param {Buffer|string} payload - The payload to send * @param {Function} resultCallback - Callback for the result * @private */ - _sendPayload (payload, resultCallback) { + #sendPayload (payload, resultCallback) { const url = new URL(this.url) const options = { @@ -121,14 +129,6 @@ class OtlpHttpLogExporter { req.end() } - /** - * Shuts down the exporter. - * @returns {Promise} Promise that resolves when shutdown is complete - */ - shutdown () { - return Promise.resolve() - } - /** * Parses additional HTTP headers from a comma-separated string. * @param {string} headersString - Comma-separated key=value pairs diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index f62fd1c244d..cabbdfce341 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -312,13 +312,10 @@ class Tracer extends NoopProxy { ) // Create logger provider with processor for Datadog Agent export - const loggerProvider = new LoggerProvider({ - resource: { attributes: resourceAttributes }, - processor - }) + const loggerProvider = new LoggerProvider({ processor }) // Register the logger provider globally with OpenTelemetry API - logs.setGlobalLoggerProvider(loggerProvider) + loggerProvider.register() } profilerStarted () { diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index dffececc9fb..78cbf6ee476 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -8,12 +8,14 @@ const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') require('../setup/core') +const { _logsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() describe('OpenTelemetry Logs', () => { let originalEnv function setupTracer (enabled = true) { process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '1' // Force immediate export const tracer = require('../../') tracer._initialized = false tracer.init() @@ -22,19 +24,33 @@ describe('OpenTelemetry Logs', () => { } function mockOtlpExport (validator, protocol = 'protobuf') { - const OtlpHttpLogExporter = require('../../src/opentelemetry/logs/otlp_http_log_exporter') - const { _logsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() - sinon.stub(OtlpHttpLogExporter.prototype, '_sendPayload').callsFake((payload, callback) => { - try { - const decoded = protocol === 'json' - ? JSON.parse(payload.toString()) - : _logsService.decode(payload) - validator(decoded) - callback({ code: 0 }) - } catch (error) { - callback({ code: 1, error }) + const http = require('http') + let capturedPayload, capturedHeaders + let validatorCalled = false + + sinon.stub(http, 'request').callsFake((options, callback) => { + capturedHeaders = options.headers + const mockReq = { + write: (data) => { capturedPayload = data }, + end: () => { + const decoded = protocol === 'json' + ? JSON.parse(capturedPayload.toString()) + : _logsService.decode(capturedPayload) + validator(decoded, capturedHeaders) + validatorCalled = true + }, + on: () => {} } + callback({ statusCode: 200, on: () => {} }) + return mockReq }) + + // Return function to check if validator was called + return () => { + if (!validatorCalled) { + throw new Error('OTLP export validator was never called - batch may not have flushed') + } + } } function mockLogWarn () { @@ -45,8 +61,10 @@ describe('OpenTelemetry Logs', () => { return { restore: () => { log.warn = originalWarn }, getMessage: () => warningMessage } } - function createMockSpan (traceId = '1234567890abcdef1234567890abcdef', spanId = '1234567890abcdef') { - return { spanContext: () => ({ traceId, spanId, traceFlags: 1, isRemote: false }) } + function createRealSpan () { + const { trace } = require('@opentelemetry/api') + const tracer = trace.getTracer('test-tracer') + return tracer.startSpan('test-span') } beforeEach(() => { @@ -61,7 +79,7 @@ describe('OpenTelemetry Logs', () => { describe('Core Functionality', () => { it('exports logs with complete OTLP structure, trace correlation, and instrumentation info', () => { - mockOtlpExport((decoded) => { + mockOtlpExport((decoded, capturedHeaders) => { const { resource } = decoded.resourceLogs[0] const resourceAttrs = {} resource.attributes.forEach(attr => { resourceAttrs[attr.key] = attr.value.stringValue }) @@ -81,16 +99,24 @@ describe('OpenTelemetry Logs', () => { const { logs } = setupTracer() const { trace, context } = require('@opentelemetry/api') - logs.getLogger('test-logger', '1.0.0').emit({ - severityText: 'INFO', - body: 'Test message', - context: trace.setSpan(context.active(), createMockSpan()), - attributes: { 'test.key': 'test.value' } + const spanContext = { + traceId: '1234567890abcdef1234567890abcdef', + spanId: '1234567890abcdef', + traceFlags: 1, + } + const span = trace.wrapSpanContext(spanContext) + const ctx = trace.setSpan(context.active(), span) + context.with(ctx, () => { + logs.getLogger('test-logger', '1.0.0').emit({ + severityText: 'INFO', + body: 'Test message', + attributes: { 'test.key': 'test.value' } + }) }) }) it('exports logs using protobuf protocol', () => { - mockOtlpExport((decoded) => { + mockOtlpExport((decoded, capturedHeaders) => { assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue, 'Protobuf format') }) @@ -100,7 +126,7 @@ describe('OpenTelemetry Logs', () => { it('exports logs using JSON protocol', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' - mockOtlpExport((decoded) => { + mockOtlpExport((decoded, capturedHeaders) => { assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue, 'JSON format') }, 'json') @@ -115,7 +141,7 @@ describe('OpenTelemetry Logs', () => { }) it('supports instrumentationScope for compatibility', () => { - mockOtlpExport((decoded) => { + mockOtlpExport((decoded, capturedHeaders) => { const log = decoded.resourceLogs[0].scopeLogs[0].logRecords[0] assert.strictEqual(log.body.stringValue, 'Scope test') }) @@ -135,18 +161,52 @@ describe('OpenTelemetry Logs', () => { process.env.DD_ENV = 'testenv' process.env.DD_TAGS = 'testtag:testvalue' - const http = require('http') - let capturedPayload, capturedHeaders - - sinon.stub(http, 'request').callsFake((options, callback) => { - capturedHeaders = options.headers - const mockReq = { - write: (data) => { capturedPayload = data }, - end: () => {}, - on: () => {} + mockOtlpExport((decoded, capturedHeaders) => { + // Validate payload body + const actual = JSON.parse(JSON.stringify(decoded.toJSON())) + const attrs = actual.resourceLogs[0].resource.attributes + const runtimeId = attrs.find(a => a.key === 'runtime-id').value.stringValue + const clientId = attrs.find(a => a.key === '_dd.rc.client_id').value.stringValue + + const expected = { + resourceLogs: [{ + resource: { + attributes: [ + { key: 'service.name', value: { stringValue: 'test-service' } }, + { key: 'service.version', value: { stringValue: 'testversion' } }, + { key: 'deployment.environment', value: { stringValue: 'testenv' } }, + { key: 'testtag', value: { stringValue: 'testvalue' } }, + { key: 'runtime-id', value: { stringValue: runtimeId } }, + { key: '_dd.rc.client_id', value: { stringValue: clientId } } + ], + droppedAttributesCount: 0 + }, + scopeLogs: [{ + scope: { + name: 'test-service', + version: '1.0.0', + droppedAttributesCount: 0 + }, + logRecords: [{ + body: { stringValue: 'HTTP test message' }, + severityText: 'ERROR', + severityNumber: 'SEVERITY_NUMBER_ERROR', + attributes: [{ key: 'test.attr', value: { stringValue: 'value' } }], + timeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].timeUnixNano, + observedTimeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].observedTimeUnixNano, + flags: 0, + spanId: actual.resourceLogs[0].scopeLogs[0].logRecords[0].spanId, + traceId: actual.resourceLogs[0].scopeLogs[0].logRecords[0].traceId + }] + }] + }] } - callback({ statusCode: 200, on: () => {} }) - return mockReq + + assert.deepStrictEqual(actual, expected) + + // Validate key headers (ignore dynamic Content-Length) + assert.strictEqual(capturedHeaders['Content-Type'], 'application/x-protobuf') + assert.strictEqual(capturedHeaders['x-api-key'], 'test123') }) const { logs } = setupTracer() @@ -157,61 +217,8 @@ describe('OpenTelemetry Logs', () => { severityNumber: 17, body: 'HTTP test message', attributes: { 'test.attr': 'value' }, - context: trace.setSpan(context.active(), createMockSpan()), + context: trace.setSpan(context.active(), createRealSpan()) }) - - // Validate complete OTLP payload structure as JSON - const { getProtobufTypes } = require('../../src/opentelemetry/logs/protobuf_loader') - const { _logsService } = getProtobufTypes() - const decoded = _logsService.decode(capturedPayload) - const actual = JSON.parse(JSON.stringify(decoded.toJSON())) - - const attrs = actual.resourceLogs[0].resource.attributes - const runtimeId = attrs.find(a => a.key === 'runtime-id').value.stringValue - const clientId = attrs.find(a => a.key === '_dd.rc.client_id').value.stringValue - - const expected = { - resourceLogs: [{ - resource: { - attributes: [ - { key: 'service.name', value: { stringValue: 'test-service' } }, - { key: 'service.version', value: { stringValue: 'testversion' } }, - { key: 'deployment.environment', value: { stringValue: 'testenv' } }, - { key: 'testtag', value: { stringValue: 'testvalue' } }, - { key: 'runtime-id', value: { stringValue: runtimeId } }, - { key: '_dd.rc.client_id', value: { stringValue: clientId } } - ], - droppedAttributesCount: 0 - }, - scopeLogs: [{ - scope: { - name: 'test-service', - version: '1.0.0', - droppedAttributesCount: 0 - }, - logRecords: [{ - body: { stringValue: 'HTTP test message' }, - severityText: 'ERROR', - severityNumber: 'SEVERITY_NUMBER_ERROR', - attributes: [{ key: 'test.attr', value: { stringValue: 'value' } }], - timeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].timeUnixNano, - observedTimeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].observedTimeUnixNano, - flags: 0, - spanId: Buffer.from('1234567890abcdef', 'hex').toString('base64'), - traceId: Buffer.from('1234567890abcdef1234567890abcdef', 'hex').toString('base64') - }] - }] - }] - } - - assert.deepStrictEqual(actual, expected) - // Validate complete headers structure - const expectedHeaders = { - 'Content-Length': capturedHeaders['Content-Length'], - 'Content-Type': 'application/x-protobuf', - 'x-api-key': 'test123' - } - assert.deepStrictEqual(capturedHeaders, expectedHeaders) }) }) From 9955d5ea2cee6e3842d7761c53e2cd758727df7f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 26 Sep 2025 14:35:08 -0400 Subject: [PATCH 37/61] nother round of clean ups --- docs/API.md | 7 +- packages/dd-trace/src/config.js | 10 +-- .../opentelemetry/logs/batch_log_processor.js | 3 +- .../src/supported-configurations.json | 10 +-- .../dd-trace/test/opentelemetry/logs.spec.js | 69 ++++++++++++++----- 5 files changed, 64 insertions(+), 35 deletions(-) diff --git a/docs/API.md b/docs/API.md index a46b39f490e..556a8a34a60 100644 --- a/docs/API.md +++ b/docs/API.md @@ -408,11 +408,10 @@ app.listen(3000) The Datadog SDK supports many of the configurations supported by the OpenTelemetry SDK. The following environment variables are supported: - `DD_LOGS_OTEL_ENABLED` - Enable OpenTelemetry logs (default: `false`) -- `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL (default: `http://localhost:4318/v1/logs`) -- `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - Optional headers in JSON format (default: `{}`) +- `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL for logs (default: `http://localhost:4318/v1/logs`) +- `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - Optional headers in JSON format for logs (default: `{}`) - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` - OTLP protocol for logs (default: `http/protobuf`) -- `OTEL_EXPORTER_OTLP_PROTOCOL` - OTLP protocol fallback (default: `http/protobuf`) -- `OTEL_EXPORTER_OTLP_TIMEOUT` - Request timeout in milliseconds (default: `10000`) +- `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` - Request timeout in milliseconds for logs (default: `10000`) - `OTEL_BSP_SCHEDULE_DELAY` - Batch timeout in milliseconds (default: `5000`) - `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` - Maximum logs per batch (default: `512`) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 28e4464790c..a32133ad89e 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -654,11 +654,11 @@ class Config { OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, + OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, OTEL_EXPORTER_OTLP_PROTOCOL, - OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS, - OTEL_EXPORTERS_OTLP_TIMEOUT, + OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_BSP_SCHEDULE_DELAY, OTEL_BSP_MAX_EXPORT_BATCH_SIZE } = getEnvironmentVariables() @@ -693,9 +693,9 @@ class Config { } else { this._setString(env, 'otelLogsProtocol', requestedProtocol || 'http/protobuf') } - this._setUnit(env, 'otelLogsTimeout', OTEL_EXPORTER_OTLP_TIMEOUT || OTEL_EXPORTERS_OTLP_TIMEOUT) - this._setUnit(env, 'otelLogsBatchTimeout', OTEL_BSP_SCHEDULE_DELAY) - this._setUnit(env, 'otelLogsMaxExportBatchSize', OTEL_BSP_MAX_EXPORT_BATCH_SIZE) + env.otelLogsTimeout = maybeInt(OTEL_EXPORTER_OTLP_LOGS_TIMEOUT || OTEL_EXPORTER_OTLP_TIMEOUT) + env.otelLogsBatchTimeout = maybeInt(OTEL_BSP_SCHEDULE_DELAY) + env.otelLogsMaxExportBatchSize = maybeInt(OTEL_BSP_MAX_EXPORT_BATCH_SIZE) this._setBoolean(env, 'apmTracingEnabled', coalesce( DD_APM_TRACING_ENABLED, diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 7078d3d4888..be0f5f388a7 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -25,11 +25,10 @@ class BatchLogRecordProcessor { this.exporter = exporter this.#batchTimeout = batchTimeout this.#maxExportBatchSize = maxExportBatchSize - + this.isShutdown = false this.#logRecords = [] this.#timer = null this.#shutdownPromise = null - this.isShutdown = false } /** diff --git a/packages/dd-trace/src/supported-configurations.json b/packages/dd-trace/src/supported-configurations.json index 9d307d1fc18..5cfa2e7d4a7 100644 --- a/packages/dd-trace/src/supported-configurations.json +++ b/packages/dd-trace/src/supported-configurations.json @@ -113,13 +113,6 @@ "DD_LOG_LEVEL": ["A"], "DD_LOGS_INJECTION": ["A"], "DD_LOGS_OTEL_ENABLED": ["A"], - "DD_LOGS_OTEL_URL": ["A"], - "DD_LOGS_OTEL_HEADERS": ["A"], - "DD_LOGS_OTEL_TIMEOUT": ["A"], - "DD_LOGS_OTEL_BATCH_TIMEOUT": ["A"], - "DD_LOGS_OTEL_MAX_EXPORT_BATCH_SIZE": ["A"], - "DD_LOGS_OTEL_MAX_QUEUE_SIZE": ["A"], - "DD_LOGS_OTEL_EXPORT_TIMEOUT_MILLIS": ["A"], "DD_MINI_AGENT_PATH": ["A"], "DD_OPENAI_LOGS_ENABLED": ["A"], "DD_OPENAI_SPAN_CHAR_LIMIT": ["A"], @@ -440,6 +433,9 @@ "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": ["A"], "OTEL_EXPORTER_OTLP_LOGS_HEADERS": ["A"], "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": ["A"], + "OTEL_EXPORTER_OTLP_LOGS_TIMEOUT": ["A"], + "OTEL_EXPORTER_OTLP_ENDPOINT": ["A"], + "OTEL_EXPORTER_OTLP_HEADERS": ["A"], "OTEL_EXPORTER_OTLP_PROTOCOL": ["A"], "OTEL_EXPORTER_OTLP_TIMEOUT": ["A"], "OTEL_BSP_SCHEDULE_DELAY": ["A"], diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 78cbf6ee476..956a92cb0ba 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -13,9 +13,9 @@ const { _logsService } = require('../../src/opentelemetry/logs/protobuf_loader') describe('OpenTelemetry Logs', () => { let originalEnv - function setupTracer (enabled = true) { + function setupTracer (enabled = true, maxExportBatchSize = '1') { process.env.DD_LOGS_OTEL_ENABLED = enabled ? 'true' : 'false' - process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '1' // Force immediate export + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = maxExportBatchSize // Force immediate export const tracer = require('../../') tracer._initialized = false tracer.init() @@ -88,15 +88,18 @@ describe('OpenTelemetry Logs', () => { const { scope, logRecords } = decoded.resourceLogs[0].scopeLogs[0] assert.strictEqual(scope.name, 'test-logger') assert.strictEqual(scope.version, '1.0.0') - - const log = logRecords[0] - assert.strictEqual(log.severityText, 'INFO') - assert.strictEqual(log.body.stringValue, 'Test message') - assert.strictEqual(log.traceId.toString('hex'), '1234567890abcdef1234567890abcdef') - assert.strictEqual(log.spanId.toString('hex'), '1234567890abcdef') + assert.strictEqual(logRecords[0].severityText, 'INFO') + assert.strictEqual(logRecords[0].body.stringValue, 'Test message') + assert.strictEqual(logRecords[0].traceId.toString('hex'), '1234567890abcdef1234567890abcdef') + assert.strictEqual(logRecords[0].spanId.toString('hex'), '1234567890abcdef') + assert.strictEqual(logRecords[1].severityText, 'ERROR') + assert.strictEqual(logRecords[1].severityNumber, 17) + assert.strictEqual(logRecords[1].body.stringValue, 'Test error message') + assert.strictEqual(logRecords[1].traceId.toString('hex'), '1234567890abcdef1234567890abcdef') + assert.strictEqual(logRecords[1].spanId.toString('hex'), '1234567890abcdef') }) - - const { logs } = setupTracer() + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '2' // Capture both logs in one payload + const { logs } = setupTracer(true, '2') const { trace, context } = require('@opentelemetry/api') const spanContext = { @@ -104,14 +107,20 @@ describe('OpenTelemetry Logs', () => { spanId: '1234567890abcdef', traceFlags: 1, } - const span = trace.wrapSpanContext(spanContext) - const ctx = trace.setSpan(context.active(), span) - context.with(ctx, () => { - logs.getLogger('test-logger', '1.0.0').emit({ + context.with(trace.setSpan(context.active(), trace.wrapSpanContext(spanContext)), () => { + const logger = logs.getLogger('test-logger', '1.0.0') + + logger.emit({ severityText: 'INFO', body: 'Test message', attributes: { 'test.key': 'test.value' } }) + logger.emit({ + severityText: 'ERROR', + severityNumber: 17, + body: 'Test error message', + attributes: { 'error.array': [1, 2, 3] } + }) }) }) @@ -231,6 +240,12 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(loggerProvider.processor.exporter.transformer.protocol, 'http/protobuf') }) + it('configures protocol from environment variable', () => { + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/json' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider.processor.exporter.transformer.protocol, 'http/json') + }) + it('prioritizes logs-specific protocol over generic protocol', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json' process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf' @@ -249,14 +264,21 @@ describe('OpenTelemetry Logs', () => { logMock.restore() }) - it('configures custom OTLP endpoint', () => { + it('configures OTLP endpoint from environment variable', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4318/v1/logs') + }) + + it('prioritizes logs-specific endpoint over generic endpoint', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://generic:4318/v1/logs' const { loggerProvider } = setupTracer() assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4318/v1/logs') }) - it('configures OTLP headers from logs-specific environment variable', () => { - process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'api-key=secret,env=prod' + it('configures OTLP headers from environment variable', () => { + process.env.OTEL_EXPORTER_OTLP_HEADERS = 'api-key=secret,env=prod' const { loggerProvider } = setupTracer() const exporter = loggerProvider.processor.exporter assert.strictEqual(exporter.headers['api-key'], 'secret') @@ -272,6 +294,19 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(exporter.headers.shared, 'logs') assert.strictEqual(exporter.headers.generic, undefined) }) + + it('configures OTLP timeout from environment variable', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT = '1000' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider.processor.exporter.timeout, 1000) + }) + + it('prioritizes logs-specific timeout over generic timeout', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT = '1000' + process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '2000' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider.processor.exporter.timeout, 1000) + }) }) describe('Telemetry Metrics', () => { From a9ddbccffee1428cef89c70c0b5182e4ae0e24c2 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 29 Sep 2025 08:44:36 -0400 Subject: [PATCH 38/61] group payloads by instrumentation scope --- .../dd-trace/src/opentelemetry/logs/logger.js | 1 - .../opentelemetry/logs/otlp_transformer.js | 50 +++++++++-- .../dd-trace/test/opentelemetry/logs.spec.js | 86 ++++++++++++++++--- 3 files changed, 115 insertions(+), 22 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index a7c57b486b9..54d2373ba56 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -90,7 +90,6 @@ class Logger { severityNumber: logRecord.severityNumber || 0, body: logRecord.body || '', attributes: logRecord.attributes, - resource: this.loggerProvider.resource, // Newer versions of the OpenTelemetry Logs API require instrumentationScope instead of instrumentationLibrary instrumentationLibrary: logRecord.instrumentationScope || logRecord.instrumentationLibrary || diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 54082b52add..5adcc0f7d75 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -70,6 +70,28 @@ class OtlpTransformer { return this.#transformToProtobuf(logRecords) } + /** + * Groups log records by instrumentation library (name and version). + * @param {Object[]} logRecords - Array of log records to group + * @returns {Map} Map of instrumentation library key to log records + * @private + */ + #groupByInstrumentationLibrary (logRecords) { + const grouped = new Map() + + for (const record of logRecords) { + const instrumentationLibrary = record.instrumentationLibrary || { name: '', version: '0.0.0' } + const key = `${instrumentationLibrary.name}@${instrumentationLibrary.version}` + + if (!grouped.has(key)) { + grouped.set(key, []) + } + grouped.get(key).push(record) + } + + return grouped + } + /** * Gets the protobuf types, loading them lazily to reduce startup overhead. * @returns {Object} Protobuf types object @@ -92,14 +114,20 @@ class OtlpTransformer { #transformToProtobuf (logRecords) { const { _logsService } = this.#getProtobufTypes() + // Group log records by instrumentation library + const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) + + // Create scope logs for each instrumentation library + const scopeLogs = [...groupedRecords.entries()].map(([key, records]) => ({ + scope: this.#transformScope(records[0]?.instrumentationLibrary), + logRecords: records.map(record => this.#transformLogRecord(record)) + })) + // Create the OTLP LogsData structure const logsData = { resourceLogs: [{ resource: this.#transformResource(), - scopeLogs: [{ - scope: this.#transformScope(logRecords[0]?.instrumentationLibrary), - logRecords: logRecords.map(record => this.#transformLogRecord(record)) - }] + scopeLogs }] } @@ -117,14 +145,20 @@ class OtlpTransformer { * @private */ #transformToJson (logRecords) { + // Group log records by instrumentation library + const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) + + // Create scope logs for each instrumentation library + const scopeLogs = [...groupedRecords.entries()].map(([key, records]) => ({ + scope: this.#transformScope(records[0]?.instrumentationLibrary), + logRecords: records.map(record => this.#transformLogRecord(record)) + })) + // JSON transformation for http/json protocol const logsData = { resourceLogs: [{ resource: this.#transformResource(), - scopeLogs: [{ - scope: this.#transformScope(logRecords[0]?.instrumentationLibrary), - logRecords: logRecords.map(record => this.#transformLogRecord(record)) - }] + scopeLogs }] } return Buffer.from(JSON.stringify(logsData)) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 956a92cb0ba..b46490dca24 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -85,20 +85,28 @@ describe('OpenTelemetry Logs', () => { resource.attributes.forEach(attr => { resourceAttrs[attr.key] = attr.value.stringValue }) assert(resourceAttrs['service.name']) - const { scope, logRecords } = decoded.resourceLogs[0].scopeLogs[0] - assert.strictEqual(scope.name, 'test-logger') - assert.strictEqual(scope.version, '1.0.0') - assert.strictEqual(logRecords[0].severityText, 'INFO') - assert.strictEqual(logRecords[0].body.stringValue, 'Test message') - assert.strictEqual(logRecords[0].traceId.toString('hex'), '1234567890abcdef1234567890abcdef') - assert.strictEqual(logRecords[0].spanId.toString('hex'), '1234567890abcdef') - assert.strictEqual(logRecords[1].severityText, 'ERROR') - assert.strictEqual(logRecords[1].severityNumber, 17) - assert.strictEqual(logRecords[1].body.stringValue, 'Test error message') - assert.strictEqual(logRecords[1].traceId.toString('hex'), '1234567890abcdef1234567890abcdef') - assert.strictEqual(logRecords[1].spanId.toString('hex'), '1234567890abcdef') + // Validate we have 2 separate scope logs (one per instrumentation library) + const { scopeLogs } = decoded.resourceLogs[0] + assert.strictEqual(scopeLogs.length, 1) + + const scope = scopeLogs[0] + assert.strictEqual(scope.scope.name, 'test-logger') + assert.strictEqual(scope.scope.version, '1.0.0') + assert.strictEqual(scope.logRecords.length, 2) + + const log1 = scope.logRecords[0] + assert.strictEqual(log1.severityText, 'INFO') + assert.strictEqual(log1.body.stringValue, 'Test message') + assert.strictEqual(log1.traceId.toString('hex'), '1234567890abcdef1234567890abcdef') + assert.strictEqual(log1.spanId.toString('hex'), '1234567890abcdef') + + const log2 = scope.logRecords[1] + assert.strictEqual(log2.severityText, 'ERROR') + assert.strictEqual(log2.severityNumber, 17) + assert.strictEqual(log2.body.stringValue, 'Test error message') + assert.strictEqual(log2.traceId.toString('hex'), '1234567890abcdef1234567890abcdef') + assert.strictEqual(log2.spanId.toString('hex'), '1234567890abcdef') }) - process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '2' // Capture both logs in one payload const { logs } = setupTracer(true, '2') const { trace, context } = require('@opentelemetry/api') @@ -118,6 +126,7 @@ describe('OpenTelemetry Logs', () => { logger.emit({ severityText: 'ERROR', severityNumber: 17, + instrumentationScope: { name: 'test-logger', version: '1.0.0' }, body: 'Test error message', attributes: { 'error.array': [1, 2, 3] } }) @@ -229,6 +238,57 @@ describe('OpenTelemetry Logs', () => { context: trace.setSpan(context.active(), createRealSpan()) }) }) + + it('groups logs by instrumentation library in separate scope payloads', () => { + mockOtlpExport((decoded, capturedHeaders) => { + const { resourceLogs } = decoded + assert.strictEqual(resourceLogs.length, 1) + + const { scopeLogs } = resourceLogs[0] + assert.strictEqual(scopeLogs.length, 2) // Should have 2 separate scope logs + + // First scope: logger1@1.0.0 + const scope1 = scopeLogs[0] + assert.strictEqual(scope1.scope.name, 'logger1') + assert.strictEqual(scope1.scope.version, '1.0.0') + assert.strictEqual(scope1.logRecords.length, 1) + assert.strictEqual(scope1.logRecords[0].severityText, 'INFO') + assert.strictEqual(scope1.logRecords[0].body.stringValue, 'Message from logger1') + + // Second scope: logger2@2.0.0 + const scope2 = scopeLogs[1] + assert.strictEqual(scope2.scope.name, 'logger2') + assert.strictEqual(scope2.scope.version, '2.0.0') + assert.strictEqual(scope2.logRecords.length, 1) + assert.strictEqual(scope2.logRecords[0].severityText, 'ERROR') + assert.strictEqual(scope2.logRecords[0].body.stringValue, 'Message from logger2') + }) + + const { logs } = setupTracer(true, '2') + const { trace, context } = require('@opentelemetry/api') + + const spanContext = { + traceId: '1234567890abcdef1234567890abcdef', + spanId: '1234567890abcdef', + traceFlags: 1, + } + context.with(trace.setSpan(context.active(), trace.wrapSpanContext(spanContext)), () => { + const logger1 = logs.getLogger('logger1', '1.0.0') + const logger2 = logs.getLogger('logger2', '2.0.0') + + logger1.emit({ + severityText: 'INFO', + body: 'Message from logger1', + attributes: { logger: 'logger1' } + }) + + logger2.emit({ + severityText: 'ERROR', + body: 'Message from logger2', + attributes: { logger: 'logger2' } + }) + }) + }) }) describe('Configurations', () => { From d9d9dfb0edb6acb5655876a2af4e3d10f6d3a51e Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 29 Sep 2025 08:56:43 -0400 Subject: [PATCH 39/61] fix typing --- packages/dd-trace/src/opentelemetry/logs/logger.js | 2 -- .../src/opentelemetry/logs/otlp_http_log_exporter.js | 7 ++++++- .../dd-trace/src/opentelemetry/logs/otlp_transformer.js | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 54d2373ba56..d930a9842d5 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -27,8 +27,6 @@ class Logger { * @param {Object} [instrumentationLibrary] - Instrumentation library information * @param {string} [instrumentationLibrary.name] - Library name (defaults to 'dd-trace-js') * @param {string} [instrumentationLibrary.version] - Library version (defaults to tracer version) - * @param {Attributes[]} [instrumentationLibrary.attributes] - Additional attributes - * @param {number} [instrumentationLibrary.dropped_attributes_count] - Number of dropped attributes */ constructor (loggerProvider, instrumentationLibrary) { this.loggerProvider = loggerProvider diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 91384c0ee4c..55de4f199b0 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -6,6 +6,11 @@ const log = require('../../log') const OtlpTransformer = require('./otlp_transformer') const telemetryMetrics = require('../../telemetry/metrics') +/** + * @typedef {import('@opentelemetry/resources').Resource} Resource + * +*/ + const tracerMetrics = telemetryMetrics.manager.namespace('tracers') /** @@ -26,7 +31,7 @@ class OtlpHttpLogExporter { * @param {string} headers - Additional HTTP headers as comma-separated key=value string * @param {number} timeout - Request timeout in milliseconds * @param {string} protocol - OTLP protocol (http/protobuf or http/json) - * @param {Object} resource - Resource attributes + * @param {Resource} resource - Resource attributes */ constructor (url, headers, timeout, protocol, resource) { this.url = url diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 5adcc0f7d75..49fbc7149df 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -3,6 +3,10 @@ const { SeverityNumber } = require('@opentelemetry/api-logs') const { getProtobufTypes } = require('./protobuf_loader') +/** + * @typedef {import('@opentelemetry/api').Attributes} Attributes +*/ + // Global severity mapping constant - no need to regenerate const SEVERITY_MAP = { [SeverityNumber.TRACE]: 'SEVERITY_NUMBER_TRACE', @@ -47,7 +51,7 @@ class OtlpTransformer { /** * Creates a new OtlpTransformer instance. * - * @param {Object} resourceAttributes - Resource attributes + * @param {Attributes} resourceAttributes - Resource attributes * @param {string} protocol - OTLP protocol (http/protobuf or http/json) */ constructor (resourceAttributes, protocol) { From 351ca2ffd45f2d3755f4a4859124ec10b772300f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 29 Sep 2025 15:38:20 -0400 Subject: [PATCH 40/61] address review comments --- .../opentelemetry/logs/batch_log_processor.js | 31 +++------ .../logs/otlp_http_log_exporter.js | 37 ++++++++-- .../opentelemetry/logs/otlp_transformer.js | 69 +++++++++---------- 3 files changed, 70 insertions(+), 67 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index be0f5f388a7..9f9ca06c62e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -12,7 +12,6 @@ class BatchLogRecordProcessor { #timer #batchTimeout #maxExportBatchSize - #shutdownPromise /** * Creates a new BatchLogRecordProcessor instance. @@ -21,14 +20,13 @@ class BatchLogRecordProcessor { * @param {number} batchTimeout - Timeout in milliseconds for batch processing * @param {number} maxExportBatchSize - Maximum number of log records per batch */ - constructor (exporter, batchTimeout, maxExportBatchSize, maxQueueSize, exportTimeoutMillis) { + constructor (exporter, batchTimeout, maxExportBatchSize) { this.exporter = exporter this.#batchTimeout = batchTimeout this.#maxExportBatchSize = maxExportBatchSize this.isShutdown = false this.#logRecords = [] this.#timer = null - this.#shutdownPromise = null } /** @@ -56,15 +54,10 @@ class BatchLogRecordProcessor { * @returns {Promise} Promise that resolves when flush is complete */ forceFlush () { - return new Promise((resolve) => { - if (this.isShutdown) { - resolve() - return - } - + if (!this.isShutdown) { this.#export() - resolve() - }) + } + return Promise.resolve() } /** @@ -73,21 +66,13 @@ class BatchLogRecordProcessor { */ shutdown () { if (this.isShutdown) { - return this.#shutdownPromise || Promise.resolve() + return Promise.resolve() } this.isShutdown = true - this.#shutdownPromise = new Promise((resolve) => { - this.#clearTimer() - - this.#export() - - const shutdownPromises = this.exporter ? [this.exporter.shutdown()] : [] - - Promise.all(shutdownPromises).then(resolve) - }) - - return this.#shutdownPromise + this.#clearTimer() + this.#export() + return this.exporter ? this.exporter.shutdown() : Promise.resolve() } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 55de4f199b0..0360f68f7bc 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -141,17 +141,40 @@ class OtlpHttpLogExporter { * @private */ #parseAdditionalHeaders (headersString) { - if (!headersString || typeof headersString !== 'string') { - return {} + const headers = {} + let key = '' + let value = '' + let readingKey = true + + for (const char of headersString) { + if (readingKey) { + if (char === '=') { + readingKey = false + key = key.trim() + } else { + key += char + } + } else if (char === ',') { + value = value.trim() + if (key && value) { + headers[key] = value + } + key = '' + value = '' + readingKey = true + } else { + value += char + } } - const headers = {} - for (const pair of headersString.split(',')) { - const [key, value] = pair.trim().split('=') - if (key && value) { - headers[key.trim()] = value.trim() + // Add the last pair if present + if (!readingKey) { + value = value.trim() + if (value) { + headers[key] = value } } + return headers } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 49fbc7149df..c3562b55152 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -1,7 +1,7 @@ 'use strict' const { SeverityNumber } = require('@opentelemetry/api-logs') -const { getProtobufTypes } = require('./protobuf_loader') +const { loadProtobufDefinitions } = require('./protobuf_loader') /** * @typedef {import('@opentelemetry/api').Attributes} Attributes @@ -87,12 +87,13 @@ class OtlpTransformer { const instrumentationLibrary = record.instrumentationLibrary || { name: '', version: '0.0.0' } const key = `${instrumentationLibrary.name}@${instrumentationLibrary.version}` - if (!grouped.has(key)) { - grouped.set(key, []) + const group = grouped.get(key) + if (group === undefined) { + grouped.set(key, [record]) + } else { + group.push(record) } - grouped.get(key).push(record) } - return grouped } @@ -104,7 +105,7 @@ class OtlpTransformer { #getProtobufTypes () { // Delay the loading of protobuf types to reduce startup overhead if (!this.#protobufTypes) { - this.#protobufTypes = getProtobufTypes() + this.#protobufTypes = loadProtobufDefinitions() } return this.#protobufTypes } @@ -117,21 +118,11 @@ class OtlpTransformer { */ #transformToProtobuf (logRecords) { const { _logsService } = this.#getProtobufTypes() - - // Group log records by instrumentation library - const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) - - // Create scope logs for each instrumentation library - const scopeLogs = [...groupedRecords.entries()].map(([key, records]) => ({ - scope: this.#transformScope(records[0]?.instrumentationLibrary), - logRecords: records.map(record => this.#transformLogRecord(record)) - })) - // Create the OTLP LogsData structure const logsData = { resourceLogs: [{ resource: this.#transformResource(), - scopeLogs + scopeLogs: this.#transformScope(logRecords), }] } @@ -149,38 +140,42 @@ class OtlpTransformer { * @private */ #transformToJson (logRecords) { - // Group log records by instrumentation library - const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) - - // Create scope logs for each instrumentation library - const scopeLogs = [...groupedRecords.entries()].map(([key, records]) => ({ - scope: this.#transformScope(records[0]?.instrumentationLibrary), - logRecords: records.map(record => this.#transformLogRecord(record)) - })) - - // JSON transformation for http/json protocol const logsData = { resourceLogs: [{ resource: this.#transformResource(), - scopeLogs + scopeLogs: this.#transformScope(logRecords) }] } return Buffer.from(JSON.stringify(logsData)) } /** - * Transforms instrumentation library information to OTLP scope format. - * @param {Object} instrumentationLibrary - Instrumentation library info - * @returns {Object} OTLP scope object + * Creates scope logs grouped by instrumentation library. + * @param {Object[]} logRecords - Array of log records to transform + * @returns {Object[]} Array of scope log objects * @private */ - #transformScope (instrumentationLibrary) { - return { - name: instrumentationLibrary?.name || 'dd-trace-js', - version: instrumentationLibrary?.version || '', - attributes: [], - droppedAttributesCount: 0 + #transformScope (logRecords) { + // Group log records by instrumentation library + const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) + + // Create scope logs for each instrumentation library + const scopeLogs = [] + + for (const [, records] of groupedRecords.entries()) { + scopeLogs.push({ + scope: { + name: records[0]?.instrumentationLibrary?.name || 'dd-trace-js', + version: records[0]?.instrumentationLibrary?.version || '', + // TODO: Support setting attributes on instrumentation library + attributes: [], + droppedAttributesCount: 0 + }, + logRecords: records.map(record => this.#transformLogRecord(record)) + }) } + + return scopeLogs } /** From b99ba1d602a25da90fc5490116315a7851637e5e Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 29 Sep 2025 19:30:54 -0400 Subject: [PATCH 41/61] add better typing, and better support for sending schemaurl --- .../opentelemetry/logs/batch_log_processor.js | 13 ++- .../dd-trace/src/opentelemetry/logs/logger.js | 82 ++++--------- .../src/opentelemetry/logs/logger_provider.js | 5 +- .../logs/otlp_http_log_exporter.js | 3 +- .../opentelemetry/logs/otlp_transformer.js | 108 +++++++++++++----- .../src/opentelemetry/logs/protobuf_loader.js | 8 +- packages/dd-trace/src/opentelemetry/span.js | 4 +- packages/dd-trace/src/opentelemetry/tracer.js | 2 +- .../dd-trace/test/opentelemetry/logs.spec.js | 25 ++-- 9 files changed, 135 insertions(+), 115 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 9f9ca06c62e..dc3c70677a2 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -1,4 +1,10 @@ 'use strict' + +/** + * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord + * @typedef {import('@opentelemetry/core').InstrumentationScope} InstrumentationScope + */ + /** * BatchLogRecordProcessor processes log records in batches for efficient export to Datadog Agent. * @@ -32,15 +38,16 @@ class BatchLogRecordProcessor { /** * Processes a single log record. * - * @param {Object} logRecord - The enriched log record with trace correlation and metadata + * @param {LogRecord} logRecord - The enriched log record with trace correlation and metadata + * @param {InstrumentationScope} instrumentationScope - The instrumentation library */ - onEmit (logRecord) { + onEmit (logRecord, instrumentationScope) { if (this.isShutdown) { return } // Store the log record (already enriched by Logger.emit) - this.#logRecords.push(logRecord) + this.#logRecords.push({ ...logRecord, instrumentationScope }) if (this.#logRecords.length >= this.#maxExportBatchSize) { this.#export() diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index d930a9842d5..fd0bd0fcc0e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -1,14 +1,16 @@ 'use strict' const { sanitizeAttributes } = require('@opentelemetry/core') -const { trace, context } = require('@opentelemetry/api') +const { context } = require('@opentelemetry/api') const packageVersion = require('../../../../../package.json').version /** * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord * @typedef {import('@opentelemetry/api').SpanContext} SpanContext * @typedef {import('@opentelemetry/api').Attributes} Attributes * @typedef {import('@opentelemetry/resources').Resource} Resource + * @typedef {import('@opentelemetry/core').InstrumentationScope} InstrumentationScope */ + /** * Logger provides methods to emit log records. * @@ -18,21 +20,28 @@ const packageVersion = require('../../../../../package.json').version * @class Logger */ class Logger { - #instrumentationLibrary + #instrumentationScope /** * Creates a new Logger instance. * * @param {LoggerProvider} loggerProvider - Parent logger provider - * @param {Object} [instrumentationLibrary] - Instrumentation library information - * @param {string} [instrumentationLibrary.name] - Library name (defaults to 'dd-trace-js') - * @param {string} [instrumentationLibrary.version] - Library version (defaults to tracer version) + * @param {InstrumentationScope} [instrumentationScope] - Instrumentation scope information (newer API) + * @param {Object} [instrumentationLibrary] - Instrumentation library information (legacy API) [DEPRECATED in v1.3.0] + * @param {InstrumentationScope} [instrumentationScope.name] - Library name (defaults to 'dd-trace-js') + * @param {InstrumentationScope} [instrumentationScope.version] - Library version (defaults to tracer version) + * @param {string} [instrumentationLibrary.name] - Library name (legacy, defaults to 'dd-trace-js') + * @param {string} [instrumentationLibrary.version] - Library version (legacy, defaults to tracer version) */ - constructor (loggerProvider, instrumentationLibrary) { + constructor (loggerProvider, instrumentationScope, instrumentationLibrary) { this.loggerProvider = loggerProvider - this.#instrumentationLibrary = { - name: instrumentationLibrary?.name || 'dd-trace-js', - version: instrumentationLibrary?.version || packageVersion + + // Support both newer instrumentationScope and legacy instrumentationLibrary + const scope = instrumentationScope || instrumentationLibrary + this.#instrumentationScope = { + name: scope?.name || 'dd-trace-js', + version: scope?.version || packageVersion, + schemaUrl: scope?.schemaUrl || '', } } @@ -48,6 +57,7 @@ class Logger { * Emits a log record. * * @param {LogRecord} logRecord - The log record to emit + * @returns {void} */ emit (logRecord) { if (this.loggerProvider.isShutdown) { @@ -67,58 +77,12 @@ class Logger { logRecord.timestamp = Date.now() * 1_000_000 } - // Set observed timestamp if not provided - if (!logRecord.observedTimestamp) { - logRecord.observedTimestamp = logRecord.timestamp - } - - // Use the provided context or get the current active context - const activeContext = logRecord.context || context.active() - - // Extract span context from the active context for trace correlation - const spanContext = this.#getSpanContext(activeContext) - - // Create enriched log record with all expected fields - // Contains: severityText, severityNumber, body, timestamp, observedTimestamp, - // attributes, resource, instrumentationLibrary, traceId, spanId, traceFlags - const enrichedLogRecord = { - timestamp: logRecord.timestamp, - observedTimestamp: logRecord.observedTimestamp, - severityText: logRecord.severityText || '', - severityNumber: logRecord.severityNumber || 0, - body: logRecord.body || '', - attributes: logRecord.attributes, - // Newer versions of the OpenTelemetry Logs API require instrumentationScope instead of instrumentationLibrary - instrumentationLibrary: logRecord.instrumentationScope || - logRecord.instrumentationLibrary || - this.#instrumentationLibrary, - traceId: spanContext?.traceId || '', - spanId: spanContext?.spanId || '', - traceFlags: spanContext?.traceFlags || 0 + if (!logRecord.context) { + // Store span context in the log record context for trace correlation + logRecord.context = context.active() } - this.loggerProvider.processor.onEmit(enrichedLogRecord) - } - - /** - * Extracts span context from the OpenTelemetry context for trace correlation. - * @param {Object} activeContext - The OpenTelemetry context - * @returns {SpanContext|null} Span context or null if not available - * @private - */ - #getSpanContext (activeContext) { - const activeSpan = trace.getSpan(activeContext) - if (activeSpan) { - const spanContext = activeSpan.spanContext() - if (spanContext?.traceId && spanContext.spanId) { - return { - traceId: spanContext.traceId, - spanId: spanContext.spanId, - traceFlags: spanContext.traceFlags - } - } - } - return null + this.loggerProvider.processor.onEmit(logRecord, this.#instrumentationScope) } } diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index 6f351092823..d4c4d0bd74a 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -60,10 +60,11 @@ class LoggerProvider { } const loggerVersion = loggerOptions.version || '' + const loggerSchemaUrl = loggerOptions?.schemaUrl || '' const key = `${name}@${loggerVersion}` if (!this.#loggers.has(key)) { - this.#loggers.set(key, new Logger(this, { name, version: loggerVersion })) + this.#loggers.set(key, new Logger(this, { name, version: loggerVersion, schemaUrl: loggerSchemaUrl })) } return this.#loggers.get(key) } @@ -124,7 +125,7 @@ class LoggerProvider { */ #createNoOpLogger () { return { - instrumentationLibrary: { + instrumentationScope: { name: 'dd-trace-js', version: '' }, diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 0360f68f7bc..b758f5e7bc2 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -8,6 +8,7 @@ const telemetryMetrics = require('../../telemetry/metrics') /** * @typedef {import('@opentelemetry/resources').Resource} Resource + * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord * */ @@ -59,7 +60,7 @@ class OtlpHttpLogExporter { /** * Exports log records via OTLP over HTTP. * - * @param {Object[]} logRecords - Array of enriched log records to export + * @param {LogRecord[]} logRecords - Array of enriched log records to export * @param {Function} resultCallback - Callback function for export result */ export (logRecords, resultCallback) { diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index c3562b55152..9a7b43a563f 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -1,11 +1,15 @@ 'use strict' const { SeverityNumber } = require('@opentelemetry/api-logs') -const { loadProtobufDefinitions } = require('./protobuf_loader') +const { getProtobufTypes } = require('./protobuf_loader') +const { trace } = require('@opentelemetry/api') +const log = require('../../log') /** * @typedef {import('@opentelemetry/api').Attributes} Attributes -*/ + * @typedef {import('@opentelemetry/api-logs').LogRecord} LogRecord + * @typedef {import('@opentelemetry/resources').Resource} Resource + */ // Global severity mapping constant - no need to regenerate const SEVERITY_MAP = { @@ -34,7 +38,6 @@ const SEVERITY_MAP = { [SeverityNumber.FATAL3]: 'SEVERITY_NUMBER_FATAL3', [SeverityNumber.FATAL4]: 'SEVERITY_NUMBER_FATAL4' } -const log = require('../../log') /** * OtlpTransformer transforms log records to OTLP format. @@ -62,7 +65,7 @@ class OtlpTransformer { /** * Transforms log records to OTLP format based on the configured protocol. - * @param {Object[]} logRecords - Array of enriched log records to transform + * @param {LogRecord[]} logRecords - Array of enriched log records to transform * @returns {Buffer} Transformed log records in the appropriate format */ transformLogRecords (logRecords) { @@ -76,16 +79,16 @@ class OtlpTransformer { /** * Groups log records by instrumentation library (name and version). - * @param {Object[]} logRecords - Array of log records to group - * @returns {Map} Map of instrumentation library key to log records + * @param {LogRecord[]} logRecords - Array of log records to group + * @returns {Map} Map of instrumentation library key to log records * @private */ - #groupByInstrumentationLibrary (logRecords) { + #groupByInstrumentationScope (logRecords) { const grouped = new Map() for (const record of logRecords) { - const instrumentationLibrary = record.instrumentationLibrary || { name: '', version: '0.0.0' } - const key = `${instrumentationLibrary.name}@${instrumentationLibrary.version}` + const instrumentationScope = record.instrumentationScope || { name: '', version: '0.0.0', schemaUrl: '' } + const key = `${instrumentationScope.name}@${instrumentationScope.version}@${instrumentationScope.schemaUrl}` const group = grouped.get(key) if (group === undefined) { @@ -105,14 +108,14 @@ class OtlpTransformer { #getProtobufTypes () { // Delay the loading of protobuf types to reduce startup overhead if (!this.#protobufTypes) { - this.#protobufTypes = loadProtobufDefinitions() + this.#protobufTypes = getProtobufTypes() } return this.#protobufTypes } /** * Transforms log records to protobuf format. - * @param {Object[]} logRecords - Array of enriched log records to transform + * @param {LogRecord[]} logRecords - Array of enriched log records to transform * @returns {Buffer} Protobuf-encoded log records * @private */ @@ -135,7 +138,7 @@ class OtlpTransformer { /** * Transforms log records to JSON format. - * @param {Object[]} logRecords - Array of enriched log records to transform + * @param {LogRecord[]} logRecords - Array of enriched log records to transform * @returns {Buffer} JSON-encoded log records * @private */ @@ -151,26 +154,28 @@ class OtlpTransformer { /** * Creates scope logs grouped by instrumentation library. - * @param {Object[]} logRecords - Array of log records to transform + * @param {LogRecord[]} logRecords - Array of log records to transform * @returns {Object[]} Array of scope log objects * @private */ #transformScope (logRecords) { // Group log records by instrumentation library - const groupedRecords = this.#groupByInstrumentationLibrary(logRecords) + const groupedRecords = this.#groupByInstrumentationScope(logRecords) // Create scope logs for each instrumentation library const scopeLogs = [] for (const [, records] of groupedRecords.entries()) { + const schemaUrl = records[0]?.instrumentationScope?.schemaUrl || '' scopeLogs.push({ scope: { - name: records[0]?.instrumentationLibrary?.name || 'dd-trace-js', - version: records[0]?.instrumentationLibrary?.version || '', - // TODO: Support setting attributes on instrumentation library + name: records[0]?.instrumentationScope?.name || 'dd-trace-js', + version: records[0]?.instrumentationScope?.version || '', + // TODO: Support setting attributes on instrumentation scope attributes: [], droppedAttributesCount: 0 }, + schemaUrl, logRecords: records.map(record => this.#transformLogRecord(record)) }) } @@ -180,7 +185,7 @@ class OtlpTransformer { /** * Transforms resource attributes to OTLP resource format. - * @returns {Object} OTLP resource object + * @returns {Resource} OTLP resource object * @private */ #transformResource () { @@ -192,25 +197,70 @@ class OtlpTransformer { /** * Transforms a single log record to OTLP format. - * @param {Object} logRecord - Log record to transform + * @param {LogRecord} logRecord - Log record to transform * @returns {Object} OTLP log record object * @private */ #transformLogRecord (logRecord) { const timestamp = logRecord.timestamp || Date.now() * 1_000_000 - return { + // Extract span context from the log record's context + const spanContext = this.#extractSpanContext(logRecord.context) + + // Only timeUnixNano and body are required + const result = { timeUnixNano: timestamp, - observedTimeUnixNano: timestamp, - severityNumber: this.#mapSeverityNumber(logRecord.severityNumber || SeverityNumber.INFO), - severityText: logRecord.severityText || 'INFO', - body: this.#transformBody(logRecord.body), - attributes: this.#transformAttributes(logRecord.attributes), - droppedAttributesCount: 0, - flags: logRecord.flags || 0, - traceId: this.#hexToBytes(logRecord.traceId || ''), - spanId: this.#hexToBytes(logRecord.spanId || '') + body: this.#transformBody(logRecord.body) + } + + // Add optional fields only if they are set + if (logRecord.observedTimestamp) { + result.observedTimeUnixNano = logRecord.observedTimestamp + } + + if (logRecord.severityNumber !== undefined) { + result.severityNumber = this.#mapSeverityNumber(logRecord.severityNumber) + } + + if (logRecord.severityText) { + result.severityText = logRecord.severityText + } + + if (logRecord.attributes) { + result.attributes = this.#transformAttributes(logRecord.attributes) + } + + if (spanContext?.traceFlags !== undefined) { + result.flags = spanContext.traceFlags + } + + // Only include traceId and spanId if they are valid (not empty, undefined, or all zeros) + if (spanContext?.traceId && spanContext.traceId !== '00000000000000000000000000000000') { + result.traceId = this.#hexToBytes(spanContext.traceId) + } + + if (spanContext?.spanId && spanContext.spanId !== '0000000000000000') { + result.spanId = this.#hexToBytes(spanContext.spanId) + } + + return result + } + + /** + * Extracts span context from the log record's context. + * @param {Object} logContext - The log record's context + * @returns {Object|null} Span context or null if not available + * @private + */ + #extractSpanContext (logContext) { + if (!logContext) return null + + const activeSpan = trace.getSpan(logContext) + if (activeSpan) { + return activeSpan.spanContext() } + + return null } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js index 0dd3080e2eb..4b1e3a32f6e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js @@ -25,7 +25,7 @@ let _scopeLogs = null let _logRecord = null let _severityNumber = null -function loadProtobufDefinitions () { +function getProtobufTypes () { if (_root) { return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } } @@ -54,12 +54,6 @@ function loadProtobufDefinitions () { return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } } -// Lazy load the protobuf definitions -function getProtobufTypes () { - return loadProtobufDefinitions() -} - module.exports = { getProtobufTypes, - loadProtobufDefinitions } diff --git a/packages/dd-trace/src/opentelemetry/span.js b/packages/dd-trace/src/opentelemetry/span.js index 2cf4b20cb42..844aaa68b04 100644 --- a/packages/dd-trace/src/opentelemetry/span.js +++ b/packages/dd-trace/src/opentelemetry/span.js @@ -177,8 +177,8 @@ class Span { return this._parentTracer.resource } - get instrumentationLibrary () { - return this._parentTracer.instrumentationLibrary + get instrumentationScope () { + return this._parentTracer.instrumentationScope } get _spanProcessor () { diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index da8ae428e99..f7d301cacd2 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -17,7 +17,7 @@ class Tracer { this._config = config this._tracerProvider = tracerProvider // Is there a reason this is public? - this.instrumentationLibrary = library + this.instrumentationScope = library this._isOtelLibrary = library?.name?.startsWith('@opentelemetry/instrumentation-') this._spanLimits = {} } diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index b46490dca24..d37894ebe7e 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -61,12 +61,6 @@ describe('OpenTelemetry Logs', () => { return { restore: () => { log.warn = originalWarn }, getMessage: () => warningMessage } } - function createRealSpan () { - const { trace } = require('@opentelemetry/api') - const tracer = trace.getTracer('test-tracer') - return tracer.startSpan('test-span') - } - beforeEach(() => { originalEnv = { ...process.env } }) @@ -92,6 +86,7 @@ describe('OpenTelemetry Logs', () => { const scope = scopeLogs[0] assert.strictEqual(scope.scope.name, 'test-logger') assert.strictEqual(scope.scope.version, '1.0.0') + assert.strictEqual(scope.schemaUrl, 'https://opentelemetry.io/schemas/1.27.0') assert.strictEqual(scope.logRecords.length, 2) const log1 = scope.logRecords[0] @@ -116,7 +111,7 @@ describe('OpenTelemetry Logs', () => { traceFlags: 1, } context.with(trace.setSpan(context.active(), trace.wrapSpanContext(spanContext)), () => { - const logger = logs.getLogger('test-logger', '1.0.0') + const logger = logs.getLogger('test-logger', '1.0.0', { schemaUrl: 'https://opentelemetry.io/schemas/1.27.0' }) logger.emit({ severityText: 'INFO', @@ -178,6 +173,7 @@ describe('OpenTelemetry Logs', () => { process.env.DD_VERSION = 'testversion' process.env.DD_ENV = 'testenv' process.env.DD_TAGS = 'testtag:testvalue' + process.env.DD_TRACE_OTEL_ENABLED = 'true' mockOtlpExport((decoded, capturedHeaders) => { // Validate payload body @@ -205,6 +201,7 @@ describe('OpenTelemetry Logs', () => { version: '1.0.0', droppedAttributesCount: 0 }, + schemaUrl: '', logRecords: [{ body: { stringValue: 'HTTP test message' }, severityText: 'ERROR', @@ -212,9 +209,9 @@ describe('OpenTelemetry Logs', () => { attributes: [{ key: 'test.attr', value: { stringValue: 'value' } }], timeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].timeUnixNano, observedTimeUnixNano: actual.resourceLogs[0].scopeLogs[0].logRecords[0].observedTimeUnixNano, - flags: 0, - spanId: actual.resourceLogs[0].scopeLogs[0].logRecords[0].spanId, - traceId: actual.resourceLogs[0].scopeLogs[0].logRecords[0].traceId + flags: 1, + traceId: 'AAAAAAAAAAAAAAAAAAAAAQ==', + spanId: 'AAAAAAAAAAI=' }] }] }] @@ -230,12 +227,18 @@ describe('OpenTelemetry Logs', () => { const { logs } = setupTracer() const { trace, context } = require('@opentelemetry/api') + const spanContext = { + traceId: '00000000000000000000000000000001', + spanId: '0000000000000002', + traceFlags: 1, + } logs.getLogger('test-service', '1.0.0').emit({ + observedTimestamp: Date.now() * 1000000, severityText: 'ERROR', severityNumber: 17, body: 'HTTP test message', attributes: { 'test.attr': 'value' }, - context: trace.setSpan(context.active(), createRealSpan()) + context: trace.setSpan(context.active(), trace.wrapSpanContext(spanContext)) }) }) From a1f8cf7518e7eb8b730c7a672c0ab02112bae795 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 29 Sep 2025 23:40:38 -0400 Subject: [PATCH 42/61] revert instrumentationScope change to span --- packages/dd-trace/src/opentelemetry/span.js | 4 ++-- packages/dd-trace/src/opentelemetry/tracer.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/span.js b/packages/dd-trace/src/opentelemetry/span.js index 844aaa68b04..2cf4b20cb42 100644 --- a/packages/dd-trace/src/opentelemetry/span.js +++ b/packages/dd-trace/src/opentelemetry/span.js @@ -177,8 +177,8 @@ class Span { return this._parentTracer.resource } - get instrumentationScope () { - return this._parentTracer.instrumentationScope + get instrumentationLibrary () { + return this._parentTracer.instrumentationLibrary } get _spanProcessor () { diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index f7d301cacd2..da8ae428e99 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -17,7 +17,7 @@ class Tracer { this._config = config this._tracerProvider = tracerProvider // Is there a reason this is public? - this.instrumentationScope = library + this.instrumentationLibrary = library this._isOtelLibrary = library?.name?.startsWith('@opentelemetry/instrumentation-') this._spanLimits = {} } From 9ff13fd95e9bb8827234987713c9c48aaa0da5af Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 1 Oct 2025 14:09:32 -0400 Subject: [PATCH 43/61] review comments --- .../opentelemetry/logs/batch_log_processor.js | 19 +++++++------- .../dd-trace/src/opentelemetry/logs/logger.js | 8 ++---- .../src/opentelemetry/logs/logger_provider.js | 26 +++++-------------- .../logs/otlp_http_log_exporter.js | 3 +-- .../opentelemetry/logs/otlp_transformer.js | 4 +-- .../dd-trace/test/opentelemetry/logs.spec.js | 4 +-- 6 files changed, 23 insertions(+), 41 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index dc3c70677a2..16d60fb351f 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -58,28 +58,25 @@ class BatchLogRecordProcessor { /** * Forces an immediate flush of all pending log records. - * @returns {Promise} Promise that resolves when flush is complete + * @returns {undefined} Promise that resolves when flush is complete */ forceFlush () { if (!this.isShutdown) { this.#export() } - return Promise.resolve() } /** * Shuts down the processor and exports any remaining log records. - * @returns {Promise} Promise that resolves when shutdown is complete + * @returns {undefined} Promise that resolves when shutdown is complete */ shutdown () { if (this.isShutdown) { - return Promise.resolve() + this.isShutdown = true + this.#clearTimer() + this.#export() + this.exporter.shutdown() } - - this.isShutdown = true - this.#clearTimer() - this.#export() - return this.exporter ? this.exporter.shutdown() : Promise.resolve() } /** @@ -105,7 +102,9 @@ class BatchLogRecordProcessor { return } - const logRecords = this.#logRecords.splice(0, this.#maxExportBatchSize) + const logRecords = this.#logRecords.slice(0, this.#maxExportBatchSize) + this.#logRecords = this.#logRecords.slice(this.#maxExportBatchSize) + this.#clearTimer() this.exporter.export(logRecords, () => {}) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index fd0bd0fcc0e..2e7f0a22df0 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -60,11 +60,7 @@ class Logger { * @returns {void} */ emit (logRecord) { - if (this.loggerProvider.isShutdown) { - return - } - - if (!this.loggerProvider.processor) { + if (this.loggerProvider.isShutdown || !this.loggerProvider.processor) { return } @@ -74,7 +70,7 @@ class Logger { // Set default timestamp if not provided if (!logRecord.timestamp) { - logRecord.timestamp = Date.now() * 1_000_000 + logRecord.timestamp = Number(process.hrtime.bigint()) } if (!logRecord.context) { diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index d4c4d0bd74a..f0958e98678 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -86,36 +86,24 @@ class LoggerProvider { /** * Forces a flush of all pending log records. - * @returns {Promise} Promise that resolves when flush is n ssue cncomplete + * @returns {undefined} Promise that resolves when flush is n ssue cncomplete */ forceFlush () { if (this.isShutdown) { - return Promise.reject(new Error('LoggerProvider is shutdown')) + throw new Error('LoggerProvider is shutdown') } - - if (!this.processor) { - return Promise.resolve() - } - - return this.processor.forceFlush() + return this.processor?.forceFlush() } /** * Shuts down the logger provider and all associated processors. - * @returns {Promise} Promise that resolves when shutdown is complete + * @returns {undefined} Promise that resolves when shutdown is complete */ shutdown () { - if (this.isShutdown) { - return Promise.resolve() + if (!this.isShutdown) { + this.isShutdown = true + this.processor.shutdown() } - - this.isShutdown = true - - if (!this.processor) { - return Promise.resolve() - } - - return this.processor.shutdown() } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index b758f5e7bc2..728b9630e00 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -76,10 +76,9 @@ class OtlpHttpLogExporter { /** * Shuts down the exporter. - * @returns {Promise} Promise that resolves when shutdown is complete + * @returns {undefined} Promise that resolves when shutdown is complete */ shutdown () { - return Promise.resolve() } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 9a7b43a563f..80679280ba4 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -165,7 +165,7 @@ class OtlpTransformer { // Create scope logs for each instrumentation library const scopeLogs = [] - for (const [, records] of groupedRecords.entries()) { + for (const records of groupedRecords.values()) { const schemaUrl = records[0]?.instrumentationScope?.schemaUrl || '' scopeLogs.push({ scope: { @@ -202,7 +202,7 @@ class OtlpTransformer { * @private */ #transformLogRecord (logRecord) { - const timestamp = logRecord.timestamp || Date.now() * 1_000_000 + const timestamp = logRecord.timestamp // Extract span context from the log record's context const spanContext = this.#extractSpanContext(logRecord.context) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index d37894ebe7e..232583e182f 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -328,9 +328,9 @@ describe('OpenTelemetry Logs', () => { }) it('configures OTLP endpoint from environment variable', () => { - process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4321/v2/logs' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4318/v1/logs') + assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4321/v2/logs') }) it('prioritizes logs-specific endpoint over generic endpoint', () => { From 0b8e71dca82e299ccc404a71bd65a6ce82dd704f Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 1 Oct 2025 15:18:44 -0400 Subject: [PATCH 44/61] clean up protobuf loader file --- .../opentelemetry/logs/otlp_transformer.js | 29 +++++-------------- .../src/opentelemetry/logs/protobuf_loader.js | 18 ++++-------- .../dd-trace/test/opentelemetry/logs.spec.js | 4 +-- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 80679280ba4..b57c1b17b3a 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -48,7 +48,6 @@ const SEVERITY_MAP = { * @class OtlpTransformer */ class OtlpTransformer { - #protobufTypes #resourceAttributes /** @@ -60,7 +59,6 @@ class OtlpTransformer { constructor (resourceAttributes, protocol) { this.#resourceAttributes = this.#transformAttributes(resourceAttributes) this.protocol = protocol - this.#protobufTypes = null } /** @@ -100,19 +98,6 @@ class OtlpTransformer { return grouped } - /** - * Gets the protobuf types, loading them lazily to reduce startup overhead. - * @returns {Object} Protobuf types object - * @private - */ - #getProtobufTypes () { - // Delay the loading of protobuf types to reduce startup overhead - if (!this.#protobufTypes) { - this.#protobufTypes = getProtobufTypes() - } - return this.#protobufTypes - } - /** * Transforms log records to protobuf format. * @param {LogRecord[]} logRecords - Array of enriched log records to transform @@ -120,7 +105,7 @@ class OtlpTransformer { * @private */ #transformToProtobuf (logRecords) { - const { _logsService } = this.#getProtobufTypes() + const { protoLogsService } = getProtobufTypes() // Create the OTLP LogsData structure const logsData = { resourceLogs: [{ @@ -130,8 +115,8 @@ class OtlpTransformer { } // Serialize to protobuf - const message = _logsService.create(logsData) - const buffer = _logsService.encode(message).finish() + const message = protoLogsService.create(logsData) + const buffer = protoLogsService.encode(message).finish() return buffer } @@ -270,15 +255,15 @@ class OtlpTransformer { * @private */ #mapSeverityNumber (severityNumber) { - const { _severityNumber } = this.#getProtobufTypes() + const { protoSeverityNumber } = getProtobufTypes() - if (!_severityNumber) { - log.error('_severityNumber is undefined') + if (!protoSeverityNumber) { + log.error('protoSeverityNumber is undefined') return 9 // Default to INFO } const severityName = SEVERITY_MAP[severityNumber] || 'SEVERITY_NUMBER_INFO' - return _severityNumber.values[severityName] + return protoSeverityNumber.values[severityName] } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js index 4b1e3a32f6e..a962900d988 100644 --- a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js @@ -19,15 +19,12 @@ const path = require('path') const fs = require('fs') let _root = null -let _logsService = null -let _resourceLogs = null -let _scopeLogs = null -let _logRecord = null -let _severityNumber = null +let protoLogsService = null +let protoSeverityNumber = null function getProtobufTypes () { if (_root) { - return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } + return { protoLogsService, protoSeverityNumber } } // Load the proto files const protoDir = __dirname @@ -45,13 +42,10 @@ function getProtobufTypes () { _root = protobuf.loadSync(protoFiles) // Get the message types - _logsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') - _resourceLogs = _root.lookupType('opentelemetry.proto.logs.v1.ResourceLogs') - _scopeLogs = _root.lookupType('opentelemetry.proto.logs.v1.ScopeLogs') - _logRecord = _root.lookupType('opentelemetry.proto.logs.v1.LogRecord') - _severityNumber = _root.lookupEnum('opentelemetry.proto.logs.v1.SeverityNumber') + protoLogsService = _root.lookupType('opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest') + protoSeverityNumber = _root.lookupEnum('opentelemetry.proto.logs.v1.SeverityNumber') - return { _root, _logsService, _resourceLogs, _scopeLogs, _logRecord, _severityNumber } + return { protoLogsService, protoSeverityNumber } } module.exports = { diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 232583e182f..4a95402e6e1 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -8,7 +8,7 @@ const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') require('../setup/core') -const { _logsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() +const { protoLogsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() describe('OpenTelemetry Logs', () => { let originalEnv @@ -35,7 +35,7 @@ describe('OpenTelemetry Logs', () => { end: () => { const decoded = protocol === 'json' ? JSON.parse(capturedPayload.toString()) - : _logsService.decode(capturedPayload) + : protoLogsService.decode(capturedPayload) validator(decoded, capturedHeaders) validatorCalled = true }, From 5410486cda6241ad781c947a54da5effa9a43874 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 3 Oct 2025 10:37:00 -0400 Subject: [PATCH 45/61] lint --- .../dd-trace/src/opentelemetry/logs/batch_log_processor.js | 2 +- .../dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 16d60fb351f..5fa810e70d6 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -104,7 +104,7 @@ class BatchLogRecordProcessor { const logRecords = this.#logRecords.slice(0, this.#maxExportBatchSize) this.#logRecords = this.#logRecords.slice(this.#maxExportBatchSize) - + this.#clearTimer() this.exporter.export(logRecords, () => {}) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index 728b9630e00..dc5737f5951 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -78,8 +78,7 @@ class OtlpHttpLogExporter { * Shuts down the exporter. * @returns {undefined} Promise that resolves when shutdown is complete */ - shutdown () { - } + shutdown () {} /** * Sends the payload via HTTP request. From 55e86e926c97f3fdf582f9d7c432d67d40da01d6 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 3 Oct 2025 15:03:47 -0400 Subject: [PATCH 46/61] move protos to same dir, this will set up metrics work --- packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js | 2 +- .../dd-trace/src/opentelemetry/{logs => protos}/common.proto | 0 packages/dd-trace/src/opentelemetry/{logs => protos}/logs.proto | 0 .../dd-trace/src/opentelemetry/{logs => protos}/payload.proto | 0 .../src/opentelemetry/{logs => protos}/protobuf_loader.js | 0 .../dd-trace/src/opentelemetry/{logs => protos}/resource.proto | 0 packages/dd-trace/test/opentelemetry/logs.spec.js | 2 +- 7 files changed, 2 insertions(+), 2 deletions(-) rename packages/dd-trace/src/opentelemetry/{logs => protos}/common.proto (100%) rename packages/dd-trace/src/opentelemetry/{logs => protos}/logs.proto (100%) rename packages/dd-trace/src/opentelemetry/{logs => protos}/payload.proto (100%) rename packages/dd-trace/src/opentelemetry/{logs => protos}/protobuf_loader.js (100%) rename packages/dd-trace/src/opentelemetry/{logs => protos}/resource.proto (100%) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index b57c1b17b3a..944f059df19 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -1,7 +1,7 @@ 'use strict' const { SeverityNumber } = require('@opentelemetry/api-logs') -const { getProtobufTypes } = require('./protobuf_loader') +const { getProtobufTypes } = require('../protos/protobuf_loader') const { trace } = require('@opentelemetry/api') const log = require('../../log') diff --git a/packages/dd-trace/src/opentelemetry/logs/common.proto b/packages/dd-trace/src/opentelemetry/protos/common.proto similarity index 100% rename from packages/dd-trace/src/opentelemetry/logs/common.proto rename to packages/dd-trace/src/opentelemetry/protos/common.proto diff --git a/packages/dd-trace/src/opentelemetry/logs/logs.proto b/packages/dd-trace/src/opentelemetry/protos/logs.proto similarity index 100% rename from packages/dd-trace/src/opentelemetry/logs/logs.proto rename to packages/dd-trace/src/opentelemetry/protos/logs.proto diff --git a/packages/dd-trace/src/opentelemetry/logs/payload.proto b/packages/dd-trace/src/opentelemetry/protos/payload.proto similarity index 100% rename from packages/dd-trace/src/opentelemetry/logs/payload.proto rename to packages/dd-trace/src/opentelemetry/protos/payload.proto diff --git a/packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js similarity index 100% rename from packages/dd-trace/src/opentelemetry/logs/protobuf_loader.js rename to packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js diff --git a/packages/dd-trace/src/opentelemetry/logs/resource.proto b/packages/dd-trace/src/opentelemetry/protos/resource.proto similarity index 100% rename from packages/dd-trace/src/opentelemetry/logs/resource.proto rename to packages/dd-trace/src/opentelemetry/protos/resource.proto diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 4a95402e6e1..d6321db791d 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -8,7 +8,7 @@ const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') require('../setup/core') -const { protoLogsService } = require('../../src/opentelemetry/logs/protobuf_loader').getProtobufTypes() +const { protoLogsService } = require('../../src/opentelemetry/protos/protobuf_loader').getProtobufTypes() describe('OpenTelemetry Logs', () => { let originalEnv From 311500ce483da6a971924b7b48862ee0f2fb2067 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 08:44:23 -0400 Subject: [PATCH 47/61] clean up throws --- packages/dd-trace/src/opentelemetry/logs/logger_provider.js | 5 ++--- .../dd-trace/src/opentelemetry/protos/protobuf_loader.js | 5 ----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index f0958e98678..779afaa0e6e 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -89,10 +89,9 @@ class LoggerProvider { * @returns {undefined} Promise that resolves when flush is n ssue cncomplete */ forceFlush () { - if (this.isShutdown) { - throw new Error('LoggerProvider is shutdown') + if (!this.isShutdown) { + return this.processor?.forceFlush() } - return this.processor?.forceFlush() } /** diff --git a/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js index a962900d988..bdf1ae0b9c5 100644 --- a/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js @@ -16,7 +16,6 @@ const protobuf = require('protobufjs') const path = require('path') -const fs = require('fs') let _root = null let protoLogsService = null @@ -35,10 +34,6 @@ function getProtobufTypes () { 'payload.proto' ].map(file => path.join(protoDir, file)) - if (!protoFiles.every(file => fs.existsSync(file))) { - throw new Error('Proto files not found') - } - _root = protobuf.loadSync(protoFiles) // Get the message types From 07ab61c03eaf507713d83280b91b9278ac3106ab Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 10:37:23 -0400 Subject: [PATCH 48/61] update protos --- .../src/opentelemetry/protos/common.proto | 85 +++++- .../src/opentelemetry/protos/logs.proto | 277 +++++++++++------- .../opentelemetry/protos/logs_service.proto | 78 +++++ .../src/opentelemetry/protos/payload.proto | 51 ---- .../opentelemetry/protos/protobuf_loader.js | 2 +- .../src/opentelemetry/protos/resource.proto | 32 +- 6 files changed, 342 insertions(+), 183 deletions(-) create mode 100644 packages/dd-trace/src/opentelemetry/protos/logs_service.proto delete mode 100644 packages/dd-trace/src/opentelemetry/protos/payload.proto diff --git a/packages/dd-trace/src/opentelemetry/protos/common.proto b/packages/dd-trace/src/opentelemetry/protos/common.proto index 6b3c0deee5a..9c6b36520e1 100644 --- a/packages/dd-trace/src/opentelemetry/protos/common.proto +++ b/packages/dd-trace/src/opentelemetry/protos/common.proto @@ -1,20 +1,34 @@ +// Vendored from: https://github.com/open-telemetry/opentelemetry-proto/blob/v1.7.0/opentelemetry/proto/logs/v1/common.proto +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package opentelemetry.proto.common.v1; -option go_package = "go.opentelemetry.io/collector/pdata/pcommon"; +option csharp_namespace = "OpenTelemetry.Proto.Common.V1"; +option java_multiple_files = true; +option java_package = "io.opentelemetry.proto.common.v1"; +option java_outer_classname = "CommonProto"; +option go_package = "go.opentelemetry.io/proto/otlp/common/v1"; // AnyValue is used to represent any type of attribute value. AnyValue may contain a -// simple scalar or an arbitrary complex structure including arrays and nested objects. -// AnyValue is a oneof type and can be one of the following: -// - string_value: A string value. -// - bool_value: A boolean value. -// - int_value: An integer value. -// - double_value: A double value. -// - array_value: An array of AnyValue values. -// - kvlist_value: A key-value list of AnyValue values. -// - bytes_value: A bytes value. +// primitive value such as a string or integer or it may contain an arbitrary nested +// object containing arrays, key-value lists and primitives. message AnyValue { + // The value is one of the listed fields. It is valid for all values to be unspecified + // in which case this AnyValue is considered to be "empty". oneof value { string string_value = 1; bool bool_value = 2; @@ -34,26 +48,69 @@ message ArrayValue { } // KeyValueList is a list of KeyValue messages. We need KeyValueList as a message -// since oneof in AnyValue does not allow repeated fields. +// since `oneof` in AnyValue does not allow repeated fields. Everywhere else where we need +// a list of KeyValue messages (e.g. in Span) we use `repeated KeyValue` directly to +// avoid unnecessary extra wrapping (which slows down the protocol). The 2 approaches +// are semantically equivalent. message KeyValueList { // A collection of key/value pairs of key-value pairs. The list may be empty (may // contain 0 elements). + // The keys MUST be unique (it is not allowed to have more than one + // value with the same key). repeated KeyValue values = 1; } -// KeyValue is a key-value pair that is used to store metadata about the telemetry -// record. +// KeyValue is a key-value pair that is used to store Span attributes, Link +// attributes, etc. message KeyValue { string key = 1; AnyValue value = 2; } // InstrumentationScope is a message representing the instrumentation scope information -// such as the fully qualified name and version. +// such as the fully qualified name and version. message InstrumentationScope { // An empty instrumentation scope name means the name is unknown. string name = 1; string version = 2; + + // Additional attributes that describe the scope. [Optional]. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). repeated KeyValue attributes = 3; uint32 dropped_attributes_count = 4; } + +// A reference to an Entity. +// Entity represents an object of interest associated with produced telemetry: e.g spans, metrics, profiles, or logs. +// +// Status: [Development] +message EntityRef { + // The Schema URL, if known. This is the identifier of the Schema that the entity data + // is recorded in. To learn more about Schema URL see + // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + // + // This schema_url applies to the data in this message and to the Resource attributes + // referenced by id_keys and description_keys. + // TODO: discuss if we are happy with this somewhat complicated definition of what + // the schema_url applies to. + // + // This field obsoletes the schema_url field in ResourceMetrics/ResourceSpans/ResourceLogs. + string schema_url = 1; + + // Defines the type of the entity. MUST not change during the lifetime of the entity. + // For example: "service" or "host". This field is required and MUST not be empty + // for valid entities. + string type = 2; + + // Attribute Keys that identify the entity. + // MUST not change during the lifetime of the entity. The Id must contain at least one attribute. + // These keys MUST exist in the containing {message}.attributes. + repeated string id_keys = 3; + + // Descriptive (non-identifying) attribute keys of the entity. + // MAY change over the lifetime of the entity. MAY be empty. + // These attribute keys are not part of entity's identity. + // These keys MUST exist in the containing {message}.attributes. + repeated string description_keys = 4; +} \ No newline at end of file diff --git a/packages/dd-trace/src/opentelemetry/protos/logs.proto b/packages/dd-trace/src/opentelemetry/protos/logs.proto index 2cfb8710c1d..9c1d0bb7493 100644 --- a/packages/dd-trace/src/opentelemetry/protos/logs.proto +++ b/packages/dd-trace/src/opentelemetry/protos/logs.proto @@ -1,3 +1,18 @@ +// Vendored from: https://github.com/open-telemetry/opentelemetry-proto/blob/v1.7.0/opentelemetry/proto/logs/v1/logs.proto +// Copyright 2020, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package opentelemetry.proto.logs.v1; @@ -5,23 +20,52 @@ package opentelemetry.proto.logs.v1; import "common.proto"; import "resource.proto"; -option go_package = "go.opentelemetry.io/collector/pdata/plog"; +option csharp_namespace = "OpenTelemetry.Proto.Logs.V1"; +option java_multiple_files = true; +option java_package = "io.opentelemetry.proto.logs.v1"; +option java_outer_classname = "LogsProto"; +option go_package = "go.opentelemetry.io/proto/otlp/logs/v1"; + +// LogsData represents the logs data that can be stored in a persistent storage, +// OR can be embedded by other protocols that transfer OTLP logs data but do not +// implement the OTLP protocol. +// +// The main difference between this message and collector protocol is that +// in this message there will not be any "control" or "metadata" specific to +// OTLP protocol. +// +// When new fields are added into this message, the OTLP request MUST be updated +// as well. +message LogsData { + // An array of ResourceLogs. + // For data coming from a single resource this array will typically contain + // one element. Intermediary nodes that receive data from multiple origins + // typically batch the data before forwarding further and in that case this + // array will contain multiple elements. + repeated ResourceLogs resource_logs = 1; +} -// A collection of logs from a Resource. +// A collection of ScopeLogs from a Resource. message ResourceLogs { + reserved 1000; + // The resource for the logs in this message. - // If this field is not set then no resource info is known. + // If this field is not set then resource info is unknown. opentelemetry.proto.resource.v1.Resource resource = 1; // A list of ScopeLogs that originate from a resource. repeated ScopeLogs scope_logs = 2; + // The Schema URL, if known. This is the identifier of the Schema that the resource data + // is recorded in. Notably, the last part of the URL path is the version number of the + // schema: http[s]://server[:port]/path/. To learn more about Schema URL see + // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url // This schema_url applies to the data in the "resource" field. It does not apply // to the data in the "scope_logs" field which have their own schema_url field. string schema_url = 3; } -// A collection of logs from a Scope. +// A collection of Logs produced by a Scope. message ScopeLogs { // The instrumentation scope information for the logs in this message. // Semantically when InstrumentationScope isn't set, it is equivalent with @@ -31,147 +75,152 @@ message ScopeLogs { // A list of log records. repeated LogRecord log_records = 2; - // This schema_url applies to all the log records in the "log_records" field. + // The Schema URL, if known. This is the identifier of the Schema that the log data + // is recorded in. Notably, the last part of the URL path is the version number of the + // schema: http[s]://server[:port]/path/. To learn more about Schema URL see + // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + // This schema_url applies to all logs in the "logs" field. string schema_url = 3; } +// Possible values for LogRecord.SeverityNumber. +enum SeverityNumber { + // UNSPECIFIED is the default SeverityNumber, it MUST NOT be used. + SEVERITY_NUMBER_UNSPECIFIED = 0; + SEVERITY_NUMBER_TRACE = 1; + SEVERITY_NUMBER_TRACE2 = 2; + SEVERITY_NUMBER_TRACE3 = 3; + SEVERITY_NUMBER_TRACE4 = 4; + SEVERITY_NUMBER_DEBUG = 5; + SEVERITY_NUMBER_DEBUG2 = 6; + SEVERITY_NUMBER_DEBUG3 = 7; + SEVERITY_NUMBER_DEBUG4 = 8; + SEVERITY_NUMBER_INFO = 9; + SEVERITY_NUMBER_INFO2 = 10; + SEVERITY_NUMBER_INFO3 = 11; + SEVERITY_NUMBER_INFO4 = 12; + SEVERITY_NUMBER_WARN = 13; + SEVERITY_NUMBER_WARN2 = 14; + SEVERITY_NUMBER_WARN3 = 15; + SEVERITY_NUMBER_WARN4 = 16; + SEVERITY_NUMBER_ERROR = 17; + SEVERITY_NUMBER_ERROR2 = 18; + SEVERITY_NUMBER_ERROR3 = 19; + SEVERITY_NUMBER_ERROR4 = 20; + SEVERITY_NUMBER_FATAL = 21; + SEVERITY_NUMBER_FATAL2 = 22; + SEVERITY_NUMBER_FATAL3 = 23; + SEVERITY_NUMBER_FATAL4 = 24; +} + +// LogRecordFlags represents constants used to interpret the +// LogRecord.flags field, which is protobuf 'fixed32' type and is to +// be used as bit-fields. Each non-zero value defined in this enum is +// a bit-mask. To extract the bit-field, for example, use an +// expression like: +// +// (logRecord.flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK) +// +enum LogRecordFlags { + // The zero value for the enum. Should not be used for comparisons. + // Instead use bitwise "and" with the appropriate mask as shown above. + LOG_RECORD_FLAGS_DO_NOT_USE = 0; + + // Bits 0-7 are used for trace flags. + LOG_RECORD_FLAGS_TRACE_FLAGS_MASK = 0x000000FF; + + // Bits 8-31 are reserved for future use. +} + // A log record according to OpenTelemetry Log Data Model: -// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md +// https://github.com/open-telemetry/oteps/blob/main/text/logs/0097-log-data-model.md message LogRecord { + reserved 4; + // time_unix_nano is the time when the event occurred. // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. // Value of 0 indicates unknown or missing timestamp. fixed64 time_unix_nano = 1; // Time when the event was observed by the collection system. - // For events that originate in OpenTelemetry (e.g. using OpenTelemetry Logging - // SDK) this timestamp is typically set at the generation time and is equal to - // Timestamp. For events that originate externally and collected by OpenTelemetry - // (e.g. using Collector) this is the time when OpenTelemetry's code observed the - // event measured by the clock of the OpenTelemetry code. This field MUST be set - // once the event is observed by OpenTelemetry. + // For events that originate in OpenTelemetry (e.g. using OpenTelemetry Logging SDK) + // this timestamp is typically set at the generation time and is equal to Timestamp. + // For events originating externally and collected by OpenTelemetry (e.g. using + // Collector) this is the time when OpenTelemetry's code observed the event measured + // by the clock of the OpenTelemetry code. This field MUST be set once the event is + // observed by OpenTelemetry. + // + // For converting OpenTelemetry log data to formats that support only one timestamp or + // when receiving OpenTelemetry log data by recipients that support only one timestamp + // internally the following logic is recommended: + // - Use time_unix_nano if it is present, otherwise use observed_time_unix_nano. // - // For converting OpenTelemetry log data to formats that support only one - // timestamp per log entry (such as Fluent Bit Logstash or Splunk) this field - // SHOULD be used as the "log timestamp". - // An implementation of the OpenTelemetry API SHOULD NOT set this field - // if the corresponding event did not happen in this process. - fixed64 observed_time_unix_nano = 2; + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // Value of 0 indicates unknown or missing timestamp. + fixed64 observed_time_unix_nano = 11; // Numerical value of the severity, normalized to values described in Log Data Model. // [Optional]. - opentelemetry.proto.logs.v1.SeverityNumber severity_number = 3; + SeverityNumber severity_number = 2; // The severity text (also known as log level). The original string representation as // it is known at the source. [Optional]. - string severity_text = 4; + string severity_text = 3; // A value containing the body of the log record. Can be for example a human-readable - // string message (including multi-line text) or a structured object in a format - // that is known to the logging SDK. + // string message (including multi-line) describing the event in a free form or it can + // be a structured data composed of arrays and maps of other values. [Optional]. opentelemetry.proto.common.v1.AnyValue body = 5; // Additional attributes that describe the specific event occurrence. [Optional]. // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). repeated opentelemetry.proto.common.v1.KeyValue attributes = 6; + uint32 dropped_attributes_count = 7; // Flags, a bit field. 8 least significant bits are the trace flags as // defined in W3C Trace Context specification. 24 most significant bits are reserved // and must be set to 0. Readers must not assume that 24 most significant bits - // will be zero and must correctly mask the bits when reading 8-bit trace flag - // (use flags & TRACE_FLAGS_MASK). [Optional]. - fixed32 flags = 7; + // will be zero and must correctly mask the bits when reading 8-bit trace flag (use + // flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK). [Optional]. + fixed32 flags = 8; // A unique identifier for a trace. All logs from the same trace share - // the same trace_id. The ID is a 16-byte array. An ID with all zeroes - // is considered invalid. Can be set for logs that are part of request processing - // and are associated with a particular trace, or if the log record is a - // standalone log record that is not part of a request processing. - // The value is an array of bytes. [Optional]. - bytes trace_id = 8; + // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + // of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is optional. + // + // The receivers SHOULD assume that the log record is not associated with a + // trace if any of the following is true: + // - the field is not present, + // - the field contains an invalid value. + bytes trace_id = 9; // A unique identifier for a span within a trace, assigned when the span - // is created. The ID is an 8-byte array. An ID with all zeroes is considered - // invalid. Can be set for logs that are part of a particular processing - // within a trace. The value is an array of bytes. [Optional]. - bytes span_id = 9; -} - -// Possible values for LogRecord.SeverityNumber. -enum SeverityNumber { - // UNSPECIFIED is the default SeverityNumber, it MUST NOT be used. - SEVERITY_NUMBER_UNSPECIFIED = 0; - - // TRACE is SeverityNumber for TRACE level. - SEVERITY_NUMBER_TRACE = 1; - - // TRACE2 is SeverityNumber for TRACE2 level. - SEVERITY_NUMBER_TRACE2 = 2; - - // TRACE3 is SeverityNumber for TRACE3 level. - SEVERITY_NUMBER_TRACE3 = 3; - - // TRACE4 is SeverityNumber for TRACE4 level. - SEVERITY_NUMBER_TRACE4 = 4; - - // DEBUG is SeverityNumber for DEBUG level. - SEVERITY_NUMBER_DEBUG = 5; - - // DEBUG2 is SeverityNumber for DEBUG2 level. - SEVERITY_NUMBER_DEBUG2 = 6; - - // DEBUG3 is SeverityNumber for DEBUG3 level. - SEVERITY_NUMBER_DEBUG3 = 7; - - // DEBUG4 is SeverityNumber for DEBUG4 level. - SEVERITY_NUMBER_DEBUG4 = 8; - - // INFO is SeverityNumber for INFO level. - SEVERITY_NUMBER_INFO = 9; - - // INFO2 is SeverityNumber for INFO2 level. - SEVERITY_NUMBER_INFO2 = 10; - - // INFO3 is SeverityNumber for INFO3 level. - SEVERITY_NUMBER_INFO3 = 11; - - // INFO4 is SeverityNumber for INFO4 level. - SEVERITY_NUMBER_INFO4 = 12; - - // WARN is SeverityNumber for WARN level. - SEVERITY_NUMBER_WARN = 13; - - // WARN2 is SeverityNumber for WARN2 level. - SEVERITY_NUMBER_WARN2 = 14; - - // WARN3 is SeverityNumber for WARN3 level. - SEVERITY_NUMBER_WARN3 = 15; - - // WARN4 is SeverityNumber for WARN4 level. - SEVERITY_NUMBER_WARN4 = 16; - - // ERROR is SeverityNumber for ERROR level. - SEVERITY_NUMBER_ERROR = 17; - - // ERROR2 is SeverityNumber for ERROR2 level. - SEVERITY_NUMBER_ERROR2 = 18; - - // ERROR3 is SeverityNumber for ERROR3 level. - SEVERITY_NUMBER_ERROR3 = 19; - - // ERROR4 is SeverityNumber for ERROR4 level. - SEVERITY_NUMBER_ERROR4 = 20; - - // FATAL is SeverityNumber for FATAL level. - SEVERITY_NUMBER_FATAL = 21; - - // FATAL2 is SeverityNumber for FATAL2 level. - SEVERITY_NUMBER_FATAL2 = 22; - - // FATAL3 is SeverityNumber for FATAL3 level. - SEVERITY_NUMBER_FATAL3 = 23; - - // FATAL4 is SeverityNumber for FATAL4 level. - SEVERITY_NUMBER_FATAL4 = 24; -} + // is created. The ID is an 8-byte array. An ID with all zeroes OR of length + // other than 8 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is optional. If the sender specifies a valid span_id then it SHOULD also + // specify a valid trace_id. + // + // The receivers SHOULD assume that the log record is not associated with a + // span if any of the following is true: + // - the field is not present, + // - the field contains an invalid value. + bytes span_id = 10; + + // A unique identifier of event category/type. + // All events with the same event_name are expected to conform to the same + // schema for both their attributes and their body. + // + // Recommended to be fully qualified and short (no longer than 256 characters). + // + // Presence of event_name on the log record identifies this record + // as an event. + // + // [Optional]. + string event_name = 12; +} \ No newline at end of file diff --git a/packages/dd-trace/src/opentelemetry/protos/logs_service.proto b/packages/dd-trace/src/opentelemetry/protos/logs_service.proto new file mode 100644 index 00000000000..a6c56a0d6ca --- /dev/null +++ b/packages/dd-trace/src/opentelemetry/protos/logs_service.proto @@ -0,0 +1,78 @@ +// Vendored from: https://github.com/open-telemetry/opentelemetry-proto/blob/v1.7.0/opentelemetry/proto/collector/logs/v1/logs_service.proto +// Copyright 2020, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package opentelemetry.proto.collector.logs.v1; + +import "logs.proto"; + +option csharp_namespace = "OpenTelemetry.Proto.Collector.Logs.V1"; +option java_multiple_files = true; +option java_package = "io.opentelemetry.proto.collector.logs.v1"; +option java_outer_classname = "LogsServiceProto"; +option go_package = "go.opentelemetry.io/proto/otlp/collector/logs/v1"; + +// Service that can be used to push logs between one Application instrumented with +// OpenTelemetry and an collector, or between an collector and a central collector (in this +// case logs are sent/received to/from multiple Applications). +service LogsService { + rpc Export(ExportLogsServiceRequest) returns (ExportLogsServiceResponse) {} +} + +message ExportLogsServiceRequest { + // An array of ResourceLogs. + // For data coming from a single resource this array will typically contain one + // element. Intermediary nodes (such as OpenTelemetry Collector) that receive + // data from multiple origins typically batch the data before forwarding further and + // in that case this array will contain multiple elements. + repeated opentelemetry.proto.logs.v1.ResourceLogs resource_logs = 1; +} + +message ExportLogsServiceResponse { + // The details of a partially successful export request. + // + // If the request is only partially accepted + // (i.e. when the server accepts only parts of the data and rejects the rest) + // the server MUST initialize the `partial_success` field and MUST + // set the `rejected_` with the number of items it rejected. + // + // Servers MAY also make use of the `partial_success` field to convey + // warnings/suggestions to senders even when the request was fully accepted. + // In such cases, the `rejected_` MUST have a value of `0` and + // the `error_message` MUST be non-empty. + // + // A `partial_success` message with an empty value (rejected_ = 0 and + // `error_message` = "") is equivalent to it not being set/present. Senders + // SHOULD interpret it the same way as in the full success case. + ExportLogsPartialSuccess partial_success = 1; +} + +message ExportLogsPartialSuccess { + // The number of rejected log records. + // + // A `rejected_` field holding a `0` value indicates that the + // request was fully accepted. + int64 rejected_log_records = 1; + + // A developer-facing human-readable message in English. It should be used + // either to explain why the server rejected parts of the data during a partial + // success or to convey warnings/suggestions during a full success. The message + // should offer guidance on how users can address such issues. + // + // error_message is an optional field. An error_message with an empty value + // is equivalent to it not being set. + string error_message = 2; +} \ No newline at end of file diff --git a/packages/dd-trace/src/opentelemetry/protos/payload.proto b/packages/dd-trace/src/opentelemetry/protos/payload.proto deleted file mode 100644 index 74b5cb1dd23..00000000000 --- a/packages/dd-trace/src/opentelemetry/protos/payload.proto +++ /dev/null @@ -1,51 +0,0 @@ -syntax = "proto3"; - -package opentelemetry.proto.collector.logs.v1; - -import "logs.proto"; - -option go_package = "go.opentelemetry.io/collector/pdata/plog/plogotlp"; - -// Service that can be used to push logs between one Application instrumented with -// OpenTelemetry and an collector, or between a collector and a central collector. -service LogsService { - // For performance reasons, it is recommended to keep this RPC - // alive for the entire life of the application. - rpc Export(ExportLogsServiceRequest) returns (ExportLogsServiceResponse); -} - -message ExportLogsServiceRequest { - // An array of ResourceLogs. - // For data coming from a single resource this array will typically contain - // one element. Intermediary nodes that receive data from multiple origins - // and batch this data before sending further, will send data from multiple - // resources in a single request. - repeated opentelemetry.proto.logs.v1.ResourceLogs resource_logs = 1; -} - -message ExportLogsServiceResponse { - // The details of a partially successful export request. - // - // If the request is only partially accepted - // (i.e. when the server accepts only parts of the data and rejects the rest) - // the server MUST initialize the `partial_success` field and MUST - // set the `rejected_*` fields accordingly. - // - // If the request is fully accepted, the server MUST NOT initialize the - // `partial_success` field. - ExportLogsPartialSuccess partial_success = 1; -} - -message ExportLogsPartialSuccess { - // The number of rejected log records. - // - // A `rejected_` field holding a `0` value indicates that the - // request was fully accepted. - int64 rejected_log_records = 1; - - // A developer-facing human-readable message in English. It should be used - // either to explain why the server rejected parts of the data during a partial - // success or to convey failure/warning information when the request was fully - // accepted. A message should be concise and should not exceed 255 characters. - string error_message = 2; -} diff --git a/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js b/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js index bdf1ae0b9c5..4168feaf8b2 100644 --- a/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js +++ b/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js @@ -31,7 +31,7 @@ function getProtobufTypes () { 'common.proto', 'resource.proto', 'logs.proto', - 'payload.proto' + 'logs_service.proto' ].map(file => path.join(protoDir, file)) _root = protobuf.loadSync(protoFiles) diff --git a/packages/dd-trace/src/opentelemetry/protos/resource.proto b/packages/dd-trace/src/opentelemetry/protos/resource.proto index 73e0419a5e7..0f80ca77229 100644 --- a/packages/dd-trace/src/opentelemetry/protos/resource.proto +++ b/packages/dd-trace/src/opentelemetry/protos/resource.proto @@ -1,10 +1,29 @@ +// Vendored from: https://github.com/open-telemetry/opentelemetry-proto/blob/v1.7.0/opentelemetry/proto/resource/v1/resource.proto +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package opentelemetry.proto.resource.v1; import "common.proto"; -option go_package = "go.opentelemetry.io/collector/pdata/pcommon"; +option csharp_namespace = "OpenTelemetry.Proto.Resource.V1"; +option java_multiple_files = true; +option java_package = "io.opentelemetry.proto.resource.v1"; +option java_outer_classname = "ResourceProto"; +option go_package = "go.opentelemetry.io/proto/otlp/resource/v1"; // Resource information. message Resource { @@ -13,7 +32,14 @@ message Resource { // attribute with the same key). repeated opentelemetry.proto.common.v1.KeyValue attributes = 1; - // dropped_attributes_count is the number of dropped attributes. If the value is 0, - // then no attributes were dropped. + // dropped_attributes_count is the number of dropped attributes. If the value is 0, then + // no attributes were dropped. uint32 dropped_attributes_count = 2; + + // Set of entities that participate in this Resource. + // + // Note: keys in the references MUST exist in attributes of this message. + // + // Status: [Development] + repeated opentelemetry.proto.common.v1.EntityRef entity_refs = 3; } From f25c7a5ae9ed91dba1205ef9d9f428070ee97f90 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 11:12:10 -0400 Subject: [PATCH 49/61] disable log injection when otel logs support is enabled --- packages/dd-trace/src/config.js | 6 ++++++ .../dd-trace/test/opentelemetry/logs.spec.js | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 727e8f9b4dd..af36d3b8719 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -1185,6 +1185,12 @@ class Config { this._setBoolean(calc, 'isImpactedTestsEnabled', !isFalse(DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED)) } + // Disable log injection when OTEL logs are enabled + // OTEL logs and DD log injection are mutually exclusive + if (this._env.otelLogsEnabled) { + this._setBoolean(calc, 'logInjection', false) + } + calc['dogstatsd.hostname'] = this._getHostname() // Compute OTLP logs URL to send payloads to the active Datadog Agent diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index d6321db791d..19a545142f0 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -370,6 +370,24 @@ describe('OpenTelemetry Logs', () => { const { loggerProvider } = setupTracer() assert.strictEqual(loggerProvider.processor.exporter.timeout, 1000) }) + + it('disables log injection when OTEL logs are enabled', () => { + const { loggerProvider } = setupTracer(true) + const tracer = require('../../') + + assert(loggerProvider) + assert.strictEqual(tracer._tracer._config.logInjection, false) + }) + + it('disables log injection even when DD_LOGS_INJECTION is explicitly set to true', () => { + // OTEL logs and DD log injection are mutually exclusive + process.env.DD_LOGS_INJECTION = 'true' + const { loggerProvider } = setupTracer(true) + const tracer = require('../../') + + assert(loggerProvider) + assert.strictEqual(tracer._tracer._config.logInjection, false) + }) }) describe('Telemetry Metrics', () => { From 9f716d13bdeb21b56de1e0b80f93321f45f0b980 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 16:08:43 -0400 Subject: [PATCH 50/61] update configurations to pass telemetry system tests --- packages/dd-trace/src/config.js | 22 +++++++++---------- packages/dd-trace/src/config_defaults.js | 4 ++++ .../opentelemetry/logs/otlp_transformer.js | 5 +++++ packages/dd-trace/src/telemetry/telemetry.js | 14 +++++++++++- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index af36d3b8719..a811ca93577 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -662,21 +662,19 @@ class Config { this._setBoolean(env, 'otelLogsEnabled', isTrue(DD_LOGS_OTEL_ENABLED)) // Set OpenTelemetry logs configuration with specific _LOGS_ vars taking precedence over generic _EXPORTERS_ vars - const customOtelLogsUrl = OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || OTEL_EXPORTER_OTLP_ENDPOINT - if (customOtelLogsUrl) { + if (OTEL_EXPORTER_OTLP_ENDPOINT) { // Only set if there's a custom URL, otherwise let calc phase handle the default - this._setString(env, 'otelLogsUrl', customOtelLogsUrl) + this._setString(env, 'otelUrl', OTEL_EXPORTER_OTLP_ENDPOINT) } - this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || OTEL_EXPORTER_OTLP_HEADERS) - const requestedProtocol = OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || OTEL_EXPORTER_OTLP_PROTOCOL - if (requestedProtocol === 'grpc') { - log.warn('OTLP gRPC protocol is not supported for logs. ' + - 'Defaulting to http/protobuf. gRPC protobuf support may be added in a future release.') - this._setString(env, 'otelLogsProtocol', 'http/protobuf') - } else { - this._setString(env, 'otelLogsProtocol', requestedProtocol || 'http/protobuf') + if (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) { + this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) } - env.otelLogsTimeout = maybeInt(OTEL_EXPORTER_OTLP_LOGS_TIMEOUT || OTEL_EXPORTER_OTLP_TIMEOUT) + this._setString(env, 'otelHeaders', OTEL_EXPORTER_OTLP_HEADERS) + this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || env.otelHeaders) + this._setString(env, 'otelProtocol', OTEL_EXPORTER_OTLP_PROTOCOL) + this._setString(env, 'otelLogsProtocol', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL || env.otelProtocol) + env.otelTimeout = maybeInt(OTEL_EXPORTER_OTLP_TIMEOUT) + env.otelLogsTimeout = maybeInt(OTEL_EXPORTER_OTLP_LOGS_TIMEOUT) || env.otelTimeout env.otelLogsBatchTimeout = maybeInt(OTEL_BSP_SCHEDULE_DELAY) env.otelLogsMaxExportBatchSize = maybeInt(OTEL_BSP_MAX_EXPORT_BATCH_SIZE) this._setBoolean( diff --git a/packages/dd-trace/src/config_defaults.js b/packages/dd-trace/src/config_defaults.js index 7b24495e05b..ae3223c0937 100644 --- a/packages/dd-trace/src/config_defaults.js +++ b/packages/dd-trace/src/config_defaults.js @@ -125,10 +125,14 @@ module.exports = { isImpactedTestsEnabled: false, logInjection: true, otelLogsEnabled: false, + otelUrl: undefined, otelLogsUrl: undefined, // Will be computed using agent host + otelHeaders: undefined, otelLogsHeaders: '', + otelProtocol: 'http/protobuf', otelLogsProtocol: 'http/protobuf', otelLogsTimeout: 10_000, + otelTimeout: 10_000, otelLogsBatchTimeout: 5000, otelLogsMaxExportBatchSize: 512, lookup: undefined, diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index 944f059df19..ffcac854c3c 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -58,6 +58,11 @@ class OtlpTransformer { */ constructor (resourceAttributes, protocol) { this.#resourceAttributes = this.#transformAttributes(resourceAttributes) + if (protocol === 'grpc') { + log.warn('OTLP gRPC protocol is not supported for logs. ' + + 'Defaulting to http/protobuf. gRPC protobuf support may be added in a future release.') + protocol = 'http/protobuf' + } this.protocol = protocol } diff --git a/packages/dd-trace/src/telemetry/telemetry.js b/packages/dd-trace/src/telemetry/telemetry.js index c21b1f39768..fb907bad2ec 100644 --- a/packages/dd-trace/src/telemetry/telemetry.js +++ b/packages/dd-trace/src/telemetry/telemetry.js @@ -328,7 +328,19 @@ const nameMapping = { instrumentationSource: 'instrumentation_source', injectionEnabled: 'ssi_injection_enabled', injectForce: 'ssi_forced_injection_enabled', - 'runtimeMetrics.enabled': 'runtimeMetrics' + 'runtimeMetrics.enabled': 'runtimeMetrics', + 'otelLogsEnabled': 'DD_LOGS_OTEL_ENABLED', + 'otelUrl': 'OTEL_EXPORTER_OTLP_ENDPOINT', + 'otelEndpoint': 'OTEL_EXPORTER_OTLP_ENDPOINT', + 'otelHeaders': 'OTEL_EXPORTER_OTLP_HEADERS', + 'otelProtocol': 'OTEL_EXPORTER_OTLP_PROTOCOL', + 'otelTimeout': 'OTEL_EXPORTER_OTLP_TIMEOUT', + 'otelLogsHeaders': 'OTEL_EXPORTER_OTLP_LOGS_HEADERS', + 'otelLogsProtocol': 'OTEL_EXPORTER_OTLP_LOGS_PROTOCOL', + 'otelLogsTimeout': 'OTEL_EXPORTER_OTLP_LOGS_TIMEOUT', + 'otelLogsUrl': 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', + 'otelLogsBatchTimeout': 'OTEL_BSP_SCHEDULE_DELAY', + 'otelLogsMaxExportBatchSize': 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE', } const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping']) From ea532c203ad1bbac7a71e24b14e79484fcc294c3 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 16:09:54 -0400 Subject: [PATCH 51/61] remove useless import --- packages/dd-trace/src/proxy.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 74232a7d0cc..7fca6287698 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -11,7 +11,7 @@ const nomenclature = require('./service-naming') const PluginManager = require('./plugin_manager') const NoopDogStatsDClient = require('./noop/dogstatsd') const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper') -let LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter, logs, os +let LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter, os const { setBaggageItem, getBaggageItem, @@ -276,7 +276,6 @@ class Tracer extends NoopProxy { LoggerProvider ??= require('./opentelemetry/logs').LoggerProvider BatchLogRecordProcessor ??= require('./opentelemetry/logs').BatchLogRecordProcessor OtlpHttpLogExporter ??= require('./opentelemetry/logs').OtlpHttpLogExporter - logs ??= require('@opentelemetry/api-logs').logs os ??= require('os') // Build resource attributes From e695249f4b4b6a39420f0bd1e04fea31bb56d9e8 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 16:49:44 -0400 Subject: [PATCH 52/61] add more tests --- .../dd-trace/src/opentelemetry/logs/logger.js | 8 -- .../opentelemetry/logs/otlp_transformer.js | 7 +- packages/dd-trace/src/telemetry/telemetry.js | 24 ++-- .../dd-trace/test/opentelemetry/logs.spec.js | 106 +++++++++++++++++- 4 files changed, 118 insertions(+), 27 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 2e7f0a22df0..5faa7598d62 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -45,14 +45,6 @@ class Logger { } } - /** - * Gets the resource associated with this logger. - * @returns {Resource} The resource attributes - */ - get resource () { - return this.loggerProvider.resource - } - /** * Emits a log record. * diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index ffcac854c3c..c0869576568 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -278,13 +278,8 @@ class OtlpTransformer { * @private */ #hexToBytes (hexString) { - if (!hexString || hexString.length === 0) { - return Buffer.alloc(0) - } - - const cleanHex = hexString.startsWith('0x') ? hexString.slice(2) : hexString + const cleanHex = hexString ? (hexString.startsWith('0x') ? hexString.slice(2) : hexString) : '' const paddedHex = cleanHex.length % 2 === 0 ? cleanHex : '0' + cleanHex - return Buffer.from(paddedHex, 'hex') } diff --git a/packages/dd-trace/src/telemetry/telemetry.js b/packages/dd-trace/src/telemetry/telemetry.js index fb907bad2ec..c19ff2d9708 100644 --- a/packages/dd-trace/src/telemetry/telemetry.js +++ b/packages/dd-trace/src/telemetry/telemetry.js @@ -329,18 +329,18 @@ const nameMapping = { injectionEnabled: 'ssi_injection_enabled', injectForce: 'ssi_forced_injection_enabled', 'runtimeMetrics.enabled': 'runtimeMetrics', - 'otelLogsEnabled': 'DD_LOGS_OTEL_ENABLED', - 'otelUrl': 'OTEL_EXPORTER_OTLP_ENDPOINT', - 'otelEndpoint': 'OTEL_EXPORTER_OTLP_ENDPOINT', - 'otelHeaders': 'OTEL_EXPORTER_OTLP_HEADERS', - 'otelProtocol': 'OTEL_EXPORTER_OTLP_PROTOCOL', - 'otelTimeout': 'OTEL_EXPORTER_OTLP_TIMEOUT', - 'otelLogsHeaders': 'OTEL_EXPORTER_OTLP_LOGS_HEADERS', - 'otelLogsProtocol': 'OTEL_EXPORTER_OTLP_LOGS_PROTOCOL', - 'otelLogsTimeout': 'OTEL_EXPORTER_OTLP_LOGS_TIMEOUT', - 'otelLogsUrl': 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', - 'otelLogsBatchTimeout': 'OTEL_BSP_SCHEDULE_DELAY', - 'otelLogsMaxExportBatchSize': 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE', + otelLogsEnabled: 'DD_LOGS_OTEL_ENABLED', + otelUrl: 'OTEL_EXPORTER_OTLP_ENDPOINT', + otelEndpoint: 'OTEL_EXPORTER_OTLP_ENDPOINT', + otelHeaders: 'OTEL_EXPORTER_OTLP_HEADERS', + otelProtocol: 'OTEL_EXPORTER_OTLP_PROTOCOL', + otelTimeout: 'OTEL_EXPORTER_OTLP_TIMEOUT', + otelLogsHeaders: 'OTEL_EXPORTER_OTLP_LOGS_HEADERS', + otelLogsProtocol: 'OTEL_EXPORTER_OTLP_LOGS_PROTOCOL', + otelLogsTimeout: 'OTEL_EXPORTER_OTLP_LOGS_TIMEOUT', + otelLogsUrl: 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', + otelLogsBatchTimeout: 'OTEL_BSP_SCHEDULE_DELAY', + otelLogsMaxExportBatchSize: 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE', } const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping']) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 19a545142f0..0672e03dfda 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -4,6 +4,7 @@ process.setMaxListeners(50) const assert = require('assert') +const os = require('os') const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') @@ -67,7 +68,12 @@ describe('OpenTelemetry Logs', () => { afterEach(() => { process.env = originalEnv - require('@opentelemetry/api-logs').logs.disable() + + const { logs } = require('@opentelemetry/api-logs') + + const provider = logs.getLoggerProvider() + provider.shutdown() + logs.disable() sinon.restore() }) @@ -292,6 +298,103 @@ describe('OpenTelemetry Logs', () => { }) }) }) + + it('handles invalid severity number by defaulting to INFO', (done) => { + mockOtlpExport((decoded) => { + const logRecord = decoded.resourceLogs[0].scopeLogs[0].logRecords[0] + // Invalid severity number should default to INFO (9) + assert.strictEqual(logRecord.severityNumber, 9) + done() + }) + + const { logs } = setupTracer() + const logger = logs.getLogger('test-logger') + + // Emit with an invalid severity number (999) + logger.emit({ + severityNumber: 999, + body: 'Test message with invalid severity' + }) + }) + + it('transforms different body types correctly', (done) => { + mockOtlpExport((decoded) => { + const logRecords = decoded.resourceLogs[0].scopeLogs[0].logRecords + + // String body + assert.strictEqual(logRecords[0].body.stringValue, 'string message') + + // Number body (protobuf returns Long objects for int64) + const intValue = logRecords[1].body.intValue + assert.strictEqual(typeof intValue === 'object' ? intValue.toNumber() : intValue, 42) + + // Boolean body + assert.strictEqual(logRecords[2].body.boolValue, true) + + // Object body + assert(logRecords[3].body.kvlistValue) + assert.strictEqual(logRecords[3].body.kvlistValue.values.length, 2) + assert.strictEqual(logRecords[3].body.kvlistValue.values[0].key, 'foo') + assert.strictEqual(logRecords[3].body.kvlistValue.values[0].value.stringValue, 'bar') + + // Default case (symbol) - should convert to string + assert.strictEqual(logRecords[4].body.stringValue, 'Symbol(test)') + + done() + }) + + const { logs } = setupTracer(true, '5') + const logger = logs.getLogger('test-logger') + + // Emit logs with different body types + logger.emit({ body: 'string message' }) + logger.emit({ body: 42 }) + logger.emit({ body: true }) + logger.emit({ body: { foo: 'bar', baz: 123 } }) + logger.emit({ body: Symbol('test') }) + }) + + it('sends logs after batch timeout expires', (done) => { + mockOtlpExport((decoded) => { + const logRecord = decoded.resourceLogs[0].scopeLogs[0].logRecords[0] + assert.strictEqual(logRecord.body.stringValue, 'timeout test') + done() + }) + + process.env.OTEL_BSP_MAX_EXPORT_BATCH_SIZE = '10' + process.env.OTEL_BSP_SCHEDULE_DELAY = '100' // 100ms timeout + + const { logs } = setupTracer() + const logger = logs.getLogger('test-logger') + + logger.emit({ body: 'timeout test' }) + + // Wait 100ms to ensure timer fires + setTimeout(() => {}, 100) + }) + + it('exports resource with service, version, env, and hostname', (done) => { + mockOtlpExport((decoded) => { + const resource = decoded.resourceLogs[0].resource + const resourceAttrs = {} + resource.attributes.forEach(attr => { resourceAttrs[attr.key] = attr.value.stringValue }) + + assert.strictEqual(resourceAttrs['service.name'], 'my-service') + assert.strictEqual(resourceAttrs['service.version'], 'v1.2.3') + assert.strictEqual(resourceAttrs['deployment.environment'], 'production') + assert.strictEqual(resourceAttrs['host.name'], os.hostname()) + done() + }) + + process.env.DD_SERVICE = 'my-service' + process.env.DD_VERSION = 'v1.2.3' + process.env.DD_ENV = 'production' + process.env.DD_TRACE_REPORT_HOSTNAME = 'true' + + const { logs } = setupTracer() + const logger = logs.getLogger('test-logger') + logger.emit({ body: 'test' }) + }) }) describe('Configurations', () => { @@ -392,6 +495,7 @@ describe('OpenTelemetry Logs', () => { describe('Telemetry Metrics', () => { it('tracks telemetry metrics for exported logs', () => { + setupTracer(true) const telemetryMetrics = { manager: { namespace: sinon.stub().returns({ count: sinon.stub().returns({ inc: sinon.spy() }) }) } } From 557b6d5f951e05bf980589a67905a8b81dc59e16 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 16:54:20 -0400 Subject: [PATCH 53/61] provide fix for failing system test --- packages/dd-trace/src/config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index a811ca93577..092383ce554 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -666,8 +666,8 @@ class Config { // Only set if there's a custom URL, otherwise let calc phase handle the default this._setString(env, 'otelUrl', OTEL_EXPORTER_OTLP_ENDPOINT) } - if (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) { - this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) + if (OTEL_EXPORTER_OTLP_ENDPOINT || OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) { + this._setString(env, 'otelLogsUrl', OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || env.otelUrl) } this._setString(env, 'otelHeaders', OTEL_EXPORTER_OTLP_HEADERS) this._setString(env, 'otelLogsHeaders', OTEL_EXPORTER_OTLP_LOGS_HEADERS || env.otelHeaders) @@ -1194,6 +1194,7 @@ class Config { // Compute OTLP logs URL to send payloads to the active Datadog Agent const agentHostname = this._getHostname() calc.otelLogsUrl = `http://${agentHostname}:4318/v1/logs` + calc.otelUrl = `http://${agentHostname}:4318/v1/traces` this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) From 266a23913c93022855f5fa4fa4ccf6786afd5a5e Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 17:19:46 -0400 Subject: [PATCH 54/61] add test case for noop logger and fix mocking for remote config --- .../dd-trace/test/opentelemetry/logs.spec.js | 66 +++++++++++++++---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 0672e03dfda..9107971a09f 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -30,19 +30,35 @@ describe('OpenTelemetry Logs', () => { let validatorCalled = false sinon.stub(http, 'request').callsFake((options, callback) => { - capturedHeaders = options.headers + // Only intercept OTLP logs requests + if (options.path && options.path.includes('/v1/logs')) { + capturedHeaders = options.headers + const mockReq = { + write: (data) => { capturedPayload = data }, + end: () => { + const decoded = protocol === 'json' + ? JSON.parse(capturedPayload.toString()) + : protoLogsService.decode(capturedPayload) + validator(decoded, capturedHeaders) + validatorCalled = true + }, + on: () => {}, + once: () => {}, + setTimeout: () => {} + } + callback({ statusCode: 200, on: () => {}, setTimeout: () => {} }) + return mockReq + } + + // For other requests (remote config, etc), return a basic mock const mockReq = { - write: (data) => { capturedPayload = data }, - end: () => { - const decoded = protocol === 'json' - ? JSON.parse(capturedPayload.toString()) - : protoLogsService.decode(capturedPayload) - validator(decoded, capturedHeaders) - validatorCalled = true - }, - on: () => {} + write: () => {}, + end: () => {}, + on: () => {}, + once: () => {}, + setTimeout: () => {} } - callback({ statusCode: 200, on: () => {} }) + callback({ statusCode: 200, on: () => {}, setTimeout: () => {} }) return mockReq }) @@ -159,6 +175,34 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(loggerProvider.isShutdown, true) }) + it('returns no-op logger after shutdown', (done) => { + let exportCalled = false + const validator = mockOtlpExport(() => { + exportCalled = true + }) + + const { logs, loggerProvider } = setupTracer() + const logger1 = logs.getLogger('test-logger') + + // Emit before shutdown - should work + logger1.emit({ body: 'before shutdown' }) + + // Shutdown the provider + loggerProvider.shutdown() + + // Get a new logger after shutdown - should be no-op + const logger2 = logs.getLogger('test-logger-2') + logger2.emit({ body: 'after shutdown' }) + loggerProvider.forceFlush() + + // Wait a bit and verify only the first log was exported + setTimeout(() => { + validator() + assert.strictEqual(exportCalled, true, 'First log should be exported') + done() + }, 50) + }) + it('supports instrumentationScope for compatibility', () => { mockOtlpExport((decoded, capturedHeaders) => { const log = decoded.resourceLogs[0].scopeLogs[0].logRecords[0] From df5d6b444a34d5c383a08e76a25bcea7b94e07ff Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 17:22:53 -0400 Subject: [PATCH 55/61] add test case for noop logger and fix mocking for remote config --- .../opentelemetry/logs/batch_log_processor.js | 2 +- .../dd-trace/test/opentelemetry/logs.spec.js | 38 +++++++++---------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 5fa810e70d6..c9996264745 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -71,7 +71,7 @@ class BatchLogRecordProcessor { * @returns {undefined} Promise that resolves when shutdown is complete */ shutdown () { - if (this.isShutdown) { + if (!this.isShutdown) { this.isShutdown = true this.#clearTimer() this.#export() diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 9107971a09f..d64b272263c 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -3,12 +3,15 @@ // Increase max listeners to avoid warnings in tests process.setMaxListeners(50) +require('../setup/core') const assert = require('assert') const os = require('os') +const http = require('http') const { describe, it, beforeEach, afterEach } = require('tap').mocha const sinon = require('sinon') const proxyquire = require('proxyquire') -require('../setup/core') +const { logs } = require('@opentelemetry/api-logs') +const { trace, context } = require('@opentelemetry/api') const { protoLogsService } = require('../../src/opentelemetry/protos/protobuf_loader').getProtobufTypes() describe('OpenTelemetry Logs', () => { @@ -20,12 +23,10 @@ describe('OpenTelemetry Logs', () => { const tracer = require('../../') tracer._initialized = false tracer.init() - const { logs } = require('@opentelemetry/api-logs') - return { logs, loggerProvider: logs.getLoggerProvider() } + return { tracer, logs, loggerProvider: logs.getLoggerProvider() } } function mockOtlpExport (validator, protocol = 'protobuf') { - const http = require('http') let capturedPayload, capturedHeaders let validatorCalled = false @@ -85,8 +86,6 @@ describe('OpenTelemetry Logs', () => { afterEach(() => { process.env = originalEnv - const { logs } = require('@opentelemetry/api-logs') - const provider = logs.getLoggerProvider() provider.shutdown() logs.disable() @@ -124,8 +123,7 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(log2.traceId.toString('hex'), '1234567890abcdef1234567890abcdef') assert.strictEqual(log2.spanId.toString('hex'), '1234567890abcdef') }) - const { logs } = setupTracer(true, '2') - const { trace, context } = require('@opentelemetry/api') + setupTracer(true, '2') const spanContext = { traceId: '1234567890abcdef1234567890abcdef', @@ -176,21 +174,24 @@ describe('OpenTelemetry Logs', () => { }) it('returns no-op logger after shutdown', (done) => { - let exportCalled = false - const validator = mockOtlpExport(() => { - exportCalled = true + const validator = mockOtlpExport((decoded) => { + // Should only export the log emitted before shutdown + assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords.length, 1) + assert.strictEqual(decoded.resourceLogs[0].scopeLogs[0].logRecords[0].body.stringValue, 'before shutdown') }) - const { logs, loggerProvider } = setupTracer() + const { logs, loggerProvider } = setupTracer(true, '2') const logger1 = logs.getLogger('test-logger') // Emit before shutdown - should work logger1.emit({ body: 'before shutdown' }) // Shutdown the provider + loggerProvider.forceFlush() loggerProvider.shutdown() // Get a new logger after shutdown - should be no-op + loggerProvider.register() const logger2 = logs.getLogger('test-logger-2') logger2.emit({ body: 'after shutdown' }) loggerProvider.forceFlush() @@ -198,7 +199,6 @@ describe('OpenTelemetry Logs', () => { // Wait a bit and verify only the first log was exported setTimeout(() => { validator() - assert.strictEqual(exportCalled, true, 'First log should be exported') done() }, 50) }) @@ -274,8 +274,7 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(capturedHeaders['x-api-key'], 'test123') }) - const { logs } = setupTracer() - const { trace, context } = require('@opentelemetry/api') + setupTracer() const spanContext = { traceId: '00000000000000000000000000000001', @@ -317,8 +316,7 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(scope2.logRecords[0].body.stringValue, 'Message from logger2') }) - const { logs } = setupTracer(true, '2') - const { trace, context } = require('@opentelemetry/api') + setupTracer(true, '2') const spanContext = { traceId: '1234567890abcdef1234567890abcdef', @@ -519,8 +517,7 @@ describe('OpenTelemetry Logs', () => { }) it('disables log injection when OTEL logs are enabled', () => { - const { loggerProvider } = setupTracer(true) - const tracer = require('../../') + const { tracer, loggerProvider } = setupTracer(true) assert(loggerProvider) assert.strictEqual(tracer._tracer._config.logInjection, false) @@ -529,8 +526,7 @@ describe('OpenTelemetry Logs', () => { it('disables log injection even when DD_LOGS_INJECTION is explicitly set to true', () => { // OTEL logs and DD log injection are mutually exclusive process.env.DD_LOGS_INJECTION = 'true' - const { loggerProvider } = setupTracer(true) - const tracer = require('../../') + const { tracer, loggerProvider } = setupTracer(true) assert(loggerProvider) assert.strictEqual(tracer._tracer._config.logInjection, false) From e995e0c668a92ab90af900c99e80a8727b2f14b7 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 18:58:32 -0400 Subject: [PATCH 56/61] fix encoding for doubles, remove unused shutdown code, test getLogger params --- .../opentelemetry/logs/batch_log_processor.js | 22 +------------ .../src/opentelemetry/logs/logger_provider.js | 1 - .../opentelemetry/logs/otlp_transformer.js | 11 ++----- .../dd-trace/test/opentelemetry/logs.spec.js | 32 ++++++++++++------- 4 files changed, 24 insertions(+), 42 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index c9996264745..0fd1ace3094 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -30,7 +30,6 @@ class BatchLogRecordProcessor { this.exporter = exporter this.#batchTimeout = batchTimeout this.#maxExportBatchSize = maxExportBatchSize - this.isShutdown = false this.#logRecords = [] this.#timer = null } @@ -42,10 +41,6 @@ class BatchLogRecordProcessor { * @param {InstrumentationScope} instrumentationScope - The instrumentation library */ onEmit (logRecord, instrumentationScope) { - if (this.isShutdown) { - return - } - // Store the log record (already enriched by Logger.emit) this.#logRecords.push({ ...logRecord, instrumentationScope }) @@ -61,22 +56,7 @@ class BatchLogRecordProcessor { * @returns {undefined} Promise that resolves when flush is complete */ forceFlush () { - if (!this.isShutdown) { - this.#export() - } - } - - /** - * Shuts down the processor and exports any remaining log records. - * @returns {undefined} Promise that resolves when shutdown is complete - */ - shutdown () { - if (!this.isShutdown) { - this.isShutdown = true - this.#clearTimer() - this.#export() - this.exporter.shutdown() - } + this.#export() } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index 779afaa0e6e..fb92d5a6192 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -101,7 +101,6 @@ class LoggerProvider { shutdown () { if (!this.isShutdown) { this.isShutdown = true - this.processor.shutdown() } } diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js index c0869576568..fb2b8930bc6 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js @@ -261,12 +261,6 @@ class OtlpTransformer { */ #mapSeverityNumber (severityNumber) { const { protoSeverityNumber } = getProtobufTypes() - - if (!protoSeverityNumber) { - log.error('protoSeverityNumber is undefined') - return 9 // Default to INFO - } - const severityName = SEVERITY_MAP[severityNumber] || 'SEVERITY_NUMBER_INFO' return protoSeverityNumber.values[severityName] } @@ -295,9 +289,10 @@ class OtlpTransformer { stringValue: body } } else if (typeof body === 'number') { - return { - intValue: body + if (Number.isInteger(body)) { + return { intValue: body } } + return { doubleValue: body } } else if (typeof body === 'boolean') { return { boolValue: body diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index d64b272263c..02b2b8c8060 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -154,7 +154,7 @@ describe('OpenTelemetry Logs', () => { }) const { logs } = setupTracer() - logs.getLogger('test').emit({ severityText: 'INFO', body: 'Protobuf format' }) + logs.getLogger({ name: 'test' }).emit({ severityText: 'INFO', body: 'Protobuf format' }) }) it('exports logs using JSON protocol', () => { @@ -184,7 +184,7 @@ describe('OpenTelemetry Logs', () => { const logger1 = logs.getLogger('test-logger') // Emit before shutdown - should work - logger1.emit({ body: 'before shutdown' }) + logger1.emit({ body: 'before shutdown', attributes: {} }) // Shutdown the provider loggerProvider.forceFlush() @@ -324,7 +324,7 @@ describe('OpenTelemetry Logs', () => { traceFlags: 1, } context.with(trace.setSpan(context.active(), trace.wrapSpanContext(spanContext)), () => { - const logger1 = logs.getLogger('logger1', '1.0.0') + const logger1 = logs.getLogger({ name: 'logger1', version: '1.0.0' }) const logger2 = logs.getLogger('logger2', '2.0.0') logger1.emit({ @@ -366,31 +366,39 @@ describe('OpenTelemetry Logs', () => { // String body assert.strictEqual(logRecords[0].body.stringValue, 'string message') - // Number body (protobuf returns Long objects for int64) + // Integer body (protobuf returns Long objects for int64) const intValue = logRecords[1].body.intValue assert.strictEqual(typeof intValue === 'object' ? intValue.toNumber() : intValue, 42) + // Double/float body + assert(logRecords[2].body.doubleValue !== undefined) + assert(Math.abs(logRecords[2].body.doubleValue - 3.14159) < 0.00001) + // Boolean body - assert.strictEqual(logRecords[2].body.boolValue, true) + assert.strictEqual(logRecords[3].body.boolValue, true) - // Object body - assert(logRecords[3].body.kvlistValue) - assert.strictEqual(logRecords[3].body.kvlistValue.values.length, 2) - assert.strictEqual(logRecords[3].body.kvlistValue.values[0].key, 'foo') - assert.strictEqual(logRecords[3].body.kvlistValue.values[0].value.stringValue, 'bar') + // Object body - tests Object.entries().map() transformation + assert(logRecords[4].body.kvlistValue) + assert.strictEqual(logRecords[4].body.kvlistValue.values.length, 2) + assert.strictEqual(logRecords[4].body.kvlistValue.values[0].key, 'foo') + assert.strictEqual(logRecords[4].body.kvlistValue.values[0].value.stringValue, 'bar') + assert.strictEqual(logRecords[4].body.kvlistValue.values[1].key, 'baz') + const bazValue = logRecords[4].body.kvlistValue.values[1].value.intValue + assert.strictEqual(typeof bazValue === 'object' ? bazValue.toNumber() : bazValue, 123) // Default case (symbol) - should convert to string - assert.strictEqual(logRecords[4].body.stringValue, 'Symbol(test)') + assert.strictEqual(logRecords[5].body.stringValue, 'Symbol(test)') done() }) - const { logs } = setupTracer(true, '5') + const { logs } = setupTracer(true, '6') const logger = logs.getLogger('test-logger') // Emit logs with different body types logger.emit({ body: 'string message' }) logger.emit({ body: 42 }) + logger.emit({ body: 3.14159 }) logger.emit({ body: true }) logger.emit({ body: { foo: 'bar', baz: 123 } }) logger.emit({ body: Symbol('test') }) From e20668ea77a928f203736ad92172ca8bb35df3aa Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 19:54:34 -0400 Subject: [PATCH 57/61] remove unused timer and shutdown logic, simplify loggerprovider register and improve tests --- .../opentelemetry/logs/batch_log_processor.js | 8 ------- .../src/opentelemetry/logs/logger_provider.js | 4 +--- .../dd-trace/test/opentelemetry/logs.spec.js | 22 +++++++++++++------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js index 0fd1ace3094..43bf557b000 100644 --- a/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +++ b/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js @@ -78,19 +78,11 @@ class BatchLogRecordProcessor { * @private */ #export () { - if (this.#logRecords.length === 0) { - return - } - const logRecords = this.#logRecords.slice(0, this.#maxExportBatchSize) this.#logRecords = this.#logRecords.slice(this.#maxExportBatchSize) this.#clearTimer() this.exporter.export(logRecords, () => {}) - - if (this.#logRecords.length > 0) { - this.#startTimer() - } } /** diff --git a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js index fb92d5a6192..83a85006033 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger_provider.js @@ -79,9 +79,7 @@ class LoggerProvider { } // Set context manager, this is required to correlate logs to spans context.setGlobalContextManager(this.#contextManager) - if (!logs.setGlobalLoggerProvider(this)) { - logs.getLoggerProvider().setDelegate(this) - } + logs.setGlobalLoggerProvider(this) } /** diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 02b2b8c8060..781aedc6852 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -167,12 +167,6 @@ describe('OpenTelemetry Logs', () => { logs.getLogger('test').emit({ severityText: 'DEBUG', body: 'JSON format' }) }) - it('handles shutdown gracefully', () => { - const { loggerProvider } = setupTracer() - loggerProvider.shutdown() - assert.strictEqual(loggerProvider.isShutdown, true) - }) - it('returns no-op logger after shutdown', (done) => { const validator = mockOtlpExport((decoded) => { // Should only export the log emitted before shutdown @@ -189,11 +183,14 @@ describe('OpenTelemetry Logs', () => { // Shutdown the provider loggerProvider.forceFlush() loggerProvider.shutdown() + assert.strictEqual(loggerProvider.isShutdown, true) + // Existing loggers should not send logs after shutdown + logger1.emit({ body: 'after shutdown same logger' }) // Get a new logger after shutdown - should be no-op loggerProvider.register() const logger2 = logs.getLogger('test-logger-2') - logger2.emit({ body: 'after shutdown' }) + logger2.emit({ body: 'after shutdown new logger' }) loggerProvider.forceFlush() // Wait a bit and verify only the first log was exported @@ -445,6 +442,17 @@ describe('OpenTelemetry Logs', () => { const logger = logs.getLogger('test-logger') logger.emit({ body: 'test' }) }) + + it('handles multiple register() calls', () => { + const { logs, loggerProvider } = setupTracer() + + // Calling register again should not throw + loggerProvider.register() + + // Provider should still work + assert.strictEqual(logs.getLoggerProvider(), loggerProvider) + logs.getLogger('test').emit({ body: 'test' }) + }) }) describe('Configurations', () => { From 3f8eab1f669f6258097b8cd1e34f003ecdafa9d6 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Mon, 6 Oct 2025 23:23:03 -0400 Subject: [PATCH 58/61] fix comment --- packages/dd-trace/src/opentelemetry/logs/logger.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/opentelemetry/logs/logger.js b/packages/dd-trace/src/opentelemetry/logs/logger.js index 5faa7598d62..57eb344fee0 100644 --- a/packages/dd-trace/src/opentelemetry/logs/logger.js +++ b/packages/dd-trace/src/opentelemetry/logs/logger.js @@ -60,7 +60,7 @@ class Logger { logRecord.attributes = sanitizeAttributes(logRecord.attributes) } - // Set default timestamp if not provided + // Note: timestamp is in nanoseconds (as defined by OpenTelemetry LogRecord API) if (!logRecord.timestamp) { logRecord.timestamp = Number(process.hrtime.bigint()) } From 148d47b4c03560dd7629de989d519d40391adddd Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Tue, 7 Oct 2025 11:22:39 -0400 Subject: [PATCH 59/61] clean up how otel endpoint configs are loaded --- docs/API.md | 2 +- packages/dd-trace/src/config.js | 4 +- .../logs/otlp_http_log_exporter.js | 52 ++++++++----------- .../dd-trace/test/opentelemetry/logs.spec.js | 32 ++++++++---- 4 files changed, 46 insertions(+), 44 deletions(-) diff --git a/docs/API.md b/docs/API.md index 556a8a34a60..eba59b30c4a 100644 --- a/docs/API.md +++ b/docs/API.md @@ -408,7 +408,7 @@ app.listen(3000) The Datadog SDK supports many of the configurations supported by the OpenTelemetry SDK. The following environment variables are supported: - `DD_LOGS_OTEL_ENABLED` - Enable OpenTelemetry logs (default: `false`) -- `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL for logs (default: `http://localhost:4318/v1/logs`) +- `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - OTLP endpoint URL for logs (default: `http://localhost:4318`) - `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - Optional headers in JSON format for logs (default: `{}`) - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` - OTLP protocol for logs (default: `http/protobuf`) - `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` - Request timeout in milliseconds for logs (default: `10000`) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 092383ce554..1ebd6040420 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -1193,8 +1193,8 @@ class Config { // Compute OTLP logs URL to send payloads to the active Datadog Agent const agentHostname = this._getHostname() - calc.otelLogsUrl = `http://${agentHostname}:4318/v1/logs` - calc.otelUrl = `http://${agentHostname}:4318/v1/traces` + calc.otelLogsUrl = `http://${agentHostname}:4318` + calc.otelUrl = `http://${agentHostname}:4318` this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) diff --git a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js index dc5737f5951..bbc3d78b5bd 100644 --- a/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +++ b/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js @@ -25,6 +25,8 @@ const tracerMetrics = telemetryMetrics.manager.namespace('tracers') class OtlpHttpLogExporter { #telemetryTags + DEFAULT_LOGS_PATH = '/v1/logs' + /** * Creates a new OtlpHttpLogExporter instance. * @@ -35,25 +37,27 @@ class OtlpHttpLogExporter { * @param {Resource} resource - Resource attributes */ constructor (url, headers, timeout, protocol, resource) { - this.url = url - this.protocol = protocol + const parsedUrl = new URL(url) - // Set Content-Type based on protocol - const contentType = this.protocol === 'http/json' - ? 'application/json' - : 'application/x-protobuf' - - this.headers = { - 'Content-Type': contentType, - ...this.#parseAdditionalHeaders(headers) - } - this.timeout = timeout + this.protocol = protocol this.transformer = new OtlpTransformer(resource, protocol) - - // Pre-compute telemetry tags for efficiency + // If no path is provided, use default path + const path = parsedUrl.pathname === '/' ? this.DEFAULT_LOGS_PATH : parsedUrl.pathname + const isJson = protocol === 'http/json' + this.options = { + hostname: parsedUrl.hostname, + port: parsedUrl.port, + path: path + parsedUrl.search, + method: 'POST', + timeout, + headers: { + 'Content-Type': isJson ? 'application/json' : 'application/x-protobuf', + ...this.#parseAdditionalHeaders(headers) + } + } this.#telemetryTags = [ 'protocol:http', - `encoding:${this.protocol === 'http/json' ? 'json' : 'protobuf'}` + `encoding:${isJson ? 'json' : 'protobuf'}` ] } @@ -74,12 +78,6 @@ class OtlpHttpLogExporter { tracerMetrics.count('otel.log_records', this.#telemetryTags).inc(logRecords.length) } - /** - * Shuts down the exporter. - * @returns {undefined} Promise that resolves when shutdown is complete - */ - shutdown () {} - /** * Sends the payload via HTTP request. * @param {Buffer|string} payload - The payload to send @@ -87,18 +85,12 @@ class OtlpHttpLogExporter { * @private */ #sendPayload (payload, resultCallback) { - const url = new URL(this.url) - const options = { - hostname: url.hostname, - port: url.port, - path: url.pathname + url.search, - method: 'POST', + ...this.options, headers: { - ...this.headers, + ...this.options.headers, 'Content-Length': payload.length - }, - timeout: this.timeout + } } const req = http.request(options, (res) => { diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 781aedc6852..9329e619a5d 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -92,7 +92,7 @@ describe('OpenTelemetry Logs', () => { sinon.restore() }) - describe('Core Functionality', () => { + describe('Logs Export', () => { it('exports logs with complete OTLP structure, trace correlation, and instrumentation info', () => { mockOtlpExport((decoded, capturedHeaders) => { const { resource } = decoded.resourceLogs[0] @@ -489,24 +489,34 @@ describe('OpenTelemetry Logs', () => { }) it('configures OTLP endpoint from environment variable', () => { - process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4321/v2/logs' + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4321/v1/logs' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4321/v2/logs') + assert.strictEqual(loggerProvider.processor.exporter.options.path, '/v1/logs') + assert.strictEqual(loggerProvider.processor.exporter.options.hostname, 'custom') + assert.strictEqual(loggerProvider.processor.exporter.options.port, '4321') }) it('prioritizes logs-specific endpoint over generic endpoint', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318/v1/logs' process.env.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://generic:4318/v1/logs' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider.processor.exporter.url, 'http://custom:4318/v1/logs') + assert.strictEqual(loggerProvider.processor.exporter.options.path, '/v1/logs') + assert.strictEqual(loggerProvider.processor.exporter.options.hostname, 'custom') + assert.strictEqual(loggerProvider.processor.exporter.options.port, '4318') + }) + + it('appends /v1/logs to endpoint if not provided', () => { + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://custom:4318' + const { loggerProvider } = setupTracer() + assert.strictEqual(loggerProvider.processor.exporter.options.path, '/v1/logs') }) it('configures OTLP headers from environment variable', () => { process.env.OTEL_EXPORTER_OTLP_HEADERS = 'api-key=secret,env=prod' const { loggerProvider } = setupTracer() const exporter = loggerProvider.processor.exporter - assert.strictEqual(exporter.headers['api-key'], 'secret') - assert.strictEqual(exporter.headers.env, 'prod') + assert.strictEqual(exporter.options.headers['api-key'], 'secret') + assert.strictEqual(exporter.options.headers.env, 'prod') }) it('prioritizes logs-specific headers over generic OTLP headers', () => { @@ -514,22 +524,22 @@ describe('OpenTelemetry Logs', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'logs-specific=value,shared=logs' const { loggerProvider } = setupTracer() const exporter = loggerProvider.processor.exporter - assert.strictEqual(exporter.headers['logs-specific'], 'value') - assert.strictEqual(exporter.headers.shared, 'logs') - assert.strictEqual(exporter.headers.generic, undefined) + assert.strictEqual(exporter.options.headers['logs-specific'], 'value') + assert.strictEqual(exporter.options.headers.shared, 'logs') + assert.strictEqual(exporter.options.headers.generic, undefined) }) it('configures OTLP timeout from environment variable', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT = '1000' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider.processor.exporter.timeout, 1000) + assert.strictEqual(loggerProvider.processor.exporter.options.timeout, 1000) }) it('prioritizes logs-specific timeout over generic timeout', () => { process.env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT = '1000' process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '2000' const { loggerProvider } = setupTracer() - assert.strictEqual(loggerProvider.processor.exporter.timeout, 1000) + assert.strictEqual(loggerProvider.processor.exporter.options.timeout, 1000) }) it('disables log injection when OTEL logs are enabled', () => { From 9ac86bbc705fc44ce4cf8941fcddbefa3785ed86 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 8 Oct 2025 17:07:29 -0400 Subject: [PATCH 60/61] address Ayans comments --- packages/dd-trace/src/config.js | 6 +- .../dd-trace/src/opentelemetry/logs/index.js | 63 +++++++++++++++++-- packages/dd-trace/src/proxy.js | 55 +--------------- .../dd-trace/test/opentelemetry/logs.spec.js | 18 ++++-- 4 files changed, 77 insertions(+), 65 deletions(-) diff --git a/packages/dd-trace/src/config.js b/packages/dd-trace/src/config.js index 1ebd6040420..c447758bc77 100644 --- a/packages/dd-trace/src/config.js +++ b/packages/dd-trace/src/config.js @@ -67,6 +67,8 @@ const VALID_PROPAGATION_BEHAVIOR_EXTRACT = new Set(['continue', 'restart', 'igno const VALID_LOG_LEVELS = new Set(['debug', 'info', 'warn', 'error']) +const DEFAULT_OTLP_PORT = 4318 + function getFromOtelSamplerMap (otelTracesSampler, otelTracesSamplerArg) { const OTEL_TRACES_SAMPLER_MAPPING = { always_on: '1.0', @@ -1193,8 +1195,8 @@ class Config { // Compute OTLP logs URL to send payloads to the active Datadog Agent const agentHostname = this._getHostname() - calc.otelLogsUrl = `http://${agentHostname}:4318` - calc.otelUrl = `http://${agentHostname}:4318` + calc.otelLogsUrl = `http://${agentHostname}:${DEFAULT_OTLP_PORT}` + calc.otelUrl = `http://${agentHostname}:${DEFAULT_OTLP_PORT}` this._setBoolean(calc, 'isGitUploadEnabled', calc.isIntelligentTestRunnerEnabled && !isFalse(this._isCiVisibilityGitUploadEnabled())) diff --git a/packages/dd-trace/src/opentelemetry/logs/index.js b/packages/dd-trace/src/opentelemetry/logs/index.js index defac5ece9d..76a91e05a7b 100644 --- a/packages/dd-trace/src/opentelemetry/logs/index.js +++ b/packages/dd-trace/src/opentelemetry/logs/index.js @@ -1,5 +1,11 @@ 'use strict' +const os = require('os') + +/** + * @typedef {import('../../config')} Config + */ + /** * @fileoverview OpenTelemetry Logs Implementation for dd-trace-js * @@ -22,15 +28,60 @@ */ const LoggerProvider = require('./logger_provider') -const Logger = require('./logger') const BatchLogRecordProcessor = require('./batch_log_processor') const OtlpHttpLogExporter = require('./otlp_http_log_exporter') -const OtlpTransformer = require('./otlp_transformer') + +/** + * Initializes OpenTelemetry Logs support + * @param {Config} config - Tracer configuration instance + */ +function initializeOpenTelemetryLogs (config) { + // Build resource attributes + const resourceAttributes = { + 'service.name': config.service, + 'service.version': config.version, + 'deployment.environment': config.env + } + + // Add all tracer tags (includes DD_TAGS, OTEL_RESOURCE_ATTRIBUTES, DD_TRACE_TAGS, etc.) + // Exclude Datadog-style keys that duplicate OpenTelemetry standard keys + if (config.tags) { + const filteredTags = { ...config.tags } + delete filteredTags.service + delete filteredTags.version + delete filteredTags.env + Object.assign(resourceAttributes, filteredTags) + } + + // Add host.name if reportHostname is enabled + if (config.reportHostname) { + resourceAttributes['host.name'] = os.hostname() + } + + // Create OTLP exporter using resolved config values + const exporter = new OtlpHttpLogExporter( + config.otelLogsUrl, + config.otelLogsHeaders, + config.otelLogsTimeout, + config.otelLogsProtocol, + resourceAttributes + ) + + // Create batch processor for exporting logs to Datadog Agent + const processor = new BatchLogRecordProcessor( + exporter, + config.otelLogsBatchTimeout, + config.otelLogsMaxExportBatchSize + ) + + // Create logger provider with processor for Datadog Agent export + const loggerProvider = new LoggerProvider({ processor }) + + // Register the logger provider globally with OpenTelemetry API + loggerProvider.register() +} module.exports = { LoggerProvider, - Logger, - BatchLogRecordProcessor, - OtlpHttpLogExporter, - OtlpTransformer + initializeOpenTelemetryLogs } diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 7fca6287698..69dc5945005 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -11,7 +11,6 @@ const nomenclature = require('./service-naming') const PluginManager = require('./plugin_manager') const NoopDogStatsDClient = require('./noop/dogstatsd') const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper') -let LoggerProvider, BatchLogRecordProcessor, OtlpHttpLogExporter, os const { setBaggageItem, getBaggageItem, @@ -206,7 +205,8 @@ class Tracer extends NoopProxy { } if (config.otelLogsEnabled) { - this.#initializeOpenTelemetryLogs(config) + const { initializeOpenTelemetryLogs } = require('./opentelemetry/logs') + initializeOpenTelemetryLogs(config) } if (config.isTestDynamicInstrumentationEnabled) { @@ -272,57 +272,6 @@ class Tracer extends NoopProxy { } } - #initializeOpenTelemetryLogs (config) { - LoggerProvider ??= require('./opentelemetry/logs').LoggerProvider - BatchLogRecordProcessor ??= require('./opentelemetry/logs').BatchLogRecordProcessor - OtlpHttpLogExporter ??= require('./opentelemetry/logs').OtlpHttpLogExporter - os ??= require('os') - - // Build resource attributes - const resourceAttributes = { - 'service.name': config.service, - 'service.version': config.version, - 'deployment.environment': config.env - } - - // Add all tracer tags (includes DD_TAGS, OTEL_RESOURCE_ATTRIBUTES, DD_TRACE_TAGS, etc.) - // Exclude Datadog-style keys that duplicate OpenTelemetry standard keys - if (config.tags) { - const filteredTags = { ...config.tags } - delete filteredTags.service - delete filteredTags.version - delete filteredTags.env - Object.assign(resourceAttributes, filteredTags) - } - - // Add host.name if reportHostname is enabled - if (config.reportHostname) { - resourceAttributes['host.name'] = os.hostname() - } - - // Create OTLP exporter using resolved config values - const exporter = new OtlpHttpLogExporter( - config.otelLogsUrl, - config.otelLogsHeaders, - config.otelLogsTimeout, - config.otelLogsProtocol, - resourceAttributes - ) - - // Create batch processor for exporting logs to Datadog Agent - const processor = new BatchLogRecordProcessor( - exporter, - config.otelLogsBatchTimeout, - config.otelLogsMaxExportBatchSize, - ) - - // Create logger provider with processor for Datadog Agent export - const loggerProvider = new LoggerProvider({ processor }) - - // Register the logger provider globally with OpenTelemetry API - loggerProvider.register() - } - /** * @override */ diff --git a/packages/dd-trace/test/opentelemetry/logs.spec.js b/packages/dd-trace/test/opentelemetry/logs.spec.js index 9329e619a5d..105e4426517 100644 --- a/packages/dd-trace/test/opentelemetry/logs.spec.js +++ b/packages/dd-trace/test/opentelemetry/logs.spec.js @@ -87,7 +87,9 @@ describe('OpenTelemetry Logs', () => { process.env = originalEnv const provider = logs.getLoggerProvider() - provider.shutdown() + if (provider.shutdown) { + provider.shutdown() + } logs.disable() sinon.restore() }) @@ -542,8 +544,16 @@ describe('OpenTelemetry Logs', () => { assert.strictEqual(loggerProvider.processor.exporter.options.timeout, 1000) }) + it('does not initialize when OTEL logs are disabled', () => { + const { loggerProvider } = setupTracer(false) + const { LoggerProvider } = require('../../src/opentelemetry/logs') + + // Should return no-op provider when disabled, not our custom LoggerProvider + assert.strictEqual(loggerProvider instanceof LoggerProvider, false) + }) + it('disables log injection when OTEL logs are enabled', () => { - const { tracer, loggerProvider } = setupTracer(true) + const { tracer, loggerProvider } = setupTracer() assert(loggerProvider) assert.strictEqual(tracer._tracer._config.logInjection, false) @@ -552,7 +562,7 @@ describe('OpenTelemetry Logs', () => { it('disables log injection even when DD_LOGS_INJECTION is explicitly set to true', () => { // OTEL logs and DD log injection are mutually exclusive process.env.DD_LOGS_INJECTION = 'true' - const { tracer, loggerProvider } = setupTracer(true) + const { tracer, loggerProvider } = setupTracer() assert(loggerProvider) assert.strictEqual(tracer._tracer._config.logInjection, false) @@ -561,7 +571,7 @@ describe('OpenTelemetry Logs', () => { describe('Telemetry Metrics', () => { it('tracks telemetry metrics for exported logs', () => { - setupTracer(true) + setupTracer() const telemetryMetrics = { manager: { namespace: sinon.stub().returns({ count: sinon.stub().returns({ inc: sinon.spy() }) }) } } From 7f4fbff27d2280c29c73d37ee16c22b767ee1937 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 9 Oct 2025 16:23:45 -0400 Subject: [PATCH 61/61] add integration tests --- .github/workflows/platform.yml | 1 + docker-compose.yml | 1 + integration-tests/opentelemetry-logs.spec.js | 60 ++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 integration-tests/opentelemetry-logs.spec.js diff --git a/.github/workflows/platform.yml b/.github/workflows/platform.yml index 22c36126e45..d9c0c08b34b 100644 --- a/.github/workflows/platform.yml +++ b/.github/workflows/platform.yml @@ -285,6 +285,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: ./.github/actions/testagent/start - uses: ./.github/actions/node with: version: ${{ matrix.version }} diff --git a/docker-compose.yml b/docker-compose.yml index 32517646d8c..316c556ebf7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -180,6 +180,7 @@ services: image: ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.33.1 ports: - "127.0.0.1:9126:9126" + - "127.0.0.1:4318:4318" environment: - LOG_LEVEL=DEBUG - TRACE_LANGUAGE=javascript diff --git a/integration-tests/opentelemetry-logs.spec.js b/integration-tests/opentelemetry-logs.spec.js new file mode 100644 index 00000000000..c9b95310a36 --- /dev/null +++ b/integration-tests/opentelemetry-logs.spec.js @@ -0,0 +1,60 @@ +'use strict' + +const { assert } = require('chai') +const { createSandbox } = require('./helpers') +const http = require('http') + +describe('OpenTelemetry Logs Integration', () => { + let sandbox + + beforeEach(async () => { + sandbox = await createSandbox() + }) + + afterEach(async () => { + await sandbox.remove() + }) + + it('should send OTLP logs to test agent and receive 200', (done) => { + const payload = JSON.stringify({ + resourceLogs: [{ + scopeLogs: [{ logRecords: [{ body: { stringValue: 'test' }, timeUnixNano: String(Date.now() * 1000000) }] }] + }] + }) + + const req = http.request({ + hostname: '127.0.0.1', + port: 4318, + path: '/v1/logs', + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Content-Length': payload.length } + }, (res) => { + assert.strictEqual(res.statusCode, 200) + done() + }) + + req.on('error', done) + req.write(payload) + req.end() + }) + + it('should receive 400 when sending protobuf to JSON endpoint', (done) => { + const protobufPayload = Buffer.from([0x0a, 0x04, 0x08, 0x01, 0x12, 0x00]) + + const req = http.request({ + hostname: '127.0.0.1', + port: 4318, + path: '/v3/logs', + method: 'POST', + headers: { 'Content-Type': 'application/x-protobuf', 'Content-Length': protobufPayload.length } + }, (res) => { + // 404 Not Found - wrong path + assert.strictEqual(res.statusCode, 404) + done() + }) + + req.on('error', done) + req.write(protobufPayload) + req.end() + }) +})