From 21e6698ed81a6352e53e86930ddf4915c90e24f5 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Tue, 6 Oct 2026 17:29:47 -0400 Subject: [PATCH 1/6] Fix version-directory cleanup race and add error type labels to telemetry --- package-lock.json | 8 +- package.json | 2 +- src/datastore/FileStoreFactory.ts | 24 +++++- src/datastore/LMDBStoreFactory.ts | 29 ++++++-- src/datastore/VersionDirectory.ts | 46 ++++++++++++ src/services/cfnLint/PyodideWorkerManager.ts | 6 +- .../cfnValidate/CfnValidateService.ts | 4 +- src/utils/Retry.ts | 9 ++- src/utils/errors/ErrorClasses.ts | 43 +++++++++++ src/utils/errors/ErrorStackInfo.ts | 28 ++++++- src/utils/errors/GenericErrorMapper.ts | 10 ++- tst/unit/datastore/FileStore.test.ts | 43 ++++++++++- tst/unit/datastore/LMDB.recovery.test.ts | 32 ++++++++ tst/unit/datastore/VersionDirectory.test.ts | 74 ++++++++++++++++++- .../cfnLint/PyodideWorkerManager.test.ts | 29 +++++++- tst/unit/telemetry/ScopedTelemetry.test.ts | 22 ++++++ tst/unit/utils/Retry.test.ts | 22 +++++- tst/unit/utils/errors/ErrorStackInfo.test.ts | 47 +++++++++++- .../utils/errors/GenericErrorMapper.test.ts | 4 + 19 files changed, 453 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index c524b391..234e78c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@aws-sdk/client-s3": "3.1117.0", "@aws-sdk/client-sts": "3.1117.0", "@aws-sdk/credential-provider-node": "3.972.81", - "@aws/cloudformation-validate": "1.12.0", + "@aws/cloudformation-validate": "1.12.1", "@base2/pretty-print-object": "1.0.2", "@opentelemetry/api": "1.9.1", "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", @@ -668,9 +668,9 @@ } }, "node_modules/@aws/cloudformation-validate": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@aws/cloudformation-validate/-/cloudformation-validate-1.12.0.tgz", - "integrity": "sha512-ZZ97yD94K8Kno6IDQJK86tBY9/bct0OHjiSx8K/Y6CRaCEKEva1iyteIP6AqXbT0POWYiRxTiXpafbVI6V2GZQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@aws/cloudformation-validate/-/cloudformation-validate-1.12.1.tgz", + "integrity": "sha512-syZyTZQ1JPubKfzkfxQ8AoLEhma+2Upsz/ESLiosVnncdo4cdWDhsLp5Bxol3Wi94j8gJkch8H4rsYZWk4K0OQ==", "license": "Apache-2.0", "engines": { "node": ">=20.0.0" diff --git a/package.json b/package.json index cadea1e2..e4ec8571 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@aws-sdk/client-s3": "3.1117.0", "@aws-sdk/client-sts": "3.1117.0", "@aws-sdk/credential-provider-node": "3.972.81", - "@aws/cloudformation-validate": "1.12.0", + "@aws/cloudformation-validate": "1.12.1", "@base2/pretty-print-object": "1.0.2", "@opentelemetry/api": "1.9.1", "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", diff --git a/src/datastore/FileStoreFactory.ts b/src/datastore/FileStoreFactory.ts index cce7264e..81369b06 100644 --- a/src/datastore/FileStoreFactory.ts +++ b/src/datastore/FileStoreFactory.ts @@ -10,7 +10,7 @@ import { DataStore, DataStoreFactory, PersistedStores, StoreName, TotalMaxDatast import { encryptionKey } from './file/Encryption'; import { KeyedFileStore } from './file/KeyedFileStore'; import { recordDiscardedData, recordDiskUsage, recordOutOfDiskFailure, StoreOperation } from './Utils'; -import { isOlderVersionDirectory } from './VersionDirectory'; +import { isOlderVersionDirectory, isRecentlyUsed, touchHeartbeat } from './VersionDirectory'; export class FileStoreFactory implements DataStoreFactory { private readonly log = LoggerFactory.getLogger('FileStore.Global'); @@ -34,6 +34,7 @@ export class FileStoreFactory implements DataStoreFactory { if (!existsSync(this.fileDbDir)) { mkdirSync(this.fileDbDir, { recursive: true }); } + this.recordHeartbeat(); for (const store of storeNames) { this.stores.set( @@ -88,6 +89,7 @@ export class FileStoreFactory implements DataStoreFactory { private emitMetrics(): void { if (this.closed) return; + this.recordHeartbeat(); this.telemetry.histogram('version', VersionNumber); this.telemetry.histogram('env.entries', this.stores.size); @@ -114,16 +116,30 @@ export class FileStoreFactory implements DataStoreFactory { } } + private recordHeartbeat(): void { + if (!touchHeartbeat(this.fileDbDir)) { + this.telemetry.count('heartbeat.error', 1); + } + } + private cleanupOldVersions(): void { if (this.closed || !existsSync(this.fileDbRoot)) return; const entries = readdirSync(this.fileDbRoot, { withFileTypes: true }); for (const entry of entries) { try { - if (entry.isDirectory() && isOlderVersionDirectory(entry.name, VersionNumber)) { - this.telemetry.count('oldVersion.cleanup.count', 1); - rmSync(join(this.fileDbRoot, entry.name), { recursive: true, force: true }); + if (!entry.isDirectory() || !isOlderVersionDirectory(entry.name, VersionNumber)) { + continue; } + + const versionDir = join(this.fileDbRoot, entry.name); + if (isRecentlyUsed(versionDir)) { + this.telemetry.count('oldVersion.cleanup.skipped', 1); + continue; + } + + this.telemetry.count('oldVersion.cleanup.count', 1); + rmSync(versionDir, { recursive: true, force: true }); } catch (error) { this.log.error(error, 'Failed to cleanup old FileDB versions'); this.telemetry.count('oldVersion.cleanup.error', 1); diff --git a/src/datastore/LMDBStoreFactory.ts b/src/datastore/LMDBStoreFactory.ts index ee116073..c28614c8 100644 --- a/src/datastore/LMDBStoreFactory.ts +++ b/src/datastore/LMDBStoreFactory.ts @@ -16,7 +16,7 @@ import { LMDBOwnershipTracker } from './lmdb/OwnershipTracker'; import { stats } from './lmdb/Stats'; import { encryptionStrategy } from './lmdb/Utils'; import { recordDiscardedData, recordDiskUsage, recordOutOfDiskFailure, StoreOperation } from './Utils'; -import { isOlderVersionDirectory } from './VersionDirectory'; +import { isOlderVersionDirectory, isRecentlyUsed, touchHeartbeat } from './VersionDirectory'; const MetricsIntervalMs = 60 * 1000; const CleanupDelayMs = 2 * 60 * 1000; @@ -91,9 +91,16 @@ export class LMDBStoreFactory implements DataStoreFactory { // The env and stores opened successfully — promote the marker out of `opening` // so an abrupt kill from now on is not mistaken for a startup crash. this.ownershipTracker.markRunning(); + this.recordHeartbeat(); this.scheduleBackgroundTasks(); } + private recordHeartbeat(): void { + if (!touchHeartbeat(this.lmdbVersionDir)) { + this.telemetry.count('heartbeat.error', 1); + } + } + get(store: StoreName): DataStore { const val = this.stores.get(store); if (val === undefined) { @@ -346,13 +353,21 @@ export class LMDBStoreFactory implements DataStoreFactory { for (const entry of entries) { try { if ( - entry.isDirectory() && - isOlderVersionDirectory(entry.name, VersionNumber) && - entry.name !== LMDBOwnershipTracker.DirName + !entry.isDirectory() || + !isOlderVersionDirectory(entry.name, VersionNumber) || + entry.name === LMDBOwnershipTracker.DirName ) { - this.telemetry.count('oldVersion.cleanup.count', 1); - rmSync(join(this.lmdbDir, entry.name), { recursive: true, force: true }); + continue; } + + const versionDir = join(this.lmdbDir, entry.name); + if (isRecentlyUsed(versionDir)) { + this.telemetry.count('oldVersion.cleanup.skipped', 1); + continue; + } + + this.telemetry.count('oldVersion.cleanup.count', 1); + rmSync(versionDir, { recursive: true, force: true }); } catch (error) { this.log.error(error, 'Failed to cleanup old LMDB versions'); this.telemetry.count('oldVersion.cleanup.error', 1); @@ -365,6 +380,8 @@ export class LMDBStoreFactory implements DataStoreFactory { return; } + this.recordHeartbeat(); + try { const staleLocks = this.env.readerCheck(); if (staleLocks > 0) { diff --git a/src/datastore/VersionDirectory.ts b/src/datastore/VersionDirectory.ts index fc0a731c..0249fa19 100644 --- a/src/datastore/VersionDirectory.ts +++ b/src/datastore/VersionDirectory.ts @@ -1,5 +1,11 @@ +import { closeSync, openSync, statSync, utimesSync } from 'fs'; +import { join } from 'path'; + const VersionDirectoryPattern = /^v(\d+)$/; +export const HeartbeatFileName = '.heartbeat'; +export const RecentUseWindowMs = 24 * 60 * 60 * 1000; + /** * True only for a strict `v` directory whose version is below {@link currentVersion}. * @@ -22,3 +28,43 @@ export function isOlderVersionDirectory(directoryName: string, currentVersion: n return version < currentVersion; } + +/** + * Marks {@link versionDir} as in use by a live process. A newer binary on the same machine checks this + * before deleting an older version directory, so an older process that is still running (another IDE, + * a window that has not restarted yet) does not lose its store underneath it. + * + * @returns false when the marker could not be written (for example the directory is gone) + */ +export function touchHeartbeat(versionDir: string, now = new Date()): boolean { + const heartbeat = join(versionDir, HeartbeatFileName); + try { + try { + utimesSync(heartbeat, now, now); + } catch { + closeSync(openSync(heartbeat, 'a')); + utimesSync(heartbeat, now, now); + } + return true; + } catch { + return false; + } +} + +/** + * True when the directory was used within {@link windowMs}. The heartbeat written by + * {@link touchHeartbeat} is authoritative; the directory's own mtime is the fallback for stores written + * by binaries that predate the heartbeat. Unreadable directories are treated as in use. + */ +export function isRecentlyUsed(versionDir: string, windowMs = RecentUseWindowMs, now = Date.now()): boolean { + const lastUsed = Math.max(mtimeMs(join(versionDir, HeartbeatFileName)), mtimeMs(versionDir)); + return lastUsed === Number.POSITIVE_INFINITY || now - lastUsed < windowMs; +} + +function mtimeMs(path: string): number { + try { + return statSync(path).mtimeMs; + } catch (error) { + return (error as NodeJS.ErrnoException).code === 'ENOENT' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY; + } +} diff --git a/src/services/cfnLint/PyodideWorkerManager.ts b/src/services/cfnLint/PyodideWorkerManager.ts index ba4670b3..11e633ea 100644 --- a/src/services/cfnLint/PyodideWorkerManager.ts +++ b/src/services/cfnLint/PyodideWorkerManager.ts @@ -8,6 +8,8 @@ import { ScopedTelemetry } from '../../telemetry/ScopedTelemetry'; import { Telemetry } from '../../telemetry/TelemetryDecorator'; import { CfnLintInitializationError, + WorkerExitError, + WorkerFailureError, WorkerNotInitializedError, WorkerShutdownError, } from '../../utils/errors/ErrorClasses'; @@ -119,7 +121,7 @@ export class PyodideWorkerManager { // Reject any pending tasks for (const task of this.tasks.values()) { - task.reject(new Error(`Worker exited unexpectedly with code ${code}`)); + task.reject(new WorkerExitError(code)); } this.tasks.clear(); } @@ -131,7 +133,7 @@ export class PyodideWorkerManager { // Set up error handler this.worker.on('error', (error: Error) => { this.log.error(error, 'Worker error'); - reject(new Error(`Worker error: ${error.message}`)); + reject(new WorkerFailureError(error)); }); // Initialize Pyodide in the worker diff --git a/src/services/cfnValidate/CfnValidateService.ts b/src/services/cfnValidate/CfnValidateService.ts index de8b1185..04fbeb25 100644 --- a/src/services/cfnValidate/CfnValidateService.ts +++ b/src/services/cfnValidate/CfnValidateService.ts @@ -64,8 +64,10 @@ export class CfnValidateService implements LintResultObserver, SettingsConfigura this.telemetry.count('validate.count', 1); const report = this.engine.validate(result.content, result.uri, { severityLevel: this.severityLevel() }); + const elapsedMs = performance.now() - now; this.telemetry.count('validate.success', 1); - this.telemetry.histogram('validate.duration', (performance.now() - now) / byteSize(result.content), { + this.telemetry.histogram('validate.latency', elapsedMs, { unit: 'ms' }); + this.telemetry.histogram('validate.duration', elapsedMs / byteSize(result.content), { unit: 'ms/byte', }); diff --git a/src/utils/Retry.ts b/src/utils/Retry.ts index 5d1c0996..c51f2f5b 100644 --- a/src/utils/Retry.ts +++ b/src/utils/Retry.ts @@ -1,4 +1,5 @@ import { Logger } from 'pino'; +import { RetryError } from './errors/ErrorClasses'; import { extractErrorMessage } from './errors/ErrorUtils'; export type RetryOptions = { @@ -79,7 +80,7 @@ export async function retryWithExponentialBackoff( if (attemptIdx > 0 && performance.now() - startTime >= totalTimeoutMs) { const message = `${operationName} timed out after ${performance.now() - startTime}ms, on attempt #${attemptIdx + 1}/${attempts}`; const errorMsg = lastError ? `${message}. Last error: ${lastError.message}` : message; - throw new Error(errorMsg); + throw new RetryError(errorMsg, 'RetryTimeout', lastError); } try { @@ -91,7 +92,11 @@ export async function retryWithExponentialBackoff( } if (attemptIdx === attempts - 1) { - throw new Error(`${operationName} failed after ${attempts} attempts. Last error: ${lastError.message}`); + throw new RetryError( + `${operationName} failed after ${attempts} attempts. Last error: ${lastError.message}`, + 'RetryExhausted', + lastError, + ); } const delay = calculateDelay(attemptIdx, initialDelayMs, jitterFactor, backoffMultiplier, maxDelayMs); diff --git a/src/utils/errors/ErrorClasses.ts b/src/utils/errors/ErrorClasses.ts index ac73d0eb..e82716cd 100644 --- a/src/utils/errors/ErrorClasses.ts +++ b/src/utils/errors/ErrorClasses.ts @@ -41,15 +41,41 @@ export class WorkerShutdownError extends Error { export class CfnLintInitializationError extends Error { public readonly phase: string; + public readonly code: string; constructor(message: string, phase?: string, options?: ErrorOptions) { super(message, options); this.name = 'CfnLintInitializationError'; this.phase = phase ?? 'unknown'; + this.code = `Init.${this.phase}`; Object.setPrototypeOf(this, CfnLintInitializationError.prototype); } } +export class WorkerExitError extends Error { + public readonly code = 'WorkerExit'; + + constructor( + public readonly exitCode: number, + options?: ErrorOptions, + ) { + super(`Worker exited unexpectedly with code ${exitCode}`, options); + this.name = 'WorkerExitError'; + Object.setPrototypeOf(this, WorkerExitError.prototype); + } +} + +export class WorkerFailureError extends Error { + public readonly code = 'WorkerError'; + public override readonly cause?: Error; + + constructor(cause: Error, options?: ErrorOptions) { + super(`Worker error: ${cause.message}`, { ...options, cause }); + this.name = 'WorkerFailureError'; + Object.setPrototypeOf(this, WorkerFailureError.prototype); + } +} + export class MountError extends Error { public override readonly cause?: Error; @@ -85,3 +111,20 @@ export class LMDBCrashError extends LMDBError { Object.setPrototypeOf(this, LMDBCrashError.prototype); } } + +export type RetryErrorCode = 'RetryTimeout' | 'RetryExhausted'; + +export class RetryError extends Error { + public override readonly cause?: Error; + + constructor( + message: string, + public readonly code: RetryErrorCode, + cause?: Error, + options?: ErrorOptions, + ) { + super(message, cause === undefined ? undefined : { ...options, cause }); + this.name = 'RetryError'; + Object.setPrototypeOf(this, RetryError.prototype); + } +} diff --git a/src/utils/errors/ErrorStackInfo.ts b/src/utils/errors/ErrorStackInfo.ts index 2e3b3d3b..0430549e 100644 --- a/src/utils/errors/ErrorStackInfo.ts +++ b/src/utils/errors/ErrorStackInfo.ts @@ -1,9 +1,34 @@ import { Attributes } from '@opentelemetry/api'; import { sanitizeMessage } from '../Sanitizer'; import { classifyAwsError } from './AwsErrorMapper'; -import { extractRootCause, extractErrorCode, extractHttpStatus } from './ErrorUtils'; +import { extractRootCause, extractErrorCode, extractHttpStatus, errorCauseChain } from './ErrorUtils'; import { classifyGenericError } from './GenericErrorMapper'; +/** + * Single bounded-cardinality label for the `errorType` metric dimension, which {@link errorType} always emits + * (the one error attribute the telemetry pipeline exports as a dimension). Prefers the deepest error code in the + * cause chain (errno, AWS, or a code set by our own wrappers), then the deepest specific class name, then the + * error's own class name. + */ +export function errorTypeLabel(error: unknown): string { + const deepestFirst = errorCauseChain(error).toReversed(); + + for (const link of deepestFirst) { + const code = extractErrorCode(link); + if (code !== undefined) { + return sanitizeMessage(code); + } + } + + for (const link of deepestFirst) { + if (link instanceof Error && link.name !== 'Error') { + return sanitizeMessage(link.name); + } + } + + return sanitizeMessage(error instanceof Error ? error.name : typeof error); +} + /** * Best effort extraction of location of exception based on stack trace */ @@ -59,6 +84,7 @@ export function errorType(error: unknown): Attributes { } return { + 'error.type.label': errorTypeLabel(error), 'error.type': sanitizeMessage(type), 'error.code': sanitizeMessage(code ?? 'Unknown'), ...genericAttr, diff --git a/src/utils/errors/GenericErrorMapper.ts b/src/utils/errors/GenericErrorMapper.ts index 52cd9951..8a12dff8 100644 --- a/src/utils/errors/GenericErrorMapper.ts +++ b/src/utils/errors/GenericErrorMapper.ts @@ -1,4 +1,10 @@ -import { CfnLintInitializationError, MountError, WorkerNotInitializedError } from './ErrorClasses'; +import { + CfnLintInitializationError, + MountError, + WorkerExitError, + WorkerFailureError, + WorkerNotInitializedError, +} from './ErrorClasses'; import { extractErrorCode, extractErrorMessage, extractHttpStatus } from './ErrorUtils'; const CANCELLATION_ERROR_IDENTIFIERS = new Set([ @@ -32,6 +38,8 @@ const FILESYSTEM_ERROR_CODES = new Set([ const CFN_LINT_ERROR_NAMES = new Set([ CfnLintInitializationError.name, MountError.name, + WorkerExitError.name, + WorkerFailureError.name, WorkerNotInitializedError.name, ]); diff --git a/tst/unit/datastore/FileStore.test.ts b/tst/unit/datastore/FileStore.test.ts index 8402cdc1..2e97a316 100644 --- a/tst/unit/datastore/FileStore.test.ts +++ b/tst/unit/datastore/FileStore.test.ts @@ -1,6 +1,6 @@ import { execFile } from 'child_process'; import { randomUUID as v4 } from 'crypto'; -import { rmSync, mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync } from 'fs'; +import { rmSync, mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync, statSync, utimesSync } from 'fs'; import { basename, join } from 'path'; import { promisify } from 'util'; import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; @@ -9,6 +9,8 @@ import { decrypt, encryptionKey } from '../../../src/datastore/file/Encryption'; import { EncryptedFile } from '../../../src/datastore/file/EncryptedFile'; import { KeyedFileStore } from '../../../src/datastore/file/KeyedFileStore'; import { FileStoreFactory } from '../../../src/datastore/FileStoreFactory'; +import { HeartbeatFileName, RecentUseWindowMs, touchHeartbeat } from '../../../src/datastore/VersionDirectory'; +import { TelemetryService } from '../../../src/telemetry/TelemetryService'; import { stableHashCode } from '../../../src/utils/StableHash'; describe('FileStore', () => { @@ -579,6 +581,8 @@ describe('FileStore', () => { writeFileSync(join(fileDbRoot, 'v5', 'data.enc'), 'newer'); mkdirSync(join(fileDbRoot, 'backup'), { recursive: true }); writeFileSync(join(fileDbRoot, 'v2'), 'not a directory'); + markUnused(join(fileDbRoot, 'v1')); + markUnused(join(fileDbRoot, 'v3')); expect(existsSync(join(fileDbRoot, 'v4'))).toBe(true); @@ -592,6 +596,38 @@ describe('FileStore', () => { expect(existsSync(join(fileDbRoot, 'v2'))).toBe(true); }); + it('should preserve an older version directory that another live process is still using', () => { + const fileDbRoot = join(testDir, 'filedb'); + const heartbeatDir = join(fileDbRoot, 'v3'); + const recentlyWrittenDir = join(fileDbRoot, 'v1'); + mkdirSync(heartbeatDir, { recursive: true }); + writeFileSync(join(heartbeatDir, 'data.enc'), 'previous'); + markUnused(heartbeatDir); + touchHeartbeat(heartbeatDir); + mkdirSync(recentlyWrittenDir, { recursive: true }); + writeFileSync(join(recentlyWrittenDir, 'data.enc'), 'legacy binary without heartbeat'); + const skipped = vi.spyOn(TelemetryService.instance.get('FileStore.Global'), 'count'); + + (fileFactory as unknown as { cleanupOldVersions(): void }).cleanupOldVersions(); + + expect(existsSync(heartbeatDir)).toBe(true); + expect(existsSync(recentlyWrittenDir)).toBe(true); + expect(skipped).toHaveBeenCalledWith('oldVersion.cleanup.skipped', 1); + expect(skipped).not.toHaveBeenCalledWith('oldVersion.cleanup.count', 1); + }); + + it('should write a heartbeat for its own version directory at startup and on every metrics tick', () => { + const heartbeat = join(testDir, 'filedb', 'v4', HeartbeatFileName); + expect(existsSync(heartbeat)).toBe(true); + + const stale = new Date(Date.now() - RecentUseWindowMs); + utimesSync(heartbeat, stale, stale); + + (fileFactory as unknown as { emitMetrics(): void }).emitMetrics(); + + expect(statSync(heartbeat).mtimeMs).toBeGreaterThan(stale.getTime()); + }); + it('should handle cleanup when directory does not exist', async () => { await fileFactory.close(); rmSync(testDir, { recursive: true, force: true }); @@ -720,6 +756,11 @@ describe('FileStore', () => { }); }); +function markUnused(versionDir: string) { + const stale = new Date(Date.now() - 2 * RecentUseWindowMs); + utimesSync(versionDir, stale, stale); +} + function encodedFilePath(dir: string, store: string, key: string) { const filePath = join(dir, `${store}.${stableHashCode(key)}.enc`); return { diff --git a/tst/unit/datastore/LMDB.recovery.test.ts b/tst/unit/datastore/LMDB.recovery.test.ts index d759fb8c..122edcad 100644 --- a/tst/unit/datastore/LMDB.recovery.test.ts +++ b/tst/unit/datastore/LMDB.recovery.test.ts @@ -5,6 +5,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { StoreName } from '../../../src/datastore/DataStore'; import { LMDBStoreFactory } from '../../../src/datastore/LMDBStoreFactory'; import { LMDBOwnershipTracker } from '../../../src/datastore/lmdb/OwnershipTracker'; +import { HeartbeatFileName, RecentUseWindowMs, touchHeartbeat } from '../../../src/datastore/VersionDirectory'; describe('LMDB fork detection and recovery', () => { let testDir: string; @@ -247,6 +248,9 @@ describe('LMDB fork detection and recovery', () => { fs.mkdirSync(join(lmdbDir, 'v8'), { recursive: true }); fs.mkdirSync(join(lmdbDir, 'backup'), { recursive: true }); fs.writeFileSync(join(lmdbDir, 'v2'), 'not a directory'); + const stale = new Date(Date.now() - 2 * RecentUseWindowMs); + fs.utimesSync(join(lmdbDir, 'v1'), stale, stale); + fs.utimesSync(join(lmdbDir, 'v6'), stale, stale); (factory as unknown as { cleanupOldVersions(): void }).cleanupOldVersions(); @@ -258,5 +262,33 @@ describe('LMDB fork detection and recovery', () => { expect(fs.existsSync(join(lmdbDir, 'v2'))).toBe(true); expect(fs.existsSync(markersDir)).toBe(true); }); + + it('should preserve an older version directory that another live process is still using', () => { + const lmdbDir = join(testDir, 'lmdb'); + const heartbeatDir = join(lmdbDir, 'v6'); + const recentlyWrittenDir = join(lmdbDir, 'v5'); + fs.mkdirSync(heartbeatDir, { recursive: true }); + const stale = new Date(Date.now() - 2 * RecentUseWindowMs); + fs.utimesSync(heartbeatDir, stale, stale); + touchHeartbeat(heartbeatDir); + fs.mkdirSync(recentlyWrittenDir, { recursive: true }); + + (factory as unknown as { cleanupOldVersions(): void }).cleanupOldVersions(); + + expect(fs.existsSync(heartbeatDir)).toBe(true); + expect(fs.existsSync(recentlyWrittenDir)).toBe(true); + }); + + it('should write a heartbeat for its own version directory once open and on every metrics tick', () => { + const heartbeat = join(testDir, 'lmdb', 'v7', HeartbeatFileName); + expect(fs.existsSync(heartbeat)).toBe(true); + + const stale = new Date(Date.now() - RecentUseWindowMs); + fs.utimesSync(heartbeat, stale, stale); + + (factory as unknown as { emitMetrics(): void }).emitMetrics(); + + expect(fs.statSync(heartbeat).mtimeMs).toBeGreaterThan(stale.getTime()); + }); }); }); diff --git a/tst/unit/datastore/VersionDirectory.test.ts b/tst/unit/datastore/VersionDirectory.test.ts index 108d9790..3902da2c 100644 --- a/tst/unit/datastore/VersionDirectory.test.ts +++ b/tst/unit/datastore/VersionDirectory.test.ts @@ -1,5 +1,75 @@ -import { describe, it, expect } from 'vitest'; -import { isOlderVersionDirectory } from '../../../src/datastore/VersionDirectory'; +import { randomUUID as v4 } from 'crypto'; +import { existsSync, mkdirSync, rmSync, statSync, utimesSync } from 'fs'; +import { join } from 'path'; +import { afterEach, beforeEach, describe, it, expect } from 'vitest'; +import { + HeartbeatFileName, + isOlderVersionDirectory, + isRecentlyUsed, + RecentUseWindowMs, + touchHeartbeat, +} from '../../../src/datastore/VersionDirectory'; + +describe('version directory heartbeat', () => { + let versionDir: string; + const now = Date.now(); + const twoDaysAgo = new Date(now - 2 * RecentUseWindowMs); + + beforeEach(() => { + versionDir = join(process.cwd(), 'node_modules', '.cache', 'version-directory', v4(), 'v3'); + mkdirSync(versionDir, { recursive: true }); + utimesSync(versionDir, twoDaysAgo, twoDaysAgo); + }); + + afterEach(() => { + rmSync(join(versionDir, '..'), { recursive: true, force: true }); + }); + + it('creates the heartbeat marker on first touch and refreshes it afterwards', () => { + const first = new Date(now - 60_000); + + expect(touchHeartbeat(versionDir, first)).toBe(true); + expect(existsSync(join(versionDir, HeartbeatFileName))).toBe(true); + expect(statSync(join(versionDir, HeartbeatFileName)).mtimeMs).toBeCloseTo(first.getTime(), -3); + + expect(touchHeartbeat(versionDir, new Date(now))).toBe(true); + expect(statSync(join(versionDir, HeartbeatFileName)).mtimeMs).toBeCloseTo(now, -3); + }); + + it('reports failure instead of throwing when the directory is gone', () => { + rmSync(versionDir, { recursive: true, force: true }); + + expect(touchHeartbeat(versionDir)).toBe(false); + }); + + it('treats a directory with a fresh heartbeat as recently used', () => { + touchHeartbeat(versionDir, new Date(now)); + + expect(isRecentlyUsed(versionDir, RecentUseWindowMs, now)).toBe(true); + }); + + it('treats a directory whose heartbeat is older than the window as unused', () => { + touchHeartbeat(versionDir, twoDaysAgo); + utimesSync(versionDir, twoDaysAgo, twoDaysAgo); + + expect(isRecentlyUsed(versionDir, RecentUseWindowMs, now)).toBe(false); + }); + + it('falls back to the directory mtime when no heartbeat was ever written', () => { + expect(isRecentlyUsed(versionDir, RecentUseWindowMs, now)).toBe(false); + + const recent = new Date(now - 60_000); + utimesSync(versionDir, recent, recent); + + expect(isRecentlyUsed(versionDir, RecentUseWindowMs, now)).toBe(true); + }); + + it('treats a directory that no longer exists as unused', () => { + rmSync(versionDir, { recursive: true, force: true }); + + expect(isRecentlyUsed(versionDir, RecentUseWindowMs, now)).toBe(false); + }); +}); describe('isOlderVersionDirectory', () => { const currentVersion = 6; diff --git a/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts b/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts index fb9dedbb..8f5e2e15 100644 --- a/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts +++ b/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts @@ -5,7 +5,13 @@ import { describe, expect, beforeEach, vi, test, Mock } from 'vitest'; import { CloudFormationFileType } from '../../../../src/document/Document'; import { PyodideWorkerManager } from '../../../../src/services/cfnLint/PyodideWorkerManager'; import { CfnLintSettings } from '../../../../src/settings/Settings'; -import { WorkerShutdownError } from '../../../../src/utils/errors/ErrorClasses'; +import { + CfnLintInitializationError, + RetryError, + WorkerFailureError, + WorkerShutdownError, +} from '../../../../src/utils/errors/ErrorClasses'; +import { errorTypeLabel } from '../../../../src/utils/errors/ErrorStackInfo'; import * as RetryModule from '../../../../src/utils/Retry'; import { mockLogger } from '../../../utils/MockServerComponents'; @@ -201,6 +207,27 @@ describe('PyodideWorkerManager', () => { await expect(initPromise).rejects.toThrow('Worker error'); }); + test('should surface a bounded error type for a worker error through the retry wrapper', async () => { + const initPromise = workerManager.initialize(); + + errorHandler(new Error('ENOMEM: worker heap exhausted')); + + const rejection: unknown = await initPromise.catch((error: unknown) => error); + expect(rejection).toBeInstanceOf(RetryError); + expect((rejection as RetryError).cause).toBeInstanceOf(WorkerFailureError); + expect(errorTypeLabel(rejection)).toBe('WorkerError'); + }); + + test('should surface the failed initialization phase as the error type', async () => { + const initPromise = workerManager.initialize(); + + messageHandler({ id: '1', error: 'micropip failed', phase: 'cfn_lint_install', success: false }); + + const rejection: unknown = await initPromise.catch((error: unknown) => error); + expect((rejection as RetryError).cause).toBeInstanceOf(CfnLintInitializationError); + expect(errorTypeLabel(rejection)).toBe('Init.cfn_lint_install'); + }); + test('should handle worker message error', async () => { // Start initialization const initPromise = workerManager.initialize(); diff --git a/tst/unit/telemetry/ScopedTelemetry.test.ts b/tst/unit/telemetry/ScopedTelemetry.test.ts index 492cba67..cfd65c2c 100644 --- a/tst/unit/telemetry/ScopedTelemetry.test.ts +++ b/tst/unit/telemetry/ScopedTelemetry.test.ts @@ -18,6 +18,17 @@ describe('ScopedTelemetry', () => { scopedTelemetry = new ScopedTelemetry('test-scope', mockMeter); }); + describe('error label', () => { + it('exports the error label dimension', () => { + const mockCounter = { add: vi.fn() }; + mockMeter.createCounter.mockReturnValue(mockCounter); + + scopedTelemetry.error('scan.error', Object.assign(new Error('gone'), { code: 'ENOENT' })); + + expect(mockCounter.add).toHaveBeenCalledWith(1, expect.objectContaining({ 'error.type.label': 'ENOENT' })); + }); + }); + describe('count', () => { it('should increment counter', () => { scopedTelemetry.count('test', 5); @@ -364,6 +375,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', + 'error.type.label': 'Error', 'error.code': 'Unknown', }); }); @@ -379,6 +391,7 @@ describe('ScopedTelemetry', () => { 1, expect.objectContaining({ 'error.type': 'Error', + 'error.type.label': 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY', 'error.code': 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY', 'error.category': 'tls', }), @@ -394,6 +407,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', + 'error.type.label': 'Error', 'error.code': 'Unknown', }); }); @@ -414,6 +428,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', + 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test error', 'error.stack': 'at func (file.ts:10:5)', @@ -431,6 +446,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'TypeError', + 'error.type.label': 'TypeError', 'error.origin': 'uncaughtException', 'error.message': 'TypeError: type error', 'error.stack': 'at test (test.ts:1:1)', @@ -448,6 +464,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', + 'error.type.label': 'Error', 'error.origin': 'unhandledRejection', 'error.message': 'Error: rejection', 'error.stack': 'at promise (p.ts:5:10)', @@ -470,6 +487,7 @@ describe('ScopedTelemetry', () => { custom: 'value', region: 'us-east-1', 'error.type': 'Error', + 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test', 'error.stack': 'at x (x.ts:1:1)', @@ -497,6 +515,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', + 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test', 'error.stack': 'at x (x.ts:1:1)', @@ -511,6 +530,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'string', + 'error.type.label': 'string', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); @@ -523,6 +543,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'object', + 'error.type.label': 'object', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); @@ -535,6 +556,7 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'undefined', + 'error.type.label': 'undefined', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); diff --git a/tst/unit/utils/Retry.test.ts b/tst/unit/utils/Retry.test.ts index 1cbfc6df..1101ec84 100644 --- a/tst/unit/utils/Retry.test.ts +++ b/tst/unit/utils/Retry.test.ts @@ -1,6 +1,7 @@ import { Logger } from 'pino'; import * as sinon from 'sinon'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { RetryError } from '../../../src/utils/errors/ErrorClasses'; import { RetryOptions, retryWithExponentialBackoff, sleep } from '../../../src/utils/Retry'; describe('sleep', () => { @@ -67,7 +68,8 @@ describe('retryWithExponentialBackoff', () => { }); it('should respect total timeout', async () => { - const mockFn = vi.fn().mockRejectedValue(new Error('Failure')); + const failure = new Error('Failure'); + const mockFn = vi.fn().mockRejectedValue(failure); const promise = retryWithExponentialBackoff( mockFn, { @@ -81,16 +83,32 @@ describe('retryWithExponentialBackoff', () => { try { await promise; } catch (err) { - expect(err).instanceof(Error); + expect(err).instanceof(RetryError); const message = (err as Error).message; expect(message).contains('SomeOperation timed out after'); expect(message).contains('on attempt #2/3. Last error: Failure'); + expect((err as RetryError).code).toBe('RetryTimeout'); + expect((err as RetryError).cause).toBe(failure); return; } throw new Error('Tests have failed'); }); + it('should tag exhausted retries with a code and keep the last error as cause', async () => { + const failure = Object.assign(new Error('worker died'), { code: 'WorkerExit' }); + const mockFn = vi.fn().mockRejectedValue(failure); + + const promise = retryWithExponentialBackoff(mockFn, options, mockLog, sleepFn); + + await expect(promise).rejects.toMatchObject({ + name: 'RetryError', + code: 'RetryExhausted', + cause: failure, + message: 'SomeOperation failed after 3 attempts. Last error: worker died', + }); + }); + it('should apply exponential backoff correctly', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')); diff --git a/tst/unit/utils/errors/ErrorStackInfo.test.ts b/tst/unit/utils/errors/ErrorStackInfo.test.ts index 91659662..a3d514f3 100644 --- a/tst/unit/utils/errors/ErrorStackInfo.test.ts +++ b/tst/unit/utils/errors/ErrorStackInfo.test.ts @@ -1,7 +1,52 @@ import { describe, test, expect } from 'vitest'; -import { errorAttributes, errorType, extractLocationFromStack } from '../../../../src/utils/errors/ErrorStackInfo'; +import { + errorAttributes, + errorType, + errorTypeLabel, + extractLocationFromStack, +} from '../../../../src/utils/errors/ErrorStackInfo'; describe('ErrorStackInfo', () => { + describe('errorTypeLabel', () => { + test('uses the error code when present', () => { + expect(errorTypeLabel(Object.assign(new Error('missing'), { code: 'ENOENT' }))).toBe('ENOENT'); + }); + + test('prefers the deepest code in the cause chain over the wrapper code', () => { + const cause = Object.assign(new Error('worker died'), { code: 'WorkerExit' }); + const wrapper = Object.assign(new Error('init failed after 3 attempts', { cause }), { + code: 'RetryExhausted', + }); + + expect(errorTypeLabel(wrapper)).toBe('WorkerExit'); + }); + + test('falls back to the wrapper code when no cause carries one', () => { + const wrapper = Object.assign(new Error('timed out', { cause: new Error('slow') }), { + code: 'RetryTimeout', + }); + + expect(errorTypeLabel(wrapper)).toBe('RetryTimeout'); + }); + + test('uses the deepest specific class name when no code exists', () => { + const cause = new TypeError('bad input'); + const wrapper = new Error('validation failed', { cause }); + + expect(errorTypeLabel(wrapper)).toBe('TypeError'); + }); + + test('uses the error class name when nothing more specific exists', () => { + expect(errorTypeLabel(new Error('plain', { cause: new Error('also plain') }))).toBe('Error'); + expect(errorTypeLabel(new RangeError('range'))).toBe('RangeError'); + }); + + test('uses the value type for non-error throwables', () => { + expect(errorTypeLabel('boom')).toBe('string'); + expect(errorTypeLabel(undefined)).toBe('undefined'); + }); + }); + describe('extractLocationFromStack', () => { test('returns empty object when stack is undefined', () => { expect(extractLocationFromStack(undefined)).toEqual({}); diff --git a/tst/unit/utils/errors/GenericErrorMapper.test.ts b/tst/unit/utils/errors/GenericErrorMapper.test.ts index 305b6a58..3c76f47e 100644 --- a/tst/unit/utils/errors/GenericErrorMapper.test.ts +++ b/tst/unit/utils/errors/GenericErrorMapper.test.ts @@ -8,6 +8,8 @@ import { CfnLintInitializationError, MountError, RequestCancellationError, + WorkerExitError, + WorkerFailureError, WorkerNotInitializedError, } from '../../../../src/utils/errors/ErrorClasses'; @@ -58,6 +60,8 @@ describe('GenericErrorMapper', () => { new CfnLintInitializationError('worker failed'), new MountError('mount failed'), new WorkerNotInitializedError(), + new WorkerExitError(1), + new WorkerFailureError(new Error('out of memory')), ])('should classify cfn-lint errors', (error) => { expect(classifyGenericError(error)).toBe('cfn_lint'); }); From edef203c1942aef5a1b3c97e77a9f53f3520df7b Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Wed, 7 Oct 2026 15:08:08 -0400 Subject: [PATCH 2/6] remove metrics changes --- src/utils/errors/ErrorStackInfo.ts | 28 +----------- tst/unit/telemetry/ScopedTelemetry.test.ts | 22 --------- tst/unit/utils/errors/ErrorStackInfo.test.ts | 47 +------------------- 3 files changed, 2 insertions(+), 95 deletions(-) diff --git a/src/utils/errors/ErrorStackInfo.ts b/src/utils/errors/ErrorStackInfo.ts index 0430549e..2e3b3d3b 100644 --- a/src/utils/errors/ErrorStackInfo.ts +++ b/src/utils/errors/ErrorStackInfo.ts @@ -1,34 +1,9 @@ import { Attributes } from '@opentelemetry/api'; import { sanitizeMessage } from '../Sanitizer'; import { classifyAwsError } from './AwsErrorMapper'; -import { extractRootCause, extractErrorCode, extractHttpStatus, errorCauseChain } from './ErrorUtils'; +import { extractRootCause, extractErrorCode, extractHttpStatus } from './ErrorUtils'; import { classifyGenericError } from './GenericErrorMapper'; -/** - * Single bounded-cardinality label for the `errorType` metric dimension, which {@link errorType} always emits - * (the one error attribute the telemetry pipeline exports as a dimension). Prefers the deepest error code in the - * cause chain (errno, AWS, or a code set by our own wrappers), then the deepest specific class name, then the - * error's own class name. - */ -export function errorTypeLabel(error: unknown): string { - const deepestFirst = errorCauseChain(error).toReversed(); - - for (const link of deepestFirst) { - const code = extractErrorCode(link); - if (code !== undefined) { - return sanitizeMessage(code); - } - } - - for (const link of deepestFirst) { - if (link instanceof Error && link.name !== 'Error') { - return sanitizeMessage(link.name); - } - } - - return sanitizeMessage(error instanceof Error ? error.name : typeof error); -} - /** * Best effort extraction of location of exception based on stack trace */ @@ -84,7 +59,6 @@ export function errorType(error: unknown): Attributes { } return { - 'error.type.label': errorTypeLabel(error), 'error.type': sanitizeMessage(type), 'error.code': sanitizeMessage(code ?? 'Unknown'), ...genericAttr, diff --git a/tst/unit/telemetry/ScopedTelemetry.test.ts b/tst/unit/telemetry/ScopedTelemetry.test.ts index cfd65c2c..492cba67 100644 --- a/tst/unit/telemetry/ScopedTelemetry.test.ts +++ b/tst/unit/telemetry/ScopedTelemetry.test.ts @@ -18,17 +18,6 @@ describe('ScopedTelemetry', () => { scopedTelemetry = new ScopedTelemetry('test-scope', mockMeter); }); - describe('error label', () => { - it('exports the error label dimension', () => { - const mockCounter = { add: vi.fn() }; - mockMeter.createCounter.mockReturnValue(mockCounter); - - scopedTelemetry.error('scan.error', Object.assign(new Error('gone'), { code: 'ENOENT' })); - - expect(mockCounter.add).toHaveBeenCalledWith(1, expect.objectContaining({ 'error.type.label': 'ENOENT' })); - }); - }); - describe('count', () => { it('should increment counter', () => { scopedTelemetry.count('test', 5); @@ -375,7 +364,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', - 'error.type.label': 'Error', 'error.code': 'Unknown', }); }); @@ -391,7 +379,6 @@ describe('ScopedTelemetry', () => { 1, expect.objectContaining({ 'error.type': 'Error', - 'error.type.label': 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY', 'error.code': 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY', 'error.category': 'tls', }), @@ -407,7 +394,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', - 'error.type.label': 'Error', 'error.code': 'Unknown', }); }); @@ -428,7 +414,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', - 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test error', 'error.stack': 'at func (file.ts:10:5)', @@ -446,7 +431,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'TypeError', - 'error.type.label': 'TypeError', 'error.origin': 'uncaughtException', 'error.message': 'TypeError: type error', 'error.stack': 'at test (test.ts:1:1)', @@ -464,7 +448,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', - 'error.type.label': 'Error', 'error.origin': 'unhandledRejection', 'error.message': 'Error: rejection', 'error.stack': 'at promise (p.ts:5:10)', @@ -487,7 +470,6 @@ describe('ScopedTelemetry', () => { custom: 'value', region: 'us-east-1', 'error.type': 'Error', - 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test', 'error.stack': 'at x (x.ts:1:1)', @@ -515,7 +497,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'Error', - 'error.type.label': 'Error', 'error.origin': 'Unknown', 'error.message': 'Error: test', 'error.stack': 'at x (x.ts:1:1)', @@ -530,7 +511,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'string', - 'error.type.label': 'string', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); @@ -543,7 +523,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'object', - 'error.type.label': 'object', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); @@ -556,7 +535,6 @@ describe('ScopedTelemetry', () => { HandlerSource: 'Unknown', 'aws.emf.storage_resolution': 1, 'error.type': 'undefined', - 'error.type.label': 'undefined', 'error.origin': 'Unknown', 'error.code': 'Unknown', }); diff --git a/tst/unit/utils/errors/ErrorStackInfo.test.ts b/tst/unit/utils/errors/ErrorStackInfo.test.ts index a3d514f3..91659662 100644 --- a/tst/unit/utils/errors/ErrorStackInfo.test.ts +++ b/tst/unit/utils/errors/ErrorStackInfo.test.ts @@ -1,52 +1,7 @@ import { describe, test, expect } from 'vitest'; -import { - errorAttributes, - errorType, - errorTypeLabel, - extractLocationFromStack, -} from '../../../../src/utils/errors/ErrorStackInfo'; +import { errorAttributes, errorType, extractLocationFromStack } from '../../../../src/utils/errors/ErrorStackInfo'; describe('ErrorStackInfo', () => { - describe('errorTypeLabel', () => { - test('uses the error code when present', () => { - expect(errorTypeLabel(Object.assign(new Error('missing'), { code: 'ENOENT' }))).toBe('ENOENT'); - }); - - test('prefers the deepest code in the cause chain over the wrapper code', () => { - const cause = Object.assign(new Error('worker died'), { code: 'WorkerExit' }); - const wrapper = Object.assign(new Error('init failed after 3 attempts', { cause }), { - code: 'RetryExhausted', - }); - - expect(errorTypeLabel(wrapper)).toBe('WorkerExit'); - }); - - test('falls back to the wrapper code when no cause carries one', () => { - const wrapper = Object.assign(new Error('timed out', { cause: new Error('slow') }), { - code: 'RetryTimeout', - }); - - expect(errorTypeLabel(wrapper)).toBe('RetryTimeout'); - }); - - test('uses the deepest specific class name when no code exists', () => { - const cause = new TypeError('bad input'); - const wrapper = new Error('validation failed', { cause }); - - expect(errorTypeLabel(wrapper)).toBe('TypeError'); - }); - - test('uses the error class name when nothing more specific exists', () => { - expect(errorTypeLabel(new Error('plain', { cause: new Error('also plain') }))).toBe('Error'); - expect(errorTypeLabel(new RangeError('range'))).toBe('RangeError'); - }); - - test('uses the value type for non-error throwables', () => { - expect(errorTypeLabel('boom')).toBe('string'); - expect(errorTypeLabel(undefined)).toBe('undefined'); - }); - }); - describe('extractLocationFromStack', () => { test('returns empty object when stack is undefined', () => { expect(extractLocationFromStack(undefined)).toEqual({}); From dac91a95893850429047cb1e88a26f64bfc7adff Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Wed, 7 Oct 2026 16:10:38 -0400 Subject: [PATCH 3/6] move to worker --- src/services/cfnValidate/CfnValidateEngine.ts | 149 ++++++++++--- .../cfnValidate/CfnValidateService.ts | 50 +++-- .../cfnValidate/cfn-validate-worker.ts | 60 ++++++ .../cfnValidate/CfnValidateEngine.test.ts | 199 +++++++++++++----- .../cfnValidate/CfnValidateService.test.ts | 90 ++++++-- vitest.config.mjs | 1 + webpack.config.js | 1 + 7 files changed, 428 insertions(+), 122 deletions(-) create mode 100644 src/services/cfnValidate/cfn-validate-worker.ts diff --git a/src/services/cfnValidate/CfnValidateEngine.ts b/src/services/cfnValidate/CfnValidateEngine.ts index 0a7dad3e..4b31a649 100644 --- a/src/services/cfnValidate/CfnValidateEngine.ts +++ b/src/services/cfnValidate/CfnValidateEngine.ts @@ -1,55 +1,140 @@ -import type { Engine, Severity, ValidationReport } from '@aws/cloudformation-validate'; +import path from 'path'; +import { Worker } from 'worker_threads'; +import type { ValidationReport } from '@aws/cloudformation-validate'; import { Closeable } from '../../utils/Closeable'; +import { WorkerExitError, WorkerFailureError, WorkerShutdownError } from '../../utils/errors/ErrorClasses'; +import type { + CfnValidateOptions, + CfnValidateRequest, + CfnValidateResponse, + CfnValidateWorkerFactory, + Pending, +} from './cfn-validate-worker'; -type CfnValidateModule = typeof import('@aws/cloudformation-validate'); +const VALIDATE_TIMEOUT_MS = 30_000; -export interface CfnValidateOptions { - readonly severityLevel: Severity; -} - -// The module is imported lazily because requiring it compiles an ~9 MB WebAssembly binary export class CfnValidateEngine implements Closeable { - private module?: CfnValidateModule; - private engine?: Engine; - - constructor(private readonly loadModule: () => Promise = defaultModuleLoader) {} + private worker?: Worker; + private ready?: Promise; + private rejectReady?: (error: Error) => void; + private initialized = false; + private failed = false; + private pending?: Pending; + private nextId = 0; + private engineVersion?: string; - async initialize(): Promise { - if (this.engine) { - return; - } + constructor(private readonly createWorker: CfnValidateWorkerFactory = defaultWorker) {} - const module = await this.loadModule(); - this.module = module; - this.engine = new module.CompositeEngine(); + initialize(): Promise { + this.ready ??= new Promise((resolve, reject) => { + this.rejectReady = reject; + const worker = this.createWorker(); + this.worker = worker; + worker.on('message', (message: CfnValidateResponse) => { + if (this.worker !== worker) { + return; + } + if ('ready' in message) { + this.engineVersion = message.ready; + this.initialized = true; + resolve(); + } else if (message.id === this.pending?.id) { + if ('report' in message) { + this.takePending()?.resolve(message.report); + } else { + this.abort(worker, toError(message.error)); + } + } + }); + worker.on('error', (error: Error) => this.abort(worker, new WorkerFailureError(error))); + worker.on('exit', (code: number) => this.abort(worker, new WorkerExitError(code))); + }); + return this.ready; } isInitialized(): boolean { - return this.engine !== undefined; + return this.initialized; } - validate(content: string, path: string, options: CfnValidateOptions): ValidationReport { - if (!this.engine || !this.module) { - throw new Error('CfnValidateEngine is not initialized. Call initialize() first.'); + isFailed(): boolean { + return this.failed; + } + + validate(content: string, path: string, options: CfnValidateOptions): Promise { + const worker = this.worker; + if (!worker || !this.initialized) { + return Promise.reject(new Error('CfnValidateEngine is not initialized. Call initialize() first.')); + } + if (this.pending) { + return Promise.reject(new Error('CfnValidateEngine is already validating')); } - return this.engine.validateTemplate(new this.module.TemplateContent(content, path), { - detailLevel: 'STANDARD', - severityLevel: options.severityLevel, + const id = ++this.nextId; + return new Promise((resolve, reject) => { + const timer = setTimeout( + () => + this.abort( + worker, + new Error(`cloudformation-validate did not finish within ${VALIDATE_TIMEOUT_MS} ms`), + ), + VALIDATE_TIMEOUT_MS, + ); + this.pending = { id, resolve, reject, timer }; + const request: CfnValidateRequest = { id, content, path, severityLevel: options.severityLevel }; + worker.postMessage(request); }); } version() { - return this.module?.version(); + return this.engineVersion; + } + + async close(): Promise { + const worker = this.discard(); + const shutdown = new WorkerShutdownError(); + this.rejectReady?.(shutdown); + this.takePending()?.reject(shutdown); + await worker?.terminate(); } - close(): void { - this.engine?.free(); - this.engine = undefined; - this.module = undefined; + private abort(worker: Worker, error: Error): void { + if (this.worker !== worker) { + return; + } + this.failed = true; + void this.discard()?.terminate(); + this.rejectReady?.(error); + this.takePending()?.reject(error); + } + + private discard(): Worker | undefined { + const worker = this.worker; + this.worker = undefined; + this.initialized = false; + return worker; + } + + private takePending(): Pending | undefined { + const pending = this.pending; + if (pending) { + clearTimeout(pending.timer); + this.pending = undefined; + } + return pending; + } +} + +function toError({ name, message, stack }: { name: string; message: string; stack?: string }): Error { + const error = new Error(message); + error.name = name; + if (stack !== undefined) { + error.stack = stack; } + return error; } -function defaultModuleLoader(): Promise { - return import('@aws/cloudformation-validate'); +function defaultWorker(): Worker { + return new Worker(path.join(__dirname, 'cfn-validate-worker.js'), { + resourceLimits: { maxOldGenerationSizeMb: 128 }, + }); } diff --git a/src/services/cfnValidate/CfnValidateService.ts b/src/services/cfnValidate/CfnValidateService.ts index 04fbeb25..5410f526 100644 --- a/src/services/cfnValidate/CfnValidateService.ts +++ b/src/services/cfnValidate/CfnValidateService.ts @@ -20,10 +20,10 @@ const CFN_VALIDATE_TOOL = 'cloudformation-validate'; export class CfnValidateService implements LintResultObserver, SettingsConfigurable, Closeable { private closed = false; + private validating = false; private cfnLintSettings: CfnLintSettings = DefaultSettings.diagnostics.cfnLint; private settingsSubscription?: SettingsSubscription; - private initialization?: Promise; @Telemetry() private readonly telemetry!: ScopedTelemetry; private readonly log = LoggerFactory.getLogger(CfnValidateService); @@ -40,13 +40,21 @@ export class CfnValidateService implements LintResultObserver, SettingsConfigura }); } + // The engine validates one template at a time; a result that arrives while it is busy is skipped onLintResult(result: LintResult): void { - if (this.closed || result.fileType !== CloudFormationFileType.Template || !this.featureFlag.isEnabled()) { + if ( + this.closed || + this.validating || + result.fileType !== CloudFormationFileType.Template || + !this.featureFlag.isEnabled() || + this.engine.isFailed() + ) { return; } - this.compare(result).catch((error: unknown) => { - this.telemetry.error('validate.error', error, undefined, { captureErrorAttributes: true }); + this.validating = true; + void this.compare(result).finally(() => { + this.validating = false; }); } @@ -60,9 +68,17 @@ export class CfnValidateService implements LintResultObserver, SettingsConfigura } const now = performance.now(); - this.telemetry.count('validate.count', 1); - const report = this.engine.validate(result.content, result.uri, { severityLevel: this.severityLevel() }); + let report; + try { + report = await this.engine.validate(result.content, result.uri, { severityLevel: this.severityLevel() }); + } catch (error) { + if (!this.closed) { + this.telemetry.error('validate.error', error, undefined, { captureErrorAttributes: true }); + this.log.warn(error, 'cloudformation-validate failed; comparisons stop until the server restarts'); + } + return; + } const elapsedMs = performance.now() - now; this.telemetry.count('validate.success', 1); @@ -76,27 +92,21 @@ export class CfnValidateService implements LintResultObserver, SettingsConfigura } private async ensureInitialized(): Promise { - this.initialization ??= this.initializeEngine(); - try { - await this.initialization; + if (this.engine.isInitialized()) { return true; - } catch { - return false; } - } - private async initializeEngine(): Promise { const startTime = performance.now(); try { await this.engine.initialize(); this.log.info(`cloudformation-validate version: ${this.engine.version()} (initialized)`); - if (this.closed) { - this.engine.close(); - } this.telemetry.count('init.success', 1); + return true; } catch (error) { - this.telemetry.error('init.fault', error, undefined, { captureErrorAttributes: true }); - throw error; + if (!this.closed) { + this.telemetry.error('init.fault', error, undefined, { captureErrorAttributes: true }); + } + return false; } finally { this.telemetry.histogram('init.duration', performance.now() - startTime, { unit: 'ms' }); } @@ -140,10 +150,10 @@ export class CfnValidateService implements LintResultObserver, SettingsConfigura } } - close(): void { + async close(): Promise { this.closed = true; this.settingsSubscription?.unsubscribe(); this.settingsSubscription = undefined; - this.engine.close(); + await this.engine.close(); } } diff --git a/src/services/cfnValidate/cfn-validate-worker.ts b/src/services/cfnValidate/cfn-validate-worker.ts new file mode 100644 index 00000000..4e05e154 --- /dev/null +++ b/src/services/cfnValidate/cfn-validate-worker.ts @@ -0,0 +1,60 @@ +import { parentPort, Worker } from 'worker_threads'; +import { + type Severity, + type ValidationReport, + CompositeEngine, + TemplateContent, + version, +} from '@aws/cloudformation-validate'; + +export interface Pending { + readonly id: number; + readonly resolve: (report: ValidationReport) => void; + readonly reject: (error: Error) => void; + readonly timer: NodeJS.Timeout; +} + +export interface CfnValidateOptions { + readonly severityLevel: Severity; +} + +export interface CfnValidateRequest { + readonly id: number; + readonly content: string; + readonly path: string; + readonly severityLevel: Severity; +} + +export type CfnValidateResponse = + | { readonly ready: string } + | { readonly id: number; readonly report: ValidationReport } + | { readonly id: number; readonly error: { name: string; message: string; stack?: string } }; + +export type CfnValidateWorkerFactory = () => Worker; + +const engine = new CompositeEngine(); + +function post(message: CfnValidateResponse): void { + parentPort?.postMessage(message); +} + +parentPort?.on('message', ({ id, content, path, severityLevel }: CfnValidateRequest) => { + try { + const report = engine.validateTemplate(new TemplateContent(content, path), { + detailLevel: 'STANDARD', + severityLevel, + }); + post({ id, report }); + } catch (error) { + // postMessage would clone a WebAssembly.RuntimeError as a plain Error and lose its name + post({ + id, + error: + error instanceof Error + ? { name: error.name, message: error.message, stack: error.stack } + : { name: typeof error, message: String(error) }, + }); + } +}); + +post({ ready: version() }); diff --git a/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts b/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts index 9213e666..f20f1611 100644 --- a/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts +++ b/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts @@ -1,8 +1,15 @@ -import { afterAll, afterEach, beforeAll, describe, expect, test, vi } from 'vitest'; -import { CfnValidateEngine } from '../../../../src/services/cfnValidate/CfnValidateEngine'; +import { EventEmitter } from 'events'; +import path from 'path'; +import { Worker } from 'worker_threads'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import { CfnValidateEngine, CfnValidateResponse } from '../../../../src/services/cfnValidate/CfnValidateEngine'; +import { WorkerExitError, WorkerFailureError, WorkerShutdownError } from '../../../../src/utils/errors/ErrorClasses'; // Path deliberately does not exist on disk: the engine must read the content it is given, not the file system const UNSAVED_TEMPLATE_PATH = '/does/not/exist/template.yaml'; +const WARN = { severityLevel: 'WARN' } as const; + +const WORKER_SOURCE = path.join(__dirname, '../../../../src/services/cfnValidate/cfn-validate-worker.ts'); const TEMPLATE_WITH_UNKNOWN_PROPERTY = [ 'AWSTemplateFormatVersion: "2010-09-09"', @@ -15,82 +22,160 @@ const TEMPLATE_WITH_UNKNOWN_PROPERTY = [ ].join('\n'); describe('CfnValidateEngine', () => { - const engine = new CfnValidateEngine(); + describe('with the real worker', () => { + let engine: CfnValidateEngine; - beforeAll(async () => { - await engine.initialize(); - }); + beforeEach(() => { + engine = new CfnValidateEngine(() => new Worker(WORKER_SOURCE, { execArgv: ['--import', 'tsx'] })); + }); - afterAll(() => { - engine.close(); - }); + afterEach(async () => { + await engine.close(); + }); - afterEach(() => { - vi.restoreAllMocks(); - }); + test('validates in-memory content off the main thread and reports 1-based locations', async () => { + await engine.initialize(); + + const report = await engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, WARN); - test('validates in-memory content and reports 1-based locations for the given path', () => { - const report = engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, { - severityLevel: 'WARN', + expect(engine.version()).toMatch(/^\d+\.\d+\.\d+/); + expect(report.status).toBe('OK'); + expect(report.filePath).toBe(UNSAVED_TEMPLATE_PATH); + const unknownProperty = report.diagnostics.find((diagnostic) => diagnostic.ruleId === 'F3002'); + expect(unknownProperty).toMatchObject({ startLine: 6, startColumn: 7, entity: { logicalId: 'Bucket' } }); }); - expect(report.status).toBe('OK'); - expect(report.filePath).toBe(UNSAVED_TEMPLATE_PATH); - const unknownProperty = report.diagnostics.find((diagnostic) => diagnostic.ruleId === 'F3002'); - expect(unknownProperty).toMatchObject({ startLine: 6, startColumn: 7, entity: { logicalId: 'Bucket' } }); - }); + test('returns a parse diagnostic instead of failing for invalid syntax, and drops findings below the level', async () => { + await engine.initialize(); + + const broken = await engine.validate('Resources:\n Broken\n Type: 1\n', UNSAVED_TEMPLATE_PATH, WARN); + const warnAndAbove = await engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, WARN); + const infoAndAbove = await engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, { + severityLevel: 'INFO', + }); - test('returns a report with a parse diagnostic instead of throwing for invalid syntax', () => { - const report = engine.validate('Resources:\n Broken\n Type: 1\n', UNSAVED_TEMPLATE_PATH, { - severityLevel: 'WARN', + expect(broken.status).toBe('ERROR'); + expect(broken.diagnostics.map((diagnostic) => diagnostic.ruleId)).toEqual(['F1101']); + expect(warnAndAbove.diagnostics.some((diagnostic) => diagnostic.severity === 'INFO')).toBe(false); + expect(infoAndAbove.diagnostics.some((diagnostic) => diagnostic.severity === 'INFO')).toBe(true); }); - expect(report.status).toBe('ERROR'); - expect(report.diagnostics.map((diagnostic) => diagnostic.ruleId)).toEqual(['F1101']); + test('rejects validation before initialization', async () => { + await expect(engine.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, WARN)).rejects.toThrow( + 'CfnValidateEngine is not initialized', + ); + }); }); - test('drops findings below the requested severity level', () => { - const warnAndAbove = engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, { - severityLevel: 'WARN', + describe('worker failures', () => { + // eslint-disable-next-line unicorn/prefer-event-target + class FakeWorker extends EventEmitter { + readonly postMessage = vi.fn(); + readonly terminate = vi.fn(() => Promise.resolve(1)); + + respond(message: CfnValidateResponse): void { + this.emit('message', message); + } + } + + let worker: FakeWorker; + const engine = () => new CfnValidateEngine(() => (worker = new FakeWorker()) as unknown as Worker); + + async function readyEngine(): Promise { + const ready = engine(); + const initialized = ready.initialize(); + worker.respond({ ready: '1.2.3' }); + await initialized; + return ready; + } + + afterEach(() => { + vi.useRealTimers(); }); - const infoAndAbove = engine.validate(TEMPLATE_WITH_UNKNOWN_PROPERTY, UNSAVED_TEMPLATE_PATH, { - severityLevel: 'INFO', + + test('resolves with the report for the matching request id', async () => { + const ready = await readyEngine(); + + const validation = ready.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, WARN); + const request = worker.postMessage.mock.calls[0][0]; + worker.respond({ id: request.id + 1, report: { status: 'STALE' } as never }); + worker.respond({ id: request.id, report: { status: 'OK' } as never }); + + expect(request).toMatchObject({ + content: 'Resources: {}', + path: UNSAVED_TEMPLATE_PATH, + severityLevel: 'WARN', + }); + await expect(validation).resolves.toEqual({ status: 'OK' }); + expect(ready.version()).toBe('1.2.3'); + expect(ready.isFailed()).toBe(false); }); - expect(warnAndAbove.diagnostics.some((diagnostic) => diagnostic.severity === 'INFO')).toBe(false); - expect(infoAndAbove.diagnostics.some((diagnostic) => diagnostic.severity === 'INFO')).toBe(true); - }); + test('an engine error terminates the worker and fails the engine for the session', async () => { + const ready = await readyEngine(); - test('loads the module once across repeated initialization', async () => { - const loadModule = vi.fn(() => import('@aws/cloudformation-validate')); - const lazyEngine = new CfnValidateEngine(loadModule); + const validation = ready.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, WARN); + const { id } = worker.postMessage.mock.calls[0][0]; + worker.respond({ + id, + error: { name: 'RuntimeError', message: 'unreachable', stack: 'RuntimeError: unreachable' }, + }); - await lazyEngine.initialize(); - await lazyEngine.initialize(); + await expect(validation).rejects.toMatchObject({ name: 'RuntimeError', message: 'unreachable' }); + expect(worker.terminate).toHaveBeenCalledOnce(); + expect(ready.isInitialized()).toBe(false); + expect(ready.isFailed()).toBe(true); + }); - expect(loadModule).toHaveBeenCalledTimes(1); - expect(lazyEngine.isInitialized()).toBe(true); - lazyEngine.close(); - }); + test('a worker crash rejects the running validation instead of surfacing anywhere else', async () => { + const ready = await readyEngine(); - test('rejects validation before initialization', () => { - const uninitialized = new CfnValidateEngine(); + const validation = ready.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, WARN); + worker.emit('error', new Error('ERR_WORKER_OUT_OF_MEMORY')); + worker.emit('exit', 1); - expect(() => uninitialized.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, { severityLevel: 'WARN' })).toThrow( - 'CfnValidateEngine is not initialized', - ); - }); + await expect(validation).rejects.toBeInstanceOf(WorkerFailureError); + expect(ready.isFailed()).toBe(true); + }); + + test('a worker exit during initialization rejects it', async () => { + const initialized = engine().initialize(); + worker.emit('exit', 1); + + await expect(initialized).rejects.toBeInstanceOf(WorkerExitError); + }); + + test('a validation that exceeds the timeout terminates the worker', async () => { + vi.useFakeTimers(); + const ready = await readyEngine(); + + const validation = ready.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, WARN); + vi.advanceTimersByTime(30_000); - test('releases the engine on close and can be initialized again', async () => { - const reusable = new CfnValidateEngine(); - await reusable.initialize(); + await expect(validation).rejects.toThrow('did not finish within'); + expect(worker.terminate).toHaveBeenCalledOnce(); + expect(ready.isFailed()).toBe(true); + }); + + test('rejects a second validation while one is running', async () => { + const ready = await readyEngine(); + const first = ready.validate('a', UNSAVED_TEMPLATE_PATH, WARN); - reusable.close(); + await expect(ready.validate('b', UNSAVED_TEMPLATE_PATH, WARN)).rejects.toThrow('already validating'); + + await ready.close(); + await expect(first).rejects.toBeInstanceOf(WorkerShutdownError); + }); - expect(reusable.isInitialized()).toBe(false); - expect(() => reusable.validate('Resources: {}', UNSAVED_TEMPLATE_PATH, { severityLevel: 'WARN' })).toThrow(); - await reusable.initialize(); - expect(reusable.isInitialized()).toBe(true); - reusable.close(); + test('close terminates the worker without counting as a failure', async () => { + const ready = await readyEngine(); + + await ready.close(); + worker.emit('exit', 1); + + expect(worker.terminate).toHaveBeenCalledOnce(); + expect(ready.isInitialized()).toBe(false); + expect(ready.isFailed()).toBe(false); + }); }); }); diff --git a/tst/unit/services/cfnValidate/CfnValidateService.test.ts b/tst/unit/services/cfnValidate/CfnValidateService.test.ts index a8927255..a8fde73b 100644 --- a/tst/unit/services/cfnValidate/CfnValidateService.test.ts +++ b/tst/unit/services/cfnValidate/CfnValidateService.test.ts @@ -15,6 +15,10 @@ import { flushAllPromises } from '../../../utils/Utils'; const TEMPLATE_URI = 'file:///workspace/template.yaml'; const TEMPLATE_CONTENT = 'Resources:\n Bucket:\n Type: AWS::S3::Bucket\n'; +// The TypeScript lib configured for this project does not declare the WebAssembly namespace +const WasmRuntimeError = (globalThis as unknown as { WebAssembly: { RuntimeError: ErrorConstructor } }).WebAssembly + .RuntimeError; + function cfnLintDiagnostic(code: string, line: number): Diagnostic { return { code, @@ -78,15 +82,20 @@ describe('CfnValidateService', () => { featureFlag = stubInterface(); featureFlag.isEnabled.returns(true); engine = stubInterface(); - engine.initialize.resolves(); engine.isInitialized.returns(false); - engine.validate.returns(report([])); + engine.initialize.callsFake(() => { + engine.isInitialized.returns(true); + return Promise.resolve(); + }); + engine.isFailed.returns(false); + engine.close.resolves(); + engine.validate.resolves(report([])); service = new CfnValidateService(featureFlag, engine); }); - afterEach(() => { - service.close(); + afterEach(async () => { + await service.close(); vi.restoreAllMocks(); }); @@ -138,7 +147,7 @@ describe('CfnValidateService', () => { }); test('emits only the comparison count when both tools agree', async () => { - engine.validate.returns(report([validateDiagnostic('E3012', 3)])); + engine.validate.resolves(report([validateDiagnostic('E3012', 3)])); service.onLintResult(lintResult({ diagnostics: [cfnLintDiagnostic('E3012', 2)] })); await flushAllPromises(); @@ -157,7 +166,7 @@ describe('CfnValidateService', () => { }); test('emits a rule id mismatch per rule attributed to the tool that reported it', async () => { - engine.validate.returns(report([validateDiagnostic('W9003', 3), validateDiagnostic('W9003', 8)])); + engine.validate.resolves(report([validateDiagnostic('W9003', 3), validateDiagnostic('W9003', 8)])); service.onLintResult(lintResult({ diagnostics: [cfnLintDiagnostic('E3012', 2)] })); await flushAllPromises(); @@ -171,7 +180,7 @@ describe('CfnValidateService', () => { }); test('emits a location mismatch per rule when both tools report it on different lines', async () => { - engine.validate.returns(report([validateDiagnostic('E3012', 9)])); + engine.validate.resolves(report([validateDiagnostic('E3012', 9)])); service.onLintResult(lintResult({ diagnostics: [cfnLintDiagnostic('E3012', 2)] })); await flushAllPromises(); @@ -188,6 +197,7 @@ describe('CfnValidateService', () => { test('initializes the engine once across lint results', async () => { service.onLintResult(lintResult()); + await flushAllPromises(); service.onLintResult(lintResult({ uri: 'file:///workspace/other.yaml' })); await flushAllPromises(); @@ -197,9 +207,32 @@ describe('CfnValidateService', () => { expect(telemetry.histogram).toHaveBeenCalledWith('init.duration', expect.any(Number), { unit: 'ms' }); }); + test('skips a lint result while a validation is in flight', async () => { + let finishFirst!: () => void; + engine.validate.onFirstCall().returns( + new Promise((resolve) => { + finishFirst = () => resolve(report([])); + }), + ); + + service.onLintResult(lintResult({ content: 'first' })); + await flushAllPromises(); + service.onLintResult(lintResult({ content: 'skipped' })); + await flushAllPromises(); + finishFirst(); + await flushAllPromises(); + service.onLintResult(lintResult({ content: 'third' })); + await flushAllPromises(); + + expect(engine.validate.getCalls().map((call) => call.args[0])).toEqual(['first', 'third']); + }); + test('reports an initialization failure once and skips every later comparison', async () => { const failure = new Error('wasm unavailable'); - engine.initialize.rejects(failure); + engine.initialize.callsFake(() => { + engine.isFailed.returns(true); + return Promise.reject(failure); + }); service.onLintResult(lintResult()); await flushAllPromises(); @@ -216,7 +249,7 @@ describe('CfnValidateService', () => { test('reports a validation failure as an error metric without throwing', async () => { const failure = new Error('engine panic'); - engine.validate.throws(failure); + engine.validate.rejects(failure); expect(() => service.onLintResult(lintResult())).not.toThrow(); await flushAllPromises(); @@ -228,8 +261,39 @@ describe('CfnValidateService', () => { expect(telemetry.count).not.toHaveBeenCalledWith('comparison.count', 1); }); + test('stops validating once the engine has failed', async () => { + const trap = new WasmRuntimeError('unreachable'); + engine.validate.callsFake(() => { + engine.isFailed.returns(true); + return Promise.reject(trap); + }); + + service.onLintResult(lintResult()); + await flushAllPromises(); + service.onLintResult(lintResult()); + await flushAllPromises(); + + expect(engine.validate.calledOnce).toBe(true); + expect(telemetry.error).toHaveBeenCalledExactlyOnceWith('validate.error', trap, undefined, { + captureErrorAttributes: true, + }); + expect(telemetry.count.mock.calls.filter(([name]) => name === 'validate.count')).toHaveLength(1); + }); + + test('does not report failures caused by closing the service', async () => { + engine.validate.callsFake(async () => { + await service.close(); + throw new Error('Worker shutdown'); + }); + + service.onLintResult(lintResult()); + await flushAllPromises(); + + expect(telemetry.error).not.toHaveBeenCalled(); + }); + test('does nothing after the service is closed', async () => { - service.close(); + await service.close(); service.onLintResult(lintResult()); await flushAllPromises(); @@ -255,7 +319,7 @@ describe('CfnValidateService', () => { test('drops validator findings for rules cfn-lint was told to ignore', async () => { service.configure(createMockSettingsManager(settingsWithCfnLint({ ignoreChecks: ['W', 'E3012'] }))); - engine.validate.returns( + engine.validate.resolves( report([ validateDiagnostic('W9003', 3), validateDiagnostic('E3012', 4), @@ -295,13 +359,13 @@ describe('CfnValidateService', () => { ); }); - test('unsubscribes from settings on close', () => { + test('unsubscribes from settings on close', async () => { const unsubscribe = vi.fn(); const settingsManager = createMockSettingsManager(); settingsManager.subscribe.returns({ unsubscribe, isActive: () => true }); service.configure(settingsManager); - service.close(); + await service.close(); expect(unsubscribe).toHaveBeenCalledOnce(); expect(engine.close.calledOnce).toBe(true); diff --git a/vitest.config.mjs b/vitest.config.mjs index 5318d96e..97f06b49 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -20,6 +20,7 @@ export default defineConfig({ }, exclude: [ 'src/services/cfnLint/pyodide-worker.ts', + 'src/services/cfnValidate/cfn-validate-worker.ts', 'src/telemetry/OTELInstrumentation.ts', 'src/telemetry/TelemetryService.ts', 'src/services/guard/assets/**', diff --git a/webpack.config.js b/webpack.config.js index 9ff89f45..76c7f0f0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -360,6 +360,7 @@ const baseConfig = { entry: { [BUNDLE_NAME]: './src/app/standalone.ts', 'pyodide-worker': './src/services/cfnLint/pyodide-worker.ts', + 'cfn-validate-worker': './src/services/cfnValidate/cfn-validate-worker.ts', }, resolve: { extensions: ['.ts', '.js', '.node'], From 4f96776b30d2ba5abff77e6e73cd20eb23962ec3 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Wed, 7 Oct 2026 16:47:34 -0400 Subject: [PATCH 4/6] fix test --- tst/unit/services/cfnLint/PyodideWorkerManager.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts b/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts index 8f5e2e15..30b8c71b 100644 --- a/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts +++ b/tst/unit/services/cfnLint/PyodideWorkerManager.test.ts @@ -11,7 +11,6 @@ import { WorkerFailureError, WorkerShutdownError, } from '../../../../src/utils/errors/ErrorClasses'; -import { errorTypeLabel } from '../../../../src/utils/errors/ErrorStackInfo'; import * as RetryModule from '../../../../src/utils/Retry'; import { mockLogger } from '../../../utils/MockServerComponents'; @@ -215,7 +214,6 @@ describe('PyodideWorkerManager', () => { const rejection: unknown = await initPromise.catch((error: unknown) => error); expect(rejection).toBeInstanceOf(RetryError); expect((rejection as RetryError).cause).toBeInstanceOf(WorkerFailureError); - expect(errorTypeLabel(rejection)).toBe('WorkerError'); }); test('should surface the failed initialization phase as the error type', async () => { @@ -225,7 +223,6 @@ describe('PyodideWorkerManager', () => { const rejection: unknown = await initPromise.catch((error: unknown) => error); expect((rejection as RetryError).cause).toBeInstanceOf(CfnLintInitializationError); - expect(errorTypeLabel(rejection)).toBe('Init.cfn_lint_install'); }); test('should handle worker message error', async () => { From a10bd2848c3029c5f117b9a1db66b08ace12996c Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Wed, 7 Oct 2026 16:48:37 -0400 Subject: [PATCH 5/6] Revert package json --- package-lock.json | 3108 ++++++++++++++++++++++++++++++++++----------- package.json | 31 +- 2 files changed, 2355 insertions(+), 784 deletions(-) diff --git a/package-lock.json b/package-lock.json index 234e78c8..70df099d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,13 +16,16 @@ "@aws-sdk/client-s3": "3.1117.0", "@aws-sdk/client-sts": "3.1117.0", "@aws-sdk/credential-provider-node": "3.972.81", - "@aws/cloudformation-validate": "1.12.1", + "@aws/cloudformation-validate": "1.12.0", "@base2/pretty-print-object": "1.0.2", "@opentelemetry/api": "1.9.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", - "@opentelemetry/instrumentation-runtime-node": "0.34.0", + "@opentelemetry/auto-instrumentations-node": "0.79.0", "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-node": "0.221.0", + "@opentelemetry/sdk-trace-base": "2.10.0", + "@opentelemetry/sdk-trace-node": "2.10.0", "@smithy/util-waiter": "4.6.2", "@tree-sitter-grammars/tree-sitter-yaml": "0.7.1", "archiver": "7.0.1", @@ -104,28 +107,15 @@ } }, "node_modules/@aws-sdk/checksums": { - "version": "3.1001.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1001.1.tgz", - "integrity": "sha512-x12Q17KYlJAd3nKf8LV5LV0vt8sh8/6YfQLGPtrGnQf/tW4jqxPGq5GPpuVitpQYM3eUR4XB7CbxZf751NMbLw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/checksums/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.1000.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.29.tgz", + "integrity": "sha512-Dtu0gr4dnATZAPwEYbpCsG+MpLM7OAliy2gTepEFQwl1vZ6DL3QMH2FveMa3HLvPsOdhJsPRB3KtxVhph9T75A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -251,17 +241,17 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.978.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.978.1.tgz", - "integrity": "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg==", + "version": "3.977.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.9.tgz", + "integrity": "sha512-reqPFEQrZxDZpeGj4PFMepBeR5LGYHRqq/L0motTzgFkCRBA4rFdaVXDSLYyGHhxVz7sT2PDnPN9CluGSfgyJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.6", - "@aws-sdk/xml-builder": "^3.972.41", + "@aws-sdk/types": "^3.974.5", + "@aws-sdk/xml-builder": "^3.972.40", "@aws/lambda-invoke-store": "^0.3.0", - "@smithy/core": "^3.35.0", - "@smithy/signature-v4": "^5.7.3", - "@smithy/types": "^4.19.0", + "@smithy/core": "^3.33.3", + "@smithy/signature-v4": "^5.6.12", + "@smithy/types": "^4.17.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -269,42 +259,16 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.72", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.72.tgz", - "integrity": "sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.70", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.70.tgz", + "integrity": "sha512-H404B7dJl2mCrBqahDEYsanB0xhdDp6tXnXcTUnXmmpy2Q3J0Ho0bUajZ2jr/RdwzCyS59Gi8xXIFwPLGBl6Uw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -312,30 +276,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.74", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.74.tgz", - "integrity": "sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/fetch-http-handler": "^5.8.0", - "@smithy/node-http-handler": "^4.12.1", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.72", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.72.tgz", + "integrity": "sha512-X98zYOrVOeuosCX+6ktf29FC2N2GHPLia7qv6mzPzTc+RPAuHWCDS++Z6JK7eGYqb/v6uaW7bAXaOvDBfol+0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/fetch-http-handler": "^5.7.2", + "@smithy/node-http-handler": "^4.11.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -343,36 +294,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.973.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.17.tgz", - "integrity": "sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/credential-provider-env": "^3.972.72", - "@aws-sdk/credential-provider-http": "^3.972.74", - "@aws-sdk/credential-provider-login": "^3.972.79", - "@aws-sdk/credential-provider-process": "^3.972.72", - "@aws-sdk/credential-provider-sso": "^3.973.16", - "@aws-sdk/credential-provider-web-identity": "^3.972.78", - "@aws-sdk/nested-clients": "^3.997.46", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/credential-provider-imds": "^4.5.2", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.973.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.15.tgz", + "integrity": "sha512-Rykg6s5ceBuynMOGWgoowO4N+27JfnqXAnVaSunZl0hOO1XodSrxGNz6sCEbnmS0lAfQZDKyb3fbr46gSuv6Sg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/credential-provider-env": "^3.972.70", + "@aws-sdk/credential-provider-http": "^3.972.72", + "@aws-sdk/credential-provider-login": "^3.972.77", + "@aws-sdk/credential-provider-process": "^3.972.70", + "@aws-sdk/credential-provider-sso": "^3.973.14", + "@aws-sdk/credential-provider-web-identity": "^3.972.76", + "@aws-sdk/nested-clients": "^3.997.44", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/credential-provider-imds": "^4.4.16", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -380,29 +318,16 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.79", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.79.tgz", - "integrity": "sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/nested-clients": "^3.997.46", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.77", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.77.tgz", + "integrity": "sha512-Jb59xfEISoN5mmbnA+HYqdtrSX3CgCtJoof+V5D8/TgUI56W63GEEd5Y58WijU3Ou6+WEgaLD1feVzaRXV5IDQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/nested-clients": "^3.997.44", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -432,28 +357,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.72", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.72.tgz", - "integrity": "sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.70", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.70.tgz", + "integrity": "sha512-2ry03fGRJr4sV3jI+ocjj5JqALnFD6ymM5KiNCDZMvq8bX2GSbE0vji4aM43TVCl2nXqqLRZaUxdq/KeWRAY4Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -461,30 +373,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.973.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.16.tgz", - "integrity": "sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/nested-clients": "^3.997.46", - "@aws-sdk/token-providers": "3.1138.0", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.973.14", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.14.tgz", + "integrity": "sha512-jkhg/8ocAAoc0RFyLMhCw+/zZh7gystQgd4F4hznNa8P4Cc501PQmxd+jGLiMHodPJ+7Zv/3znM62gZojyasmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/nested-clients": "^3.997.44", + "@aws-sdk/token-providers": "3.1116.0", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -492,29 +391,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.78", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.78.tgz", - "integrity": "sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/nested-clients": "^3.997.46", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.76", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.76.tgz", + "integrity": "sha512-d3AGyVu759PGr35mEB2s22xxlNEA5rpdxtSPJthfPFJvoQ8dt357iVPECqWfUxXp1toJAvKmbtcIYVGigaGsCA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/nested-clients": "^3.997.44", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -522,29 +408,16 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.77", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.77.tgz", - "integrity": "sha512-E7W2UOeUoc+lg3uIfR/dM7ZwusHwhBQrKMnlkRv4EXRR+C0YtV1pg25xC7GdZIhXH+NAMgZPCbE7o5to2cjFiw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/signature-v4-multi-region": "^3.996.47", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.972.75", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.75.tgz", + "integrity": "sha512-wMIsNumRVKaNMKhvU/s9VrdEwE8S6gSzXp4RygFG5BEMnGkkXf8cjh8zf7cKJBpUDpqTWqwbz5isEgp9rH6Lng==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/signature-v4-multi-region": "^3.996.46", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -552,31 +425,18 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.46", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.46.tgz", - "integrity": "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/signature-v4-multi-region": "^3.996.47", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/fetch-http-handler": "^5.8.0", - "@smithy/node-http-handler": "^4.12.1", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.997.44", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.44.tgz", + "integrity": "sha512-NhEgryjlBF9w38ZXqGymQV28IhkYa1mKhlbYnqIis57AYwWGVYfUPgg/qC2rLRqOUfblxx++irvju10kVTa8Vw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/signature-v4-multi-region": "^3.996.46", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/fetch-http-handler": "^5.7.2", + "@smithy/node-http-handler": "^4.11.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -584,27 +444,14 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.47", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.47.tgz", - "integrity": "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.974.6", - "@smithy/signature-v4": "^5.7.3", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.996.46", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.46.tgz", + "integrity": "sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/types": "^3.974.5", + "@smithy/signature-v4": "^5.6.12", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -612,29 +459,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1138.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1138.0.tgz", - "integrity": "sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.978.1", - "@aws-sdk/nested-clients": "^3.997.46", - "@aws-sdk/types": "^3.974.6", - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.974.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.6.tgz", - "integrity": "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", + "version": "3.1116.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1116.0.tgz", + "integrity": "sha512-ygIivKqh8aHzNkucOCXHyIBgBpLPfrSI0mCqXF+vLBsPTUKqj0VSqAY0GFPe7lQl4HntjOcQ+KSyS7oUV2C54Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@aws-sdk/core": "^3.977.9", + "@aws-sdk/nested-clients": "^3.997.44", + "@aws-sdk/types": "^3.974.5", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -655,12 +489,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.41", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.41.tgz", - "integrity": "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.40.tgz", + "integrity": "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -668,9 +502,9 @@ } }, "node_modules/@aws/cloudformation-validate": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@aws/cloudformation-validate/-/cloudformation-validate-1.12.1.tgz", - "integrity": "sha512-syZyTZQ1JPubKfzkfxQ8AoLEhma+2Upsz/ESLiosVnncdo4cdWDhsLp5Bxol3Wi94j8gJkch8H4rsYZWk4K0OQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@aws/cloudformation-validate/-/cloudformation-validate-1.12.0.tgz", + "integrity": "sha512-ZZ97yD94K8Kno6IDQJK86tBY9/bct0OHjiSx8K/Y6CRaCEKEva1iyteIP6AqXbT0POWYiRxTiXpafbVI6V2GZQ==", "license": "Apache-2.0", "engines": { "node": ">=20.0.0" @@ -706,9 +540,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", - "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { @@ -1320,9 +1154,9 @@ "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -1370,9 +1204,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", - "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { @@ -1382,7 +1216,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.3.2", + "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -1401,9 +1235,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -1411,29 +1245,6 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -1482,76 +1293,206 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@harperfast/extended-iterable": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", - "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", - "license": "Apache-2.0" - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, + "node_modules/@grpc/grpc-js": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", "license": "Apache-2.0", "dependencies": { - "@humanfs/types": "^0.15.0" + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": ">=18.18.0" + "node": ">=12.10.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, "engines": { - "node": ">=18.18.0" + "node": ">=6" } }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@grpc/proto-loader/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">=18.18.0" + "node": ">=8" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@grpc/proto-loader/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@harperfast/extended-iterable": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", + "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", + "license": "Apache-2.0" + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@isaacs/cliui": { @@ -1604,9 +1545,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, @@ -1621,6 +1562,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@lmdb/lmdb-darwin-arm64": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.6.tgz", @@ -1791,9 +1742,9 @@ ] }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", - "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, "license": "MIT", "optional": true, @@ -1808,38 +1759,1117 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.221.0.tgz", + "integrity": "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.79.0.tgz", + "integrity": "sha512-qL53aIjdw56sRDqz6LXD9h15vPTJgPpqv80rbsnRjzhuC9VqZ58fgk/lx0SdECJ2rcu8keeji5ZgjzJwiQZ0fg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/instrumentation-amqplib": "^0.68.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.73.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.76.0", + "@opentelemetry/instrumentation-bunyan": "^0.66.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.66.0", + "@opentelemetry/instrumentation-connect": "^0.64.0", + "@opentelemetry/instrumentation-cucumber": "^0.37.0", + "@opentelemetry/instrumentation-dataloader": "^0.38.0", + "@opentelemetry/instrumentation-dns": "^0.64.0", + "@opentelemetry/instrumentation-express": "^0.69.0", + "@opentelemetry/instrumentation-fs": "^0.40.0", + "@opentelemetry/instrumentation-generic-pool": "^0.64.0", + "@opentelemetry/instrumentation-graphql": "^0.69.0", + "@opentelemetry/instrumentation-grpc": "^0.221.0", + "@opentelemetry/instrumentation-hapi": "^0.67.0", + "@opentelemetry/instrumentation-host-metrics": "^0.4.0", + "@opentelemetry/instrumentation-http": "^0.221.0", + "@opentelemetry/instrumentation-ioredis": "^0.69.0", + "@opentelemetry/instrumentation-kafkajs": "^0.30.0", + "@opentelemetry/instrumentation-knex": "^0.65.0", + "@opentelemetry/instrumentation-koa": "^0.69.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.65.0", + "@opentelemetry/instrumentation-memcached": "^0.64.0", + "@opentelemetry/instrumentation-mongodb": "^0.74.0", + "@opentelemetry/instrumentation-mongoose": "^0.67.0", + "@opentelemetry/instrumentation-mysql": "^0.67.0", + "@opentelemetry/instrumentation-mysql2": "^0.67.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.67.0", + "@opentelemetry/instrumentation-net": "^0.65.0", + "@opentelemetry/instrumentation-openai": "^0.19.0", + "@opentelemetry/instrumentation-oracledb": "^0.46.0", + "@opentelemetry/instrumentation-pg": "^0.73.0", + "@opentelemetry/instrumentation-pino": "^0.67.0", + "@opentelemetry/instrumentation-redis": "^0.69.0", + "@opentelemetry/instrumentation-restify": "^0.66.0", + "@opentelemetry/instrumentation-router": "^0.65.0", + "@opentelemetry/instrumentation-runtime-node": "^0.34.0", + "@opentelemetry/instrumentation-socket.io": "^0.68.0", + "@opentelemetry/instrumentation-tedious": "^0.40.0", + "@opentelemetry/instrumentation-undici": "^0.31.0", + "@opentelemetry/instrumentation-winston": "^0.65.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.36.0", + "@opentelemetry/resource-detector-aws": "^2.21.0", + "@opentelemetry/resource-detector-azure": "^0.29.0", + "@opentelemetry/resource-detector-container": "^0.8.12", + "@opentelemetry/resource-detector-gcp": "^0.56.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-node": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^2.0.0" + } + }, + "node_modules/@opentelemetry/configuration": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.221.0.tgz", + "integrity": "sha512-uE9y56Zdi9Gt/RdxYnVOo3YmFZkKJJMA0gqtBe8wh8gdtF5Asqe+Oh/TWiDtFb1s+31jNY4CWgnfIB1KOITfFA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "yaml": "^2.8.3" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.10.0.tgz", + "integrity": "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.221.0.tgz", + "integrity": "sha512-txG1G0IrYSsKKMeiWZfj/i5cQmWB+h+hf3HzPpF3RqZVwp+iQQEIsv8Vtmzy6RWVdHdJZfygmVrBI39YTBvWcw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.221.0.tgz", + "integrity": "sha512-nKXkr4Tomi6fjYVOf+ytcW3dZAVr4v4Bv5gsT6dr2gvpUPJpKgHB4XbMufMsPotRE3g0XH2GwVVCkN2w6SON+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.221.0.tgz", + "integrity": "sha512-AH6EY+47gXFaWYgG3hfeOneGiE9xIZGtDBk+9g0sM8NZWzsQhhmqPbQQXJzS7pyCh5jRRr2nYNXVrkCmoojRvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.221.0.tgz", + "integrity": "sha512-KOgCtO15FC6C1T/xOqBcr7EyUs7B+7yomGNb5Y97d3s38rPbCCk5sewkmE2b0/itOkQ/PptX8CLlD+kn2mEtTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.221.0.tgz", + "integrity": "sha512-sRfCKbOzgy8xZQV2as0RzIZlnCmCseCKZGLfRcrpo2CBngJDr+rPtX0zkG0+oUCV5kfQPUoW3W3C96Ag3Y/Clg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-metrics": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.221.0.tgz", + "integrity": "sha512-YMF4LveY2I3yhw61rn6nmC9FE8U24IZHPeKU1Duc5+sbwjMd8FwZAwba318ImdThCg/HuVQvhm2y6bfgNPnfYg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.221.0.tgz", + "integrity": "sha512-kW79a20qWESIuAdDrxzg9WKM98twV/NBWBFRAH57ap/+ssZhiCo0hckzKT0zpuwR/gSHrFAQhJL0bYDrnEM34g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.221.0.tgz", + "integrity": "sha512-zXminlZedtq9LvOW64CnNkOqk15zV75k8JgtdTuWFge6+jk2m4GmAUm6L2eIiG1o2a2bZxXw2PDrszm+bps0IA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.221.0.tgz", + "integrity": "sha512-AySXiKoC+meiWm6zdVj5T2LnPDZuatveBby1cMOeQteIWsYXAUxs8Sru13G2pVSPrUXz6vF+og7QVBX6GdC/oQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.221.0.tgz", + "integrity": "sha512-Z9i2T7vgZbWe9rSLYxXVIbeW+XyzUq4rZanW3ZyVNwVDqCsh0EJKUgBWWQ0CZfeuUA+RQPzKgJQHMuWAUnKqXw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.10.0.tgz", + "integrity": "sha512-7gsvgf0UDoJ4l9ObrwBmz5G/ZogiPk+lq+g5GpLp24YQF/vPM/BSsnOfcLnfinast5ASUgLo78uSC/ObjlnXgg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.221.0.tgz", + "integrity": "sha512-cCk80Z/iRDf/5gfsKMB4f74LqVA5yKETB/9ojPzVW/6/f70iu89nJvGxsFCxx4XfSohaOofkU19kiYm84AiAlw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.68.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.68.0.tgz", + "integrity": "sha512-U9Fc3C061q+AGxP3xEJTIAJtBduY1GL21J4SjOSxCmmls4UUva16jzQ5ZkunQe0pKalrRjZ/DlZ+wgfgQxqjBw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.73.0.tgz", + "integrity": "sha512-N2BZFlWmVt2zjpiqPnfmIlj7tV/wfKSZCFF/laLAnJSTZjSEdc9JYSXW+KUV0FMUNDfpLCeAcI1xDMdGLdxFJg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/propagator-aws-xray": "^2.1.4", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "^8.10.155" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.76.0.tgz", + "integrity": "sha512-gg2QaDtWeFezRt2mAl9vBQ38y60tzUShKg1KA9uTgsMJimUHaBnB3X8kEH9Of8jKWT4DDoDcSA37gPcoEc0hiA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.66.0.tgz", + "integrity": "sha512-IqYQC1dav35NHlD5nYnpBXK8tI6KJ9/MIt8LYKFxwlhMIwfBCfavaklyP8NtVKoJ0WZKzX2v9Sh+xGK1XvSniQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.66.0.tgz", + "integrity": "sha512-4ksN7PfXLg7raDyXIjIrtxxzuuDlUx6Fh0s8VXojdl+nn2o0xkYa9jrq1f9Bfqhm+Sce3GOa1RjE3ycvAwk6Xw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.64.0.tgz", + "integrity": "sha512-D1Tpom3BpY8g29FFOEQ2FZioVFjyXwXHsh3BOn2BHcg7Taipg+yc+DPGUwvdR4WZrKnNMAG/+FBXNa0S0KhJYA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.37.0.tgz", + "integrity": "sha512-ezhn6D0DSUZkwLBGdfnr+PAENvB92AhbEH/dkcSLYB8dbQiw/NQ8y19jOn3E6MZTt0+FD1YyHtrJS2skDO4nDQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.38.0.tgz", + "integrity": "sha512-OmOVadK0m7sdlvMwbt1gb2iVUCyvVNDo3x5JLGgnKggLTJBgTcQxgMl3pAhFAMzWGo9URuMxuh3Bphy9Pb9nZw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.64.0.tgz", + "integrity": "sha512-La6s9SdKgojZQVFD7AclQBYe3WioVe6zicJswM3QPPPHpCufJYnw8rO/G9o2Yl/OUeS7PYpzwHh4N6lexzbEcA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.69.0.tgz", + "integrity": "sha512-91pHMujQgDyhEQrdg8RriMBrRZ/qPaJ0Y2dopQ6lHjW5YjoeytWi8ruM//T6f5o0D95hnqRlv79Pel1lGPqaYg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.40.0.tgz", + "integrity": "sha512-p39axaaYVKhnl5l4M+1aiXmxrAG2HuTti7DHxs2jDJRst828y5iwqUZLC1UWIKIhW9FfdV5gogXg+nRRhSc0EA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.64.0.tgz", + "integrity": "sha512-wM939j8Ox5BBHoA0r/p9etdpyS3GcUf/sfrUx1dtZdqGKU4ZcBxLyPD8QntwFkSI9PHql+rRejTCA6Btktz8Kg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.69.0.tgz", + "integrity": "sha512-vyKzuiBoEulV1FjMSe4iiuwZedt+nNAuaSVOh/3WxjDIuGQ9WsH+0ohd9snhIY6guAjYOGjqvTiYLs6K+OTQQg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.221.0.tgz", + "integrity": "sha512-1U45172SiPWG1MPfrgLItIuXZO/RfJqt5sxsrdlKN1NRV0pUtv7lbpgB1nShwP/SGSKaAFkovbVg3a1hfy3mpQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.221.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.67.0.tgz", + "integrity": "sha512-cIXIN4vZXm6aI4yz+4oUIRnkiAxCIpONrMhnGTI+ILKKEsIXP8Uselfr9663+TnisrgRLB7kKp+SoOuGJRHGtw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-host-metrics": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-host-metrics/-/instrumentation-host-metrics-0.4.0.tgz", + "integrity": "sha512-jnFyX2sTn2B+9mjsL3qgAHzpxdaia4/FV2GSlf9QrpaiMi6O0M0lA9JZTsf4FTvuOwrIngCk+MeVXjsxgBXXyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "systeminformation": "^5.31.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.221.0.tgz", + "integrity": "sha512-oIP91CPIANuYr09tGFElPFKAh6JUar+awJf1kBRYlaeo9b0gDwZHEB2zBfFlvdNFHm0wAVutMZODVi5smKT30g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/instrumentation": "0.221.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.69.0.tgz", + "integrity": "sha512-I9sZtxXWZ1tRXtRNTEVxpokGtXy6RL1SZhtPVh7zxH78t8ar71V5Dx4bnQiUjKTDzItpC73krD8c0/cEWA9oLg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.30.0.tgz", + "integrity": "sha512-/p/D4etxJpJGB0VrS+kqF8WfVAMFWf5ybhY0mjzIEd/d/T68+nxTWJaI5MJXFiyOnBUFuMlun12VJt+QJDCSZA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.65.0.tgz", + "integrity": "sha512-rJTT12VlDnL6wOWfxnBvkTUIzW2ju+7nqlToMy1tlqL0j6ohlVPxryMCS5h6UqE3CFpq7HtHqVObQHZgrA37KA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.69.0.tgz", + "integrity": "sha512-fxuA8jFOdqQzJV9Sitd0dk+zns7RQCFe19ia3LHex5oLiQPaaQovBv37jndX/zAZw6EBORATePHE8OQUwraPCQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.65.0.tgz", + "integrity": "sha512-s2KisLZ82iDvCF2QbsV1k1wrz3DMSBP9OiMfmNn5oSyaNT7jcNphR4uxr7WjwH+ssucuvhKWqKzJ2vdx7KRMVA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.64.0.tgz", + "integrity": "sha512-ek34tp7Qjci4CLahXybJ3aaixU1d2j28X5JSXSXbp6/rIiFGjMCAXJWw3FeiYmA82D/gV/wzPhL7r7m/p4gUzw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.74.0.tgz", + "integrity": "sha512-GRnHu69YLQUYgguuYkKi6wpizMY4r7gLC08rSq8cg41p6t7+1YIy5nXoGC61NA7KCZUE9jbcDnzd45i32IblZg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.67.0.tgz", + "integrity": "sha512-iEBgNrychD36qI16X/V8WZb2JabjQPE+pyrkLU320ApZyhGVsYU9LH3Nqt4Mkg1nFsa9qWhRQrCfhoANCgT6EA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.67.0.tgz", + "integrity": "sha512-G4aRrVKcd2Aodqi7WzRZ3LQJNKrM8BpsXEVMHrOb9s8Lg0jZXNvlLY0NWL1yVJrjnqI/unwEsp2aVHkVImPMeA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.67.0.tgz", + "integrity": "sha512-AmviR7l0xMxhC83scY3u+NkkT6blhD/xK9tPi9nYtjNG1gwPtMgZjYOa3f9lGOwpXs/EwN7wiyAgxiO4KTcENA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.42.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.67.0.tgz", + "integrity": "sha512-lXb7pjobd2i/9Gmihf9wrOM0MgnDYBxOJq7uWEhZOqULodNFLyPCRUnWxSIbPQdUzlU36QtHjuAeaEBUJnqXkA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.65.0.tgz", + "integrity": "sha512-W82H8UvaSrWynpI510CNJbq2Aq6L4/zuR/dAvoCZVYeRiChi0LHMI8i3rPe3Tmau2WBwE0jimaWgOs0GCfIHbQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-openai": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.19.0.tgz", + "integrity": "sha512-zHz7m/aUMDyAap7UMzaaxDkbmxEyUOfMBfh+7KICNwTBmIOypMnuUWwXWAfIJLgl+2dnZlNzxZRknULeS4YIhg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-oracledb": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.46.0.tgz", + "integrity": "sha512-nqxQvbp7HvsVPyDdgiZADPQX6B6ZUtLfm+XPuJHtQ3anxIcqU6qhJlrDIEM2LrZMShqf7bs84RHfDt2rgsp7hg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@types/oracledb": "6.5.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.73.0.tgz", + "integrity": "sha512-yf3tBVwLHB9cZNNPSToNrthx36ouPe4FctFxy7ya6vSJ6gaiKjNfA/IgFFeuBpZflEQhy6aesPqzZo8ZjFkvNg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.42.0", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.67.0.tgz", + "integrity": "sha512-Hb6phi2x1bq23OIiesj4imQvXs9Y5MMLtpgXH9hOuMm9LpBYz2cxPNgpgZ/XATuRclP1eRPoSl399o5XKwfoIA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.41.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.69.0.tgz", + "integrity": "sha512-lyCIEW89cYhMwaUSMBzsKHdwH2wOoqmuwXOARJneo9UL55govLIUCbYYAJ457oM8kdKADymlY4+SUW0DKQeIHw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.66.0.tgz", + "integrity": "sha512-9zbnL0ML2jFgJmmG1XPQTqwopCogC8eAtUQ0SXvYb+Ux2yuOBOvSg9XvRk/hcQf6WsRMll47cELCMC+IaI9I+g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.65.0.tgz", + "integrity": "sha512-ti9tDLFLhLoev5U/cGeQpFTlOjFFwrFbieZmwTFql9z8EijXDzFE7a3+3mgnxGl9CZR0luKCwFD/o51NPU+Ngg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-runtime-node": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.34.0.tgz", + "integrity": "sha512-Yb3PcmuK/iIOWY49GSEcSGl7fR4r6UqhZnuy5EWvFaqKqqs9SYnQeyQUEAbnBnSougRpwFBDbdN1SSGcvMhbtQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.68.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.68.0.tgz", + "integrity": "sha512-Bhd0KApVBYV4WQMZZbKRYfvev7SudvCtSn6b36uyUbKowOMEoGpnVoIvm0rlrrBR0KmkcV3Y37SngCGUrTm3lg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.40.0.tgz", + "integrity": "sha512-zTNNxs+KUJf1J+lHzeTDxAIZdVJYvQ8mvGUfyiWcVFgVdl7+4XV+wOBMSd1tZcRRlopfcVODDCOVMx/N7+zvcA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.31.0.tgz", + "integrity": "sha512-qunCfgSFV+bjRdAYkWIjVX38jIN/Xj80CiERXXdzYAmdigCFvJPB3AY3j43bjJlkhgbJJSCGdbvQUSut8QIiyQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.65.0.tgz", + "integrity": "sha512-hWSPnS530deRa+ttzY+QiGmgsK7aQHpqxbQRm56yO1j4qnIXuYYHaoSJ8/4lLOEcXB+hZs0mAAJ6QiMl1aaiGA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.221.0.tgz", + "integrity": "sha512-UFPIq80OH3Ns/oPFHRj14d4DTOxUo+MUFU8hUiCq5jTqFhdeJnfVSANHT+xp92409cA+oxzvlZCe6NM1wvCuBA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.221.0.tgz", + "integrity": "sha512-rQDmNgyiGCTrescjnzH2ntVyUKVIq6I2UjuK8+stT/Xg0ZOT71FVJqwjFdspQl6Yol/Yqsut9bDo+ame8oTmDQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.221.0.tgz", + "integrity": "sha512-lg6lkOU08Az23jVcn/0Els9HP+V8PnR4Km6p0KgpTggS0n/WuhnmY64rSh83Of9iR9nD+dpWr6adlcX8KzAwjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-2.2.0.tgz", + "integrity": "sha512-Yjvt2EjL+tfpkVOdKbhTPgpM4SIAez9nG6Q/QjQ3yfcJcjIWp59ph70SLfvmkSL6++3DCnuBG3iWcB18PwWavQ==", "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.221.0.tgz", - "integrity": "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ==", + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.10.0.tgz", + "integrity": "sha512-GnA5B24H+1w8BO21J0q+IWNB0z1v+AGbcquTdIt/dufibhnhgxaA8YKvz0I3akRZhB1jHT+/tlzK+qlAjEDybQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/core": "2.10.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/propagator-jaeger": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", - "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.10.0.tgz", + "integrity": "sha512-yw/IX8DL470dSMZJoE82ScfYGp7JWZ/G8kFJo35ZILUVTB2jFPTOaioN+8s09pH0RHsWNhweVZb+ZnjJJpCChg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/core": "2.10.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -1848,93 +2878,96 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.221.0.tgz", - "integrity": "sha512-sRfCKbOzgy8xZQV2as0RzIZlnCmCseCKZGLfRcrpo2CBngJDr+rPtX0zkG0+oUCV5kfQPUoW3W3C96Ag3Y/Clg==", + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz", + "integrity": "sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.36.0.tgz", + "integrity": "sha512-s75zJV1ShpYL5nk2cODfZY05Haw2hGxcfEFMu3ymvh2QU3HrhXaCW+rmNkhXhRrO8YophMFTyVdb7iCDleC/JQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.10.0", - "@opentelemetry/otlp-exporter-base": "0.221.0", - "@opentelemetry/otlp-transformer": "0.221.0", - "@opentelemetry/resources": "2.10.0", - "@opentelemetry/sdk-metrics": "2.10.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.221.0.tgz", - "integrity": "sha512-cCk80Z/iRDf/5gfsKMB4f74LqVA5yKETB/9ojPzVW/6/f70iu89nJvGxsFCxx4XfSohaOofkU19kiYm84AiAlw==", + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.21.0.tgz", + "integrity": "sha512-Veavy+khoywR+Hv065SU5jucFTGTiW1KXo39CsJ+8wqdYYz8jiRJPnQ20Kd+X9HbV2+Abb0l5CrJIdxK1ZOqBg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.221.0", - "import-in-the-middle": "^3.0.0", - "require-in-the-middle": "^8.0.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-runtime-node": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.34.0.tgz", - "integrity": "sha512-Yb3PcmuK/iIOWY49GSEcSGl7fR4r6UqhZnuy5EWvFaqKqqs9SYnQeyQUEAbnBnSougRpwFBDbdN1SSGcvMhbtQ==", + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.29.0.tgz", + "integrity": "sha512-lWm0vjjlQMoc4Xvvd+dW/OZWT/SI4w+cIN7kbm8KimIZCr1EpAyvyQ7WEOrGoBoXCpQCrsZ18uKTooDgiBCGIw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.221.0", "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.221.0" + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.37.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.221.0.tgz", - "integrity": "sha512-UFPIq80OH3Ns/oPFHRj14d4DTOxUo+MUFU8hUiCq5jTqFhdeJnfVSANHT+xp92409cA+oxzvlZCe6NM1wvCuBA==", + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.12.tgz", + "integrity": "sha512-EJRFfIY26whY0w5RDxMRXlfBDgDS001JYMHuOVuDBBsRrV4MBqoVajR9B0L9Vy728+w/HNVnSQkpJFacFr+klg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.10.0", - "@opentelemetry/otlp-transformer": "0.221.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.221.0.tgz", - "integrity": "sha512-lg6lkOU08Az23jVcn/0Els9HP+V8PnR4Km6p0KgpTggS0n/WuhnmY64rSh83Of9iR9nD+dpWr6adlcX8KzAwjg==", + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.56.0.tgz", + "integrity": "sha512-H8yNeqTsuapbXs6MLZTtelfUCk+5D8jD3+KosCJaXOyx5gl3EWWvs70HbNXTUO4VYLxccySFYJYVCd8YMM0NJw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.221.0", - "@opentelemetry/core": "2.10.0", - "@opentelemetry/resources": "2.10.0", - "@opentelemetry/sdk-logs": "0.221.0", - "@opentelemetry/sdk-metrics": "2.10.0", - "@opentelemetry/sdk-trace": "2.10.0" + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "gcp-metadata": "^8.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, "node_modules/@opentelemetry/resources": { @@ -1987,6 +3020,47 @@ "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.221.0.tgz", + "integrity": "sha512-UbYuvtBrQQB5Prsh9KOKy4kxzexFxfMs5MkteHeWMoswsEB7kiNhyUVkAOFW/qsEzNHtrkgyghrD2ilZJa+5YA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "@opentelemetry/configuration": "0.221.0", + "@opentelemetry/context-async-hooks": "2.10.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-logs-otlp-http": "0.221.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.221.0", + "@opentelemetry/exporter-prometheus": "0.221.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-trace-otlp-http": "0.221.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.221.0", + "@opentelemetry/exporter-zipkin": "2.10.0", + "@opentelemetry/instrumentation": "0.221.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/propagator-b3": "2.10.0", + "@opentelemetry/propagator-jaeger": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0", + "@opentelemetry/sdk-trace-node": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/sdk-trace": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz", @@ -2004,6 +3078,41 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz", + "integrity": "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.10.0.tgz", + "integrity": "sha512-GZK/G6oZyBLGlH1pUgeDch7D91KoHd2uotUGIkWCPi9GI5T9X0p4L7nNAMDR1BQjkRYoDqo+ddfVx9t5Uhys+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.10.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", @@ -2013,14 +3122,29 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.42.0.tgz", + "integrity": "sha512-nwUwUU+8O8a4bnLqk6CodWeegGMEANgC94KTAhXcpGWLrW/2/hek/0ajNbjXnSOoNuCX+nteUPs46HFHhou9Xw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, "node_modules/@oxc-project/types": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", "dev": true, "license": "MIT", "funding": { - "url": "https://github.com/sponsors/oxc-project" + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@pinojs/redact": { @@ -2059,10 +3183,67 @@ "dev": true, "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "license": "BSD-3-Clause" + }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", - "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", "cpu": [ "arm" ], @@ -2077,9 +3258,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", - "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], @@ -2094,9 +3275,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", - "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], @@ -2111,9 +3292,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", - "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ "x64" ], @@ -2128,9 +3309,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", - "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ "x64" ], @@ -2145,9 +3326,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", - "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ "arm" ], @@ -2162,9 +3343,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", - "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ "arm64" ], @@ -2182,9 +3363,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", - "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ "arm64" ], @@ -2202,9 +3383,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", - "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ "ppc64" ], @@ -2222,9 +3403,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", - "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -2242,9 +3423,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", - "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -2262,9 +3443,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", - "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -2282,9 +3463,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", - "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -2299,9 +3480,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", - "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ "arm64" ], @@ -2316,9 +3497,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", - "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -2396,12 +3577,12 @@ "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@smithy/core": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.35.0.tgz", - "integrity": "sha512-zRMhfkByhT2snNdr1si24vJitU6Cr9ix2MikUfWmkAgp4jrNP0GcKSP5YvwQ+TlI8AZXER5QOGJn3JsVtSD9/A==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.33.3.tgz", + "integrity": "sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.19.0", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -2423,13 +3604,13 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.8.0.tgz", - "integrity": "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.7.2.tgz", + "integrity": "sha512-nZyWTmSpJEXl6VtWVMBJve/7x12DZu6sIX1z1a+ZMaHlQQRs9Zpu6NbTe/gmxYXVRpkjxyDYpZ5gx2IM6f/Wkw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.33.3", - "@smithy/types": "^4.18.0", + "@smithy/core": "^3.33.2", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -2437,13 +3618,13 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.12.1.tgz", - "integrity": "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.11.3.tgz", + "integrity": "sha512-2jY1tSpERfPfWqyBV2pH+iGFaghVsIJszJNsT7hxtQYhVJpWDyc0LqOWI+nXOxOAHaEfZ4PXXtp1wW1TGpHhkA==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.33.3", - "@smithy/types": "^4.18.0", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -2451,13 +3632,13 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.4.tgz", - "integrity": "sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.3.tgz", + "integrity": "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.35.0", - "@smithy/types": "^4.19.0", + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.17.2", "tslib": "^2.6.2" }, "engines": { @@ -2465,9 +3646,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.19.0.tgz", - "integrity": "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.17.2.tgz", + "integrity": "sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2544,9 +3725,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", "optional": true, @@ -2564,6 +3745,21 @@ "@types/readdir-glob": "*" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "license": "MIT" + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -2575,6 +3771,15 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -2617,16 +3822,62 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "26.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.3.0.tgz", "integrity": "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~8.3.0" } }, + "node_modules/@types/oracledb": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", + "integrity": "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/proper-lockfile": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz", @@ -2689,6 +3940,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -2900,9 +4160,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.10.tgz", - "integrity": "sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -3065,14 +4325,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.1.tgz", - "integrity": "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", + "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.70.1", - "@typescript-eslint/types": "^8.70.1", + "@typescript-eslint/tsconfig-utils": "^8.68.0", + "@typescript-eslint/types": "^8.68.0", "debug": "^4.4.3" }, "engines": { @@ -3087,14 +4347,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz", - "integrity": "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", + "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1" + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3105,9 +4365,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz", - "integrity": "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", + "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", "dev": true, "license": "MIT", "engines": { @@ -3301,9 +4561,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.1.tgz", - "integrity": "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", + "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", "dev": true, "license": "MIT", "engines": { @@ -3315,16 +4575,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz", - "integrity": "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", + "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.70.1", - "@typescript-eslint/tsconfig-utils": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/visitor-keys": "8.70.1", + "@typescript-eslint/project-service": "8.68.0", + "@typescript-eslint/tsconfig-utils": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3343,16 +4603,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.1.tgz", - "integrity": "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", + "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.70.1", - "@typescript-eslint/types": "8.70.1", - "@typescript-eslint/typescript-estree": "8.70.1" + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3367,13 +4627,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.70.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz", - "integrity": "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", + "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/types": "8.68.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4168,9 +5428,9 @@ } }, "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -4313,18 +5573,18 @@ } }, "node_modules/array-includes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.2.0.tgz", - "integrity": "sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", + "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "es-shim-unscopables": "^1.1.0", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" }, @@ -4428,9 +5688,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.7.tgz", - "integrity": "sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", + "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", "dev": true, "license": "MIT", "dependencies": { @@ -4520,9 +5780,9 @@ } }, "node_modules/b4a": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz", - "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -4544,9 +5804,9 @@ } }, "node_modules/bare-events": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", - "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", "license": "Apache-2.0", "peerDependencies": { "bare-abort-controller": "*" @@ -4558,9 +5818,9 @@ } }, "node_modules/bare-fs": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.2.tgz", - "integrity": "sha512-+ZI68KHMUvosXfKbg/UOHK0tbCdRnegbvPEdEcZ3Nd6TetieQsJPRXBRXPdLyy8+3VSEbPXtsumTpEtt78xv9w==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz", + "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.5.4", @@ -4582,15 +5842,15 @@ } }, "node_modules/bare-path": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz", - "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", + "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", "license": "Apache-2.0" }, "node_modules/bare-stream": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", - "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", + "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.8.1", @@ -4615,9 +5875,9 @@ } }, "node_modules/bare-url": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.4.tgz", - "integrity": "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.2.tgz", + "integrity": "sha512-L13PCJzKG8RGvx8V1/DdMi12ERhC3tprr7/8a94BxpmnRsFqxh5XZNdhtMxu5HPkRshYOOWRGY8lDP7ZhpG9Cg==", "license": "Apache-2.0", "dependencies": { "bare-path": "^3.0.0" @@ -4644,9 +5904,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.26", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz", - "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==", + "version": "2.11.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", + "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4666,6 +5926,15 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bowser": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", @@ -4673,9 +5942,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", - "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { @@ -4686,9 +5955,9 @@ } }, "node_modules/browserslist": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.1.tgz", - "integrity": "sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -4706,11 +5975,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.25", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.438", - "node-releases": "^2.0.57", - "update-browserslist-db": "^1.3.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -4760,9 +6029,9 @@ "license": "MIT" }, "node_modules/builtin-modules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.4.0.tgz", - "integrity": "sha512-JCWSCdun+4Ovd9BhM/Vtlmwb7oD6Wl4YiPRXXwhAuwlPhW1un/MKgXn7GZoFm53ginnoNzus69V8JWx0K393jg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.3.0.tgz", + "integrity": "sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==", "dev": true, "license": "MIT", "engines": { @@ -4832,9 +6101,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001812", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz", - "integrity": "sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -5192,6 +6461,15 @@ "node": ">= 8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -5396,9 +6674,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.439", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.439.tgz", - "integrity": "sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q==", + "version": "1.5.414", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.414.tgz", + "integrity": "sha512-aYlviXiaXBbzvKgyALpcMmqa3Np3sDr0XnZbEG62n2UpZFbEcjQ4EEMOLGzVPhwVnwTz0lvKY+GcARbunuHekw==", "dev": true, "license": "ISC" }, @@ -5428,9 +6706,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", - "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", "dependencies": { @@ -5561,9 +6839,9 @@ } }, "node_modules/es-module-lexer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-3.0.2.tgz", - "integrity": "sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -5673,7 +6951,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5921,9 +7198,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -6064,9 +7341,9 @@ } }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "17.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", - "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", "dev": true, "license": "MIT", "engines": { @@ -6127,9 +7404,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -6287,10 +7564,16 @@ "node": ">=12.0.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-copy": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.1.1.tgz", - "integrity": "sha512-A4QTJmuiztpGtr6AMeJts9R4hbj2ZBUwtOaKrG6rw2y7t6+IaJKjz5M3XDs8BUznxDH43FVc6A0y/gWlMl4UtA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.4.tgz", + "integrity": "sha512-eVAiWVNPSEGIzDl5yPuLrx8fNMogScXvD9xp1Kzd41FjRIz2I3sSIcxsFeM5EzFfHAfobdvs8ZySffUopljvIA==", "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -6333,9 +7616,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", - "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", "dev": true, "funding": [ { @@ -6367,6 +7650,29 @@ } } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -6509,6 +7815,24 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6580,6 +7904,57 @@ "url": "https://github.com/sponsors/krisk" } }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz", + "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "7.1.3", + "google-logging-utils": "1.1.3", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -6594,16 +7969,15 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", - "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -6722,9 +8096,9 @@ "license": "MIT" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", - "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -6775,6 +8149,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6974,13 +8357,13 @@ } }, "node_modules/import-in-the-middle": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.5.1.tgz", - "integrity": "sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.3.3.tgz", + "integrity": "sha512-AiohS3H80sXO6owEltjGX+glb7qXaDhBoJb9XcQVH4UI207xu/bDLUcadVKp7Qe576reg9yr/PXZjV5qx8gfbA==", "license": "Apache-2.0", "dependencies": { "cjs-module-lexer": "^2.2.0", - "es-module-lexer": "^3.0.2", + "es-module-lexer": "^2.2.0", "module-details-from-path": "^1.0.4" }, "engines": { @@ -7181,13 +8564,13 @@ } }, "node_modules/is-core-module": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", - "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.4" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -7810,6 +9193,15 @@ "node": ">=6" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8276,6 +9668,12 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8291,6 +9689,12 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/lru-cache": { "version": "11.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", @@ -8320,9 +9724,9 @@ } }, "node_modules/magicast": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", - "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", "dependencies": { @@ -8417,16 +9821,16 @@ } }, "node_modules/minimizer-webpack-plugin": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.12.0.tgz", - "integrity": "sha512-PCN1x1OzFeFB2GlP91s46q7Gz8Jf16Z7M45bzpoqrYZlh12QeY6tYVM5h299wbwy1DxnQ69VFmmh8Hb2Ff8mbw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.3", - "terser": "^5.51.0" + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -8442,9 +9846,6 @@ "@minify-html/node": { "optional": true }, - "@napi-rs/image": { - "optional": true - }, "@swc/core": { "optional": true }, @@ -8469,21 +9870,12 @@ "html-minifier-terser": { "optional": true }, - "imagemin": { - "optional": true - }, "lightningcss": { "optional": true }, "postcss": { "optional": true }, - "sharp": { - "optional": true - }, - "svgo": { - "optional": true - }, "uglify-js": { "optional": true } @@ -8552,9 +9944,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.19", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", - "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -8632,6 +10024,26 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-exports-info": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", @@ -8661,6 +10073,24 @@ "semver": "bin/semver.js" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -8707,9 +10137,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.57", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", - "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, "license": "MIT", "engines": { @@ -8839,9 +10269,9 @@ } }, "node_modules/obug": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", - "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -8899,9 +10329,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.2.tgz", - "integrity": "sha512-BY+qgDArmYpvvmij141xbkB4Cw8RFLBQM5Zj4MODFb1SyXBRE/xO4Xj/QWbR7aUEBxbkjuNdsFVCL2TmbYrlNg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "license": "MIT" }, "node_modules/own-keys": { @@ -9062,6 +10492,37 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", + "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9245,9 +10706,9 @@ } }, "node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -9265,7 +10726,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.18", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -9273,6 +10734,45 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9360,6 +10860,29 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/protobufjs": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -9449,9 +10972,9 @@ "license": "MIT" }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", - "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -9568,9 +11091,9 @@ } }, "node_modules/regjsparser": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", - "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9580,6 +11103,15 @@ "regjsparser": "bin/parser" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -9679,14 +11211,29 @@ "node": ">= 4" } }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rolldown": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.11.tgz", - "integrity": "sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.151.0", + "@oxc-project/types": "=0.146.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -9696,21 +11243,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.11", - "@rolldown/binding-android-arm64": "1.2.11", - "@rolldown/binding-darwin-arm64": "1.2.11", - "@rolldown/binding-darwin-x64": "1.2.11", - "@rolldown/binding-freebsd-x64": "1.2.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.11", - "@rolldown/binding-linux-arm64-gnu": "1.2.11", - "@rolldown/binding-linux-arm64-musl": "1.2.11", - "@rolldown/binding-linux-ppc64-gnu": "1.2.11", - "@rolldown/binding-linux-s390x-gnu": "1.2.11", - "@rolldown/binding-linux-x64-gnu": "1.2.11", - "@rolldown/binding-linux-x64-musl": "1.2.11", - "@rolldown/binding-openharmony-arm64": "1.2.11", - "@rolldown/binding-win32-arm64-msvc": "1.2.11", - "@rolldown/binding-win32-x64-msvc": "1.2.11" + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, "node_modules/safe-array-concat": { @@ -9808,15 +11355,15 @@ } }, "node_modules/schema-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", - "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15", - "ajv": "^8.20.0", - "ajv-formats": "^3.0.1", + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { @@ -10213,9 +11760,9 @@ } }, "node_modules/streamx": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", - "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -10466,6 +12013,32 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/systeminformation": { + "version": "5.33.2", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.2.tgz", + "integrity": "sha512-T0w9cJPXe0AVMOukHTBNMrqU9mf3LdRR6dxLdnNbM9LdKEcH5yWT5FEN7ljvgh4cjliLy7pICtViQtVeYqaZxg==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", @@ -10481,9 +12054,9 @@ } }, "node_modules/tar-stream": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz", - "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", "license": "MIT", "dependencies": { "b4a": "^1.6.4", @@ -10502,9 +12075,9 @@ } }, "node_modules/terser": { - "version": "5.51.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", - "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", + "integrity": "sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10555,9 +12128,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", - "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", "engines": { @@ -10977,18 +12550,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", - "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "for-each": "^0.3.5", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", "gopd": "^1.2.0", + "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.10" + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -11233,7 +12807,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -11275,9 +12848,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", - "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -11329,16 +12902,16 @@ "license": "MIT" }, "node_modules/vite": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", - "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.7", - "postcss": "^8.5.28", - "rolldown": "~1.2.9", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -11355,7 +12928,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -11496,13 +13069,6 @@ } } }, - "node_modules/vitest/node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "dev": true, - "license": "MIT" - }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -11571,6 +13137,15 @@ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "license": "MIT" }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webpack": { "version": "5.109.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", @@ -11768,22 +13343,15 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.3.tgz", - "integrity": "sha512-F/zS5rEcCKxS6hrhxkLjOzblTsuv89rkuDyP+vToquds6KfPJ3fDqg9UNzbtJcA2AgXZOLMYLQqZpuyE5zDfxg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "dev": true, - "license": "MIT" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11901,9 +13469,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", - "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { @@ -12111,11 +13679,19 @@ } } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -12165,9 +13741,9 @@ } }, "node_modules/yargs/node_modules/string-width": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", - "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e4ec8571..f064a320 100644 --- a/package.json +++ b/package.json @@ -5,20 +5,8 @@ "id": "aws-cloudformation-languageserver", "description": "AWS CloudFormation Language Server", "publisher": "aws", + "author": "Amazon Web Services (AWS)", "license": "Apache-2.0", - "private": true, - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/aws-cloudformation/cloudformation-languageserver" - }, - "homepage": "https://github.com/aws-cloudformation/cloudformation-languageserver#readme", - "bugs": { - "url": "https://github.com/aws-cloudformation/cloudformation-languageserver/issues" - }, "main": "src/app/standalone.ts", "engines": { "node": ">=24.19.0 <25", @@ -69,13 +57,16 @@ "@aws-sdk/client-s3": "3.1117.0", "@aws-sdk/client-sts": "3.1117.0", "@aws-sdk/credential-provider-node": "3.972.81", - "@aws/cloudformation-validate": "1.12.1", + "@aws/cloudformation-validate": "1.12.0", "@base2/pretty-print-object": "1.0.2", "@opentelemetry/api": "1.9.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", - "@opentelemetry/instrumentation-runtime-node": "0.34.0", + "@opentelemetry/auto-instrumentations-node": "0.79.0", "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-node": "0.221.0", + "@opentelemetry/sdk-trace-base": "2.10.0", + "@opentelemetry/sdk-trace-node": "2.10.0", "@smithy/util-waiter": "4.6.2", "@tree-sitter-grammars/tree-sitter-yaml": "0.7.1", "archiver": "7.0.1", @@ -157,10 +148,14 @@ "externalDependencies": [ "@aws/cloudformation-validate", "@opentelemetry/api", - "@opentelemetry/exporter-metrics-otlp-http", - "@opentelemetry/instrumentation-runtime-node", + "@opentelemetry/auto-instrumentations-node", + "@opentelemetry/instrumentation-pino", "@opentelemetry/resources", + "@opentelemetry/sdk-logs", "@opentelemetry/sdk-metrics", + "@opentelemetry/sdk-node", + "@opentelemetry/sdk-trace-base", + "@opentelemetry/sdk-trace-node", "@tree-sitter-grammars/tree-sitter-yaml", "lmdb", "pino", From 1a9dde046dd1edc444f7b53e609ccf4ad43a5fac Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Thu, 8 Oct 2026 12:04:29 -0400 Subject: [PATCH 6/6] Fix import --- tst/unit/services/cfnValidate/CfnValidateEngine.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts b/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts index f20f1611..70d69e81 100644 --- a/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts +++ b/tst/unit/services/cfnValidate/CfnValidateEngine.test.ts @@ -2,8 +2,9 @@ import { EventEmitter } from 'events'; import path from 'path'; import { Worker } from 'worker_threads'; import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; -import { CfnValidateEngine, CfnValidateResponse } from '../../../../src/services/cfnValidate/CfnValidateEngine'; +import { CfnValidateEngine } from '../../../../src/services/cfnValidate/CfnValidateEngine'; import { WorkerExitError, WorkerFailureError, WorkerShutdownError } from '../../../../src/utils/errors/ErrorClasses'; +import { CfnValidateResponse } from '../../../../src/services/cfnValidate/cfn-validate-worker'; // Path deliberately does not exist on disk: the engine must read the content it is given, not the file system const UNSAVED_TEMPLATE_PATH = '/does/not/exist/template.yaml';