diff --git a/.gitignore b/.gitignore index c2f7e8fd3b..9cf5c4abb9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ package.tgz docs/ *.tsbuildinfo +# Generated WASM base64 files +**/*.wasm.base64.ts + # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored .pnp.* .yarn/* @@ -20,8 +23,8 @@ docs/ !.yarn/releases !.yarn/sdks !.yarn/versions -/test-results/ -/playwright-report/ +**/test-results/ +**/playwright-report/ /blob-report/ /playwright/.cache/ .vscode diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75b8762626..297a21491d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: CURRENT_STAGING: staging-47 APP: 'browser-sdk' - CURRENT_CI_IMAGE: 93 + CURRENT_CI_IMAGE: 94 BUILD_STABLE_REGISTRY: 'registry.ddbuild.io' CI_IMAGE: '$BUILD_STABLE_REGISTRY/ci/$APP:$CURRENT_CI_IMAGE' GIT_REPOSITORY: 'git@github.com:DataDog/browser-sdk.git' diff --git a/Dockerfile b/Dockerfile index e3913da984..bad620c192 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,6 +65,8 @@ RUN apt-get -y install git RUN apt-get -y install procps +RUN apt-get -y install xvfb + # Woke RUN set -o pipefail \ && curl -sSfL https://git.io/getwoke | bash -s -- -b /usr/local/bin v0.17.1 diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 8af282d6f5..891c1e071b 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -10,6 +10,10 @@ prod,@tabler/icons-react,MIT,Copyright (c) 2020-2023 Paweł Kuna prod,clsx,MIT,Copyright (c) Luke Edwards (lukeed.com) prod,react,MIT,Copyright (c) Facebook, Inc. and its affiliates. prod,react-dom,MIT,Copyright (c) Facebook, Inc. and its affiliates. +prod,@msgpack/msgpack,Apache-2.0,Copyright (c) 2010 Peter Griess +prod,dd-trace,Apache-2.0,Copyright (c) 2018, Datadog Inc. +prod,graphql,MIT,Copyright (c) GraphQL Contributors +prod,@openfeature/core,Apache-2.0,Copyright OpenFeature Maintainers dev,typedoc,Apache-2.0,TypeStrong dev,@eslint/js,MIT,Copyright OpenJS Foundation and other contributors, dev,@jsdevtools/coverage-istanbul-loader,MIT,Copyright (c) 2015 James Messinger @@ -84,3 +88,4 @@ dev,react-refresh-typescript,MIT,Copyright (c) Piotr Monwid-Olechnowicz dev,webpack-dev-server,MIT,Copyright JS Foundation and other contributors dev,http-server,MIT,Copyright http-party contributors dev,react-router,MIT,Copyright (c) React Training LLC 2015-2019 Copyright (c) Remix Software Inc. 2020-2021 Copyright (c) Shopify Inc. 2022-2023 +dev,electron,MIT,Copyright (c) Electron contributors Copyright (c) 2013-2020 GitHub Inc. diff --git a/developer-extension/package.json b/developer-extension/package.json index 003c59bcc9..50686e4060 100644 --- a/developer-extension/package.json +++ b/developer-extension/package.json @@ -3,8 +3,8 @@ "version": "6.24.0", "private": true, "scripts": { - "build": "rm -rf dist && webpack --disable-interpret --mode production", - "dev": "rm -rf dist && webpack --disable-interpret --mode development && webpack serve --disable-interpret --mode development --config-name=panel --hot" + "build": "webpack --disable-interpret --mode production", + "dev": "webpack --disable-interpret --mode development && webpack serve --disable-interpret --mode development --config-name=panel --hot" }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0", diff --git a/developer-extension/src/panel/hooks/useEvents/useEvents.ts b/developer-extension/src/panel/hooks/useEvents/useEvents.ts index b54d048414..89ccbec762 100644 --- a/developer-extension/src/panel/hooks/useEvents/useEvents.ts +++ b/developer-extension/src/panel/hooks/useEvents/useEvents.ts @@ -31,7 +31,7 @@ export function useEvents({ }, [eventCollectionStrategy]) useEffect(() => { - if (!preserveEvents) { + if (!preserveEvents && 'webNavigation' in chrome) { const clearCurrentEvents = (details: chrome.webNavigation.WebNavigationTransitionCallbackDetails) => { if (details.transitionType === 'reload' && details.tabId === chrome.devtools.inspectedWindow.tabId) { clearEvents() diff --git a/developer-extension/webpack.config.mts b/developer-extension/webpack.config.mts index 6b6bff398f..542d1844af 100644 --- a/developer-extension/webpack.config.mts +++ b/developer-extension/webpack.config.mts @@ -16,6 +16,7 @@ export default (_env: unknown, argv: { mode?: webpack.Configuration['mode'] }) = entry: './src/background', output: { filename: 'background.js', + clean: true, }, plugins: [ ...(isDevelopment diff --git a/eslint-local-rules/disallowSideEffects.js b/eslint-local-rules/disallowSideEffects.js index d7bfb91f1f..1d7f73006d 100644 --- a/eslint-local-rules/disallowSideEffects.js +++ b/eslint-local-rules/disallowSideEffects.js @@ -38,6 +38,7 @@ const packagesWithoutSideEffect = new Set([ '@datadog/browser-rum-core', 'react', 'react-router-dom', + 'electron', ]) /** diff --git a/eslint-local-rules/enforceProdDepsImports.js b/eslint-local-rules/enforceProdDepsImports.js index 42ca104bef..a475b1e202 100644 --- a/eslint-local-rules/enforceProdDepsImports.js +++ b/eslint-local-rules/enforceProdDepsImports.js @@ -38,7 +38,7 @@ export default { return moduleVisitor((source) => { const importTypeResult = importType(source.value, context) // Use an allow list instead of a deny list to make the rule more future-proof. - if (importTypeResult === 'parent' || importTypeResult === 'sibling') { + if (importTypeResult === 'parent' || importTypeResult === 'sibling' || importTypeResult === 'builtin') { return } diff --git a/eslint.config.mjs b/eslint.config.mjs index 770a09726b..e33e1beb78 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -418,6 +418,18 @@ export default tseslint.config( }, }, + { + files: ['packages/electron/src/**/*.ts'], + ignores: [SPEC_FILES], + rules: { + // TODO: verify this is safe + 'local-rules/disallow-side-effects': 'off', + + // TODO: remove before merging this to main: quick dev only + 'no-console': 'off', + }, + }, + { // Files executed by nodejs files: [ diff --git a/package.json b/package.json index 29db63d320..f9c85ad41b 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "scripts": { "postinstall": "scripts/cli init_submodule", "build": "yarn workspaces foreach --all --parallel --topological run build", + "build:electron": "lerna run build:modules --scope=@datadog/electron", "build:bundle": "yarn workspaces foreach --all --parallel run build:bundle", "build:apps": "node scripts/build/build-test-apps.ts", "build:docs:json": "typedoc --logLevel Verbose --json ./docs.json", @@ -32,7 +33,7 @@ "test:e2e:init": "yarn build && yarn build:apps && yarn playwright install chromium --with-deps", "test:e2e": "playwright test --config test/e2e/playwright.local.config.ts --project chromium", "test:e2e:bs": "node ./scripts/test/bs-wrapper.ts playwright test --config test/e2e/playwright.bs.config.ts", - "test:e2e:ci": "yarn test:e2e:init && yarn test:e2e", + "test:e2e:ci": "yarn test:e2e:init && xvfb-run -a yarn test:e2e", "test:e2e:ci:bs": "yarn build && yarn build:apps && yarn test:e2e:bs", "test:compat:tsc": "node scripts/check-typescript-compatibility.ts", "test:compat:ssr": "scripts/cli check_server_side_rendering_compatibility", diff --git a/packages/core/package.json b/packages/core/package.json index 4b02061449..3648a1c3c5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,6 +7,7 @@ "types": "cjs/index.d.ts", "sideEffects": false, "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules" }, "repository": { diff --git a/packages/core/src/browser/cookie.ts b/packages/core/src/browser/cookie.ts index bab3f49e93..3e47802fbf 100644 --- a/packages/core/src/browser/cookie.ts +++ b/packages/core/src/browser/cookie.ts @@ -7,6 +7,7 @@ import { generateUUID, } from '../tools/utils/stringUtils' import { buildUrl } from '../tools/utils/urlPolyfill' +import { getGlobalObject } from '../tools/globalObject' export interface CookieOptions { secure?: boolean @@ -65,7 +66,7 @@ export function deleteCookie(name: string, options?: CookieOptions) { } export function areCookiesAuthorized(options: CookieOptions): boolean { - if (document.cookie === undefined || document.cookie === null) { + if (getGlobalObject().document?.cookie === undefined || getGlobalObject().document?.cookie === null) { return false } try { diff --git a/packages/core/src/domain/resourceUtils.ts b/packages/core/src/domain/resourceUtils.ts index f5849134c0..34528a7e06 100644 --- a/packages/core/src/domain/resourceUtils.ts +++ b/packages/core/src/domain/resourceUtils.ts @@ -9,6 +9,7 @@ export const ResourceType = { FONT: 'font', MEDIA: 'media', OTHER: 'other', + NATIVE: 'native', } as const export type ResourceType = (typeof ResourceType)[keyof typeof ResourceType] diff --git a/packages/core/src/domain/telemetry/index.ts b/packages/core/src/domain/telemetry/index.ts index c828c694a4..31736928b7 100644 --- a/packages/core/src/domain/telemetry/index.ts +++ b/packages/core/src/domain/telemetry/index.ts @@ -6,6 +6,7 @@ export { addTelemetryError, resetTelemetry, startTelemetry, + startTelemetryCollection, addTelemetryConfiguration, addTelemetryUsage, addTelemetryMetrics, diff --git a/packages/core/src/domain/telemetry/telemetry.ts b/packages/core/src/domain/telemetry/telemetry.ts index 82ec6d4cc1..c97a030b55 100644 --- a/packages/core/src/domain/telemetry/telemetry.ts +++ b/packages/core/src/domain/telemetry/telemetry.ts @@ -56,6 +56,7 @@ const ALLOWED_FRAME_URLS = [ export const enum TelemetryService { LOGS = 'browser-logs-sdk', RUM = 'browser-rum-sdk', + ELECTRON = 'electron-sdk', } export interface Telemetry { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index afe4af85c9..a50202efb4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,4 @@ -export type { Configuration, InitConfiguration, EndpointBuilder, ProxyFn } from './domain/configuration' +export type { Configuration, InitConfiguration, EndpointBuilder, ProxyFn, TrackType } from './domain/configuration' export { validateAndBuildConfiguration, DefaultPrivacyLevel, @@ -7,6 +7,7 @@ export { isSampleRate, buildEndpointHost, isIntakeUrl, + createEndpointBuilder, } from './domain/configuration' export * from './domain/intakeSites' export type { TrackingConsentState } from './domain/trackingConsent' @@ -40,6 +41,7 @@ export type { } from './domain/telemetry' export { startTelemetry, + startTelemetryCollection, addTelemetryDebug, addTelemetryError, resetTelemetry, @@ -55,13 +57,25 @@ export { Observable, BufferedObservable } from './tools/observable' export type { SessionManager } from './domain/session/sessionManager' export { startSessionManager, stopSessionManager } from './domain/session/sessionManager' export { + SESSION_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY, // Exposed for tests SESSION_NOT_TRACKED, SessionPersistence, } from './domain/session/sessionConstants' -export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, FlushEvent, FlushReason } from './transport' +export type { + BandwidthStats, + HttpRequest, + HttpRequestEvent, + Payload, + FlushEvent, + FlushReason, + DatadogEventBridge, + BrowserWindowWithEventBridge, + Batch, +} from './transport' export { createHttpRequest, + RECOMMENDED_REQUEST_BYTES_LIMIT, canUseEventBridge, getEventBridge, bridgeSupports, diff --git a/packages/core/src/tools/utils/byteUtils.ts b/packages/core/src/tools/utils/byteUtils.ts index ed8071f858..57935566be 100644 --- a/packages/core/src/tools/utils/byteUtils.ts +++ b/packages/core/src/tools/utils/byteUtils.ts @@ -1,3 +1,5 @@ +import { globalObject } from '../globalObject' + export const ONE_KIBI_BYTE = 1024 export const ONE_MEBI_BYTE = 1024 * ONE_KIBI_BYTE @@ -16,8 +18,8 @@ export function computeBytesCount(candidate: string): number { return candidate.length } - if (window.TextEncoder !== undefined) { - return new TextEncoder().encode(candidate).length + if ('TextEncoder' in globalObject) { + return new (globalObject as { TextEncoder: typeof TextEncoder }).TextEncoder().encode(candidate).length } return new Blob([candidate]).size diff --git a/packages/core/src/tools/utils/urlPolyfill.ts b/packages/core/src/tools/utils/urlPolyfill.ts index a118546328..0eeda6c7cd 100644 --- a/packages/core/src/tools/utils/urlPolyfill.ts +++ b/packages/core/src/tools/utils/urlPolyfill.ts @@ -1,7 +1,8 @@ import { globalObject } from '../globalObject' export function normalizeUrl(url: string) { - return buildUrl(url, location.href).href + const base = typeof location !== 'undefined' ? location.href : undefined + return buildUrl(url, base).href } export function isValidUrl(url: string) { diff --git a/packages/core/src/transport/httpRequest.ts b/packages/core/src/transport/httpRequest.ts index 04e6976ee7..58700e8f8a 100644 --- a/packages/core/src/transport/httpRequest.ts +++ b/packages/core/src/transport/httpRequest.ts @@ -73,7 +73,8 @@ export interface RetryInfo { export function createHttpRequest( endpointBuilders: EndpointBuilder[], reportError: (error: RawError) => void, - bytesLimit: number = RECOMMENDED_REQUEST_BYTES_LIMIT + bytesLimit: number = RECOMMENDED_REQUEST_BYTES_LIMIT, + userAgent?: string ): HttpRequest { const observable = new Observable>() const retryState = newRetryState() @@ -87,9 +88,9 @@ export function createHttpRequest( retryState, (payload, onResponse) => { if (isExperimentalFeatureEnabled(ExperimentalFeature.AVOID_FETCH_KEEPALIVE)) { - fetchStrategy(endpointBuilder, payload, onResponse) + fetchStrategy(endpointBuilder, payload, onResponse, userAgent) } else { - fetchKeepAliveStrategy(endpointBuilder, bytesLimit, payload, onResponse) + fetchKeepAliveStrategy(endpointBuilder, bytesLimit, payload, onResponse, userAgent) } }, endpointBuilder.trackType, @@ -104,13 +105,18 @@ export function createHttpRequest( */ sendOnExit: (payload: Body) => { for (const endpointBuilder of endpointBuilders) { - sendBeaconStrategy(endpointBuilder, bytesLimit, payload) + sendBeaconStrategy(endpointBuilder, bytesLimit, payload, userAgent) } }, } } -function sendBeaconStrategy(endpointBuilder: EndpointBuilder, bytesLimit: number, payload: Payload) { +function sendBeaconStrategy( + endpointBuilder: EndpointBuilder, + bytesLimit: number, + payload: Payload, + userAgent?: string +) { const canUseBeacon = !!navigator.sendBeacon && payload.bytesCount < bytesLimit if (canUseBeacon) { try { @@ -125,7 +131,7 @@ function sendBeaconStrategy(endpointBuilder: EndpointBuilder, bytesLimit: number } } - fetchStrategy(endpointBuilder, payload) + fetchStrategy(endpointBuilder, payload, undefined, userAgent) } let hasReportedBeaconError = false @@ -141,29 +147,39 @@ export function fetchKeepAliveStrategy( endpointBuilder: EndpointBuilder, bytesLimit: number, payload: Payload, - onResponse?: (r: HttpResponse) => void + onResponse?: (r: HttpResponse) => void, + userAgent?: string ) { const canUseKeepAlive = isKeepAliveSupported() && payload.bytesCount < bytesLimit if (canUseKeepAlive) { const fetchUrl = endpointBuilder.build('fetch-keepalive', payload) - fetch(fetchUrl, { method: 'POST', body: payload.data, keepalive: true, mode: 'cors' }) + const config: RequestInit = { method: 'POST', body: payload.data, keepalive: true, mode: 'cors' } + if (userAgent) { + config.headers = { 'User-Agent': userAgent } + } + fetch(fetchUrl, config) .then(monitor((response: Response) => onResponse?.({ status: response.status, type: response.type }))) .catch(monitor(() => fetchStrategy(endpointBuilder, payload, onResponse))) } else { - fetchStrategy(endpointBuilder, payload, onResponse) + fetchStrategy(endpointBuilder, payload, onResponse, userAgent) } } export function fetchStrategy( endpointBuilder: EndpointBuilder, payload: Payload, - onResponse?: (r: HttpResponse) => void + onResponse?: (r: HttpResponse) => void, + userAgent?: string ) { const fetchUrl = endpointBuilder.build('fetch', payload) - fetch(fetchUrl, { method: 'POST', body: payload.data, mode: 'cors' }) + const config: RequestInit = { method: 'POST', body: payload.data, mode: 'cors' } + if (userAgent) { + config.headers = { 'User-Agent': userAgent } + } + fetch(fetchUrl, config) .then(monitor((response: Response) => onResponse?.({ status: response.status, type: response.type }))) .catch(monitor(() => onResponse?.({ status: 0 }))) } diff --git a/packages/core/src/transport/index.ts b/packages/core/src/transport/index.ts index ce6307356c..287b7338a6 100644 --- a/packages/core/src/transport/index.ts +++ b/packages/core/src/transport/index.ts @@ -1,7 +1,8 @@ export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, RetryInfo } from './httpRequest' -export { createHttpRequest } from './httpRequest' +export { createHttpRequest, RECOMMENDED_REQUEST_BYTES_LIMIT } from './httpRequest' export type { BrowserWindowWithEventBridge, DatadogEventBridge } from './eventBridge' export { canUseEventBridge, bridgeSupports, getEventBridge, BridgeCapability } from './eventBridge' +export type { Batch } from './batch' export { createBatch } from './batch' export type { FlushController, FlushEvent, FlushReason } from './flushController' export { createFlushController, FLUSH_DURATION_LIMIT } from './flushController' diff --git a/packages/electron/.npmignore b/packages/electron/.npmignore new file mode 100644 index 0000000000..254b105e43 --- /dev/null +++ b/packages/electron/.npmignore @@ -0,0 +1,9 @@ +* +!/bundle/**/*.js +!/cjs/**/* +!/esm/**/* +!/src/**/* +/src/**/*.spec.ts +/src/**/*.specHelper.ts +!/internal/* +!/internal-synthetics/* diff --git a/packages/electron/.yarnrc b/packages/electron/.yarnrc new file mode 100644 index 0000000000..db15371515 --- /dev/null +++ b/packages/electron/.yarnrc @@ -0,0 +1,2 @@ +save-exact true + diff --git a/packages/electron/main/package.json b/packages/electron/main/package.json new file mode 100644 index 0000000000..842358f536 --- /dev/null +++ b/packages/electron/main/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "main": "../cjs/entries/main.js", + "module": "../esm/entries/main.js", + "types": "../cjs/entries/main.d.ts" +} diff --git a/packages/electron/package.json b/packages/electron/package.json new file mode 100644 index 0000000000..1825119b4a --- /dev/null +++ b/packages/electron/package.json @@ -0,0 +1,44 @@ +{ + "name": "@datadog/electron", + "version": "6.23.0", + "license": "Apache-2.0", + "scripts": { + "pack": "yarn pack", + "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-electron.js", + "build:modules": "node ../../scripts/build/build-package.ts --modules", + "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-electron.js" + }, + "dependencies": { + "@datadog/browser-core": "6.24.0", + "@datadog/browser-logs": "6.24.0", + "@datadog/browser-rum-core": "6.24.0", + "@msgpack/msgpack": "3.1.2", + "@openfeature/core": "1.9.1", + "dd-trace": "^5.76.0", + "graphql": "16.12.0" + }, + "peerDependencies": { + "electron": "39" + }, + "repository": { + "type": "git", + "url": "https://github.com/DataDog/browser-sdk.git", + "directory": "packages/electron" + }, + "devDependencies": { + "@types/pako": "2.0.4", + "electron": "39", + "pako": "2.1.0" + }, + "volta": { + "extends": "../../package.json" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "cjs/**/*", + "esm/**/*", + "bundle/**/*" + ] +} diff --git a/packages/electron/preload/package.json b/packages/electron/preload/package.json new file mode 100644 index 0000000000..650beb32a7 --- /dev/null +++ b/packages/electron/preload/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "main": "../cjs/entries/preload.js", + "module": "../esm/entries/preload.js", + "types": "../cjs/entries/preload.d.ts" +} diff --git a/packages/electron/renderer/package.json b/packages/electron/renderer/package.json new file mode 100644 index 0000000000..ade81e8b79 --- /dev/null +++ b/packages/electron/renderer/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "main": "../cjs/entries/renderer.js", + "module": "../esm/entries/renderer.js", + "types": "../cjs/entries/renderer.d.ts" +} diff --git a/packages/electron/scripts/generate-wasm-base64.js b/packages/electron/scripts/generate-wasm-base64.js new file mode 100755 index 0000000000..0e2fcd757f --- /dev/null +++ b/packages/electron/scripts/generate-wasm-base64.js @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +/** + * This script converts the minidump_bg.wasm file to a base64-encoded string + * and generates a TypeScript file that exports it. + * This allows the WASM file to be embedded directly in the built code. + */ + +const fs = require('fs') +const path = require('path') + +const wasmPath = path.join(__dirname, '../src/wasm/minidump_bg.wasm') +const outputPath = path.join(__dirname, '../src/wasm/minidump_bg.wasm.base64.ts') + +console.log('Converting WASM to base64...') +console.log(` Input: ${wasmPath}`) +console.log(` Output: ${outputPath}`) + +// Read the WASM file +const wasmBuffer = fs.readFileSync(wasmPath) +const base64String = wasmBuffer.toString('base64') + +console.log(` WASM size: ${wasmBuffer.length} bytes`) +console.log(` Base64 size: ${base64String.length} bytes`) + +// Generate the TypeScript file +const tsContent = `// This file is automatically generated by scripts/generate-wasm-base64.js +// Do not edit manually + +/** + * Base64-encoded WebAssembly binary for the minidump parser + * Original size: ${wasmBuffer.length} bytes + * Encoded size: ${base64String.length} bytes + */ +export const MINIDUMP_WASM_BASE64 = '${base64String}' +` + +fs.writeFileSync(outputPath, tsContent, 'utf-8') +console.log('✓ Successfully generated base64 file') diff --git a/packages/electron/src/domain/logs/assembly.ts b/packages/electron/src/domain/logs/assembly.ts new file mode 100644 index 0000000000..5edbb07843 --- /dev/null +++ b/packages/electron/src/domain/logs/assembly.ts @@ -0,0 +1,27 @@ +import type { Observable, Context, Batch } from '@datadog/browser-core' +import { HookNames, DISCARDED, combine } from '@datadog/browser-core' +import type { LogsEvent } from '@datadog/browser-logs' +import type { Hooks } from '../../hooks' + +export function startLogsEventAssembleAndSend( + onLogsEventObservable: Observable, + logsBatch: Batch, + hooks: Hooks +) { + onLogsEventObservable.subscribe((event) => { + const defaultLogsEventAttributes = hooks.triggerHook(HookNames.Assemble, { + eventType: 'log' as any, + })! + + if (defaultLogsEventAttributes === DISCARDED) { + return + } + + const serverLogEvent = combine(event as Context, { + session_id: defaultLogsEventAttributes.session!.id, + application_id: defaultLogsEventAttributes.application!.id, + }) + + logsBatch.add(serverLogEvent) + }) +} diff --git a/packages/electron/src/domain/main/bridge.ts b/packages/electron/src/domain/main/bridge.ts new file mode 100644 index 0000000000..ec40c1bcb6 --- /dev/null +++ b/packages/electron/src/domain/main/bridge.ts @@ -0,0 +1,35 @@ +import type { Observable } from '@datadog/browser-core' +import { monitor } from '@datadog/browser-core' +import { ipcMain } from 'electron' +import type { RumEvent } from '@datadog/browser-rum-core' +import type { LogsEvent } from '@datadog/browser-logs' +import type { CollectedRumEvent } from '../rum/events' + +interface BridgeEvent { + eventType: 'rum' | 'internal_telemetry' | 'log' + event: unknown +} + +export function setupMainBridge( + rumEventObservable: Observable, + logsEventObservable: Observable +) { + ipcMain.handle( + 'datadog:send', + monitor((_event, msg: string) => { + const bridgeEvent = JSON.parse(msg) as BridgeEvent + + switch (bridgeEvent.eventType) { + case 'rum': + case 'internal_telemetry': + rumEventObservable.notify({ event: bridgeEvent.event as RumEvent, source: 'renderer' }) + break + case 'log': + logsEventObservable.notify(bridgeEvent.event as LogsEvent) + break + default: + console.log('Unhandled event type', bridgeEvent) + } + }) + ) +} diff --git a/packages/electron/src/domain/main/ipcMain.ts b/packages/electron/src/domain/main/ipcMain.ts new file mode 100644 index 0000000000..daf73ec35e --- /dev/null +++ b/packages/electron/src/domain/main/ipcMain.ts @@ -0,0 +1,47 @@ +import type { IpcMain } from 'electron' +import { ipcMain } from 'electron' +import tracer from '../trace/tracer' +import type { DatadogCarrier } from '../trace/trace' + +const SPAN_NAME_PREFIX = 'ipcMain' + +const isDatadogCarrier = (arg: any): arg is DatadogCarrier => typeof arg === 'object' && arg?.__dd_carrier === true + +export function monitorIpcMain(): IpcMain { + const ddIpcMain = { ...ipcMain } + + ddIpcMain.on = withDatadogCarrier('on', ipcMain.on.bind(ipcMain)) + ddIpcMain.off = withDatadogCarrier('off', ipcMain.off.bind(ipcMain)) + ddIpcMain.once = withDatadogCarrier('once', ipcMain.once.bind(ipcMain)) + ddIpcMain.addListener = withDatadogCarrier('addListener', ipcMain.addListener.bind(ipcMain)) + ddIpcMain.removeListener = withDatadogCarrier('removeListener', ipcMain.removeListener.bind(ipcMain)) + ddIpcMain.handle = withDatadogCarrier('handle', ipcMain.handle.bind(ipcMain)) + ddIpcMain.handleOnce = withDatadogCarrier('handleOnce', ipcMain.handleOnce.bind(ipcMain)) + + ddIpcMain.removeAllListeners = ipcMain.removeAllListeners.bind(ipcMain) + ddIpcMain.removeHandler = ipcMain.removeHandler.bind(ipcMain) + + return ddIpcMain +} + +function withDatadogCarrier R, R>(name: string, fn: T): (...args: Parameters) => R { + return (...args: Parameters) => { + const channel = args[0] + const listener = args[1] as (...args: any[]) => R + const spanName = `${SPAN_NAME_PREFIX}.${name}.${channel}` + + return fn(channel, (...args: Parameters) => { + const lastArg = args[args.length - 1] + if (isDatadogCarrier(lastArg)) { + const parentContext = tracer.extract('text_map', lastArg) + args.pop() // remove the carrier from the args + + if (parentContext) { + return tracer.trace(spanName, { childOf: parentContext }, () => listener(...args)) + } + } + + return tracer.trace(spanName, () => listener(...args)) + }) + } +} diff --git a/packages/electron/src/domain/preload/bridge.ts b/packages/electron/src/domain/preload/bridge.ts new file mode 100644 index 0000000000..3eeb8b42e7 --- /dev/null +++ b/packages/electron/src/domain/preload/bridge.ts @@ -0,0 +1,25 @@ +import { contextBridge, ipcRenderer } from 'electron' +import type { DatadogEventBridge } from '@datadog/browser-core' + +export function setupRendererBridge() { + ;(window as any).DatadogEventBridge = { + getCapabilities() { + return '[]' + }, + getPrivacyLevel() { + return 'mask' + }, + getAllowedWebViewHosts() { + return JSON.stringify([location.hostname]) + }, + send(msg: string) { + void ipcRenderer.invoke('datadog:send', msg) + }, + } satisfies DatadogEventBridge + + try { + contextBridge.exposeInMainWorld('DatadogEventBridge', (window as any).DatadogEventBridge) + } catch { + // contextBridge API can only be used when contextIsolation is enabled + } +} diff --git a/packages/electron/src/domain/preload/ipcRenderer.ts b/packages/electron/src/domain/preload/ipcRenderer.ts new file mode 100644 index 0000000000..a502efe62b --- /dev/null +++ b/packages/electron/src/domain/preload/ipcRenderer.ts @@ -0,0 +1,98 @@ +import type { IpcRenderer } from 'electron' +import { contextBridge, ipcRenderer } from 'electron' +import { createSpanIdentifier, createTraceIdentifier } from '@datadog/browser-rum-core' +import type { Observable } from '@datadog/browser-core' +import { BufferedObservable, clocksNow, elapsed, toServerDuration } from '@datadog/browser-core' +import type { DatadogCarrier, SpanInfo } from '../trace/trace' + +function isThenable(value: any): value is Promise { + return typeof value === 'object' && value !== null && 'then' in value +} + +const SPAN_NAME_PREFIX = 'ipcRenderer' + +function createDatadogCarrier(): DatadogCarrier { + const spanId = createSpanIdentifier().toString() + const traceId = createTraceIdentifier().toString() + + return { + __dd_carrier: true, + 'x-datadog-origin': 'rum', + 'x-datadog-parent-id': spanId, + 'x-datadog-sampling-priority': '1', + 'x-datadog-trace-id': traceId, + } +} + +function withDatadogCarrier R, R>( + observable: Observable, + method: string, + fn: T +): (...args: Parameters) => R { + return (...args: Parameters) => { + const carrier = createDatadogCarrier() + const startClock = clocksNow() + const channel = args[0] + + const result = fn(...args, carrier) + + const notifySpan = () => { + observable.notify({ + startClocks: startClock, + spanId: parseInt(carrier['x-datadog-parent-id'], 10).toString(), + traceId: parseInt(carrier['x-datadog-trace-id'], 10).toString(), + duration: toServerDuration(elapsed(startClock.timeStamp, clocksNow().timeStamp)), + name: `${SPAN_NAME_PREFIX}.${method}.${channel}`, + }) + } + + if (isThenable(result)) { + return result.then((data: any) => { + notifySpan() + + return data // eslint-disable-line @typescript-eslint/no-unsafe-return + }) as R + } + + notifySpan() + + return result + } +} + +export function monitorIpcRenderer(): IpcRenderer { + const ddIpcRenderer = { ...ipcRenderer } + const observable = new BufferedObservable(100) + + window.dd_electron_internal_api = { + onSpan: (callback: (spanInfo: SpanInfo) => void) => { + const subscription = observable.subscribe((spanInfo) => callback(spanInfo)) + + return () => subscription.unsubscribe() + }, + } + try { + contextBridge.exposeInMainWorld('dd_electron_internal_api', window.dd_electron_internal_api) + } catch { + // contextBridge API can only be used when contextIsolation is enabled + } + + ddIpcRenderer.on = withDatadogCarrier(observable, 'on', ipcRenderer.on.bind(ipcRenderer)) + ddIpcRenderer.off = withDatadogCarrier(observable, 'off', ipcRenderer.off.bind(ipcRenderer)) + ddIpcRenderer.once = withDatadogCarrier(observable, 'once', ipcRenderer.once.bind(ipcRenderer)) + ddIpcRenderer.addListener = withDatadogCarrier(observable, 'addListener', ipcRenderer.addListener.bind(ipcRenderer)) + ddIpcRenderer.removeListener = withDatadogCarrier( + observable, + 'removeListener', + ipcRenderer.removeListener.bind(ipcRenderer) + ) + ddIpcRenderer.send = withDatadogCarrier(observable, 'send', ipcRenderer.send.bind(ipcRenderer)) + ddIpcRenderer.invoke = withDatadogCarrier(observable, 'invoke', ipcRenderer.invoke.bind(ipcRenderer)) + ddIpcRenderer.sendSync = withDatadogCarrier(observable, 'sendSync', ipcRenderer.sendSync.bind(ipcRenderer)) + ddIpcRenderer.sendToHost = withDatadogCarrier(observable, 'sendToHost', ipcRenderer.sendToHost.bind(ipcRenderer)) + + // TODO: Do something for ipcRenderer.postMessage ?? + // see https://www.electronjs.org/docs/latest/api/ipc-renderer#ipcrendererpostmessagechannel-message-transfer + + return ddIpcRenderer +} diff --git a/packages/electron/src/domain/renderer/plugin.ts b/packages/electron/src/domain/renderer/plugin.ts new file mode 100644 index 0000000000..fb999055f0 --- /dev/null +++ b/packages/electron/src/domain/renderer/plugin.ts @@ -0,0 +1,130 @@ +import { generateUUID } from '@datadog/browser-core' +import type { RumPlugin, RumPublicApi, StartRumResult, RawRumResourceEvent } from '@datadog/browser-rum-core' +import type { SpanInfo } from '../trace/trace' + +let globalPublicApi: RumPublicApi | undefined +let globalConfiguration: ElectronPluginConfiguration | undefined +let globalAddEvent: StartRumResult['addEvent'] | undefined +type InitSubscriber = (configuration: ElectronPluginConfiguration, rumPublicApi: RumPublicApi) => void +type StartSubscriber = (addEvent: StartRumResult['addEvent']) => void + +const onRumInitSubscribers: InitSubscriber[] = [] +const onRumStartSubscribers: StartSubscriber[] = [] + +/** + * Electron plugin configuration. + * + * @category Main + */ +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface ElectronPluginConfiguration {} + +/** + * Electron plugin type. + * + * The plugins API is unstable and experimental, and may change without notice. Please don't use this type directly. + * + * @internal + */ +export type ElectronPlugin = Required + +// eslint-disable-next-line no-restricted-syntax +declare global { + interface Window { + dd_electron_internal_api: { + onSpan: (callback: (spanInfo: SpanInfo) => void) => void + } + } +} + +/** + * Electron plugin constructor. + * + * @category Main + * @example + * ```ts + * import { datadogRum } from '@datadog/browser-rum' + * import { electronPlugin } from '@datadog/electron/renderer' + * + * datadogRum.init({ + * applicationId: '', + * clientToken: '', + * site: '', + * plugins: [electronPlugin()], + * // ... + * }) + * ``` + */ +export function electronPlugin(configuration: ElectronPluginConfiguration = {}): ElectronPlugin { + return { + name: 'electron', + onInit({ publicApi }) { + globalPublicApi = publicApi + globalConfiguration = configuration + for (const subscriber of onRumInitSubscribers) { + subscriber(globalConfiguration, globalPublicApi) + } + }, + onRumStart({ addEvent }) { + globalAddEvent = addEvent + + if (!addEvent) { + return + } + + for (const subscriber of onRumStartSubscribers) { + subscriber(addEvent) + } + + window.dd_electron_internal_api.onSpan((spanInfo: SpanInfo) => { + const event: RawRumResourceEvent = { + date: spanInfo.startClocks.timeStamp, + type: 'resource', + _dd: { + span_id: spanInfo.spanId, + trace_id: spanInfo.traceId, + discarded: false, + rule_psr: 1, + }, + resource: { + type: 'native', + id: generateUUID(), + url: spanInfo.name, + method: 'GET', + duration: spanInfo.duration, + }, + } + + // @ts-expect-error - TODO: fix this - probably also due to deep imports - it break at build time + addEvent(spanInfo.startClocks.relative, event, {}, spanInfo.duration) + }) + }, + getConfigurationTelemetry() { + return {} + }, + } satisfies RumPlugin +} + +export function onRumInit(callback: InitSubscriber) { + if (globalConfiguration && globalPublicApi) { + callback(globalConfiguration, globalPublicApi) + } else { + onRumInitSubscribers.push(callback) + } +} + +export function onRumStart(callback: StartSubscriber) { + if (globalAddEvent) { + callback(globalAddEvent) + } else { + onRumStartSubscribers.push(callback) + } +} + +export function resetElectronPlugin() { + globalPublicApi = undefined + globalConfiguration = undefined + globalAddEvent = undefined + onRumInitSubscribers.length = 0 + onRumStartSubscribers.length = 0 +} diff --git a/packages/electron/src/domain/rum/activity.ts b/packages/electron/src/domain/rum/activity.ts new file mode 100644 index 0000000000..b555c65dcf --- /dev/null +++ b/packages/electron/src/domain/rum/activity.ts @@ -0,0 +1,17 @@ +import { Observable } from '@datadog/browser-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { CollectedRumEvent } from './events' + +export function startActivityTracking(onRumEventObservable: Observable) { + const onActivityObservable = new Observable() + const alreadySeenViewIds = new Set() + onRumEventObservable.subscribe(({ event }) => { + if (event.type === RumEventType.VIEW && !alreadySeenViewIds.has(event.view.id)) { + alreadySeenViewIds.add(event.view.id) + onActivityObservable.notify() + } else if (event.type === RumEventType.ACTION && event.action.type === 'click') { + onActivityObservable.notify() + } + }) + return onActivityObservable +} diff --git a/packages/electron/src/domain/rum/appStability.ts b/packages/electron/src/domain/rum/appStability.ts new file mode 100644 index 0000000000..bdcdc2612c --- /dev/null +++ b/packages/electron/src/domain/rum/appStability.ts @@ -0,0 +1,83 @@ +import { Observable, setTimeout, clearTimeout, ONE_SECOND } from '@datadog/browser-core' +import { app } from 'electron' + +const WEB_CONTENTS_FINISHED_TIMEOUT = 30 * ONE_SECOND +const APP_STABLE_TIMEOUT = 30 * ONE_SECOND + +/** + * Try to notify when the app is stable after startup + * + * https://www.electronjs.org/docs/latest/tutorial/performance#2-loading-and-running-code-too-soon + * Motivation: + * As crashes files accesses and parsing can be I/O and CPU intensive, delay them to not impact the main thread during startup + * Crashes at startup have been observed on Windows VM when executed only on app ready + */ +export function startAppStabilityTracking() { + const observable = new Observable() + + const timeouts = new Map() + const pending = new Set() + let notified = false + let readyTimeout: NodeJS.Timeout | undefined + + app.on('web-contents-created', onWebContentsCreated) + + void app.whenReady().then(() => { + readyTimeout = setTimeout(notifyOnce, APP_STABLE_TIMEOUT) + }) + + return observable + + function onWebContentsCreated(_event: Electron.Event, webContents: Electron.WebContents) { + const id = webContents.id + pending.add(id) + + webContents.once('did-finish-load', onWebContentsFinished) + webContents.once('destroyed', onWebContentsFinished) + + timeouts.set(id, setTimeout(onWebContentsFinished, WEB_CONTENTS_FINISHED_TIMEOUT)) + + function onWebContentsFinished() { + if (!pending.has(id)) { + return + } + pending.delete(id) + const timeout = timeouts.get(id) + if (timeout) { + clearTimeout(timeout) + timeouts.delete(id) + } + webContents.removeListener('did-finish-load', onWebContentsFinished) + webContents.removeListener('destroyed', onWebContentsFinished) + checkLoadingWebContents() + } + } + + function checkLoadingWebContents() { + if (pending.size === 0) { + notifyOnce() + } + } + + function notifyOnce() { + if (notified) { + return + } + notified = true + cleanup() + observable.notify() + } + + function cleanup() { + app.removeListener('web-contents-created', onWebContentsCreated) + if (readyTimeout) { + clearTimeout(readyTimeout) + readyTimeout = undefined + } + for (const t of timeouts.values()) { + clearTimeout(t) + } + timeouts.clear() + pending.clear() + } +} diff --git a/packages/electron/src/domain/rum/assembly.ts b/packages/electron/src/domain/rum/assembly.ts new file mode 100644 index 0000000000..938d92c2a2 --- /dev/null +++ b/packages/electron/src/domain/rum/assembly.ts @@ -0,0 +1,46 @@ +import type { Observable, Context, Batch } from '@datadog/browser-core' +import { HookNames, DISCARDED, combine } from '@datadog/browser-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Hooks } from '../../hooks' +import type { CollectedRumEvent } from './events' + +export function startRumEventAssembleAndSend( + onRumEventObservable: Observable, + rumBatch: Batch, + hooks: Hooks +) { + onRumEventObservable.subscribe(({ event, source }) => { + const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, { + eventType: event.type, + })! + + if (defaultRumEventAttributes === DISCARDED) { + return + } + const commonContext = + source === 'renderer' + ? { + session: { id: defaultRumEventAttributes.session!.id }, + application: { id: defaultRumEventAttributes.application!.id }, + } + : combine(defaultRumEventAttributes, { + // TODO source electron + source: 'browser' as const, + application: { id: defaultRumEventAttributes.application!.id }, + session: { + type: 'user' as const, + }, + _dd: { + format_version: 2 as const, + }, + }) + + const serverRumEvent = combine(commonContext, event) + + if (serverRumEvent.type === RumEventType.VIEW) { + rumBatch.upsert(serverRumEvent as unknown as Context, serverRumEvent.view.id) + } else { + rumBatch.add(serverRumEvent as unknown as Context) + } + }) +} diff --git a/packages/electron/src/domain/rum/convertSpans.ts b/packages/electron/src/domain/rum/convertSpans.ts new file mode 100644 index 0000000000..9e985d9889 --- /dev/null +++ b/packages/electron/src/domain/rum/convertSpans.ts @@ -0,0 +1,37 @@ +import type { Observable } from '@datadog/browser-core' +import { ResourceType, generateUUID } from '@datadog/browser-core' +import type { RumResourceEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Trace } from '../trace/trace' +import { createIdentifier } from '../trace/id' +import type { CollectedRumEvent } from './events' + +export function startConvertSpanToRumEvent( + onTraceObservable: Observable, + onRumEventObservable: Observable +) { + onTraceObservable.subscribe((trace) => { + trace.forEach((span) => { + if (span.name === 'http.request') { + const rumResource: Partial = { + type: RumEventType.RESOURCE, + date: span.start / 1e6, + resource: { + id: generateUUID(), + duration: span.duration, + type: ResourceType.NATIVE, + method: span.meta['http.method'], + status_code: span.meta['http.status'], + url: span.meta['http.url'], + }, + _dd: { + trace_id: createIdentifier(span.trace_id, 16).toString(10), + span_id: createIdentifier(span.span_id, 16).toString(10), + format_version: 2, + }, + } + onRumEventObservable.notify({ event: rumResource as RumResourceEvent, source: 'main-process' }) + } + }) + }) +} diff --git a/packages/electron/src/domain/rum/crashReporter.ts b/packages/electron/src/domain/rum/crashReporter.ts new file mode 100644 index 0000000000..f5fc333c2a --- /dev/null +++ b/packages/electron/src/domain/rum/crashReporter.ts @@ -0,0 +1,270 @@ +import * as fs from 'node:fs/promises' +import * as path from 'node:path' + +import type { Observable } from '@datadog/browser-core' +import { monitorError, monitor, ErrorHandling, generateUUID } from '@datadog/browser-core' +import type { RumEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import { app, crashReporter } from 'electron' +import { process_minidump_with_stackwalk } from '../../wasm/minidump' +import type { CollectedRumEvent } from './events' +import { NODE_VIEW_NAME } from './mainProcessTracking' + +/** + * Minidump parsed output structure + */ +interface MinidumpResult { + status: string + crash_info: { + type: string + address: string + crashing_thread: number + } + system_info: { + os: string + cpu: string + cpu_info: string + } + thread_count: number + threads: Array<{ + thread_index: number + frame_count: number + frames: Array<{ + module: string + function: string + instruction: string + module_offset: string + trust: string + }> + }> + crashing_thread?: { + thread_index: number + frames: Array<{ + module: string + function: string + instruction: string + module_offset: string + trust: string + }> + } + module_count: number + modules: Array<{ + base_address: string + code_file: string + code_identifier: string + debug_file: string + debug_identifier: string + version: string + }> +} + +interface CrashContext { + sessionId: string + viewId: string +} + +const CRASH_CONTEXT_FILE_NAME = '.dd_context' + +let pendingCrashReportsProcessed = false +const callbacks: Array<() => void> = [] + +/** + * Convert minidump parsed result to a RUM error event format + */ +function createCrashErrorEvent( + minidumpResult: MinidumpResult, + dumpFileName: string, + crashTime: number, + sessionId: string, + viewId: string +): RumEvent { + // Transform threads + const threads = minidumpResult.threads.map((thread, threadId) => { + const isCrashed = thread.thread_index === minidumpResult.crash_info.crashing_thread + const stack = thread.frames + .map((frame) => { + const moduleName = frame.module ? path.basename(frame.module) : '???' + + // find module and read the base address + const address = minidumpResult.modules.find((module) => module.code_file === frame.module)?.base_address + // offset from hex do decimal + const offset = parseInt(frame.module_offset, 16) + + return `${threadId} ${moduleName} ${frame.instruction} ${address} + ${offset}` + }) + .join('\n') + + return { + name: `Thread ${thread.thread_index}`, + crashed: isCrashed, + stack, + } + }) + + // Transform modules to binary_images + const binaryImages = minidumpResult.modules.map((module) => { + // Extract base address value (remove 0x prefix if present) + const loadAddress = module.base_address + + // Determine if it's a system library based on path + const isSystem = + module.code_file.includes('/System/Library/') || + module.code_file.includes('/usr/lib/') || + module.code_file.includes('\\Windows\\') || + module.code_file.includes('\\System32\\') + + return { + uuid: module.debug_identifier, + name: path.basename(module.code_file), + is_system: isSystem, + load_address: loadAddress, + max_address: undefined, // Not provided by minidump parser + arch: minidumpResult.system_info.cpu, + } + }) + + // Get the crashed thread for the main stack trace + const crashedThread = threads.find((t) => t.crashed) + + return { + date: crashTime, + error: { + binary_images: binaryImages, + category: 'Exception' as const, + handling: ErrorHandling.UNHANDLED, + id: generateUUID(), + is_crash: true, + message: `Application crashed (${dumpFileName})`, + meta: { + code_type: minidumpResult.system_info.cpu, + process: app.getName(), + exception_type: minidumpResult.crash_info.type, + path: undefined, // Could be extracted from modules + }, + source: 'source' as const, + source_type: 'electron' as 'browser', + stack: crashedThread?.stack, + threads, + type: minidumpResult.crash_info.type, + was_truncated: false, + }, + session: { id: sessionId, type: 'user' as const }, + type: RumEventType.ERROR, + view: { id: viewId, url: NODE_VIEW_NAME }, + } as unknown as RumEvent +} + +export function startCrashMonitoring( + onRumEventObservable: Observable, + onAppStable: Observable +) { + // Initialize crash reporter + crashReporter.start({ + uploadToServer: false, // We'll handle uploading via RUM + }) + + // TODO: + // - process files sequentially instead of in parallel to limit impact on resources + // - consider offloading that to a different thread + onAppStable.subscribe(() => { + void processCrashesFiles(onRumEventObservable).catch(monitorError) + }) +} + +async function processCrashesFiles(onRumEventObservable: Observable) { + const crashesDirectory = app.getPath('crashDumps') + + const crashContextPath = path.join(crashesDirectory, CRASH_CONTEXT_FILE_NAME) + + // Check if crash context file exists + try { + await fs.access(crashContextPath) + } catch { + console.warn('[Datadog] No crash context found') + // Stop reporting, we don't want to report incorrect data + pendingCrashReportsProcessed = true + callbacks.forEach((callback) => callback()) + return + } + + // Read crash context from previous session + const crashContext = await fs.readFile(crashContextPath, 'utf-8') + const crashContextData = JSON.parse(crashContext) as CrashContext + + // Check if there are any crash reports pending + const pendingCrashReports = await getFilesRecursive(crashesDirectory, '.dmp') + + if (pendingCrashReports.length === 0) { + console.log('[Datadog] No pending crash reports found') + } else { + console.log(`[Datadog] ${pendingCrashReports.length} pending crash reports found`) + } + + // Process crash reports in parallel + await Promise.all( + pendingCrashReports.map(async (reportPath) => { + const reportMetadata = await fs.stat(reportPath) + const reportBytes = await fs.readFile(reportPath) + + const resultJson = await process_minidump_with_stackwalk(reportBytes) + const minidumpResult: MinidumpResult = JSON.parse(resultJson) + + const crashTime = new Date(reportMetadata.ctime).getTime() + + const reportName = path.basename(reportPath) + const rumErrorEvent = createCrashErrorEvent( + minidumpResult, + reportName, + crashTime, + crashContextData.sessionId, + crashContextData.viewId + ) + + onRumEventObservable.notify({ + event: rumErrorEvent, + source: 'main-process', + }) + + // delete the crash report + await fs.unlink(reportPath) + console.log(`[Datadog] crash processed: ${reportName}`) + }) + ) + + pendingCrashReportsProcessed = true + callbacks.forEach((callback) => callback()) +} + +async function getFilesRecursive(dir: string, ext: string) { + let results: string[] = [] + + const entries = await fs.readdir(dir, { withFileTypes: true }) + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name) + + if (entry.isDirectory()) { + // Recurse into subdirectory + results = results.concat(await getFilesRecursive(fullPath, ext)) + } else if (entry.isFile() && entry.name.endsWith(ext)) { + // Match extension (example: ".txt") + results.push(fullPath) + } + } + + return results +} + +export const storeCrashContext = monitor(async (context: { sessionId: string; viewId: string }) => { + if (!pendingCrashReportsProcessed) { + callbacks.push(() => { + void storeCrashContext(context) + }) + return + } + + const crashesDirectory = app.getPath('crashDumps') + + const crashContextPath = path.join(crashesDirectory, CRASH_CONTEXT_FILE_NAME) + await fs.writeFile(crashContextPath, JSON.stringify(context, null, 2), 'utf-8') +}) diff --git a/packages/electron/src/domain/rum/errorCollection.ts b/packages/electron/src/domain/rum/errorCollection.ts new file mode 100644 index 0000000000..ae6a552e9f --- /dev/null +++ b/packages/electron/src/domain/rum/errorCollection.ts @@ -0,0 +1,94 @@ +import type { Observable, RawError } from '@datadog/browser-core' +import { + monitor, + NO_ERROR_STACK_PRESENT_MESSAGE, + computeRawError, + clocksNow, + NonErrorPrefix, + ErrorSource, + ErrorHandling, + computeStackTrace, + generateUUID, +} from '@datadog/browser-core' +import type { RumEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import { app } from 'electron' +import type { CollectedRumEvent } from './events' + +export function startErrorCollection(onRumEventObservable: Observable) { + process.on( + 'unhandledRejection', + monitor((reason) => { + const error = computeRawError({ + stackTrace: computeStackTrace(reason), + originalError: reason, + startClocks: clocksNow(), + nonErrorPrefix: NonErrorPrefix.UNCAUGHT, + source: ErrorSource.SOURCE, + handling: ErrorHandling.UNHANDLED, + }) + notifyRawError(error) + }) + ) + + process.on( + 'uncaughtException', + monitor((originalError) => { + const error = computeRawError({ + stackTrace: computeStackTrace(originalError), + originalError, + startClocks: clocksNow(), + nonErrorPrefix: NonErrorPrefix.UNCAUGHT, + source: ErrorSource.SOURCE, + handling: ErrorHandling.UNHANDLED, + }) + notifyRawError(error) + }) + ) + + app.on('browser-window-created', (_, window) => { + window.webContents.on( + 'render-process-gone', + monitor((_, details) => { + notifyRawError({ + stack: NO_ERROR_STACK_PRESENT_MESSAGE, + message: `render process ${details.reason}`, + handling: ErrorHandling.UNHANDLED, + source: ErrorSource.SOURCE, + startClocks: clocksNow(), + }) + }) + ) + }) + + app.on( + 'child-process-gone', + monitor((_, details) => { + notifyRawError({ + stack: NO_ERROR_STACK_PRESENT_MESSAGE, + message: `${details.name || details.serviceName} process ${details.reason}`, + handling: ErrorHandling.UNHANDLED, + source: ErrorSource.SOURCE, + startClocks: clocksNow(), + }) + }) + ) + + function notifyRawError(error: RawError) { + const rawRumEvent: Partial = { + date: error.startClocks.timeStamp, + error: { + id: generateUUID(), + message: error.message, + source: error.source, + stack: error.stack, + type: error.type, + handling: error.handling, + source_type: 'browser', + }, + type: RumEventType.ERROR, + context: error.context, + } + onRumEventObservable.notify({ event: rawRumEvent as RumEvent, source: 'main-process' }) + } +} diff --git a/packages/electron/src/domain/rum/events.ts b/packages/electron/src/domain/rum/events.ts new file mode 100644 index 0000000000..90779be74b --- /dev/null +++ b/packages/electron/src/domain/rum/events.ts @@ -0,0 +1,6 @@ +import type { RumEvent } from '@datadog/browser-rum-core' + +export interface CollectedRumEvent { + source: 'main-process' | 'renderer' + event: RumEvent +} diff --git a/packages/electron/src/domain/rum/mainProcessTracking.ts b/packages/electron/src/domain/rum/mainProcessTracking.ts new file mode 100644 index 0000000000..adc66266f7 --- /dev/null +++ b/packages/electron/src/domain/rum/mainProcessTracking.ts @@ -0,0 +1,123 @@ +import type { RumConfiguration, RumViewEvent } from '@datadog/browser-rum-core' +import { RumEventType } from '@datadog/browser-rum-core' +import type { Observable } from '@datadog/browser-core' +import { SKIPPED, HookNames, timeStampNow, combine, toServerDuration, elapsed } from '@datadog/browser-core' +import type { Hooks } from '../../hooks' +import type { SessionManager } from '../session/manager' +import type { CollectedRumEvent } from './events' + +export const NODE_VIEW_NAME = 'ApplicationLaunch' + +export function startMainProcessTracking( + hooks: Hooks, + configuration: RumConfiguration, + sessionManager: SessionManager, + mainProcessViewId: string, + onRumEventObservable: Observable, + onActivityObservable: Observable +) { + let currentSessionId = sessionManager.getSession()?.id + + // Subscribe to session changes to update session ID + sessionManager.stateObservable.subscribe(({ id: sessionId }) => { + currentSessionId = sessionId + }) + + const mainProcessContext = { + viewId: mainProcessViewId, + } + + hooks.register(HookNames.Assemble, ({ eventType, ...event }) => { + if ('session' in event) { + return SKIPPED + } + + return { + type: eventType, + application: { + id: configuration.applicationId, + }, + session: { + id: currentSessionId, + }, + view: { + id: mainProcessContext.viewId, + url: NODE_VIEW_NAME, + }, + service: configuration.service, + env: configuration.env, + version: configuration.version, + } + }) + hooks.register(HookNames.AssembleTelemetry, () => ({ + application: { + id: configuration.applicationId, + }, + session: { + id: sessionManager.getSession()?.id, + }, + })) + console.log({ sessionId: currentSessionId, viewId: mainProcessViewId }) + console.log( + '\x1b[34m%s\x1b[0m', + `https://app.datadoghq.com/rum/sessions?query=%40type%3Asession%20%40session.id%3A${currentSessionId}` + ) + console.log('\x1b[34m%s\x1b[0m', `https://app.datadoghq.com/apm/traces?query=%40_dd.session.id%3A${currentSessionId}`) + const applicationStart = timeStampNow() + let applicationLaunch = { + type: RumEventType.VIEW, + date: applicationStart as number, + view: { + id: mainProcessContext.viewId, + is_active: true, + name: NODE_VIEW_NAME, + time_spent: 0, + // TODO update counters + action: { + count: 0, + }, + resource: { + count: 0, + }, + error: { + count: 0, + }, + }, + _dd: { + document_version: 0, + }, + } as RumViewEvent + + onRumEventObservable.subscribe(({ event, source }) => { + if (source === 'renderer') { + return + } + switch (event.type) { + case RumEventType.RESOURCE: + ;(applicationLaunch.view.resource.count as any) += 1 + updateView() + break + case RumEventType.ERROR: + ;(applicationLaunch.view.error.count as any) += 1 + updateView() + break + } + }) + + updateView() + onActivityObservable.subscribe(updateView) + + function updateView() { + applicationLaunch = combine(applicationLaunch, { + view: { + time_spent: toServerDuration(elapsed(applicationStart, timeStampNow())), + }, + _dd: { + document_version: applicationLaunch._dd.document_version + 1, + }, + }) + onRumEventObservable.notify({ event: applicationLaunch, source: 'main-process' }) + } + // TODO session expiration / renewal + // TODO useragent +} diff --git a/packages/electron/src/domain/session/manager.ts b/packages/electron/src/domain/session/manager.ts new file mode 100644 index 0000000000..c18e4b69cd --- /dev/null +++ b/packages/electron/src/domain/session/manager.ts @@ -0,0 +1,140 @@ +import * as fs from 'node:fs' +import * as path from 'node:path' +import { app } from 'electron' +import type { TimeStamp } from '@datadog/browser-core' +import { Observable, generateUUID, timeStampNow, SESSION_TIME_OUT_DELAY } from '@datadog/browser-core' + +interface State { + id: string + createdAt: TimeStamp + lastActivityAt: TimeStamp +} + +interface PersistedState extends State { + anonymousId: string +} + +const SESSION_FILE_NAME = '.dd_s' + +// eslint-disable-next-line no-restricted-syntax +export class SessionManager { + public stateObservable = new Observable() + public expireObservable = new Observable() + + private readonly filePath: string + private readonly anonymousId: string + + private state: State + + constructor(onActivityObservable: Observable) { + // Set up file path for persistence + const userDataPath = app.getPath('userData') + this.filePath = path.join(userDataPath, SESSION_FILE_NAME) + + // Load persisted data or initialize new session + const fromState: PersistedState = this.loadPersistedData() ?? { + anonymousId: generateUUID(), + id: '', + lastActivityAt: 0 as TimeStamp, + createdAt: 0 as TimeStamp, + } + + this.anonymousId = fromState.anonymousId + this.state = { + id: fromState.id, + createdAt: fromState.createdAt, + lastActivityAt: fromState.lastActivityAt, + } + this.expandOrRenewSession() + + // Subscribe to activity events to extend session + onActivityObservable.subscribe(() => { + this.expandOrRenewSession() + }) + } + + public getSession(): PersistedState { + return { + anonymousId: this.anonymousId, + id: this.state.id, + createdAt: this.state.createdAt, + lastActivityAt: this.state.lastActivityAt, + } + } + + private expandOrRenewSession(): void { + const now = timeStampNow() + + const timeSinceLastActivity = now - this.state.lastActivityAt + const timeSinceCreation = now - this.state.createdAt + + const shouldRenew = timeSinceLastActivity >= 1 * 60 * 1000 || timeSinceCreation >= SESSION_TIME_OUT_DELAY + + if (shouldRenew) { + this.renewSession() + } else { + this.expandSession() + } + } + + /** + * Expand session by updating last activity time + */ + private expandSession(): void { + this.state.lastActivityAt = timeStampNow() + this.persistState() + this.stateObservable.notify(this.getSession()) + } + + /** + * Renew session by generating a new session ID + */ + private renewSession(): void { + const now = timeStampNow() + + this.state = { + id: generateUUID(), + createdAt: now, + lastActivityAt: now, + } + + // Persist new state + this.persistState() + this.expireObservable.notify() + } + + /** + * Load persisted session data from disk + */ + private loadPersistedData(): PersistedState | undefined { + try { + if (!fs.existsSync(this.filePath)) { + return undefined + } + + const fileContent = fs.readFileSync(this.filePath, 'utf-8') + return JSON.parse(fileContent) as PersistedState + } catch { + return undefined + } + } + + /** + * Persist current session state to disk (async, non-blocking) + */ + private persistState(): void { + const data: PersistedState = { + anonymousId: this.anonymousId, + id: this.state.id, + createdAt: this.state.createdAt, + lastActivityAt: this.state.lastActivityAt, + } + + const fileContent = JSON.stringify(data, null, 2) + try { + fs.writeFileSync(this.filePath, fileContent, 'utf-8') + } catch { + // send telemetry + } + } +} diff --git a/packages/electron/src/domain/telemetry/telemetry.ts b/packages/electron/src/domain/telemetry/telemetry.ts new file mode 100644 index 0000000000..b898412422 --- /dev/null +++ b/packages/electron/src/domain/telemetry/telemetry.ts @@ -0,0 +1,12 @@ +import type { Batch, Configuration, AbstractHooks, TelemetryEvent, Context } from '@datadog/browser-core' +import { startTelemetryCollection, Observable, TelemetryService } from '@datadog/browser-core' + +export function startTelemetry(batch: Batch, configuration: Configuration, hooks: AbstractHooks) { + const observable = new Observable() + + observable.subscribe((event) => { + batch.add(event) + }) + + startTelemetryCollection(TelemetryService.ELECTRON, configuration, hooks, observable) +} diff --git a/packages/electron/src/domain/trace/id.ts b/packages/electron/src/domain/trace/id.ts new file mode 100644 index 0000000000..b68574b41b --- /dev/null +++ b/packages/electron/src/domain/trace/id.ts @@ -0,0 +1,198 @@ +// Duplicated from https://github.com/DataDog/dd-trace-js/blob/f40cdf96/packages/dd-trace/src/id.js + +'use strict' + +import crypto from 'node:crypto' + +const UINT_MAX = 4_294_967_296 + +const data = new Uint8Array(8 * 8192) +const zeroId = new Uint8Array(8) + +const map = Array.prototype.map +const pad = (byte: number) => `${byte < 16 ? '0' : ''}${byte.toString(16)}` + +let batch = 0 + +// Internal representation of a trace or span ID. +// eslint-disable-next-line no-restricted-syntax +class Identifier { + _buffer: any[] | Uint8Array + + constructor(value: string, radix = 16) { + this._buffer = radix === 16 ? createBuffer(value) : fromString(value, radix) + } + + toString(radix = 16) { + return radix === 16 ? toHexString(this._buffer) : toNumberString(this._buffer, radix) + } + + toBigInt() { + return Buffer.from(this._buffer).readBigUInt64BE(0) + } + + toBuffer() { + return this._buffer + } + + toArray() { + if (this._buffer.length === 8) { + return this._buffer + } + return this._buffer.slice(-8) + } + + toJSON() { + return this.toString() + } + + equals(other: Identifier) { + const length = this._buffer.length + const otherLength = other._buffer.length + + // Only compare the bytes available in both IDs. + for (let i = length, j = otherLength; i >= 0 && j >= 0; i--, j--) { + if (this._buffer[i] !== other._buffer[j]) { + return false + } + } + + return true + } +} + +// Create a buffer, using an optional hexadecimal value if provided. +function createBuffer(value: string) { + if (value === '0') { + return zeroId + } + if (!value) { + return pseudoRandom() + } + + const size = Math.ceil(value.length / 16) * 16 + const bytes = size / 2 + const buffer = [] + + value = value.padStart(size, '0') + + for (let i = 0; i < bytes; i++) { + buffer[i] = Number.parseInt(value.slice(i * 2, i * 2 + 2), 16) + } + + return buffer +} + +// Convert a numerical string to a buffer using the specified radix. +function fromString(str: string, raddix: number) { + const buffer = new Array(8) + const len = str.length + + let pos = 0 + let high = 0 + let low = 0 + + if (str[0] === '-') { + pos++ + } + + const sign = pos + + while (pos < len) { + const chr = Number.parseInt(str[pos++], raddix) + + if (!(chr >= 0)) { + break + } // NaN + + low = low * raddix + chr + high = high * raddix + Math.floor(low / UINT_MAX) + low %= UINT_MAX + } + + if (sign) { + // eslint-disable-next-line no-bitwise + high = ~high + + if (low) { + low = UINT_MAX - low + } else { + high++ + } + } + + writeUInt32BE(buffer, high, 0) + writeUInt32BE(buffer, low, 4) + + return buffer +} + +// Convert a buffer to a numerical string. +function toNumberString(buffer: any, radix: number) { + let high = readInt32(buffer, buffer.length - 8) + let low = readInt32(buffer, buffer.length - 4) + let str = '' + + radix = radix || 10 + + while (1) { + const mod = (high % radix) * UINT_MAX + low + + high = Math.floor(high / radix) + low = Math.floor(mod / radix) + str = (mod % radix).toString(radix) + str + + if (!high && !low) { + break + } + } + + return str +} + +// Convert a buffer to a hexadecimal string. +function toHexString(buffer: any) { + return map.call(buffer, pad).join('') +} + +// Simple pseudo-random 64-bit ID generator. +function pseudoRandom() { + if (batch === 0) { + crypto.randomFillSync(data) + } + + batch = (batch + 1) % 8192 + + const offset = batch * 8 + + return [ + data[offset] & 0x7f, // only positive int64, + data[offset + 1], + data[offset + 2], + data[offset + 3], + data[offset + 4], + data[offset + 5], + data[offset + 6], + data[offset + 7], + ] +} + +// Read a buffer to unsigned integer bytes. +function readInt32(buffer: any, offset: any) { + return buffer[offset + 0] * 16_777_216 + (buffer[offset + 1] << 16) + (buffer[offset + 2] << 8) + buffer[offset + 3] +} + +// Write unsigned integer bytes to a buffer. +function writeUInt32BE(buffer: any, value: any, offset: any) { + buffer[3 + offset] = value & 255 + value >>= 8 + buffer[2 + offset] = value & 255 + value >>= 8 + buffer[1 + offset] = value & 255 + value >>= 8 + buffer[0 + offset] = value & 255 +} + +export function createIdentifier(value: any, radix: number) { + return new Identifier(value, radix) +} diff --git a/packages/electron/src/domain/trace/trace.ts b/packages/electron/src/domain/trace/trace.ts new file mode 100644 index 0000000000..490ac59bc8 --- /dev/null +++ b/packages/electron/src/domain/trace/trace.ts @@ -0,0 +1,20 @@ +import type { ClocksState, ServerDuration } from '@datadog/browser-core' + +export interface DatadogCarrier { + __dd_carrier: true + 'x-datadog-origin': string + 'x-datadog-parent-id': string + 'x-datadog-sampling-priority': string + 'x-datadog-trace-id': string +} + +export interface SpanInfo { + spanId: string + traceId: string + startClocks: ClocksState + duration: ServerDuration + name: string +} + +export type Span = any +export type Trace = Span[] diff --git a/packages/electron/src/domain/trace/traceAgent.ts b/packages/electron/src/domain/trace/traceAgent.ts new file mode 100644 index 0000000000..337033a984 --- /dev/null +++ b/packages/electron/src/domain/trace/traceAgent.ts @@ -0,0 +1,108 @@ +import { createServer } from 'node:http' +import type { Observable } from '@datadog/browser-core' +import { monitor, HookNames, DISCARDED } from '@datadog/browser-core' +import { decode } from '@msgpack/msgpack' +import type { Hooks } from '../../hooks' +import type { Trace } from './trace' +import tracer from './tracer' +import { createIdentifier } from './id' + +export function createDdTraceAgent(onTraceObservable: Observable, hooks: Hooks) { + const server = createServer() + + server.on( + 'request', + monitor((req, res) => { + // Collect binary data chunks + const chunks: Buffer[] = [] + + req.on( + 'data', + monitor((chunk: Buffer) => { + chunks.push(chunk) + }) + ) + + req.on( + 'end', + monitor(() => { + const buffer = Buffer.concat(chunks) + + const decoded = decode(buffer) as Array< + Array<{ name: string; type: string; meta: { [key: string]: unknown }; [key: string]: unknown }> + > + + const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, { + eventType: 'span' as any, + })! + + if (defaultRumEventAttributes === DISCARDED) { + return + } + + for (const trace of decoded) { + const filteredTrace = trace + .filter((span) => !isSdkRequest(span)) + .map((span) => ({ + // rewrite ids + ...span, + trace_id: createIdentifier(`${span.trace_id as number}`, 10).toString(16), + span_id: createIdentifier(`${span.span_id as number}`, 10).toString(16), + parent_id: createIdentifier(`${span.parent_id as number}`, 10).toString(16), + meta: { + ...span.meta, + '_dd.application.id': defaultRumEventAttributes.application!.id, + '_dd.session.id': defaultRumEventAttributes.session!.id, + '_dd.view.id': defaultRumEventAttributes.view!.id, + }, + })) + + if (filteredTrace.length > 0) { + onTraceObservable.notify(filteredTrace) + } + } + }) + ) + + // Respond with the agent API format that dd-trace expects + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end( + JSON.stringify({ + rate_by_service: { + 'service:dd-trace,env:prod': 1, + }, + }) + ) + }) + ) + + server.listen( + 0, + monitor(() => { + const addressInfo = server.address() + if (!addressInfo) { + throw new Error('Failed to get server address') + } + + if (typeof addressInfo === 'string') { + throw new Error(`Address is a string: ${addressInfo}`) + } + + const { port } = addressInfo + const url = `http://127.0.0.1:${port}` + + // console.log('agents url', url) + tracer.setUrl(url) + }) + ) +} + +function isSdkRequest(span: any) { + const spanRequestUrl = span.meta['http.url'] as string | undefined + return ( + (spanRequestUrl && + (spanRequestUrl.startsWith('http://127.0.0.1') || + spanRequestUrl.startsWith('https://browser-intake-datadoghq.com/'))) || + (span.resource as string).startsWith('browser-intake-datadoghq.com') + ) +} diff --git a/packages/electron/src/domain/trace/tracer.ts b/packages/electron/src/domain/trace/tracer.ts new file mode 100644 index 0000000000..ec3351a75d --- /dev/null +++ b/packages/electron/src/domain/trace/tracer.ts @@ -0,0 +1,11 @@ +import tracer from 'dd-trace' + +export function initTracer(service: string, env: string, version: string) { + tracer.init({ + service, + env, + version, + }) +} +// initialized in a different file to avoid hoisting. +export default tracer // eslint-disable-line import/no-default-export diff --git a/packages/electron/src/entries/main.ts b/packages/electron/src/entries/main.ts new file mode 100644 index 0000000000..0f218c6761 --- /dev/null +++ b/packages/electron/src/entries/main.ts @@ -0,0 +1,211 @@ +import crypto from 'node:crypto' +import type { RumConfiguration, RumInitConfiguration } from '@datadog/browser-rum-core' +import { createHooks, validateAndBuildRumConfiguration } from '@datadog/browser-rum-core' +import type { LogsEvent } from '@datadog/browser-logs' +import type { + PageMayExitEvent, + AbstractHooks, + RawError, + Encoder, + InitConfiguration, + TrackType, +} from '@datadog/browser-core' +import { + RECOMMENDED_REQUEST_BYTES_LIMIT, + monitor, + createBatch, + createHttpRequest, + createFlushController, + createEndpointBuilder, + buildGlobalContextManager, + Observable, + createIdentityEncoder, + HookNames, + setInterval, +} from '@datadog/browser-core' +import tracer, { initTracer } from '../domain/trace/tracer' +import { monitorIpcMain } from '../domain/main/ipcMain' +import type { CollectedRumEvent } from '../domain/rum/events' +import { setupMainBridge } from '../domain/main/bridge' +import { startActivityTracking } from '../domain/rum/activity' +import { startRumEventAssembleAndSend } from '../domain/rum/assembly' +import { startMainProcessTracking } from '../domain/rum/mainProcessTracking' +import { startConvertSpanToRumEvent } from '../domain/rum/convertSpans' +import { startCrashMonitoring, storeCrashContext } from '../domain/rum/crashReporter' +import type { Trace } from '../domain/trace/trace' +import { createDdTraceAgent } from '../domain/trace/traceAgent' +import { startLogsEventAssembleAndSend } from '../domain/logs/assembly' +import { startTelemetry } from '../domain/telemetry/telemetry' +import { startErrorCollection } from '../domain/rum/errorCollection' +import { getUserAgent } from '../tools/userAgent' +import { SessionManager } from '../domain/session/manager' +import { startAppStabilityTracking } from '../domain/rum/appStability' + +export const ddElectron = makeDatadogElectron() +export { tracer } +export { monitorIpcMain } + +function makeDatadogElectron() { + const globalContext = buildGlobalContextManager() + + function startElectronRumBatch( + configuration: RumConfiguration, + reportError: (error: RawError) => void, + pageMayExitObservable: Observable, + sessionExpireObservable: Observable, + createEncoder: () => Encoder + ) { + return createBatch({ + encoder: createEncoder(), + request: createHttpRequest( + [configuration.rumEndpointBuilder], + reportError, + RECOMMENDED_REQUEST_BYTES_LIMIT, + getUserAgent() + ), + flushController: createFlushController({ + pageMayExitObservable, + sessionExpireObservable, + }), + }) + } + + function startElectronLogsBatch( + configuration: RumConfiguration, + reportError: (error: RawError) => void, + pageMayExitObservable: Observable, + sessionExpireObservable: Observable, + createEncoder: () => Encoder + ) { + return createBatch({ + encoder: createEncoder(), + request: createHttpRequest( + [configuration.logsEndpointBuilder], + reportError, + RECOMMENDED_REQUEST_BYTES_LIMIT, + getUserAgent() + ), + flushController: createFlushController({ + pageMayExitObservable, + sessionExpireObservable, + }), + }) + } + + // TODO change it by a single event fetch + function startElectronSpanBatch( + initConfiguration: InitConfiguration, + reportError: (error: RawError) => void, + pageMayExitObservable: Observable, + sessionExpireObservable: Observable, + createEncoder: () => Encoder + ) { + return createBatch({ + encoder: createEncoder(), + request: createHttpRequest( + [createEndpointBuilder(initConfiguration, 'spans' as TrackType)], + reportError, + RECOMMENDED_REQUEST_BYTES_LIMIT, + getUserAgent() + ), + flushController: createFlushController({ + pageMayExitObservable, + sessionExpireObservable, + }), + }) + } + + function reportError() { + console.error('Error reporting to Datadog') + } + + return { + init(initConfiguration: RumInitConfiguration) { + console.log('init from SDK Electron') + + const configuration = validateAndBuildRumConfiguration(initConfiguration) + + if (!configuration) { + return + } + + const pageMayExitObservable = new Observable() + const onRumEventObservable = new Observable() + const onLogsEventObservable = new Observable() + const onTraceObservable = new Observable() + const hooks = createHooks() + const mainProcessViewId = crypto.randomUUID() + + ;(hooks as AbstractHooks).register(HookNames.Assemble, () => { + const context = globalContext.getContext() + return { context } + }) + + // Initialize activity tracking first (needed by session manager) + const onActivityObservable = startActivityTracking(onRumEventObservable) + + // Initialize session manager + const sessionManager = new SessionManager(onActivityObservable) + const sessionExpireObservable = sessionManager.expireObservable + sessionManager.stateObservable.subscribe((state) => { + void storeCrashContext({ sessionId: state.id, viewId: mainProcessViewId }) + }) + + const rumBatch = startElectronRumBatch( + configuration, + reportError, + pageMayExitObservable, + sessionExpireObservable, + createIdentityEncoder + ) + startRumEventAssembleAndSend(onRumEventObservable, rumBatch, hooks) + startTelemetry(rumBatch, configuration, hooks) + + const logsBatch = startElectronLogsBatch( + configuration, + reportError, + pageMayExitObservable, + sessionExpireObservable, + createIdentityEncoder + ) + startLogsEventAssembleAndSend(onLogsEventObservable, logsBatch, hooks) + + const spanBatch = startElectronSpanBatch( + initConfiguration, + reportError, + pageMayExitObservable, + sessionExpireObservable, + createIdentityEncoder + ) + onTraceObservable.subscribe((trace) => { + spanBatch.add({ env: 'prod', spans: trace }) + }) + + const onAppStable = startAppStabilityTracking() + startMainProcessTracking( + hooks, + configuration, + sessionManager, + mainProcessViewId, + onRumEventObservable, + onActivityObservable + ) + startErrorCollection(onRumEventObservable) + startConvertSpanToRumEvent(onTraceObservable, onRumEventObservable) + setupMainBridge(onRumEventObservable, onLogsEventObservable) + startCrashMonitoring(onRumEventObservable, onAppStable) + + initTracer(configuration.service!, configuration.env!, configuration.version!) + createDdTraceAgent(onTraceObservable, hooks) + + setInterval(() => { + pageMayExitObservable.notify({ reason: 'page_hide' }) + }, 1000) + }, + setGlobalContext: monitor(globalContext.setContext.bind(globalContext)), + getGlobalContext: monitor(globalContext.getContext.bind(globalContext)), + setGlobalContextProperty: monitor(globalContext.setContextProperty.bind(globalContext)), + removeGlobalContextProperty: monitor(globalContext.removeContextProperty.bind(globalContext)), + clearGlobalContext: monitor(globalContext.clearContext.bind(globalContext)), + } +} diff --git a/packages/electron/src/entries/preload.ts b/packages/electron/src/entries/preload.ts new file mode 100644 index 0000000000..c511284e3e --- /dev/null +++ b/packages/electron/src/entries/preload.ts @@ -0,0 +1,2 @@ +export { monitorIpcRenderer } from '../domain/preload/ipcRenderer' +export { setupRendererBridge } from '../domain/preload/bridge' diff --git a/packages/electron/src/entries/renderer.ts b/packages/electron/src/entries/renderer.ts new file mode 100644 index 0000000000..ff9724bb1a --- /dev/null +++ b/packages/electron/src/entries/renderer.ts @@ -0,0 +1,2 @@ +export type * from './renderer' +export { electronPlugin } from '../domain/renderer/plugin' diff --git a/packages/electron/src/hooks.ts b/packages/electron/src/hooks.ts new file mode 100644 index 0000000000..50d635ee6e --- /dev/null +++ b/packages/electron/src/hooks.ts @@ -0,0 +1,28 @@ +import type { + DISCARDED, + HookNamesAsConst, + RecursivePartial, + RelativeTime, + SKIPPED, + TelemetryEvent, +} from '@datadog/browser-core' +import { abstractHooks } from '@datadog/browser-core' +import type { RumEvent } from '@datadog/browser-rum-core' + +// Define a partial RUM event type. +// Ensuring the `type` field is always present improves type checking, especially in conditional logic in hooks (e.g., `if (eventType === 'view')`). +export type DefaultRumEventAttributes = RecursivePartial & { type: RumEvent['type'] } +export type DefaultTelemetryEventAttributes = RecursivePartial + +export interface HookCallbackMap { + [HookNamesAsConst.ASSEMBLE]: (param: { + eventType: RumEvent['type'] + }) => DefaultRumEventAttributes | SKIPPED | DISCARDED + [HookNamesAsConst.ASSEMBLE_TELEMETRY]: (param: { + startTime: RelativeTime + }) => DefaultTelemetryEventAttributes | SKIPPED | DISCARDED +} + +export type Hooks = ReturnType + +export const createHooks = abstractHooks diff --git a/packages/electron/src/tools/userAgent.ts b/packages/electron/src/tools/userAgent.ts new file mode 100644 index 0000000000..905b6fc257 --- /dev/null +++ b/packages/electron/src/tools/userAgent.ts @@ -0,0 +1,53 @@ +import os from 'os' +import { app } from 'electron' + +export function getUserAgent() { + return [ + `${app.getName()}/${app.getVersion()}`, + `(${getOSUserAgentPart()})`, + `Electron/${process.versions.electron}`, + `Chrome/${process.versions.chrome}`, + `Node/${process.versions.node}`, + ].join(' ') +} + +// totally vibe coded +function getOSUserAgentPart() { + const platform = os.platform() // 'darwin' | 'win32' | 'linux' + const arch = os.arch() // 'x64', 'arm64', etc. + + if (platform === 'darwin') { + // macOS version is kernel-style (e.g. '23.5.0') + // Convert to marketing version (e.g. macOS 14.x.x) + const version = os.release() // Darwin kernel version + const darwinMajor = parseInt(version.split('.')[0], 10) + + // Darwin→macOS mapping: Darwin 23 → macOS 14, 22 → 13, 21 → 12, 20 → 11 + const macOSMajor = darwinMajor - 9 + + // Browser uses underscore-separated + const macOSVersionUA = `${macOSMajor}_0_0` + + return `Macintosh; Intel Mac OS X ${macOSVersionUA}` + } + + if (platform === 'win32') { + // Map kernels to Windows versions + // Windows 10 → NT 10.0 + // Windows 11 → NT 10.0 (yes, same NT version!) + const ntVersion = '10.0' + + const archUA = arch === 'x64' || arch === 'arm64' ? 'Win64; x64' : arch + return `Windows NT ${ntVersion}; ${archUA}` + } + + // Generic Linux + if (platform === 'linux') { + const archUA = arch === 'x64' ? 'x86_64' : arch === 'arm64' ? 'aarch64' : arch + + return `X11; Linux ${archUA}` + } + + // fallback + return `${platform}; ${arch}` +} diff --git a/packages/electron/src/wasm/minidump.d.ts b/packages/electron/src/wasm/minidump.d.ts new file mode 100644 index 0000000000..12b26fce8c --- /dev/null +++ b/packages/electron/src/wasm/minidump.d.ts @@ -0,0 +1,53 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Initialize panic hook for better error messages in WASM + */ +export function init(): void; +/** + * Parse a minidump from raw bytes and return basic information as JSON + * + * # Arguments + * * `dump_bytes` - The minidump file as a byte array + * + * # Returns + * A JSON string containing basic minidump information (system info, exception, threads, modules) + * + * # Example (JavaScript) + * ```js + * const fs = require('fs'); + * const { parse_minidump } = require('./minidump_wasm'); + * + * const dumpBytes = fs.readFileSync('crash.dmp'); + * const result = parse_minidump(dumpBytes); + * const json = JSON.parse(result); + * console.log('OS:', json.system_info.os); + * console.log('Crash reason:', json.exception.crash_reason); + * ``` + */ +export function parse_minidump(dump_bytes: Uint8Array): string; +/** + * Process a minidump with full stack walking (returns a Promise) + * + * # Arguments + * * `dump_bytes` - The minidump file as a byte array + * + * # Returns + * A Promise that resolves to a JSON string containing full crash analysis with stack traces + * + * # Example (JavaScript) + * ```js + * const fs = require('fs'); + * const { process_minidump_with_stackwalk } = require('./minidump_wasm'); + * + * const dumpBytes = fs.readFileSync('crash.dmp'); + * const result = await process_minidump_with_stackwalk(dumpBytes); + * const json = JSON.parse(result); + * + * // Access crashing thread's stack trace + * json.crashing_thread.frames.forEach((frame, i) => { + * console.log(`Frame ${i}: ${frame.module || '?'} + ${frame.offset}`); + * }); + * ``` + */ +export function process_minidump_with_stackwalk(dump_bytes: Uint8Array): Promise; diff --git a/packages/electron/src/wasm/minidump.js b/packages/electron/src/wasm/minidump.js new file mode 100644 index 0000000000..a05c33fff3 --- /dev/null +++ b/packages/electron/src/wasm/minidump.js @@ -0,0 +1,407 @@ +let imports = {} +imports['__wbindgen_placeholder__'] = module.exports + +let cachedUint8ArrayMemory0 = null + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer) + } + return cachedUint8ArrayMemory0 +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) + +cachedTextDecoder.decode() + +function decodeText(ptr, len) { + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)) +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0 + return decodeText(ptr, len) +} + +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc() + wasm.__wbindgen_externrefs.set(idx, obj) + return idx +} + +function handleError(f, args) { + try { + return f.apply(this, args) + } catch (e) { + const idx = addToExternrefTable0(e) + wasm.__wbindgen_exn_store(idx) + } +} + +let WASM_VECTOR_LEN = 0 + +const cachedTextEncoder = new TextEncoder() + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg) + view.set(buf) + return { + read: arg.length, + written: buf.length, + } + } +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg) + const ptr = malloc(buf.length, 1) >>> 0 + getUint8ArrayMemory0() + .subarray(ptr, ptr + buf.length) + .set(buf) + WASM_VECTOR_LEN = buf.length + return ptr + } + + let len = arg.length + let ptr = malloc(len, 1) >>> 0 + + const mem = getUint8ArrayMemory0() + + let offset = 0 + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset) + if (code > 0x7f) { + break + } + mem[ptr + offset] = code + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset) + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0 + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len) + const ret = cachedTextEncoder.encodeInto(arg, view) + + offset += ret.written + ptr = realloc(ptr, len, offset, 1) >>> 0 + } + + WASM_VECTOR_LEN = offset + return ptr +} + +let cachedDataViewMemory0 = null + +function getDataViewMemory0() { + if ( + cachedDataViewMemory0 === null || + cachedDataViewMemory0.buffer.detached === true || + (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer) + ) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer) + } + return cachedDataViewMemory0 +} + +function isLikeNone(x) { + return x === undefined || x === null +} + +const CLOSURE_DTORS = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((state) => state.dtor(state.a, state.b)) + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor } + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++ + const a = state.a + state.a = 0 + try { + return f(a, state.b, ...args) + } finally { + state.a = a + real._wbg_cb_unref() + } + } + real._wbg_cb_unref = () => { + if (--state.cnt === 0) { + state.dtor(state.a, state.b) + state.a = 0 + CLOSURE_DTORS.unregister(state) + } + } + CLOSURE_DTORS.register(real, state, state) + return real +} +/** + * Initialize panic hook for better error messages in WASM + */ +exports.init = function () { + wasm.init() +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0 + getUint8ArrayMemory0().set(arg, ptr / 1) + WASM_VECTOR_LEN = arg.length + return ptr +} + +function takeFromExternrefTable0(idx) { + const value = wasm.__wbindgen_externrefs.get(idx) + wasm.__externref_table_dealloc(idx) + return value +} +/** + * Parse a minidump from raw bytes and return basic information as JSON + * + * # Arguments + * * `dump_bytes` - The minidump file as a byte array + * + * # Returns + * A JSON string containing basic minidump information (system info, exception, threads, modules) + * + * # Example (JavaScript) + * ```js + * const fs = require('fs'); + * const { parse_minidump } = require('./minidump'); + * + * const dumpBytes = fs.readFileSync('crash.dmp'); + * const result = parse_minidump(dumpBytes); + * const json = JSON.parse(result); + * console.log('OS:', json.system_info.os); + * console.log('Crash reason:', json.exception.crash_reason); + * ``` + * + * @param {Uint8Array} dump_bytes + * @returns {string} + */ +exports.parse_minidump = function (dump_bytes) { + let deferred3_0 + let deferred3_1 + try { + const ptr0 = passArray8ToWasm0(dump_bytes, wasm.__wbindgen_malloc) + const len0 = WASM_VECTOR_LEN + const ret = wasm.parse_minidump(ptr0, len0) + var ptr2 = ret[0] + var len2 = ret[1] + if (ret[3]) { + ptr2 = 0 + len2 = 0 + throw takeFromExternrefTable0(ret[2]) + } + deferred3_0 = ptr2 + deferred3_1 = len2 + return getStringFromWasm0(ptr2, len2) + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1) + } +} + +/** + * Process a minidump with full stack walking (returns a Promise) + * + * # Arguments + * * `dump_bytes` - The minidump file as a byte array + * + * # Returns + * A Promise that resolves to a JSON string containing full crash analysis with stack traces + * + * # Example (JavaScript) + * ```js + * const fs = require('fs'); + * const { process_minidump_with_stackwalk } = require('./minidump'); + * + * const dumpBytes = fs.readFileSync('crash.dmp'); + * const result = await process_minidump_with_stackwalk(dumpBytes); + * const json = JSON.parse(result); + * + * // Access crashing thread's stack trace + * json.crashing_thread.frames.forEach((frame, i) => { + * console.log(`Frame ${i}: ${frame.module || '?'} + ${frame.offset}`); + * }); + * ``` + * + * @param {Uint8Array} dump_bytes + * @returns {Promise} + */ +exports.process_minidump_with_stackwalk = function (dump_bytes) { + const ptr0 = passArray8ToWasm0(dump_bytes, wasm.__wbindgen_malloc) + const len0 = WASM_VECTOR_LEN + const ret = wasm.process_minidump_with_stackwalk(ptr0, len0) + return ret +} + +function wasm_bindgen__convert__closures_____invoke__hbd2252a5ae7d61cd(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__hbd2252a5ae7d61cd(arg0, arg1, arg2) +} + +function wasm_bindgen__convert__closures_____invoke__h2fe7d57d144c8924(arg0, arg1, arg2, arg3) { + wasm.wasm_bindgen__convert__closures_____invoke__h2fe7d57d144c8924(arg0, arg1, arg2, arg3) +} + +exports.__wbg___wbindgen_is_function_ee8a6c5833c90377 = function (arg0) { + const ret = typeof arg0 === 'function' + return ret +} + +exports.__wbg___wbindgen_is_undefined_2d472862bd29a478 = function (arg0) { + const ret = arg0 === undefined + return ret +} + +exports.__wbg___wbindgen_throw_b855445ff6a94295 = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)) +} + +exports.__wbg__wbg_cb_unref_2454a539ea5790d9 = function (arg0) { + arg0._wbg_cb_unref() +} + +exports.__wbg_call_525440f72fbfc0ea = function () { + return handleError(function (arg0, arg1, arg2) { + const ret = arg0.call(arg1, arg2) + return ret + }, arguments) +} + +exports.__wbg_call_e762c39fa8ea36bf = function () { + return handleError(function (arg0, arg1) { + const ret = arg0.call(arg1) + return ret + }, arguments) +} + +exports.__wbg_error_7534b8e9a36f1ab4 = function (arg0, arg1) { + let deferred0_0 + let deferred0_1 + try { + deferred0_0 = arg0 + deferred0_1 = arg1 + console.error(getStringFromWasm0(arg0, arg1)) + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1) + } +} + +exports.__wbg_new_3c3d849046688a66 = function (arg0, arg1) { + try { + var state0 = { a: arg0, b: arg1 } + var cb0 = (arg0, arg1) => { + const a = state0.a + state0.a = 0 + try { + return wasm_bindgen__convert__closures_____invoke__h2fe7d57d144c8924(a, state0.b, arg0, arg1) + } finally { + state0.a = a + } + } + const ret = new Promise(cb0) + return ret + } finally { + state0.a = state0.b = 0 + } +} + +exports.__wbg_new_8a6f238a6ece86ea = function () { + const ret = new Error() + return ret +} + +exports.__wbg_new_no_args_ee98eee5275000a4 = function (arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)) + return ret +} + +exports.__wbg_queueMicrotask_34d692c25c47d05b = function (arg0) { + const ret = arg0.queueMicrotask + return ret +} + +exports.__wbg_queueMicrotask_9d76cacb20c84d58 = function (arg0) { + queueMicrotask(arg0) +} + +exports.__wbg_resolve_caf97c30b83f7053 = function (arg0) { + const ret = Promise.resolve(arg0) + return ret +} + +exports.__wbg_stack_0ed75d68575b0f3c = function (arg0, arg1) { + const ret = arg1.stack + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) + const len1 = WASM_VECTOR_LEN + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true) + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true) +} + +exports.__wbg_static_accessor_GLOBAL_89e1d9ac6a1b250e = function () { + const ret = typeof global === 'undefined' ? null : global + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret) +} + +exports.__wbg_static_accessor_GLOBAL_THIS_8b530f326a9e48ac = function () { + const ret = typeof globalThis === 'undefined' ? null : globalThis + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret) +} + +exports.__wbg_static_accessor_SELF_6fdf4b64710cc91b = function () { + const ret = typeof self === 'undefined' ? null : self + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret) +} + +exports.__wbg_static_accessor_WINDOW_b45bfc5a37f6cfa2 = function () { + const ret = typeof window === 'undefined' ? null : window + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret) +} + +exports.__wbg_then_4f46f6544e6b4a28 = function (arg0, arg1) { + const ret = arg0.then(arg1) + return ret +} + +exports.__wbindgen_cast_2241b6af4c4b2941 = function (arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1) + return ret +} + +exports.__wbindgen_cast_29d5b4f96fd1dba2 = function (arg0, arg1) { + // Cast intrinsic for `Closure(Closure { dtor_idx: 399, function: Function { arguments: [Externref], shim_idx: 400, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure( + arg0, + arg1, + wasm.wasm_bindgen__closure__destroy__h75e0120a17cf8b85, + wasm_bindgen__convert__closures_____invoke__hbd2252a5ae7d61cd + ) + return ret +} + +exports.__wbindgen_init_externref_table = function () { + const table = wasm.__wbindgen_externrefs + const offset = table.grow(4) + table.set(0, undefined) + table.set(offset + 0, undefined) + table.set(offset + 1, null) + table.set(offset + 2, true) + table.set(offset + 3, false) +} + +// Load WASM from base64-encoded string embedded in the code +const { MINIDUMP_WASM_BASE64 } = require('./minidump_bg.wasm.base64') +// Decode base64 to binary +const wasmBytes = Buffer.from(MINIDUMP_WASM_BASE64, 'base64') +const wasmModule = new WebAssembly.Module(wasmBytes) +const wasm = (exports.__wasm = new WebAssembly.Instance(wasmModule, imports).exports) + +wasm.__wbindgen_start() diff --git a/packages/electron/src/wasm/minidump_bg.wasm b/packages/electron/src/wasm/minidump_bg.wasm new file mode 100644 index 0000000000..23ea94b8ad Binary files /dev/null and b/packages/electron/src/wasm/minidump_bg.wasm differ diff --git a/packages/electron/src/wasm/minidump_bg.wasm.d.ts b/packages/electron/src/wasm/minidump_bg.wasm.d.ts new file mode 100644 index 0000000000..8bcb6b97b4 --- /dev/null +++ b/packages/electron/src/wasm/minidump_bg.wasm.d.ts @@ -0,0 +1,17 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const parse_minidump: (a: number, b: number) => [number, number, number, number]; +export const process_minidump_with_stackwalk: (a: number, b: number) => any; +export const init: () => void; +export const wasm_bindgen__convert__closures_____invoke__hbd2252a5ae7d61cd: (a: number, b: number, c: any) => void; +export const wasm_bindgen__closure__destroy__h75e0120a17cf8b85: (a: number, b: number) => void; +export const wasm_bindgen__convert__closures_____invoke__h2fe7d57d144c8924: (a: number, b: number, c: any, d: any) => void; +export const __wbindgen_exn_store: (a: number) => void; +export const __externref_table_alloc: () => number; +export const __wbindgen_externrefs: WebAssembly.Table; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __externref_table_dealloc: (a: number) => void; +export const __wbindgen_start: () => void; diff --git a/packages/electron/typedoc.json b/packages/electron/typedoc.json new file mode 100644 index 0000000000..002b26a53c --- /dev/null +++ b/packages/electron/typedoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["src/entries/main.ts"] +} diff --git a/packages/flagging/package.json b/packages/flagging/package.json index 3bcfba8f64..523f64e9fe 100644 --- a/packages/flagging/package.json +++ b/packages/flagging/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-flagging.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-flagging.js" }, diff --git a/packages/logs/package.json b/packages/logs/package.json index 5fa4497263..8be49c1895 100644 --- a/packages/logs/package.json +++ b/packages/logs/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-logs.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-logs.js" }, diff --git a/packages/rum-core/package.json b/packages/rum-core/package.json index 960ed8b8bf..e062fd3848 100644 --- a/packages/rum-core/package.json +++ b/packages/rum-core/package.json @@ -6,6 +6,7 @@ "module": "esm/index.js", "types": "cjs/index.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules" }, "dependencies": { diff --git a/packages/rum-core/src/domain/tracing/identifier.ts b/packages/rum-core/src/domain/tracing/identifier.ts index e506016631..cc3e8b7d0a 100644 --- a/packages/rum-core/src/domain/tracing/identifier.ts +++ b/packages/rum-core/src/domain/tracing/identifier.ts @@ -1,4 +1,4 @@ -interface BaseIdentifier { +export interface BaseIdentifier { toString(radix?: number): string } diff --git a/packages/rum-core/src/index.ts b/packages/rum-core/src/index.ts index c00a6b0ff2..b30e908aa0 100644 --- a/packages/rum-core/src/index.ts +++ b/packages/rum-core/src/index.ts @@ -23,7 +23,7 @@ export type { RumEventDomainContext, RumVitalEventDomainContext, } from './domainContext.types' -export type { ReplayStats, RawRumActionEvent, RawRumEvent } from './rawRumEvent.types' +export type { ReplayStats, RawRumActionEvent, RawRumEvent, RawRumResourceEvent } from './rawRumEvent.types' export { ActionType, RumEventType, FrustrationType } from './rawRumEvent.types' export { startRum } from './boot/startRum' export type { RawRumEventCollectedData } from './domain/lifeCycle' @@ -48,6 +48,7 @@ export type { FeatureFlagsForEvents, RemoteConfiguration, } from './domain/configuration' +export { validateAndBuildRumConfiguration } from './domain/configuration' export { DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE } from './domain/action/actionNameConstants' export { STABLE_ATTRIBUTES } from './domain/getSelectorFromElement' export * from './browser/htmlDomUtils' @@ -71,5 +72,7 @@ export type { Hooks, DefaultRumEventAttributes, DefaultTelemetryEventAttributes export { createHooks } from './domain/hooks' export { isSampled } from './domain/sampler/sampler' export type { TracingOption, PropagatorType } from './domain/tracing/tracer.types' +export type { BaseIdentifier, TraceIdentifier, SpanIdentifier } from './domain/tracing/identifier' +export { createTraceIdentifier, createSpanIdentifier } from './domain/tracing/identifier' export type { TransportPayload } from './transport/formDataTransport' export { createFormDataTransport } from './transport/formDataTransport' diff --git a/packages/rum-react/package.json b/packages/rum-react/package.json index e7d66a0875..cc1264f9e2 100644 --- a/packages/rum-react/package.json +++ b/packages/rum-react/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules", "prepack": "npm run build" }, diff --git a/packages/rum-slim/package.json b/packages/rum-slim/package.json index db20e6fae3..e371d22816 100644 --- a/packages/rum-slim/package.json +++ b/packages/rum-slim/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-rum-slim.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-rum-slim.js" }, diff --git a/packages/rum/package.json b/packages/rum/package.json index aa4d12b4a8..84f84d3f79 100644 --- a/packages/rum/package.json +++ b/packages/rum/package.json @@ -6,6 +6,7 @@ "module": "esm/entries/main.js", "types": "cjs/entries/main.d.ts", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --modules --bundle datadog-rum.js", "build:bundle": "node ../../scripts/build/build-package.ts --bundle datadog-rum.js" }, diff --git a/packages/worker/package.json b/packages/worker/package.json index e4b1bff308..ade59a87c6 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -4,6 +4,7 @@ "license": "Apache-2.0", "main": "bundle/worker.js", "scripts": { + "pack": "yarn pack", "build": "node ../../scripts/build/build-package.ts --bundle worker.js", "build:bundle": "yarn build" }, diff --git a/scripts/build/build-package.ts b/scripts/build/build-package.ts index 35de4985c5..7ad32a1940 100644 --- a/scripts/build/build-package.ts +++ b/scripts/build/build-package.ts @@ -2,6 +2,8 @@ import fs from 'node:fs/promises' import { parseArgs } from 'node:util' import path from 'node:path' import { globSync } from 'node:fs' +import { existsSync } from 'node:fs' +import { execSync } from 'node:child_process' import ts from 'typescript' import webpack from 'webpack' import webpackBase from '../../webpack.base.ts' @@ -26,6 +28,9 @@ runMain(async () => { }, }) + // Generate WASM base64 file if this is the electron package + await generateWasmBase64IfNeeded({ verbose: values.verbose }) + if (values.modules) { printLog('Building modules...') await buildModules({ @@ -51,6 +56,26 @@ runMain(async () => { printLog('Done.') }) +async function generateWasmBase64IfNeeded({ verbose }: { verbose: boolean }) { + // Check if this is the electron package by looking for the WASM generation script + const wasmGeneratorScript = './scripts/generate-wasm-base64.js' + + if (existsSync(wasmGeneratorScript)) { + printLog('Generating WASM base64...') + try { + execSync(`node ${wasmGeneratorScript}`, { + stdio: verbose ? 'inherit' : 'pipe', + encoding: 'utf-8' + }) + if (verbose) { + printLog('WASM base64 generation completed') + } + } catch (error) { + throw new Error(`Failed to generate WASM base64: ${error}`) + } + } +} + async function buildBundle({ filename, verbose }: { filename: string; verbose: boolean }) { await fs.rm('./bundle', { recursive: true, force: true }) return new Promise((resolve, reject) => { diff --git a/scripts/build/build-test-apps.ts b/scripts/build/build-test-apps.ts index 376d95d934..885cd84b28 100644 --- a/scripts/build/build-test-apps.ts +++ b/scripts/build/build-test-apps.ts @@ -18,6 +18,7 @@ runMain(async () => { buildApp('test/apps/react-router-v6-app') buildApp('test/apps/react-heavy-spa') buildApp('test/apps/react-shopist-like') + buildApp('test/apps/electron') await buildReactRouterv7App() await buildExtensions() diff --git a/scripts/lib/buildEnv.ts b/scripts/lib/buildEnv.ts index 4dfb5a15e5..d12600945d 100644 --- a/scripts/lib/buildEnv.ts +++ b/scripts/lib/buildEnv.ts @@ -51,7 +51,11 @@ const buildEnvFactories: BuildEnvFactories = { // Make sure the worker is built // TODO: Improve overall built time by rebuilding the worker only if its sources have changed? // TODO: Improve developer experience during tests by detecting worker source changes? - command`yarn build`.withCurrentWorkingDirectory(workerPath).run() + command`yarn build` + .withCurrentWorkingDirectory(workerPath) + // shell needed in windows to execute yarn in spawnSync + .withShell() + .run() return readFileSync(path.join(workerPath, 'bundle/worker.js'), { encoding: 'utf-8', }) diff --git a/scripts/lib/command.ts b/scripts/lib/command.ts index d6fc817d8b..86baf44b92 100644 --- a/scripts/lib/command.ts +++ b/scripts/lib/command.ts @@ -4,6 +4,7 @@ import { printError } from './executionUtils.ts' interface CommandOptions { cwd?: string stdio?: 'inherit' | 'pipe' + shell?: true } interface CommandBuilder { @@ -11,6 +12,7 @@ interface CommandBuilder { withEnvironment(newEnv: Record): CommandBuilder withCurrentWorkingDirectory(newCurrentWorkingDirectory: string): CommandBuilder withLogs(): CommandBuilder + withShell(): CommandBuilder run(): string } @@ -51,6 +53,11 @@ export function command(...templateArguments: [TemplateStringsArray, ...any[]]): return this }, + withShell() { + extraOptions.shell = true + return this + }, + withLogs() { extraOptions.stdio = 'inherit' return this diff --git a/scripts/lib/computeBundleSize.ts b/scripts/lib/computeBundleSize.ts index 407bbb8939..f0efa8c0a5 100644 --- a/scripts/lib/computeBundleSize.ts +++ b/scripts/lib/computeBundleSize.ts @@ -2,7 +2,7 @@ import path from 'node:path' import fs from 'node:fs' import zlib from 'node:zlib' -const packages = ['rum', 'logs', 'flagging', 'rum-slim', 'worker'] as const +const packages = ['rum', 'logs', 'flagging', 'rum-slim', 'worker', 'electron'] as const interface BundleSize { uncompressed: number diff --git a/test/apps/electron/.gitignore b/test/apps/electron/.gitignore new file mode 100644 index 0000000000..37cfcf3632 --- /dev/null +++ b/test/apps/electron/.gitignore @@ -0,0 +1,3 @@ +.yarn/* +node_modules +dist \ No newline at end of file diff --git a/test/apps/electron/README.md b/test/apps/electron/README.md new file mode 100644 index 0000000000..7309e8b448 --- /dev/null +++ b/test/apps/electron/README.md @@ -0,0 +1,3 @@ +# electron + +Sample electron app for e2e tests diff --git a/test/apps/electron/package.json b/test/apps/electron/package.json new file mode 100644 index 0000000000..df78b9cb7b --- /dev/null +++ b/test/apps/electron/package.json @@ -0,0 +1,24 @@ +{ + "name": "electron", + "version": "0.0.0", + "private": true, + "main": "src/main.ts", + "scripts": { + "start": "electron ./dist/main.js", + "build": "webpack --config webpack.main.js && webpack --config webpack.renderer.js" + }, + "devDependencies": { + "electron": "39.2.3", + "html-webpack-plugin": "5.6.5", + "ts-loader": "9.5.4", + "webpack": "5.103.0", + "webpack-cli": "6.0.1" + }, + "dependencies": { + "@datadog/electron": "file:../../../packages/electron/package.tgz" + }, + "resolutions": { + "@datadog/browser-rum-core": "file:../../../packages/rum-core/package.tgz", + "@datadog/browser-core": "file:../../../packages/core/package.tgz" + } +} diff --git a/test/apps/electron/public/index.html b/test/apps/electron/public/index.html new file mode 100644 index 0000000000..5e4aac3471 --- /dev/null +++ b/test/apps/electron/public/index.html @@ -0,0 +1,10 @@ + + + + + Sample Electron App + + +

Electron sample app

+ + diff --git a/test/apps/electron/src/main.ts b/test/apps/electron/src/main.ts new file mode 100644 index 0000000000..4a035cb6be --- /dev/null +++ b/test/apps/electron/src/main.ts @@ -0,0 +1,37 @@ +import { app, BrowserWindow } from 'electron' +import { ddElectron } from '@datadog/electron/main' + +// Delay startup to not miss early logs in playwright +setTimeout(startApp, 200) + +function startApp() { + ddElectron.init(retrieveRumConfiguration()) + + app.whenReady().then(() => { + createWindow() + }) + + app.on('window-all-closed', () => { + app.quit() + }) +} + +function createWindow() { + const win = new BrowserWindow({ + width: 800, + height: 600, + }) + + win.loadFile('index.html') +} + +function retrieveRumConfiguration(): any { + const namespace = 'RUM_' + const rumConfiguration = {} + Object.entries(process.env) + .filter(([key]) => key.startsWith(namespace)) + .forEach(([key, value]) => { + rumConfiguration[key.replace(namespace, '')] = Number.isNaN(Number(value)) ? value : Number(value) + }) + return rumConfiguration +} diff --git a/test/apps/electron/src/renderer.ts b/test/apps/electron/src/renderer.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/apps/electron/webpack.main.js b/test/apps/electron/webpack.main.js new file mode 100644 index 0000000000..97d13d9aa6 --- /dev/null +++ b/test/apps/electron/webpack.main.js @@ -0,0 +1,22 @@ +const path = require('path') + +module.exports = { + mode: 'development', + target: 'electron-main', + entry: './src/main.ts', + output: { + filename: 'main.js', + path: path.resolve(__dirname, 'dist'), + }, + resolve: { + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: 'ts-loader', + }, + ], + }, +} diff --git a/test/apps/electron/webpack.renderer.js b/test/apps/electron/webpack.renderer.js new file mode 100644 index 0000000000..1dc723ed7d --- /dev/null +++ b/test/apps/electron/webpack.renderer.js @@ -0,0 +1,28 @@ +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + mode: 'development', + target: 'electron-renderer', + entry: './src/renderer.ts', + output: { + filename: 'renderer.js', + path: path.resolve(__dirname, 'dist'), + }, + resolve: { + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: 'ts-loader', + }, + ], + }, + plugins: [ + new HtmlWebpackPlugin({ + template: 'public/index.html', + }), + ], +} diff --git a/test/apps/electron/yarn.lock b/test/apps/electron/yarn.lock new file mode 100644 index 0000000000..049747e264 --- /dev/null +++ b/test/apps/electron/yarn.lock @@ -0,0 +1,3502 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@datadog/browser-core@file:../../../packages/core/package.tgz::locator=electron%40workspace%3A.": + version: 6.24.0 + resolution: "@datadog/browser-core@file:../../../packages/core/package.tgz#../../../packages/core/package.tgz::hash=580731&locator=electron%40workspace%3A." + checksum: 10c0/b51788104ecf8d7df3f8b5ba7ead4bb69f2fb1281004a8c9afcb0bc034bf07a715b99b5d345a2045401fba370258248f78d3d6ff949895c232d7a24f8f533b48 + languageName: node + linkType: hard + +"@datadog/browser-rum-core@file:../../../packages/rum-core/package.tgz::locator=electron%40workspace%3A.": + version: 6.24.0 + resolution: "@datadog/browser-rum-core@file:../../../packages/rum-core/package.tgz#../../../packages/rum-core/package.tgz::hash=9f99a4&locator=electron%40workspace%3A." + dependencies: + "@datadog/browser-core": "npm:6.24.0" + checksum: 10c0/15da4a2dc2a686c1befb4dde7b48e8578be2a037b38a0dd33163c7dcbdfc91e0eab4817171389b9ef2cd6f608b21da495bb0754adf6452b8c147ab4500ba446e + languageName: node + linkType: hard + +"@datadog/electron@file:../../../packages/electron/package.tgz::locator=electron%40workspace%3A.": + version: 6.23.0 + resolution: "@datadog/electron@file:../../../packages/electron/package.tgz#../../../packages/electron/package.tgz::hash=526e80&locator=electron%40workspace%3A." + dependencies: + "@datadog/browser-core": "npm:6.24.0" + "@datadog/browser-rum-core": "npm:6.24.0" + "@msgpack/msgpack": "npm:3.1.2" + "@openfeature/core": "npm:1.9.1" + dd-trace: "npm:^5.76.0" + graphql: "npm:16.12.0" + peerDependencies: + "@datadog/browser-logs": 6.24.0 + electron: 39 + peerDependenciesMeta: + "@datadog/browser-logs": + optional: true + checksum: 10c0/8580cd9c38d5059894d827eb9fb6a0bb521bdff370cfb67a68f30791c143bd92ce5750f71c86e007dd3424ebd2530a65d8695b2d367f7aa9f043f986f24a8f2a + languageName: node + linkType: hard + +"@datadog/flagging-core@npm:0.2.0": + version: 0.2.0 + resolution: "@datadog/flagging-core@npm:0.2.0" + dependencies: + spark-md5: "npm:^3.0.2" + peerDependencies: + "@openfeature/core": ^1.8.1 + checksum: 10c0/e3a837bdb6186a0a0a22a692afc6289d8527b43f6fc9fe87c152d99a79ba546c1574d48fb84fe9cf05067c7a911844aa6708eddf60213eb5e1f029c0f9881e20 + languageName: node + linkType: hard + +"@datadog/libdatadog@npm:0.7.0": + version: 0.7.0 + resolution: "@datadog/libdatadog@npm:0.7.0" + checksum: 10c0/04ca10b1f3a393e3a6356c80ca257c79c9ebca98923b88fd55d11e732f3721b4fd6fba134737b19d56da1b579c8633824364c724303f33106db461ad7f61c669 + languageName: node + linkType: hard + +"@datadog/native-appsec@npm:10.3.0": + version: 10.3.0 + resolution: "@datadog/native-appsec@npm:10.3.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/a1c5eac27d566148c58559e1e3d481efb0bf336b14a2e2a4bcdef6d7137b3fd6401781deac0271b5aa71634796af3f6ffcc1608609268355d4632c6f99dc338f + languageName: node + linkType: hard + +"@datadog/native-iast-taint-tracking@npm:4.0.0": + version: 4.0.0 + resolution: "@datadog/native-iast-taint-tracking@npm:4.0.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/72a18959a9eccfeff4b791ff9929a384df84385596232685a65ca9a0225306f376e85bd44540e98467d8058e54bc776b3fd52ed029c04eebb9ef7d3ae73c5df7 + languageName: node + linkType: hard + +"@datadog/native-metrics@npm:3.1.1": + version: 3.1.1 + resolution: "@datadog/native-metrics@npm:3.1.1" + dependencies: + node-addon-api: "npm:^6.1.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/05757cd34fca5f129130dba95be32012a9693ac59e7517145560d71275dd9b7592aad60e8f0d1d805b99d74ea834d8ae1e5db00b0de75bc6faba84419cb35393 + languageName: node + linkType: hard + +"@datadog/openfeature-node-server@npm:^0.2.0": + version: 0.2.0 + resolution: "@datadog/openfeature-node-server@npm:0.2.0" + dependencies: + "@datadog/flagging-core": "npm:0.2.0" + "@openfeature/server-sdk": "npm:~1.18.0" + peerDependencies: + "@openfeature/server-sdk": ~1.18.0 + checksum: 10c0/9465f7b109bd39604cd62bfa184d6ea0fc4b526de566b010f2f0e6ebeac4d50773486b66a0adca340377538b30bb6fe875085acfce87c56f2ee1d7d431f413c1 + languageName: node + linkType: hard + +"@datadog/pprof@npm:5.12.0": + version: 5.12.0 + resolution: "@datadog/pprof@npm:5.12.0" + dependencies: + delay: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:<4.0" + p-limit: "npm:^3.1.0" + pprof-format: "npm:^2.2.1" + source-map: "npm:^0.7.4" + checksum: 10c0/e18e9e941fbd7ba6de52f3e8d92d7b4612ab054b302d2b2581932be41d1f4bb03d27b753ab9242364b897ba2773c105b1badb2d760db4b1fe633e1b8c23c1013 + languageName: node + linkType: hard + +"@datadog/sketches-js@npm:2.1.1": + version: 2.1.1 + resolution: "@datadog/sketches-js@npm:2.1.1" + checksum: 10c0/4b930240202e4e94ac49fc95298a7111202492566f76672e0ec43425a1710a0e3650a20f858a6358509ab08363d39fce5db210c88d94b4225f96b3bfe645cc5c + languageName: node + linkType: hard + +"@datadog/wasm-js-rewriter@npm:5.0.1": + version: 5.0.1 + resolution: "@datadog/wasm-js-rewriter@npm:5.0.1" + dependencies: + js-yaml: "npm:^4.1.0" + lru-cache: "npm:^7.14.0" + module-details-from-path: "npm:^1.0.3" + node-gyp-build: "npm:^4.5.0" + checksum: 10c0/e5f665f53b8d292efe85ac401f56923112860cfd14c5d84097ad22e1b86c8a30f3cd39cc92e1ec6e8f5f9de5fef028af46554752d8ae2d0f80b7c3a44827f0db + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.6.1": + version: 0.6.3 + resolution: "@discoveryjs/json-ext@npm:0.6.3" + checksum: 10c0/778a9f9d5c3696da3c1f9fa4186613db95a1090abbfb6c2601430645c0d0158cd5e4ba4f32c05904e2dd2747d57710f6aab22bd2f8aa3c4e8feab9b247c65d85 + languageName: node + linkType: hard + +"@electron/get@npm:^2.0.0": + version: 2.0.3 + resolution: "@electron/get@npm:2.0.3" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e + languageName: node + linkType: hard + +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": "npm:^4.0.1" + checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@isaacs/ttlcache@npm:^2.0.1": + version: 2.1.2 + resolution: "@isaacs/ttlcache@npm:2.1.2" + checksum: 10c0/91875a1b2b3be915333e69b890fd92b766bfece3c5080cfafa57df883910fe34d54a270f57bec05df72df4c356a4be2841f65b522a9d217a0b219c78aaae8aa5 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/50a4fdafe0b8f655cb2877e59fe81320272eaa4ccdbe6b9b87f10614b2220399ae3e05c16137a59db1f189523b42c7f88bd097ee991dbd7bc0e01113c583e844 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 + languageName: node + linkType: hard + +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.3.0 + resolution: "@jsep-plugin/assignment@npm:1.3.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/d749554dc691798116eb068eebe2d9bcb0b0d89ef6c7cc7c2a9f37d03da15fdbf8053407e97008090cd1bd6f256ea6c26abbada7399cf79f0b6b502e164b084b + languageName: node + linkType: hard + +"@jsep-plugin/regex@npm:^1.0.4": + version: 1.0.4 + resolution: "@jsep-plugin/regex@npm:1.0.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/bec7eb7ea6ab453a2672edc808644c5be3dc06b2a9d77182e18cd595b37deba6dcdb3760849d8684afc5779a86b7d2604dd525cb612a548f9ed9f31a8032ec24 + languageName: node + linkType: hard + +"@msgpack/msgpack@npm:3.1.2": + version: 3.1.2 + resolution: "@msgpack/msgpack@npm:3.1.2" + checksum: 10c0/4fee6dbea70a485d3a787ac76dd43687f489d662f22919237db1f2abbc3c88070c1d3ad78417ce6e764bcd041051680284654021f52068e0aff82d570cb942d5 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^11.2.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@openfeature/core@npm:1.9.1": + version: 1.9.1 + resolution: "@openfeature/core@npm:1.9.1" + checksum: 10c0/983c651484621e6e5a3b4bf83fce5398a1adc2ace6162ff5a13a8eaf6d285b7c6b15f5c0a477ece9010ca88b28799985d810047ea0c18324d7a51ac4d04e18d6 + languageName: node + linkType: hard + +"@openfeature/server-sdk@npm:~1.18.0": + version: 1.18.0 + resolution: "@openfeature/server-sdk@npm:1.18.0" + peerDependencies: + "@openfeature/core": ^1.7.0 + checksum: 10c0/5c3aa8fee5ec4ad9ec40ee74094fe0377b28cadfcc6f71414fa1762035cb994891184cc491a59dbaade71afe0139cd39c193e3897b05df8fa21f0e7b84b67c53 + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:<1.0.0": + version: 0.208.0 + resolution: "@opentelemetry/api-logs@npm:0.208.0" + dependencies: + "@opentelemetry/api": "npm:^1.3.0" + checksum: 10c0/dc1fbee6219df4166509f43b74ea936bb18b6d594565b0bcf56b654a1c958b50d6046b8739dc36c98149fe890c02150ff3814e963f5ea439a07ff3c562555b99 + languageName: node + linkType: hard + +"@opentelemetry/api@npm:>=1.0.0 <1.10.0, @opentelemetry/api@npm:^1.3.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.30.1, @opentelemetry/core@npm:>=1.14.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/core@npm:1.30.1" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/4c25ba50a6137c2ba9ca563fb269378f3c9ca6fd1b3f15dbb6eff78eebf5656f281997cbb7be8e51c01649fd6ad091083fcd8a42dd9b5dfac907dc06d7cfa092 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:>=1.0.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/resources@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/688e73258283c80662bfa9a858aaf73bf3b832a18d96e546d0dddfa6dcec556cdfa087a1d0df643435293406009e4122d7fb7eeea69aa87b539d3bab756fba74 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.28.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 10c0/deb8a0f744198071e70fea27143cf7c9f7ecb7e4d7b619488c917834ea09b31543c1c2bcea4ec5f3cf68797f0ef3549609c14e859013d9376400ac1499c2b9cb + languageName: node + linkType: hard + +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard + +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=13.7.0": + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 + languageName: node + linkType: hard + +"@types/node@npm:^22.7.7": + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f + languageName: node + linkType: hard + +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^3.0.1": + version: 3.0.1 + resolution: "@webpack-cli/configtest@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + checksum: 10c0/edd24ecfc429298fe86446f7d7daedfe82d72e7f6236c81420605484fdadade5d59c6bcef3d76bd724e11d9727f74e75de183223ae62d3a568b2d54199688cbe + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^3.0.1": + version: 3.0.1 + resolution: "@webpack-cli/info@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + checksum: 10c0/b23b94e7dc8c93e79248f20d5f1bd0fbb7b9ba4b012803e2fdc5440b8f2ee1f3eca7f4933bbca346c8168673bf572b1858169a3cb2c17d9b8bcd833d480c2170 + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^3.0.1": + version: 3.0.1 + resolution: "@webpack-cli/serve@npm:3.0.1" + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 10c0/65245e45bfa35e11a5b30631b99cfed0c1b39b2cc8320fa2d2a4185264535618827d349ec032c58af4201d6236cbc43bec894fcb840fdd06314611537a80e210 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 + languageName: node + linkType: hard + +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" + peerDependencies: + acorn: ^8 + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d + languageName: node + linkType: hard + +"acorn-import-phases@npm:^1.0.3": + version: 1.0.4 + resolution: "acorn-import-phases@npm:1.0.4" + peerDependencies: + acorn: ^8.14.0 + checksum: 10c0/338eb46fc1aed5544f628344cb9af189450b401d152ceadbf1f5746901a5d923016cd0e7740d5606062d374fdf6941c29bb515d2bd133c4f4242d5d4cd73a3c7 + languageName: node + linkType: hard + +"acorn@npm:^8.14.0, acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"baseline-browser-mapping@npm:^2.8.25": + version: 2.8.30 + resolution: "baseline-browser-mapping@npm:2.8.30" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10c0/724e2a71dc18af1555953278544d60d3677ad1413d19b4c68f0b1d16cb075186035125cad38d93c1ccc2df8dc8520e6d47452b76b265898ad7ac480630f12cae + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"boolean@npm:^3.0.1": + version: 3.2.0 + resolution: "boolean@npm:3.2.0" + checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.26.3": + version: 4.28.0 + resolution: "browserslist@npm:4.28.0" + dependencies: + baseline-browser-mapping: "npm:^2.8.25" + caniuse-lite: "npm:^1.0.30001754" + electron-to-chromium: "npm:^1.5.249" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.1.4" + bin: + browserslist: cli.js + checksum: 10c0/4284fd568f7d40a496963083860d488cb2a89fb055b6affd316bebc59441fec938e090b3e62c0ee065eb0bc88cd1bc145f4300a16c75f3f565621c5823715ae1 + languageName: node + linkType: hard + +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"cacache@npm:^20.0.1": + version: 20.0.2 + resolution: "cacache@npm:20.0.2" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^11.0.3" + lru-cache: "npm:^11.1.0" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^13.0.0" + unique-filename: "npm:^4.0.0" + checksum: 10c0/11db56f35167f66661e63901427a198775ecf431583c7bfef1dd2fcb970ac826d7cec725ba39b7f389bf8fd3d8ea3290b22c14630e875df913d36e35cdd99df6 + languageName: node + linkType: hard + +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001754": + version: 1.0.30001756 + resolution: "caniuse-lite@npm:1.0.30001756" + checksum: 10c0/863df07bd8d5139371ce7d4e582f03fef38141726282dcd532421bbd95ea298c7f953a8e1a9790db89ca1816bd8ce3cce638a66361b769dd1f2dc8d4c721d546 + languageName: node + linkType: hard + +"chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.2.2": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be + languageName: node + linkType: hard + +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + kind-of: "npm:^6.0.2" + shallow-clone: "npm:^3.0.0" + checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 + languageName: node + linkType: hard + +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"crypto-randomuuid@npm:^1.0.0": + version: 1.0.0 + resolution: "crypto-randomuuid@npm:1.0.0" + checksum: 10c0/6c8f7513f3b0c38b876b5011d91e21c284f7a695d27b6ef25a2a1ca89c362af23e321bf47953069b9fe56bc384de7880a13c390a4663ac5dcf525a1b4f937a1f + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.0.1" + domhandler: "npm:^4.3.1" + domutils: "npm:^2.8.0" + nth-check: "npm:^2.0.1" + checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 + languageName: node + linkType: hard + +"css-what@npm:^6.0.1": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10c0/91e24c26fb977b4ccef30d7007d2668c1c10ac0154cc3f42f7304410e9594fb772aea4f30c832d2993b132ca8d99338050866476210316345ec2e7d47b248a56 + languageName: node + linkType: hard + +"dc-polyfill@npm:^0.1.10": + version: 0.1.10 + resolution: "dc-polyfill@npm:0.1.10" + checksum: 10c0/b4a847b5883fb3bc1173d48b98d2aa554af12b427b13d3f5fbd31a4d4cbfc733d8134e261e442ac890df3606f97e5440b603ff72d0c9cd62ac2e5f3cbc52aa6d + languageName: node + linkType: hard + +"dd-trace@npm:^5.76.0": + version: 5.80.0 + resolution: "dd-trace@npm:5.80.0" + dependencies: + "@datadog/libdatadog": "npm:0.7.0" + "@datadog/native-appsec": "npm:10.3.0" + "@datadog/native-iast-taint-tracking": "npm:4.0.0" + "@datadog/native-metrics": "npm:3.1.1" + "@datadog/openfeature-node-server": "npm:^0.2.0" + "@datadog/pprof": "npm:5.12.0" + "@datadog/sketches-js": "npm:2.1.1" + "@datadog/wasm-js-rewriter": "npm:5.0.1" + "@isaacs/ttlcache": "npm:^2.0.1" + "@opentelemetry/api": "npm:>=1.0.0 <1.10.0" + "@opentelemetry/api-logs": "npm:<1.0.0" + "@opentelemetry/core": "npm:>=1.14.0 <1.31.0" + "@opentelemetry/resources": "npm:>=1.0.0 <1.31.0" + crypto-randomuuid: "npm:^1.0.0" + dc-polyfill: "npm:^0.1.10" + escape-string-regexp: "npm:^5.0.0" + ignore: "npm:^7.0.5" + import-in-the-middle: "npm:^1.14.2" + istanbul-lib-coverage: "npm:^3.2.2" + jest-docblock: "npm:^29.7.0" + jsonpath-plus: "npm:^10.3.0" + limiter: "npm:^1.1.5" + lodash.sortby: "npm:^4.7.0" + lru-cache: "npm:^10.4.3" + module-details-from-path: "npm:^1.0.4" + mutexify: "npm:^1.4.0" + opentracing: "npm:>=0.14.7" + path-to-regexp: "npm:^0.1.12" + pprof-format: "npm:^2.1.1" + protobufjs: "npm:^7.5.3" + retry: "npm:^0.13.1" + rfdc: "npm:^1.4.1" + semifies: "npm:^1.0.0" + shell-quote: "npm:^1.8.2" + source-map: "npm:^0.7.4" + tlhunter-sorted-set: "npm:^0.1.0" + ttl-set: "npm:^1.0.0" + checksum: 10c0/94220c45d27a5a4bb8cee571385181fb32b973eacbf5149098e55d7f8e53e7bfb8114e73502e2c97e148b6753eb8eb6da7f75aa2a308d2ca17ab94a3af429e52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 10c0/01cdc4cd0cd35fb622518a3df848e67e09763a38e7cdada2232b6fda9ddda72eddcf74f0e24211200fbe718434f2335f2a2633875a6c96037fefa6de42896ad7 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b + languageName: node + linkType: hard + +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.249": + version: 1.5.259 + resolution: "electron-to-chromium@npm:1.5.259" + checksum: 10c0/a6600ff20d513e1acce29cd04af5fcb338295ebe5a13fa9802009464d9c269a4a092218c8ea8c9b85017a1efd75606fe0cdf5f36216979f7c8462af7df2f530d + languageName: node + linkType: hard + +"electron@npm:39.2.3": + version: 39.2.3 + resolution: "electron@npm:39.2.3" + dependencies: + "@electron/get": "npm:^2.0.0" + "@types/node": "npm:^22.7.7" + extract-zip: "npm:^2.0.1" + bin: + electron: cli.js + checksum: 10c0/4ebfd932cabaf2b49859b1437661941e1a4475ac5b8a7f8e7be02276ea6ba0f901889b02a39cdaab7803c41f87afa46216e626397687140df5eb7978caade595 + languageName: node + linkType: hard + +"electron@workspace:.": + version: 0.0.0-use.local + resolution: "electron@workspace:." + dependencies: + "@datadog/electron": "file:../../../packages/electron/package.tgz" + electron: "npm:39.2.3" + html-webpack-plugin: "npm:5.6.5" + ts-loader: "npm:9.5.4" + webpack: "npm:5.103.0" + webpack-cli: "npm:6.0.1" + languageName: unknown + linkType: soft + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.17.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"envinfo@npm:^7.14.0": + version: 7.20.0 + resolution: "envinfo@npm:7.20.0" + bin: + envinfo: dist/cli.js + checksum: 10c0/2afa8085f9952d3afe6893098ef9cadc991aa38ed5ed5a0fd953ddb72a7543f425fbf46e8c02c4fa0ecad3c03a93381b0a212f799c2a8db8dc8886d8d7d5dc05 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b + languageName: node + linkType: hard + +"es6-error@npm:^4.1.1": + version: 4.1.1 + resolution: "es6-error@npm:4.1.1" + checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef + languageName: node + linkType: hard + +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"foreground-child@npm:^3.3.1": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^11.0.3": + version: 11.1.0 + resolution: "glob@npm:11.1.0" + dependencies: + foreground-child: "npm:^3.3.1" + jackspeak: "npm:^4.1.1" + minimatch: "npm:^10.1.1" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2 + languageName: node + linkType: hard + +"global-agent@npm:^3.0.0": + version: 3.0.0 + resolution: "global-agent@npm:3.0.0" + dependencies: + boolean: "npm:^3.0.1" + es6-error: "npm:^4.1.1" + matcher: "npm:^3.0.0" + roarr: "npm:^2.15.3" + semver: "npm:^7.3.2" + serialize-error: "npm:^7.0.1" + checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphql@npm:16.12.0": + version: 16.12.0 + resolution: "graphql@npm:16.12.0" + checksum: 10c0/b6fffa4e8a4e4a9933ebe85e7470b346dbf49050c1a482fac5e03e4a1a7bed2ecd3a4c97e29f04457af929464bc5e4f2aac991090c2f320111eef26e902a5c75 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a + languageName: node + linkType: hard + +"html-webpack-plugin@npm:5.6.5": + version: 5.6.5 + resolution: "html-webpack-plugin@npm:5.6.5" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/4ae0ae48fec6337e4eb055e730e46340172ec1967bd383d897d03cb3c4e385a8128e8d5179c4658536b00e432c2d3f026d97eb5fdb4cf9dc710498d2e871b84e + languageName: node + linkType: hard + +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^7.0.5": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d + languageName: node + linkType: hard + +"import-in-the-middle@npm:^1.14.2": + version: 1.15.0 + resolution: "import-in-the-middle@npm:1.15.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-import-attributes: "npm:^1.9.5" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10c0/43d4efbe75a89c04343fd052ca5d2193adc0e2df93325e50d8b32c31403b2f089a5e2b6e47f4e5413bc4058b9781aaaf61bfe3f0e5e6d7f9487eb112fd095e0d + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 + languageName: node + linkType: hard + +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 + languageName: node + linkType: hard + +"is-core-module@npm:^2.16.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.2.2": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"jackspeak@npm:^4.1.1": + version: 4.1.1 + resolution: "jackspeak@npm:4.1.1" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 + languageName: node + linkType: hard + +"jsep@npm:^1.4.0": + version: 1.4.0 + resolution: "jsep@npm:1.4.0" + checksum: 10c0/fe60adf47e050e22eadced42514a51a15a3cf0e2d147896584486acd8ee670fc16641101b9aeb81f4aaba382043d29744b7aac41171e8106515b14f27e0c7116 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 + languageName: node + linkType: hard + +"jsonpath-plus@npm:^10.3.0": + version: 10.3.0 + resolution: "jsonpath-plus@npm:10.3.0" + dependencies: + "@jsep-plugin/assignment": "npm:^1.3.0" + "@jsep-plugin/regex": "npm:^1.0.4" + jsep: "npm:^1.4.0" + bin: + jsonpath: bin/jsonpath-cli.js + jsonpath-plus: bin/jsonpath-cli.js + checksum: 10c0/f5ff53078ecab98e8afd1dcdb4488e528653fa5a03a32d671f52db1ae9c3236e6e072d75e1949a80929fd21b07603924a586f829b40ad35993fa0247fa4f7506 + languageName: node + linkType: hard + +"keyv@npm:^4.0.0": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: 10c0/ebe2b20a820d1f67b8e1724051246434c419b2da041a7e9cd943f6daf113b8d17a52a1bd88fb79be5b624c10283ecb737f50edb5c1c88c71f4cd367108c97300 + languageName: node + linkType: hard + +"loader-runner@npm:^4.3.1": + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 10c0/a523b6329f114e0a98317158e30a7dfce044b731521be5399464010472a93a15ece44757d1eaed1d8845019869c5390218bc1c7c3110f4eeaef5157394486eac + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981 + languageName: node + linkType: hard + +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b + languageName: node + linkType: hard + +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"lru-cache@npm:^10.4.3": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.2 + resolution: "lru-cache@npm:11.2.2" + checksum: 10c0/72d7831bbebc85e2bdefe01047ee5584db69d641c48d7a509e86f66f6ee111b30af7ec3bd68a967d47b69a4b1fa8bbf3872630bd06a63b6735e6f0a5f1c8e83d + languageName: node + linkType: hard + +"lru-cache@npm:^7.14.0": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" + dependencies: + "@npmcli/agent": "npm:^4.0.0" + cacache: "npm:^20.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^5.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^6.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^13.0.0" + checksum: 10c0/525f74915660be60b616bcbd267c4a5b59481b073ba125e45c9c3a041bb1a47a2bd0ae79d028eb6f5f95bf9851a4158423f5068539c3093621abb64027e8e461 + languageName: node + linkType: hard + +"matcher@npm:^3.0.0": + version: 3.0.0 + resolution: "matcher@npm:3.0.0" + dependencies: + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.0": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"minimatch@npm:^10.1.1": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass-fetch@npm:5.0.0" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/9443aab5feab190972f84b64116e54e58dd87a58e62399cae0a4a7461b80568281039b7c3a38ba96453431ebc799d1e26999e548540156216729a4967cd5ef06 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"module-details-from-path@npm:^1.0.3, module-details-from-path@npm:^1.0.4": + version: 1.0.4 + resolution: "module-details-from-path@npm:1.0.4" + checksum: 10c0/10863413e96dab07dee917eae07afe46f7bf853065cc75a7d2a718adf67574857fb64f8a2c0c9af12ac733a9a8cf652db7ed39b95f7a355d08106cb9cc50c83b + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"mutexify@npm:^1.4.0": + version: 1.4.0 + resolution: "mutexify@npm:1.4.0" + dependencies: + queue-tick: "npm:^1.0.0" + checksum: 10c0/0b2fad0c671cef33ad3596d702b581e5bb3708ec7ba2913639cfb1642c7f5093af9d8793b38eafe1b723e7879d60419d2e96c5e7793271e0167833a7939ac66d + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 + languageName: node + linkType: hard + +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac + languageName: node + linkType: hard + +"node-gyp-build@npm:<4.0, node-gyp-build@npm:^3.9.0": + version: 3.9.0 + resolution: "node-gyp-build@npm:3.9.0" + bin: + node-gyp-build: ./bin.js + node-gyp-build-optional: ./optional.js + node-gyp-build-test: ./build-test.js + checksum: 10c0/0e7e39e5746728e6adf58803d9c3c732b6107f1af3df5128c4c2a6c9c0fb99a6c981ad0a7514d707adccbcfe303b4a92da7949408f1d3ec281f70d37bec29f60 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.5.0": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 12.1.0 + resolution: "node-gyp@npm:12.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.2" + tinyglobby: "npm:^0.2.12" + which: "npm:^6.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/f43efea8aaf0beb6b2f6184e533edad779b2ae38062953e21951f46221dd104006cc574154f2ad4a135467a5aae92c49e84ef289311a82e08481c5df0e8dc495 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 + languageName: node + linkType: hard + +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" + dependencies: + abbrev: "npm:^4.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"opentracing@npm:>=0.14.7": + version: 0.14.7 + resolution: "opentracing@npm:0.14.7" + checksum: 10c0/a7be8d697b1997548233423f5f4c196e285af8e864a24d7704fc6029beb73cd1f987651ca814e207629c6bc624cb03297a86601c0dc51cdca9a07a20f97b71ea + languageName: node + linkType: hard + +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 + languageName: node + linkType: hard + +"path-to-regexp@npm:^0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b + languageName: node + linkType: hard + +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"pprof-format@npm:^2.1.1, pprof-format@npm:^2.2.1": + version: 2.2.1 + resolution: "pprof-format@npm:2.2.1" + checksum: 10c0/1c8051b3e3ebba1ac2b8d7cf0a84ce501fdabe5e72a803c7daa6ddf67cbee33e9b5d6dbc6ffbeb740e3e56600c875f372576304ed718a4ffa4c89c18185494ae + languageName: node + linkType: hard + +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 + languageName: node + linkType: hard + +"proc-log@npm:^6.0.0": + version: 6.0.0 + resolution: "proc-log@npm:6.0.0" + checksum: 10c0/40c5e2b4c55e395a3bd72e38cba9c26e58598a1f4844fa6a115716d5231a0919f46aa8e351147035d91583ad39a794593615078c948bc001fe3beb99276be776 + languageName: node + linkType: hard + +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"protobufjs@npm:^7.5.3": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.0.0" + checksum: 10c0/913b676109ffb3c05d3d31e03a684e569be91f3bba8613da4a683d69d9dba948daa2afd7d2e7944d1aa6c417890c35d9d9a8883c1160affafb0f9670d59ef722 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.3 + resolution: "pump@npm:3.0.3" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/ada5cdf1d813065bbc99aa2c393b8f6beee73b5de2890a8754c9f488d7323ffd2ca5f5a0943b48934e3fcbd97637d0337369c3c631aeb9614915db629f1c75c9 + languageName: node + linkType: hard + +"queue-tick@npm:^1.0.0": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: "npm:^1.20.0" + checksum: 10c0/1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve@npm:^1.20.0": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" + dependencies: + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 + languageName: node + linkType: hard + +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 + languageName: node + linkType: hard + +"rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + +"roarr@npm:^2.15.3": + version: 2.15.4 + resolution: "roarr@npm:2.15.4" + dependencies: + boolean: "npm:^3.0.1" + detect-node: "npm:^2.0.4" + globalthis: "npm:^1.0.1" + json-stringify-safe: "npm:^5.0.1" + semver-compare: "npm:^1.0.0" + sprintf-js: "npm:^1.1.2" + checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/1c8d2c480a026d7c02ab2ecbe5919133a096d6a721a3f201fa50663e4f30f6d6ba020dfddd93cb828b66b922e76b342e103edd19a62c95c8f60e9079cc403202 + languageName: node + linkType: hard + +"semifies@npm:^1.0.0": + version: 1.0.0 + resolution: "semifies@npm:1.0.0" + checksum: 10c0/d93d5e8d2c0b7d5f972b9378736ed5cc1f2ab40d043234b4156665872f08cb0da914ee8c8b35c59dc6b17880a4c5502588c7515c6bb4dbc3ce5565746428d31d + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + +"semver@npm:^6.2.0": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:^1.8.2": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.7 + resolution: "socks@npm:2.8.7" + dependencies: + ip-address: "npm:^10.0.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:~0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"source-map@npm:^0.7.4": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + +"spark-md5@npm:^3.0.2": + version: 3.0.2 + resolution: "spark-md5@npm:3.0.2" + checksum: 10c0/3fd11735eac5e7d60d6006d99ac0a055f148a89e9baf5f0b51ac103022dec30556b44190b37f6737ca50f81e8e50dc13e724f9edf6290c412ff5ab2101ce7780 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.2": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"ssri@npm:^13.0.0": + version: 13.0.0 + resolution: "ssri@npm:13.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/405f3a531cd98b013cecb355d63555dca42fd12c7bc6671738aaa9a82882ff41cdf0ef9a2b734ca4f9a760338f114c29d01d9238a65db3ccac27929bd6e6d4b2 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b + languageName: node + linkType: hard + +"sumchecker@npm:^3.0.1": + version: 3.0.1 + resolution: "sumchecker@npm:3.0.1" + dependencies: + debug: "npm:^4.1.0" + checksum: 10c0/43c387be9dfe22dbeaf39dfa4ffb279847aeb37a42a8988c0b066f548bbd209aa8c65e03da29f2b29be1a66b577801bf89fff0007df4183db2f286263a9569e5 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10c0/cb9d67cc2c6a74dedc812ef3085d9d681edd2c1fa18e4aef57a3c0605fdbe44e6b8ea00bd9ef21bc74dd45314e39d31227aa031ebf2f5e38164df514136f2681 + languageName: node + linkType: hard + +"tar@npm:^7.5.2": + version: 7.5.2 + resolution: "tar@npm:7.5.2" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/a7d8b801139b52f93a7e34830db0de54c5aa45487c7cb551f6f3d44a112c67f1cb8ffdae856b05fd4f17b1749911f1c26f1e3a23bbe0279e17fd96077f13f467 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.11": + version: 5.3.14 + resolution: "terser-webpack-plugin@npm:5.3.14" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^4.3.0" + serialize-javascript: "npm:^6.0.2" + terser: "npm:^5.31.1" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/9b060947241af43bd6fd728456f60e646186aef492163672a35ad49be6fbc7f63b54a7356c3f6ff40a8f83f00a977edc26f044b8e106cc611c053c8c0eaf8569 + languageName: node + linkType: hard + +"terser@npm:^5.10.0, terser@npm:^5.31.1": + version: 5.44.1 + resolution: "terser@npm:5.44.1" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.15.0" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/ee7a76692cb39b1ed22c30ff366c33ff3c977d9bb769575338ff5664676168fcba59192fb5168ef80c7cd901ef5411a1b0351261f5eaa50decf0fc71f63bde75 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + +"tlhunter-sorted-set@npm:^0.1.0": + version: 0.1.0 + resolution: "tlhunter-sorted-set@npm:0.1.0" + checksum: 10c0/fd07870aa75331fb7823e68604fda3bafb6aaef5cea8d342a3c24096635fd2c70273a330b00013e51cbde25272ae599de1270edeff972bd3c32e1c78e714edc6 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-loader@npm:9.5.4": + version: 9.5.4 + resolution: "ts-loader@npm:9.5.4" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.0.0" + micromatch: "npm:^4.0.0" + semver: "npm:^7.3.4" + source-map: "npm:^0.7.4" + peerDependencies: + typescript: "*" + webpack: ^5.0.0 + checksum: 10c0/f0982404b43628c335d3b3a60ac3f1738385da7b97c3f04cb5ad2ebad791597be39b25c8a4e158a66173f9bd9f5aa72e285b046b0573e4beed8ecd032d418e4d + languageName: node + linkType: hard + +"tslib@npm:^2.0.3": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"ttl-set@npm:^1.0.0": + version: 1.0.0 + resolution: "ttl-set@npm:1.0.0" + dependencies: + fast-fifo: "npm:^1.3.2" + checksum: 10c0/ef260c2a903c4ab05090d4dbc21ddb738d7f38fd9680570582414b9115a7c358796c82f5b19067262eabb7476e43b7a2f02e3bb4cace85edee3242aee745d4d3 + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.4": + version: 1.1.4 + resolution: "update-browserslist-db@npm:1.1.4" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/db0c9aaecf1258a6acda5e937fc27a7996ccca7a7580a1b4aa8bba6a9b0e283e5e65c49ebbd74ec29288ef083f1b88d4da13e3d4d326c1e5fc55bf72d7390702 + languageName: node + linkType: hard + +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e + languageName: node + linkType: hard + +"watchpack@npm:^2.4.4": + version: 2.4.4 + resolution: "watchpack@npm:2.4.4" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/6c0901f75ce245d33991225af915eea1c5ae4ba087f3aee2b70dd377d4cacb34bef02a48daf109da9d59b2d31ec6463d924a0d72f8618ae1643dd07b95de5275 + languageName: node + linkType: hard + +"webpack-cli@npm:6.0.1": + version: 6.0.1 + resolution: "webpack-cli@npm:6.0.1" + dependencies: + "@discoveryjs/json-ext": "npm:^0.6.1" + "@webpack-cli/configtest": "npm:^3.0.1" + "@webpack-cli/info": "npm:^3.0.1" + "@webpack-cli/serve": "npm:^3.0.1" + colorette: "npm:^2.0.14" + commander: "npm:^12.1.0" + cross-spawn: "npm:^7.0.3" + envinfo: "npm:^7.14.0" + fastest-levenshtein: "npm:^1.0.12" + import-local: "npm:^3.0.2" + interpret: "npm:^3.1.1" + rechoir: "npm:^0.8.0" + webpack-merge: "npm:^6.0.1" + peerDependencies: + webpack: ^5.82.0 + peerDependenciesMeta: + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: ./bin/cli.js + checksum: 10c0/2aaca78e277427f03f528602abd707d224696048fb46286ea636c7975592409c4381ca94d68bbbb3900f195ca97f256e619583e8feb34a80da531461323bf3e2 + languageName: node + linkType: hard + +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.1" + checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.3.3": + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 10c0/ab732f6933b513ba4d505130418995ddef6df988421fccf3289e53583c6a39e205c4a0739cee98950964552d3006604912679c736031337fb4a9d78d8576ed40 + languageName: node + linkType: hard + +"webpack@npm:5.103.0": + version: 5.103.0 + resolution: "webpack@npm:5.103.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.8" + "@types/json-schema": "npm:^7.0.15" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.15.0" + acorn-import-phases: "npm:^1.0.3" + browserslist: "npm:^4.26.3" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.3" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.3.1" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" + terser-webpack-plugin: "npm:^5.3.11" + watchpack: "npm:^2.4.4" + webpack-sources: "npm:^3.3.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/d0cf86f8cac249874d6f36292e25011413ebb5bae82c48fa78a165a217e63db00b1a1f563f5195070eb17a055c6da4b6ab89fbdd37f781abdda862aa8c0bd623 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^6.0.0": + version: 6.0.0 + resolution: "which@npm:6.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/fe9d6463fe44a76232bb6e3b3181922c87510a5b250a98f1e43a69c99c079b3f42ddeca7e03d3e5f2241bf2d334f5a7657cfa868b97c109f3870625842f4cc15 + languageName: node + linkType: hard + +"wildcard@npm:^2.0.1": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard diff --git a/test/e2e/lib/framework/createTest.ts b/test/e2e/lib/framework/createTest.ts index 25b32dc831..963084a115 100644 --- a/test/e2e/lib/framework/createTest.ts +++ b/test/e2e/lib/framework/createTest.ts @@ -2,6 +2,7 @@ import type { LogsInitConfiguration } from '@datadog/browser-logs' import type { RumInitConfiguration, RemoteConfiguration } from '@datadog/browser-rum-core' import type { BrowserContext, Page } from '@playwright/test' import { test, expect } from '@playwright/test' +import { _electron as electron } from 'playwright-core' import { addTag, addTestOptimizationTags } from '../helpers/tags' import { getRunId } from '../../../envUtils' import type { BrowserLog } from '../helpers/browser' @@ -10,7 +11,7 @@ import { DEFAULT_LOGS_CONFIGURATION, DEFAULT_RUM_CONFIGURATION } from '../helper import { validateRumFormat } from '../helpers/validation' import type { BrowserConfiguration } from '../../../browsers.conf' import { IntakeRegistry } from './intakeRegistry' -import { flushEvents } from './flushEvents' +import { flushEvents, flushElectronEvents } from './flushEvents' import type { Servers } from './httpServers' import { getTestServers, waitForServersIdle } from './httpServers' import type { SetupFactory, SetupOptions } from './pageSetups' @@ -50,6 +51,7 @@ type TestRunner = (testContext: TestContext) => Promise | void class TestBuilder { private rumConfiguration: RumInitConfiguration | undefined = undefined private alsoRunWithRumSlim = false + private isElectron = false private logsConfiguration: LogsInitConfiguration | undefined = undefined private remoteConfiguration?: RemoteConfiguration = undefined private head = '' @@ -87,6 +89,11 @@ class TestBuilder { return this } + withElectron() { + this.isElectron = true + return this + } + withLogs(logsInitConfiguration?: Partial) { this.logsConfiguration = { ...DEFAULT_LOGS_CONFIGURATION, ...logsInitConfiguration } return this @@ -194,6 +201,7 @@ class TestBuilder { testFixture: this.testFixture, extension: this.extension, hostName: this.hostName, + isElectron: this.isElectron, } if (this.alsoRunWithRumSlim) { @@ -268,20 +276,80 @@ function declareTest(title: string, setupOptions: SetupOptions, factory: SetupFa const testContext = createTestContext(servers, page, context, browserLogs, browserName, setupOptions) servers.intake.bindServerApp(createIntakeServerApp(testContext.intakeRegistry)) + bindServersToConfigurations(servers, setupOptions) const setup = factory(setupOptions, servers) servers.base.bindServerApp(createMockServerApp(servers, setup, setupOptions.remoteConfiguration)) servers.crossOrigin.bindServerApp(createMockServerApp(servers, setup)) - await setUpTest(browserLogs, testContext) + if (setupOptions.isElectron) { + await runElectronTest(runner, testContext, setupOptions) + } else { + await runBrowserTest(runner, testContext, browserLogs) + } + }) +} - try { - await runner(testContext) - tearDownPassedTest(testContext) - } finally { - await tearDownTest(testContext) +function bindServersToConfigurations(servers: Servers, setupOptions: SetupOptions) { + for (const config of [ + setupOptions.rum, + setupOptions.logs, + setupOptions.extension?.logsConfiguration, + setupOptions.extension?.rumConfiguration, + ]) { + if (config) { + config.proxy = servers.intake.origin + ;(config as any).remoteConfigurationProxy = `${servers.base.origin}/config` } + } +} + +async function runBrowserTest(runner: TestRunner, testContext: TestContext, browserLogs: BrowserLogsManager) { + await setUpTest(browserLogs, testContext) + try { + await runner(testContext) + tearDownPassedTest(testContext) + } finally { + await tearDownTest(testContext) + } +} + +async function runElectronTest(runner: TestRunner, testContext: TestContext, setupOptions: SetupOptions) { + const ELECTRON_APP_MAIN = 'test/apps/electron/dist/main.js' + const rumEnv = setupOptions.rum ? toEnvVariable(setupOptions.rum) : undefined + const electronApp = await electron.launch({ + args: [ELECTRON_APP_MAIN], + env: { + ...process.env, + ...rumEnv, + ELECTRON_ENABLE_LOGGING: '1', + }, + }) + + const child = electronApp.process() + child.stdout?.on('data', (data) => console.log('[ELECTRON MAIN]', String(data))) + child.stderr?.on('data', (data) => console.error('[ELECTRON MAIN]', String(data))) + + const page = await electronApp.firstWindow() + testContext.page = page + await page.waitForLoadState('domcontentloaded') + await waitForServersIdle() + try { + await runner(testContext) + tearDownPassedTest(testContext) + } finally { + await flushElectronEvents(page) + await page.close() + } +} + +function toEnvVariable(rum: RumInitConfiguration) { + const namespace = 'RUM_' + const env: { [key: string]: any } = {} + Object.entries(rum).forEach(([key, value]) => { + env[`${namespace}${key}`] = value }) + return env } function createTestContext( diff --git a/test/e2e/lib/framework/flushEvents.ts b/test/e2e/lib/framework/flushEvents.ts index 7567d42116..47acf9b4f5 100644 --- a/test/e2e/lib/framework/flushEvents.ts +++ b/test/e2e/lib/framework/flushEvents.ts @@ -24,3 +24,9 @@ export async function flushEvents(page: Page) { await page.goto(`${servers.base.origin}/ok?duration=200`) await waitForServersIdle() } + +export async function flushElectronEvents(page: Page) { + // TODO improve electron sdk flush logic + await page.waitForTimeout(1000) + await waitForServersIdle() +} diff --git a/test/e2e/lib/framework/index.ts b/test/e2e/lib/framework/index.ts index 8baeb9662f..1d224d99e9 100644 --- a/test/e2e/lib/framework/index.ts +++ b/test/e2e/lib/framework/index.ts @@ -4,7 +4,7 @@ export { createExtension } from './createExtension' export { bundleSetup, html, npmSetup, reactSetup, formatConfiguration, createCrossOriginScriptUrls } from './pageSetups' export { IntakeRegistry } from './intakeRegistry' export { getTestServers, waitForServersIdle } from './httpServers' -export { flushEvents } from './flushEvents' +export { flushEvents, flushElectronEvents } from './flushEvents' export { waitForRequests } from './waitForRequests' export { LARGE_RESPONSE_MIN_BYTE_SIZE } from './serverApps/mock' export { getSdkBundlePath, getTestAppBundlePath } from './sdkBuilds' diff --git a/test/e2e/lib/framework/pageSetups.ts b/test/e2e/lib/framework/pageSetups.ts index 3a47a8ac51..3a5fe45970 100644 --- a/test/e2e/lib/framework/pageSetups.ts +++ b/test/e2e/lib/framework/pageSetups.ts @@ -8,6 +8,7 @@ import type { Servers } from './httpServers' export interface SetupOptions { rum?: RumInitConfiguration + isElectron: boolean useRumSlim: boolean logs?: LogsInitConfiguration logsInit: (initConfiguration: LogsInitConfiguration) => void @@ -75,7 +76,7 @@ n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n) ${formatSnippet(logsScriptUrl, 'DD_LOGS')} DD_LOGS.onReady(function () { DD_LOGS.setGlobalContext(${JSON.stringify(options.context)}) - ;(${options.logsInit.toString()})(${formatConfiguration(options.logs, servers)}) + ;(${options.logsInit.toString()})(${formatConfiguration(options.logs)}) }) ` @@ -87,7 +88,7 @@ n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n) ${formatSnippet(rumScriptUrl, 'DD_RUM')} DD_RUM.onReady(function () { DD_RUM.setGlobalContext(${JSON.stringify(options.context)}) - ;(${options.rumInit.toString()})(${formatConfiguration(options.rum, servers)}) + ;(${options.rumInit.toString()})(${formatConfiguration(options.rum)}) }) ` @@ -117,7 +118,7 @@ export function bundleSetup(options: SetupOptions, servers: Servers) { ` } @@ -127,7 +128,7 @@ export function bundleSetup(options: SetupOptions, servers: Servers) { ` } @@ -155,7 +156,7 @@ export function npmSetup(options: SetupOptions, servers: Servers) { ` @@ -166,7 +167,7 @@ export function npmSetup(options: SetupOptions, servers: Servers) { ` @@ -195,7 +196,7 @@ export function reactSetup(options: SetupOptions, servers: Servers, appName: str if (options.rum) { header += html` ` @@ -214,7 +215,7 @@ export function workerSetup(options: WorkerOptions, servers: Servers) { ${options.importScripts ? js`importScripts('/datadog-logs.js');` : js`import '/datadog-logs.js';`} // Initialize DD_LOGS in service worker - DD_LOGS.init(${formatConfiguration({ ...DEFAULT_LOGS_CONFIGURATION, forwardConsoleLogs: 'all', forwardErrorsToLogs: true }, servers)}) + DD_LOGS.init(${formatConfiguration({ ...DEFAULT_LOGS_CONFIGURATION, forwardConsoleLogs: 'all', forwardErrorsToLogs: true, proxy: servers.intake.origin })}) // Handle messages from main thread self.addEventListener('message', (event) => { @@ -292,7 +293,7 @@ function setupExtension(options: SetupOptions, servers: Servers) { ` } @@ -302,7 +303,7 @@ function setupExtension(options: SetupOptions, servers: Servers) { ` } @@ -310,27 +311,20 @@ function setupExtension(options: SetupOptions, servers: Servers) { return header } -export function formatConfiguration(initConfiguration: LogsInitConfiguration | RumInitConfiguration, servers: Servers) { +export function formatConfiguration(initConfiguration: LogsInitConfiguration | RumInitConfiguration) { const fns = new Map void>() - let result = JSON.stringify( - { - ...initConfiguration, - proxy: servers.intake.origin, - remoteConfigurationProxy: `${servers.base.origin}/config`, - }, - (_key, value) => { - if (typeof value === 'function') { - const id = generateUUID() - fns.set(id, value) - - return id - } + let result = JSON.stringify(initConfiguration, (_key, value) => { + if (typeof value === 'function') { + const id = generateUUID() + fns.set(id, value) - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return value + return id } - ) + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return value + }) result = result.replace('"LOCATION_ORIGIN"', 'location.origin') diff --git a/test/e2e/playwright.bs.config.ts b/test/e2e/playwright.bs.config.ts index 8066c1f683..af0d920ba0 100644 --- a/test/e2e/playwright.bs.config.ts +++ b/test/e2e/playwright.bs.config.ts @@ -7,7 +7,7 @@ import { browserConfigurations } from './browsers.conf' export default defineConfig({ ...baseConfig, workers: 5, // BrowserStack has a limit of 5 parallel sessions - testIgnore: ['**/developerExtension.scenario.ts', '**/s8sInject.scenario.ts'], // These test won't run in the BrowserStack + testIgnore: ['**/developerExtension.scenario.ts', '**/s8sInject.scenario.ts', '**/electron.scenario.ts'], // These test won't run in the BrowserStack projects: browserConfigurations.map((configuration) => ({ name: configuration.sessionName, metadata: configuration, diff --git a/test/e2e/scenario/electron.scenario.ts b/test/e2e/scenario/electron.scenario.ts new file mode 100644 index 0000000000..517ad68acc --- /dev/null +++ b/test/e2e/scenario/electron.scenario.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test' +import { createTest, flushElectronEvents, npmSetup } from '../lib/framework' + +test.describe('electron sdk', () => { + createTest('should track a view on the main process') + .withSetup(npmSetup) + .withRum() + .withElectron() + .run(async ({ intakeRegistry, page }) => { + await flushElectronEvents(page) + + const viewEvent = intakeRegistry.rumViewEvents[0] + expect(viewEvent).toBeDefined() + expect(viewEvent.source).toBe('browser') + expect(viewEvent.view.name).toBe('ApplicationLaunch') + expect(viewEvent.view.url).toBe('ApplicationLaunch') + }) +}) diff --git a/yarn.lock b/yarn.lock index 5b5e0ed377..063b413363 100644 --- a/yarn.lock +++ b/yarn.lock @@ -245,7 +245,7 @@ __metadata: languageName: unknown linkType: soft -"@datadog/browser-logs@workspace:*, @datadog/browser-logs@workspace:packages/logs": +"@datadog/browser-logs@npm:6.24.0, @datadog/browser-logs@workspace:*, @datadog/browser-logs@workspace:packages/logs": version: 0.0.0-use.local resolution: "@datadog/browser-logs@workspace:packages/logs" dependencies: @@ -369,6 +369,119 @@ __metadata: languageName: unknown linkType: soft +"@datadog/electron@workspace:packages/electron": + version: 0.0.0-use.local + resolution: "@datadog/electron@workspace:packages/electron" + dependencies: + "@datadog/browser-core": "npm:6.24.0" + "@datadog/browser-logs": "npm:6.24.0" + "@datadog/browser-rum-core": "npm:6.24.0" + "@msgpack/msgpack": "npm:3.1.2" + "@openfeature/core": "npm:1.9.1" + "@types/pako": "npm:2.0.4" + dd-trace: "npm:^5.76.0" + electron: "npm:39" + graphql: "npm:16.12.0" + pako: "npm:2.1.0" + peerDependencies: + electron: 39 + languageName: unknown + linkType: soft + +"@datadog/flagging-core@npm:0.2.0": + version: 0.2.0 + resolution: "@datadog/flagging-core@npm:0.2.0" + dependencies: + spark-md5: "npm:^3.0.2" + peerDependencies: + "@openfeature/core": ^1.8.1 + checksum: 10c0/e3a837bdb6186a0a0a22a692afc6289d8527b43f6fc9fe87c152d99a79ba546c1574d48fb84fe9cf05067c7a911844aa6708eddf60213eb5e1f029c0f9881e20 + languageName: node + linkType: hard + +"@datadog/libdatadog@npm:0.7.0": + version: 0.7.0 + resolution: "@datadog/libdatadog@npm:0.7.0" + checksum: 10c0/04ca10b1f3a393e3a6356c80ca257c79c9ebca98923b88fd55d11e732f3721b4fd6fba134737b19d56da1b579c8633824364c724303f33106db461ad7f61c669 + languageName: node + linkType: hard + +"@datadog/native-appsec@npm:10.3.0": + version: 10.3.0 + resolution: "@datadog/native-appsec@npm:10.3.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/a1c5eac27d566148c58559e1e3d481efb0bf336b14a2e2a4bcdef6d7137b3fd6401781deac0271b5aa71634796af3f6ffcc1608609268355d4632c6f99dc338f + languageName: node + linkType: hard + +"@datadog/native-iast-taint-tracking@npm:4.0.0": + version: 4.0.0 + resolution: "@datadog/native-iast-taint-tracking@npm:4.0.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/72a18959a9eccfeff4b791ff9929a384df84385596232685a65ca9a0225306f376e85bd44540e98467d8058e54bc776b3fd52ed029c04eebb9ef7d3ae73c5df7 + languageName: node + linkType: hard + +"@datadog/native-metrics@npm:3.1.1": + version: 3.1.1 + resolution: "@datadog/native-metrics@npm:3.1.1" + dependencies: + node-addon-api: "npm:^6.1.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^3.9.0" + checksum: 10c0/05757cd34fca5f129130dba95be32012a9693ac59e7517145560d71275dd9b7592aad60e8f0d1d805b99d74ea834d8ae1e5db00b0de75bc6faba84419cb35393 + languageName: node + linkType: hard + +"@datadog/openfeature-node-server@npm:^0.2.0": + version: 0.2.0 + resolution: "@datadog/openfeature-node-server@npm:0.2.0" + dependencies: + "@datadog/flagging-core": "npm:0.2.0" + "@openfeature/server-sdk": "npm:~1.18.0" + peerDependencies: + "@openfeature/server-sdk": ~1.18.0 + checksum: 10c0/9465f7b109bd39604cd62bfa184d6ea0fc4b526de566b010f2f0e6ebeac4d50773486b66a0adca340377538b30bb6fe875085acfce87c56f2ee1d7d431f413c1 + languageName: node + linkType: hard + +"@datadog/pprof@npm:5.12.0": + version: 5.12.0 + resolution: "@datadog/pprof@npm:5.12.0" + dependencies: + delay: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:<4.0" + p-limit: "npm:^3.1.0" + pprof-format: "npm:^2.2.1" + source-map: "npm:^0.7.4" + checksum: 10c0/e18e9e941fbd7ba6de52f3e8d92d7b4612ab054b302d2b2581932be41d1f4bb03d27b753ab9242364b897ba2773c105b1badb2d760db4b1fe633e1b8c23c1013 + languageName: node + linkType: hard + +"@datadog/sketches-js@npm:2.1.1": + version: 2.1.1 + resolution: "@datadog/sketches-js@npm:2.1.1" + checksum: 10c0/4b930240202e4e94ac49fc95298a7111202492566f76672e0ec43425a1710a0e3650a20f858a6358509ab08363d39fce5db210c88d94b4225f96b3bfe645cc5c + languageName: node + linkType: hard + +"@datadog/wasm-js-rewriter@npm:5.0.1": + version: 5.0.1 + resolution: "@datadog/wasm-js-rewriter@npm:5.0.1" + dependencies: + js-yaml: "npm:^4.1.0" + lru-cache: "npm:^7.14.0" + module-details-from-path: "npm:^1.0.3" + node-gyp-build: "npm:^4.5.0" + checksum: 10c0/e5f665f53b8d292efe85ac401f56923112860cfd14c5d84097ad22e1b86c8a30f3cd39cc92e1ec6e8f5f9de5fef028af46554752d8ae2d0f80b7c3a44827f0db + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.6.1": version: 0.6.3 resolution: "@discoveryjs/json-ext@npm:0.6.3" @@ -376,6 +489,25 @@ __metadata: languageName: node linkType: hard +"@electron/get@npm:^2.0.0": + version: 2.0.3 + resolution: "@electron/get@npm:2.0.3" + dependencies: + debug: "npm:^4.1.1" + env-paths: "npm:^2.2.0" + fs-extra: "npm:^8.1.0" + global-agent: "npm:^3.0.0" + got: "npm:^11.8.5" + progress: "npm:^2.0.3" + semver: "npm:^6.2.0" + sumchecker: "npm:^3.0.1" + dependenciesMeta: + global-agent: + optional: true + checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e + languageName: node + linkType: hard + "@emnapi/core@npm:^1.1.0": version: 1.7.0 resolution: "@emnapi/core@npm:1.7.0" @@ -908,6 +1040,13 @@ __metadata: languageName: node linkType: hard +"@isaacs/ttlcache@npm:^2.0.1": + version: 2.1.1 + resolution: "@isaacs/ttlcache@npm:2.1.1" + checksum: 10c0/f02870024e7523da5d97a9a6c4d7e4a984dffa2896304ac4c48e9773cc624741238618733ae4eef206f21285990da994c2c88c3fb3ceb6cd91af46dd019228be + languageName: node + linkType: hard + "@istanbuljs/schema@npm:^0.1.2": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" @@ -1022,6 +1161,24 @@ __metadata: languageName: node linkType: hard +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.3.0 + resolution: "@jsep-plugin/assignment@npm:1.3.0" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/d749554dc691798116eb068eebe2d9bcb0b0d89ef6c7cc7c2a9f37d03da15fdbf8053407e97008090cd1bd6f256ea6c26abbada7399cf79f0b6b502e164b084b + languageName: node + linkType: hard + +"@jsep-plugin/regex@npm:^1.0.4": + version: 1.0.4 + resolution: "@jsep-plugin/regex@npm:1.0.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 10c0/bec7eb7ea6ab453a2672edc808644c5be3dc06b2a9d77182e18cd595b37deba6dcdb3760849d8684afc5779a86b7d2604dd525cb612a548f9ed9f31a8032ec24 + languageName: node + linkType: hard + "@jsonjoy.com/base64@npm:^1.1.2": version: 1.1.2 resolution: "@jsonjoy.com/base64@npm:1.1.2" @@ -1200,6 +1357,13 @@ __metadata: languageName: node linkType: hard +"@msgpack/msgpack@npm:3.1.2": + version: 3.1.2 + resolution: "@msgpack/msgpack@npm:3.1.2" + checksum: 10c0/4fee6dbea70a485d3a787ac76dd43687f489d662f22919237db1f2abbc3c88070c1d3ad78417ce6e764bcd041051680284654021f52068e0aff82d570cb942d5 + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:0.2.4": version: 0.2.4 resolution: "@napi-rs/wasm-runtime@npm:0.2.4" @@ -1747,6 +1911,68 @@ __metadata: languageName: node linkType: hard +"@openfeature/core@npm:1.9.1": + version: 1.9.1 + resolution: "@openfeature/core@npm:1.9.1" + checksum: 10c0/983c651484621e6e5a3b4bf83fce5398a1adc2ace6162ff5a13a8eaf6d285b7c6b15f5c0a477ece9010ca88b28799985d810047ea0c18324d7a51ac4d04e18d6 + languageName: node + linkType: hard + +"@openfeature/server-sdk@npm:~1.18.0": + version: 1.18.0 + resolution: "@openfeature/server-sdk@npm:1.18.0" + peerDependencies: + "@openfeature/core": ^1.7.0 + checksum: 10c0/5c3aa8fee5ec4ad9ec40ee74094fe0377b28cadfcc6f71414fa1762035cb994891184cc491a59dbaade71afe0139cd39c193e3897b05df8fa21f0e7b84b67c53 + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:<1.0.0": + version: 0.208.0 + resolution: "@opentelemetry/api-logs@npm:0.208.0" + dependencies: + "@opentelemetry/api": "npm:^1.3.0" + checksum: 10c0/dc1fbee6219df4166509f43b74ea936bb18b6d594565b0bcf56b654a1c958b50d6046b8739dc36c98149fe890c02150ff3814e963f5ea439a07ff3c562555b99 + languageName: node + linkType: hard + +"@opentelemetry/api@npm:>=1.0.0 <1.10.0, @opentelemetry/api@npm:^1.3.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.30.1, @opentelemetry/core@npm:>=1.14.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/core@npm:1.30.1" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/4c25ba50a6137c2ba9ca563fb269378f3c9ca6fd1b3f15dbb6eff78eebf5656f281997cbb7be8e51c01649fd6ad091083fcd8a42dd9b5dfac907dc06d7cfa092 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:>=1.0.0 <1.31.0": + version: 1.30.1 + resolution: "@opentelemetry/resources@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10c0/688e73258283c80662bfa9a858aaf73bf3b832a18d96e546d0dddfa6dcec556cdfa087a1d0df643435293406009e4122d7fb7eeea69aa87b539d3bab756fba74 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.28.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 10c0/deb8a0f744198071e70fea27143cf7c9f7ecb7e4d7b619488c917834ea09b31543c1c2bcea4ec5f3cf68797f0ef3549609c14e859013d9376400ac1499c2b9cb + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -1801,6 +2027,79 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + "@puppeteer/browsers@npm:2.10.13": version: 2.10.13 resolution: "@puppeteer/browsers@npm:2.10.13" @@ -2007,6 +2306,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + "@socket.io/component-emitter@npm:~3.1.0": version: 3.1.2 resolution: "@socket.io/component-emitter@npm:3.1.2" @@ -2146,6 +2452,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + "@tabler/icons-react@npm:3.35.0": version: 3.35.0 resolution: "@tabler/icons-react@npm:3.35.0" @@ -2263,6 +2578,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + "@types/chrome@npm:0.1.27": version: 0.1.27 resolution: "@types/chrome@npm:0.1.27" @@ -2452,6 +2779,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + "@types/http-errors@npm:*": version: 2.0.5 resolution: "@types/http-errors@npm:2.0.5" @@ -2489,6 +2823,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.182": version: 4.17.20 resolution: "@types/lodash@npm:4.17.20" @@ -2542,6 +2885,24 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=13.7.0": + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 + languageName: node + linkType: hard + +"@types/node@npm:^22.7.7": + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -2595,6 +2956,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + "@types/retry@npm:0.12.2": version: 0.12.2 resolution: "@types/retry@npm:0.12.2" @@ -3114,6 +3484,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" + peerDependencies: + acorn: ^8 + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d + languageName: node + linkType: hard + "acorn-import-phases@npm:^1.0.3": version: 1.0.4 resolution: "acorn-import-phases@npm:1.0.4" @@ -3141,7 +3520,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1": +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -3779,6 +4158,13 @@ __metadata: languageName: node linkType: hard +"boolean@npm:^3.0.1": + version: 3.2.0 + resolution: "boolean@npm:3.2.0" + checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.12 resolution: "brace-expansion@npm:1.1.12" @@ -4012,6 +4398,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -4203,6 +4611,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.2": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be + languageName: node + linkType: hard + "clean-css@npm:^5.2.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" @@ -4304,6 +4719,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -4770,6 +5194,13 @@ __metadata: languageName: node linkType: hard +"crypto-randomuuid@npm:^1.0.0": + version: 1.0.0 + resolution: "crypto-randomuuid@npm:1.0.0" + checksum: 10c0/6c8f7513f3b0c38b876b5011d91e21c284f7a695d27b6ef25a2a1ca89c362af23e321bf47953069b9fe56bc384de7880a13c390a4663ac5dcf525a1b4f937a1f + languageName: node + linkType: hard + "css-loader@npm:7.1.2": version: 7.1.2 resolution: "css-loader@npm:7.1.2" @@ -4908,6 +5339,58 @@ __metadata: languageName: node linkType: hard +"dc-polyfill@npm:^0.1.10": + version: 0.1.10 + resolution: "dc-polyfill@npm:0.1.10" + checksum: 10c0/b4a847b5883fb3bc1173d48b98d2aa554af12b427b13d3f5fbd31a4d4cbfc733d8134e261e442ac890df3606f97e5440b603ff72d0c9cd62ac2e5f3cbc52aa6d + languageName: node + linkType: hard + +"dd-trace@npm:^5.76.0": + version: 5.79.0 + resolution: "dd-trace@npm:5.79.0" + dependencies: + "@datadog/libdatadog": "npm:0.7.0" + "@datadog/native-appsec": "npm:10.3.0" + "@datadog/native-iast-taint-tracking": "npm:4.0.0" + "@datadog/native-metrics": "npm:3.1.1" + "@datadog/openfeature-node-server": "npm:^0.2.0" + "@datadog/pprof": "npm:5.12.0" + "@datadog/sketches-js": "npm:2.1.1" + "@datadog/wasm-js-rewriter": "npm:5.0.1" + "@isaacs/ttlcache": "npm:^2.0.1" + "@opentelemetry/api": "npm:>=1.0.0 <1.10.0" + "@opentelemetry/api-logs": "npm:<1.0.0" + "@opentelemetry/core": "npm:>=1.14.0 <1.31.0" + "@opentelemetry/resources": "npm:>=1.0.0 <1.31.0" + crypto-randomuuid: "npm:^1.0.0" + dc-polyfill: "npm:^0.1.10" + escape-string-regexp: "npm:^5.0.0" + ignore: "npm:^7.0.5" + import-in-the-middle: "npm:^1.14.2" + istanbul-lib-coverage: "npm:^3.2.2" + jest-docblock: "npm:^29.7.0" + jsonpath-plus: "npm:^10.3.0" + limiter: "npm:^1.1.5" + lodash.sortby: "npm:^4.7.0" + lru-cache: "npm:^10.4.3" + module-details-from-path: "npm:^1.0.4" + mutexify: "npm:^1.4.0" + opentracing: "npm:>=0.14.7" + path-to-regexp: "npm:^0.1.12" + pprof-format: "npm:^2.1.1" + protobufjs: "npm:^7.5.3" + retry: "npm:^0.13.1" + rfdc: "npm:^1.4.1" + semifies: "npm:^1.0.0" + shell-quote: "npm:^1.8.2" + source-map: "npm:^0.7.4" + tlhunter-sorted-set: "npm:^0.1.0" + ttl-set: "npm:^1.0.0" + checksum: 10c0/999e637857f1c69504e27a15e60a978225292f61cd5480e645fae865dd1b3b66f2208011fb502838d87730669da1035d1c7b9e4d7a6880c8b15970f8746fd893 + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -4967,6 +5450,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "dedent@npm:1.5.3": version: 1.5.3 resolution: "dedent@npm:1.5.3" @@ -5012,6 +5504,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -5059,6 +5558,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 10c0/01cdc4cd0cd35fb622518a3df848e67e09763a38e7cdada2232b6fda9ddda72eddcf74f0e24211200fbe718434f2335f2a2633875a6c96037fefa6de42896ad7 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -5101,6 +5607,13 @@ __metadata: languageName: node linkType: hard +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + "detect-node-es@npm:^1.1.0": version: 1.1.0 resolution: "detect-node-es@npm:1.1.0" @@ -5305,6 +5818,19 @@ __metadata: languageName: node linkType: hard +"electron@npm:39": + version: 39.2.1 + resolution: "electron@npm:39.2.1" + dependencies: + "@electron/get": "npm:^2.0.0" + "@types/node": "npm:^22.7.7" + extract-zip: "npm:^2.0.1" + bin: + electron: cli.js + checksum: 10c0/bb5356701d8dc36dfe49b916c39bf00161463b1e5c6c868a089616da68d7117ed32258c294281c8a7c266f50864ff3d815724d51e298ad38dd4e13ab1bab17fa + languageName: node + linkType: hard + "emoji-name-map@npm:2.0.3": version: 2.0.3 resolution: "emoji-name-map@npm:2.0.3" @@ -5620,6 +6146,13 @@ __metadata: languageName: node linkType: hard +"es6-error@npm:^4.1.1": + version: 4.1.1 + resolution: "es6-error@npm:4.1.1" + checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef + languageName: node + linkType: hard + "es6-iterator@npm:^2.0.3": version: 2.0.3 resolution: "es6-iterator@npm:2.0.3" @@ -5697,6 +6230,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + "escodegen@npm:^2.1.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -6900,6 +7440,20 @@ __metadata: languageName: node linkType: hard +"global-agent@npm:^3.0.0": + version: 3.0.0 + resolution: "global-agent@npm:3.0.0" + dependencies: + boolean: "npm:^3.0.1" + es6-error: "npm:^4.1.1" + matcher: "npm:^3.0.0" + roarr: "npm:^2.15.3" + semver: "npm:^7.3.2" + serialize-error: "npm:^7.0.1" + checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 + languageName: node + linkType: hard + "globals@npm:16.5.0, globals@npm:^16.4.0": version: 16.5.0 resolution: "globals@npm:16.5.0" @@ -6914,7 +7468,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.4": +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -6931,6 +7485,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -6945,6 +7518,13 @@ __metadata: languageName: node linkType: hard +"graphql@npm:16.12.0": + version: 16.12.0 + resolution: "graphql@npm:16.12.0" + checksum: 10c0/b6fffa4e8a4e4a9933ebe85e7470b346dbf49050c1a482fac5e03e4a1a7bed2ecd3a4c97e29f04457af929464bc5e4f2aac991090c2f320111eef26e902a5c75 + languageName: node + linkType: hard + "handle-thing@npm:^2.0.0": version: 2.0.1 resolution: "handle-thing@npm:2.0.1" @@ -7169,7 +7749,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 @@ -7277,6 +7857,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^2.2.1": version: 2.2.4 resolution: "https-proxy-agent@npm:2.2.4" @@ -7380,7 +7970,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.0, ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d @@ -7397,6 +7987,18 @@ __metadata: languageName: node linkType: hard +"import-in-the-middle@npm:^1.14.2": + version: 1.15.0 + resolution: "import-in-the-middle@npm:1.15.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-import-attributes: "npm:^1.9.5" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10c0/43d4efbe75a89c04343fd052ca5d2193adc0e2df93325e50d8b32c31403b2f089a5e2b6e47f4e5413bc4058b9781aaaf61bfe3f0e5e6d7f9487eb112fd095e0d + languageName: node + linkType: hard + "import-local@npm:3.1.0": version: 3.1.0 resolution: "import-local@npm:3.1.0" @@ -8030,7 +8632,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b @@ -8137,6 +8739,15 @@ __metadata: languageName: node linkType: hard +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + "jest-worker@npm:^27.4.5": version: 27.5.1 resolution: "jest-worker@npm:27.5.1" @@ -8185,6 +8796,13 @@ __metadata: languageName: node linkType: hard +"jsep@npm:^1.4.0": + version: 1.4.0 + resolution: "jsep@npm:1.4.0" + checksum: 10c0/fe60adf47e050e22eadced42514a51a15a3cf0e2d147896584486acd8ee670fc16641101b9aeb81f4aaba382043d29744b7aac41171e8106515b14f27e0c7116 + languageName: node + linkType: hard + "jsesc@npm:^3.0.2, jsesc@npm:^3.1.0, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -8347,6 +8965,20 @@ __metadata: languageName: node linkType: hard +"jsonpath-plus@npm:^10.3.0": + version: 10.3.0 + resolution: "jsonpath-plus@npm:10.3.0" + dependencies: + "@jsep-plugin/assignment": "npm:^1.3.0" + "@jsep-plugin/regex": "npm:^1.0.4" + jsep: "npm:^1.4.0" + bin: + jsonpath: bin/jsonpath-cli.js + jsonpath-plus: bin/jsonpath-cli.js + checksum: 10c0/f5ff53078ecab98e8afd1dcdb4488e528653fa5a03a32d671f52db1ae9c3236e6e072d75e1949a80929fd21b07603924a586f829b40ad35993fa0247fa4f7506 + languageName: node + linkType: hard + "junk@npm:^4.0.1": version: 4.0.1 resolution: "junk@npm:4.0.1" @@ -8493,7 +9125,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.4": +"keyv@npm:^4.0.0, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -8642,6 +9274,13 @@ __metadata: languageName: node linkType: hard +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: 10c0/ebe2b20a820d1f67b8e1724051246434c419b2da041a7e9cd943f6daf113b8d17a52a1bd88fb79be5b624c10283ecb737f50edb5c1c88c71f4cd367108c97300 + languageName: node + linkType: hard + "lines-and-columns@npm:2.0.3": version: 2.0.3 resolution: "lines-and-columns@npm:2.0.3" @@ -8749,6 +9388,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + languageName: node + linkType: hard + "lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -8779,6 +9425,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981 + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -8788,7 +9441,14 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2": +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb @@ -8820,7 +9480,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.14.1": +"lru-cache@npm:^7.14.0, lru-cache@npm:^7.14.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed @@ -8944,6 +9604,15 @@ __metadata: languageName: node linkType: hard +"matcher@npm:^3.0.0": + version: 3.0.0 + resolution: "matcher@npm:3.0.0" + dependencies: + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -9132,6 +9801,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -9361,6 +10044,13 @@ __metadata: languageName: node linkType: hard +"module-details-from-path@npm:^1.0.3, module-details-from-path@npm:^1.0.4": + version: 1.0.4 + resolution: "module-details-from-path@npm:1.0.4" + checksum: 10c0/10863413e96dab07dee917eae07afe46f7bf853065cc75a7d2a718adf67574857fb64f8a2c0c9af12ac733a9a8cf652db7ed39b95f7a355d08106cb9cc50c83b + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -9416,6 +10106,15 @@ __metadata: languageName: node linkType: hard +"mutexify@npm:^1.4.0": + version: 1.4.0 + resolution: "mutexify@npm:1.4.0" + dependencies: + queue-tick: "npm:^1.0.0" + checksum: 10c0/0b2fad0c671cef33ad3596d702b581e5bb3708ec7ba2913639cfb1642c7f5093af9d8793b38eafe1b723e7879d60419d2e96c5e7793271e0167833a7939ac66d + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -9495,6 +10194,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac + languageName: node + linkType: hard + "node-forge@npm:1.3.1, node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -9502,6 +10210,28 @@ __metadata: languageName: node linkType: hard +"node-gyp-build@npm:<4.0, node-gyp-build@npm:^3.9.0": + version: 3.9.0 + resolution: "node-gyp-build@npm:3.9.0" + bin: + node-gyp-build: ./bin.js + node-gyp-build-optional: ./optional.js + node-gyp-build-test: ./build-test.js + checksum: 10c0/0e7e39e5746728e6adf58803d9c3c732b6107f1af3df5128c4c2a6c9c0fb99a6c981ad0a7514d707adccbcfe303b4a92da7949408f1d3ec281f70d37bec29f60 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.5.0": + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 + languageName: node + linkType: hard + "node-gyp@npm:^11.0.0, node-gyp@npm:latest": version: 11.5.0 resolution: "node-gyp@npm:11.5.0" @@ -9578,6 +10308,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + "npm-bundled@npm:^4.0.0": version: 4.0.0 resolution: "npm-bundled@npm:4.0.0" @@ -10008,6 +10745,13 @@ __metadata: languageName: node linkType: hard +"opentracing@npm:>=0.14.7": + version: 0.14.7 + resolution: "opentracing@npm:0.14.7" + checksum: 10c0/a7be8d697b1997548233423f5f4c196e285af8e864a24d7704fc6029beb73cd1f987651ca814e207629c6bc624cb03297a86601c0dc51cdca9a07a20f97b71ea + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -10049,6 +10793,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -10074,7 +10825,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -10452,7 +11203,7 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.12": +"path-to-regexp@npm:0.1.12, path-to-regexp@npm:^0.1.12": version: 0.1.12 resolution: "path-to-regexp@npm:0.1.12" checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b @@ -10681,6 +11432,13 @@ __metadata: languageName: node linkType: hard +"pprof-format@npm:^2.1.1, pprof-format@npm:^2.2.1": + version: 2.2.1 + resolution: "pprof-format@npm:2.2.1" + checksum: 10c0/1c8051b3e3ebba1ac2b8d7cf0a84ce501fdabe5e72a803c7daa6ddf67cbee33e9b5d6dbc6ffbeb740e3e56600c875f372576304ed718a4ffa4c89c18185494ae + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -10795,6 +11553,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.5.3": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.0.0" + checksum: 10c0/913b676109ffb3c05d3d31e03a684e569be91f3bba8613da4a683d69d9dba948daa2afd7d2e7944d1aa6c417890c35d9d9a8883c1160affafb0f9670d59ef722 + languageName: node + linkType: hard + "protocols@npm:^2.0.0, protocols@npm:^2.0.1": version: 2.0.2 resolution: "protocols@npm:2.0.2" @@ -10947,6 +11725,13 @@ __metadata: languageName: node linkType: hard +"queue-tick@npm:^1.0.0": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -10954,6 +11739,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -11391,6 +12183,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -11447,6 +12246,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -11478,7 +12286,7 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": +"rfdc@npm:^1.3.0, rfdc@npm:^1.4.1": version: 1.4.1 resolution: "rfdc@npm:1.4.1" checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 @@ -11529,6 +12337,20 @@ __metadata: languageName: node linkType: hard +"roarr@npm:^2.15.3": + version: 2.15.4 + resolution: "roarr@npm:2.15.4" + dependencies: + boolean: "npm:^3.0.1" + detect-node: "npm:^2.0.4" + globalthis: "npm:^1.0.1" + json-stringify-safe: "npm:^5.0.1" + semver-compare: "npm:^1.0.0" + sprintf-js: "npm:^1.1.2" + checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec + languageName: node + linkType: hard + "router@npm:^2.2.0": version: 2.2.0 resolution: "router@npm:2.2.0" @@ -11683,6 +12505,20 @@ __metadata: languageName: node linkType: hard +"semifies@npm:^1.0.0": + version: 1.0.0 + resolution: "semifies@npm:1.0.0" + checksum: 10c0/d93d5e8d2c0b7d5f972b9378736ed5cc1f2ab40d043234b4156665872f08cb0da914ee8c8b35c59dc6b17880a4c5502588c7515c6bb4dbc3ce5565746428d31d + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -11701,7 +12537,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -11710,7 +12546,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -11759,6 +12595,15 @@ __metadata: languageName: node linkType: hard +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + "serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -11897,7 +12742,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.8.3": +"shell-quote@npm:^1.8.2, shell-quote@npm:^1.8.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd @@ -12115,6 +12960,13 @@ __metadata: languageName: node linkType: hard +"spark-md5@npm:^3.0.2": + version: 3.0.2 + resolution: "spark-md5@npm:3.0.2" + checksum: 10c0/3fd11735eac5e7d60d6006d99ac0a055f148a89e9baf5f0b51ac103022dec30556b44190b37f6737ca50f81e8e50dc13e724f9edf6290c412ff5ab2101ce7780 + languageName: node + linkType: hard + "spdx-correct@npm:^3.0.0": version: 3.2.0 resolution: "spdx-correct@npm:3.2.0" @@ -12213,6 +13065,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:^1.1.2": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -12454,6 +13313,15 @@ __metadata: languageName: node linkType: hard +"sumchecker@npm:^3.0.1": + version: 3.0.1 + resolution: "sumchecker@npm:3.0.1" + dependencies: + debug: "npm:^4.1.0" + checksum: 10c0/43c387be9dfe22dbeaf39dfa4ffb279847aeb37a42a8988c0b066f548bbd209aa8c65e03da29f2b29be1a66b577801bf89fff0007df4183db2f286263a9569e5 + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -12728,6 +13596,13 @@ __metadata: languageName: node linkType: hard +"tlhunter-sorted-set@npm:^0.1.0": + version: 0.1.0 + resolution: "tlhunter-sorted-set@npm:0.1.0" + checksum: 10c0/fd07870aa75331fb7823e68604fda3bafb6aaef5cea8d342a3c24096635fd2c70273a330b00013e51cbde25272ae599de1270edeff972bd3c32e1c78e714edc6 + languageName: node + linkType: hard + "tmp@npm:^0.2.1, tmp@npm:~0.2.1": version: 0.2.5 resolution: "tmp@npm:0.2.5" @@ -12898,6 +13773,15 @@ __metadata: languageName: node linkType: hard +"ttl-set@npm:^1.0.0": + version: 1.0.0 + resolution: "ttl-set@npm:1.0.0" + dependencies: + fast-fifo: "npm:^1.3.2" + checksum: 10c0/ef260c2a903c4ab05090d4dbc21ddb738d7f38fd9680570582414b9115a7c358796c82f5b19067262eabb7476e43b7a2f02e3bb4cace85edee3242aee745d4d3 + languageName: node + linkType: hard + "tuf-js@npm:^3.0.1": version: 3.1.0 resolution: "tuf-js@npm:3.1.0" @@ -12929,6 +13813,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + "type-fest@npm:^0.18.0": version: 0.18.1 resolution: "type-fest@npm:0.18.1" @@ -13148,6 +14039,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0"