diff --git a/.github/dependency-review-config.yml b/.github/dependency-review-config.yml new file mode 100644 index 000000000..d18bc5e76 --- /dev/null +++ b/.github/dependency-review-config.yml @@ -0,0 +1,16 @@ +# Configuration for the org-level dependency-review workflow. +# +# electron is a devDependency only (used to build and test the SDK, it is never +# shipped to consumers) so these Electron advisories do not affect downstream +# apps, which pin their own Electron version. They are flagged against the floor +# of our supported range (35.7.5); newer Electron versions we test against are +# patched. +fail-on-severity: 'high' +allow-ghsas: + - GHSA-v3j7-r9gq-3gjw # Electron: custom protocol supportFetchAPI cross-origin reads + - GHSA-9wfr-w7mm-pc7f # Electron: renderer command-line switch injection + - GHSA-jjp3-mq3x-295m # Electron: use-after-free in PowerMonitor + - GHSA-8337-3p73-46f4 # Electron: use-after-free in WebContents permission callbacks + - GHSA-h7rp-cf8h-j98x # Electron: context isolation bypass via Function.prototype.bind + - GHSA-532v-xpq5-8h95 # Electron: use-after-free in offscreen paint callback + - GHSA-9f4c-93c8-jc8g # Electron: sandboxed iframe allow-popups bypass diff --git a/MIGRATION.md b/MIGRATION.md index ee7cb43cd..e9198a503 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,10 +1,18 @@ This document details the changes between major versions of the Sentry Electron SDK. +- [Upgrading from 7.x to 8.x](#upgrading-from-7x-to-8x) - [Upgrading from 6.x to 7.x](#upgrading-from-6x-to-7x) - [Upgrading from 5.x to 6.x](#upgrading-from-5x-to-6x) - [Upgrading from 4.x to 5.x](#upgrading-from-4x-to-5x) +# Upgrading from 7.x to 8.x + +## Supported Electron Versions + +The Sentry Node SDK now requires Node >= 20.19.0 which means the Sentry Electron +SDK now supports Electron >= 35.0.0. + # Upgrading from 6.x to 7.x Most users won't notice many breaking API changes in v7 but it's worth checking diff --git a/README.md b/README.md index d52099e05..ceed89ff4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Test](https://github.com/getsentry/sentry-electron/actions/workflows/build.yml/b [`@sentry/browser`](https://github.com/getsentry/sentry-javascript/tree/master/packages/browser)) - Captures **native crashes** (Minidump crash reports) from renderers and the main process - Collects **breadcrumbs and context** information along with events across renderers and the main process -- Supports `electron >= v23` +- Supports `electron >= v35` ## Usage diff --git a/package.json b/package.json index c2420497b..99d696781 100644 --- a/package.json +++ b/package.json @@ -105,13 +105,14 @@ "e2e": "xvfb-maybe vitest run --root=./test/e2e --silent=false --disable-console-intercept" }, "dependencies": { - "@sentry/browser": "10.73.0", - "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.73.0", - "@sentry/node": "10.73.0" + "@sentry/browser": "11.0.0-rc.0", + "@sentry/conventions": "^0.23.0", + "@sentry/core": "11.0.0-rc.0", + "@sentry/node": "11.0.0-rc.0", + "@sentry/server-utils": "11.0.0-rc.0" }, "peerDependencies": { - "@sentry/node-native": "10.73.0" + "@sentry/node-native": "11.0.0-rc.0" }, "peerDependenciesMeta": { "@sentry/node-native": { @@ -120,14 +121,14 @@ }, "devDependencies": { "@rollup/plugin-typescript": "^12.1.3", - "@sentry/eslint-plugin-sdk": "10.73.0", - "@sentry/node-native": "10.73.0", + "@sentry/eslint-plugin-sdk": "11.0.0-rc.0", + "@sentry/node-native": "11.0.0-rc.0", "@types/busboy": "^1.5.4", "@types/koa": "^2.0.52", "@types/koa-bodyparser": "^4.3.0", "@types/tmp": "^0.2.2", "busboy": "^1.6.0", - "electron": "^25.9.8", + "electron": "^35.7.5", "extract-zip": "^2.0.1", "koa": "^3.0.1", "koa-bodyparser": "^4.3.0", diff --git a/scripts/update-electron-versions.mjs b/scripts/update-electron-versions.mjs index d08d2484e..179e07995 100644 --- a/scripts/update-electron-versions.mjs +++ b/scripts/update-electron-versions.mjs @@ -9,7 +9,7 @@ const result = spawnSync('npm', ['view', 'electron', 'dist-tags', '--json'], { e const allTags = JSON.parse(result.stdout); const versions = []; -let startVersion = 23; +let startVersion = 35; while (true) { const versionTag = `${startVersion}-x-y`; diff --git a/src/main/index.ts b/src/main/index.ts index 4b8c9bf9e..ff3f55434 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -22,7 +22,6 @@ export { addIntegration, amqplibIntegration, anthropicAIIntegration, - applyDiagnosticsChannelInjectionIntegrations, bindScopeToEmitter, buildLaunchDarklyFlagUsedHandler, captureCheckIn, @@ -33,12 +32,12 @@ export { captureMessage, captureSession, close, - connectIntegration, consoleIntegration, consoleLoggingIntegration, contextLinesIntegration, continueTrace, createConsolaReporter, + createFlueInstrumentation, createGetModuleFromFilename, createLangChainCallbackHandler, createSentryWinstonTransport, @@ -46,8 +45,8 @@ export { cron, dataloaderIntegration, dedupeIntegration, - diagnosticsChannelInjectionIntegrations, endSession, + eveConversationHook, eventFiltersIntegration, expressErrorHandler, expressIntegration, @@ -58,14 +57,15 @@ export { flush, fsIntegration, functionToStringIntegration, - generateInstrumentOnce, genericPoolIntegration, getActiveSpan, getAutoPerformanceIntegrations, getClient, getCurrentScope, getGlobalScope, + getInstrumentedModuleNames, getIsolationScope, + getOtlpTracesEndpoint, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, @@ -75,23 +75,19 @@ export { growthbookIntegration, graphqlIntegration, hapiIntegration, - honoIntegration, httpHeadersToSpanAttributes, httpIntegration, httpServerIntegration, httpServerSpansIntegration, - // eslint-disable-next-line deprecation/deprecation - inboundFiltersIntegration, initOpenTelemetry, instrumentAnthropicAiClient, instrumentGoogleGenAIClient, instrumentLangChainEmbeddings, - instrumentLangGraph, + instrumentMistralAiClient, instrumentOpenAiClient, instrumentStateGraph, instrumentStateGraphCompile, instrumentSupabaseClient, - isDiagnosticsChannelInjectionEnabled, isEnabled, isInitialized, kafkaIntegration, @@ -105,7 +101,9 @@ export { localVariablesIntegration, logger, lruMemoizerIntegration, + mastraIntegration, metrics, + mistralAIIntegration, modulesIntegration, mongoIntegration, mongooseIntegration, @@ -119,6 +117,7 @@ export { openAIIntegration, OpenFeatureIntegrationHook, openFeatureIntegration, + openTelemetryIntegration, parameterize, pinoIntegration, postgresIntegration, @@ -129,11 +128,11 @@ export { requestDataIntegration, rewriteFramesIntegration, Scope, + SentryMastraExporter, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, - SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, - SentryContextManager, + SENTRY_SEGMENT_NAME_SOURCE, setAttribute, setAttributes, setConversationId, @@ -143,19 +142,18 @@ export { setExtras, setHttpStatus, setMeasurement, - setNodeAsyncContextStrategy, + setOpenTelemetryContextAsyncContextStrategy, setTag, setTags, - setupConnectErrorHandler, setupExpressErrorHandler, setupFastifyErrorHandler, setupHapiErrorHandler, - setupHonoErrorHandler, setupKoaErrorHandler, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, + spanToStaticSpanJSON, spanToTraceHeader, spotlightIntegration, startInactiveSpan, @@ -171,14 +169,14 @@ export { trpcMiddleware, unleashIntegration, updateSpanName, - experimentalUseDiagnosticsChannelInjection, - validateOpenTelemetrySetup, winterCGHeadersToDict, withActiveSpan, withIsolationScope, withMonitor, withScope, + withStaticSpan, withStreamedSpan, + workerThreadsIntegration, wrapMcpServerWithSentry, zodErrorsIntegration, } from '@sentry/node'; diff --git a/src/main/integrations/renderer-anr.ts b/src/main/integrations/renderer-anr.ts index 66273a622..e7a32e1bd 100644 --- a/src/main/integrations/renderer-anr.ts +++ b/src/main/integrations/renderer-anr.ts @@ -1,12 +1,6 @@ import type { Client, Event, Integration, StackFrame } from '@sentry/core'; -import { - callFrameToStackFrame, - captureEvent, - debug, - defineIntegration, - stripSentryFramesAndReverse, - watchdogTimer, -} from '@sentry/core'; +import { captureEvent, debug, defineIntegration, stripSentryFramesAndReverse } from '@sentry/core'; +import { callFrameToStackFrame, watchdogTimer } from '@sentry/core/server'; import { createGetModuleFromFilename } from '@sentry/node'; import type { WebContents } from 'electron'; import { app, powerMonitor } from 'electron'; diff --git a/src/main/sdk.ts b/src/main/sdk.ts index 44c8ad179..32deacb71 100644 --- a/src/main/sdk.ts +++ b/src/main/sdk.ts @@ -12,14 +12,12 @@ import { eventFiltersIntegration, functionToStringIntegration, getCurrentScope, - initOpenTelemetry, linkedErrorsIntegration, localVariablesIntegration, nativeNodeFetchIntegration, NodeClient, nodeContextIntegration, onUnhandledRejectionIntegration, - setNodeAsyncContextStrategy, } from '@sentry/node'; import type { Session, WebContents } from 'electron'; import { session } from 'electron'; @@ -155,23 +153,17 @@ export type ElectronMainOptions = Pick< Omit & NodeOptions; -function resolveUserInfo(options: ElectronMainOptions): boolean { - const base = options.dataCollection != null ? true : !!options.sendDefaultPii; - const dc = options.dataCollection ?? {}; - return dc.userInfo ?? base; -} - /** * Initialize Sentry in the Electron main process */ export function init(userOptions: ElectronMainOptions): void { const [major = 0] = process.versions.electron.split('.').map(Number); - if (major < 23) { - throw new Error('Sentry Electron SDK requires Electron 23 or higher'); + if (major < 35) { + throw new Error('Sentry Electron SDK requires Electron 35 or higher'); } - const inferIpAddress = resolveUserInfo(userOptions); + const inferIpAddress = userOptions.dataCollection?.userInfo ?? true; const optionsWithDefaults = { _metadata: { sdk: getSdkInfo(inferIpAddress) }, @@ -200,8 +192,6 @@ export function init(userOptions: ElectronMainOptions): void { removeRedundantIntegrations(options); configureUtilityProcessIPC(); - setNodeAsyncContextStrategy(); - const scope = getCurrentScope(); scope.update(options.initialScope); @@ -223,12 +213,6 @@ export function init(userOptions: ElectronMainOptions): void { client.init(); configureIPC(client, options); - - // If users opt-out of this, they _have_ to set up OpenTelemetry themselves - // There is no way to use this SDK without OpenTelemetry! - if (!options.skipOpenTelemetrySetup) { - initOpenTelemetry(client); - } } /** A list of integrations which cause default integrations to be removed */ diff --git a/src/main/stack-parse.ts b/src/main/stack-parse.ts index 4bbac112a..0710804c0 100644 --- a/src/main/stack-parse.ts +++ b/src/main/stack-parse.ts @@ -1,5 +1,6 @@ import type { StackFrame, StackParser } from '@sentry/core'; -import { createStackParser, debug, nodeStackLineParser } from '@sentry/core'; +import { createStackParser, debug } from '@sentry/core'; +import { nodeStackLineParser } from '@sentry/core/server'; import { createGetModuleFromFilename } from '@sentry/node'; import type { WebContents, WebFrameMain } from 'electron'; import { app } from 'electron'; diff --git a/src/main/transports/electron-net.ts b/src/main/transports/electron-net.ts index bde1efdb3..aa43df0ef 100644 --- a/src/main/transports/electron-net.ts +++ b/src/main/transports/electron-net.ts @@ -41,7 +41,7 @@ function getRequestOptions(url: string): Electron.ClientRequestConstructorOption hostname, path: `${pathname}${search}`, port: parseInt(port, 10), - protocol, + protocol: protocol as 'http:' | 'https:', // Use a non-persistent in-memory session to avoid triggering a macOS keychain // prompt during Chromium's cookie-store initialization of the default session. partition: 'sentry-electron', diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 4ae62f7ef..2b54d7a5b 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -24,6 +24,7 @@ export { addBreadcrumb, addEventProcessor, addIntegration, + bfcacheMetricsIntegration, bindScopeToEmitter, breadcrumbsIntegration, browserApiErrorsIntegration, @@ -39,11 +40,11 @@ export { captureMessage, captureSession, chromeStackLineParser, + consoleIntegration, consoleLoggingIntegration, contextLinesIntegration, continueTrace, createConsolaReporter, - createLangChainCallbackHandler, createTransport, createUserFeedbackEnvelope, dedupeIntegration, @@ -79,17 +80,9 @@ export { growthbookIntegration, httpClientIntegration, httpContextIntegration, - // eslint-disable-next-line deprecation/deprecation - inboundFiltersIntegration, - instrumentAnthropicAiClient, - instrumentCreateReactAgent, - instrumentGoogleGenAIClient, - instrumentLangChainEmbeddings, - instrumentLangGraph, - instrumentOpenAiClient, instrumentOutgoingRequests, - instrumentStateGraph, instrumentSupabaseClient, + interactionsIntegration, isBotUserAgent, isEnabled, isInitialized, @@ -113,7 +106,7 @@ export { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, - SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, + SENTRY_SEGMENT_NAME_SOURCE, sendFeedback, setActiveSpanInBrowser, setAttribute, @@ -132,6 +125,7 @@ export { spanStreamingIntegration, spanToBaggageHeader, spanToJSON, + spanToStaticSpanJSON, spanToTraceHeader, spotlightBrowserIntegration, startBrowserTracingNavigationSpan, @@ -146,6 +140,7 @@ export { suppressTracing, thirdPartyErrorFilterIntegration, uiProfiler, + userTimingIntegration, unleashIntegration, updateSpanName, webVitalsIntegration, @@ -153,6 +148,7 @@ export { withActiveSpan, withIsolationScope, withScope, + withStaticSpan, withStreamedSpan, viewHierarchyIntegration, zodErrorsIntegration, diff --git a/src/renderer/sdk.ts b/src/renderer/sdk.ts index 4c87d47af..77f38c387 100644 --- a/src/renderer/sdk.ts +++ b/src/renderer/sdk.ts @@ -49,7 +49,7 @@ interface ElectronRendererOptions extends Partial( options: ElectronRendererOptions & O = {} as ElectronRendererOptions & O, // This parameter name ensures that TypeScript error messages contain a hint for fixing SDK version mismatches - originalInit: (if_you_get_a_typescript_error_ensure_sdks_use_version_v10_73_0: O) => void = browserInit, + originalInit: (if_you_get_a_typescript_error_ensure_sdks_use_version_v11_0_0_rc_0: O) => void = browserInit, ): void { // Ensure the browser SDK is only init'ed once. if (window?.__SENTRY__RENDERER_INIT__) { diff --git a/src/renderer/stack-parse.ts b/src/renderer/stack-parse.ts index 85fb723f9..3a34c4951 100644 --- a/src/renderer/stack-parse.ts +++ b/src/renderer/stack-parse.ts @@ -1,6 +1,7 @@ import { chromeStackLineParser } from '@sentry/browser'; import type { StackFrame, StackParser } from '@sentry/core'; -import { nodeStackLineParser, stripSentryFramesAndReverse } from '@sentry/core'; +import { stripSentryFramesAndReverse } from '@sentry/core'; +import { nodeStackLineParser } from '@sentry/core/server'; const STACKTRACE_FRAME_LIMIT = 50; diff --git a/src/utility/index.ts b/src/utility/index.ts index 5a424becf..16635e8ab 100644 --- a/src/utility/index.ts +++ b/src/utility/index.ts @@ -22,7 +22,6 @@ export { addIntegration, amqplibIntegration, anthropicAIIntegration, - applyDiagnosticsChannelInjectionIntegrations, bindScopeToEmitter, buildLaunchDarklyFlagUsedHandler, captureCheckIn, @@ -34,12 +33,12 @@ export { captureSession, childProcessIntegration, close, - connectIntegration, consoleIntegration, consoleLoggingIntegration, contextLinesIntegration, continueTrace, createConsolaReporter, + createFlueInstrumentation, createGetModuleFromFilename, createLangChainCallbackHandler, createSentryWinstonTransport, @@ -47,8 +46,8 @@ export { cron, dataloaderIntegration, dedupeIntegration, - diagnosticsChannelInjectionIntegrations, endSession, + eveConversationHook, eventFiltersIntegration, expressErrorHandler, expressIntegration, @@ -59,14 +58,15 @@ export { flush, fsIntegration, functionToStringIntegration, - generateInstrumentOnce, genericPoolIntegration, getActiveSpan, getAutoPerformanceIntegrations, getClient, getCurrentScope, getGlobalScope, + getInstrumentedModuleNames, getIsolationScope, + getOtlpTracesEndpoint, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, @@ -76,23 +76,19 @@ export { growthbookIntegration, graphqlIntegration, hapiIntegration, - honoIntegration, httpHeadersToSpanAttributes, httpIntegration, httpServerIntegration, httpServerSpansIntegration, - // eslint-disable-next-line deprecation/deprecation - inboundFiltersIntegration, initOpenTelemetry, instrumentAnthropicAiClient, instrumentGoogleGenAIClient, instrumentLangChainEmbeddings, - instrumentLangGraph, + instrumentMistralAiClient, instrumentOpenAiClient, instrumentStateGraph, instrumentStateGraphCompile, instrumentSupabaseClient, - isDiagnosticsChannelInjectionEnabled, isEnabled, isInitialized, kafkaIntegration, @@ -106,7 +102,9 @@ export { localVariablesIntegration, logger, lruMemoizerIntegration, + mastraIntegration, metrics, + mistralAIIntegration, modulesIntegration, mongoIntegration, mongooseIntegration, @@ -121,6 +119,7 @@ export { openAIIntegration, OpenFeatureIntegrationHook, openFeatureIntegration, + openTelemetryIntegration, parameterize, pinoIntegration, postgresIntegration, @@ -131,11 +130,11 @@ export { requestDataIntegration, rewriteFramesIntegration, Scope, + SentryMastraExporter, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, - SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, - SentryContextManager, + SENTRY_SEGMENT_NAME_SOURCE, setAttribute, setAttributes, setConversationId, @@ -145,19 +144,18 @@ export { setExtras, setHttpStatus, setMeasurement, - setNodeAsyncContextStrategy, + setOpenTelemetryContextAsyncContextStrategy, setTag, setTags, - setupConnectErrorHandler, setupExpressErrorHandler, setupFastifyErrorHandler, setupHapiErrorHandler, - setupHonoErrorHandler, setupKoaErrorHandler, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, + spanToStaticSpanJSON, spanToTraceHeader, spotlightIntegration, startInactiveSpan, @@ -173,14 +171,14 @@ export { trpcMiddleware, unleashIntegration, updateSpanName, - experimentalUseDiagnosticsChannelInjection, - validateOpenTelemetrySetup, winterCGHeadersToDict, withActiveSpan, withIsolationScope, withMonitor, withScope, + withStaticSpan, withStreamedSpan, + workerThreadsIntegration, wrapMcpServerWithSentry, zodErrorsIntegration, } from '@sentry/node'; diff --git a/src/utility/sdk.ts b/src/utility/sdk.ts index df59c65a9..3c0ffa6b3 100644 --- a/src/utility/sdk.ts +++ b/src/utility/sdk.ts @@ -1,11 +1,6 @@ import type { Integration, StackParser } from '@sentry/core'; -import { - createStackParser, - debug, - getIntegrationsToSetup, - nodeStackLineParser, - stackParserFromStackParserOptions, -} from '@sentry/core'; +import { createStackParser, debug, getIntegrationsToSetup, stackParserFromStackParserOptions } from '@sentry/core'; +import { nodeStackLineParser } from '@sentry/core/server'; import type { NodeOptions } from '@sentry/node'; import { consoleIntegration, @@ -13,13 +8,11 @@ import { eventFiltersIntegration, functionToStringIntegration, getCurrentScope, - initOpenTelemetry, linkedErrorsIntegration, nativeNodeFetchIntegration, NodeClient, onUncaughtExceptionIntegration, onUnhandledRejectionIntegration, - setNodeAsyncContextStrategy, } from '@sentry/node'; import { makeUtilityProcessTransport } from './transport.js'; @@ -65,18 +58,10 @@ export function init(userOptions: NodeOptions = {}): void { debug.enable(); } - setNodeAsyncContextStrategy(); - const scope = getCurrentScope(); scope.update(options.initialScope); const client = new NodeClient(options); scope.setClient(client); client.init(); - - // If users opt-out of this, they _have_ to set up OpenTelemetry themselves - // There is no way to use this SDK without OpenTelemetry! - if (!options.skipOpenTelemetrySetup) { - initOpenTelemetry(client); - } } diff --git a/test/e2e/test-apps/javascript/main-error/src/main.js b/test/e2e/test-apps/javascript/main-error/src/main.js index 2b96a4c15..81f678d7a 100644 --- a/test/e2e/test-apps/javascript/main-error/src/main.js +++ b/test/e2e/test-apps/javascript/main-error/src/main.js @@ -6,7 +6,6 @@ const { init } = require('@sentry/electron/main'); init({ dsn: '__DSN__', debug: true, - sendDefaultPii: true, onFatalError: () => {}, }); diff --git a/test/e2e/test-apps/other/browser-profiling-manual/src/index.html b/test/e2e/test-apps/other/browser-profiling-manual/src/index.html index 76361f16b..7ffb6e501 100644 --- a/test/e2e/test-apps/other/browser-profiling-manual/src/index.html +++ b/test/e2e/test-apps/other/browser-profiling-manual/src/index.html @@ -6,7 +6,12 @@ - - diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-manual/src/main.js b/test/e2e/test-apps/span-streaming/browser-profiling-manual/src/main.js deleted file mode 100644 index 9be074235..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-manual/src/main.js +++ /dev/null @@ -1,25 +0,0 @@ -const path = require('path'); - -const { app, BrowserWindow } = require('electron'); -const { init } = require('@sentry/electron/main'); - -init({ - dsn: '__DSN__', - debug: true, - release: 'some-release', - enableRendererProfiling: true, - traceLifecycle: 'stream', - onFatalError: () => {}, -}); - -app.on('ready', () => { - const mainWindow = new BrowserWindow({ - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - - mainWindow.loadFile(path.join(__dirname, 'index.html')); -}); diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-manual/test.ts b/test/e2e/test-apps/span-streaming/browser-profiling-manual/test.ts deleted file mode 100644 index 3262c7a63..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-manual/test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type { StreamedSpanJSON } from '@sentry/core'; -import { expect } from 'vitest'; -import { electronTestRunner, profileChunkEnvelope, SHORT_UUID_MATCHER, spanEnvelope, UUID_MATCHER } from '../../..'; - -// A child span for each `startSpan({ name: 'PBKDF2' })` call in the renderer -function pbkdf2Span(): StreamedSpanJSON { - return { - name: 'PBKDF2', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - parent_span_id: SHORT_UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: false, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.origin': { value: 'manual', type: 'string' }, - 'sentry.environment': { value: 'production', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.browser', type: 'string' }, - }), - }; -} - -electronTestRunner(__dirname, async (ctx) => { - await ctx - .ignoreExpectationOrder() - // The transaction is streamed as a span envelope. UI profiling attaches the - // profiler id to the segment span rather than a profile context. - .expect({ - envelope: spanEnvelope( - 'Long work', - [ - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - { - name: 'Long work', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.origin': { value: 'manual', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - 'sentry.sample_rate': { value: 1, type: 'integer' }, - 'sentry.environment': { value: 'production', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.browser', type: 'string' }, - 'sentry.profiler_id': { value: UUID_MATCHER, type: 'string' }, - 'sentry.segment.name.source': { value: 'custom', type: 'string' }, - }), - }, - ], - { ingest_settings: { infer_ip: 'never', infer_user_agent: 'never' } }, - ), - }) - // Expect the profile_chunk envelope from UI profiling - .expect({ - envelope: profileChunkEnvelope({ - release: 'some-release', - environment: 'development', - profile: expect.objectContaining({ - samples: expect.arrayContaining([ - expect.objectContaining({ - stack_id: expect.any(Number), - thread_id: expect.any(String), - timestamp: expect.any(Number), - }), - ]), - stacks: expect.any(Array), - frames: expect.arrayContaining([ - expect.objectContaining({ - function: expect.any(String), - abs_path: expect.stringContaining('app:///'), - }), - ]), - thread_metadata: expect.any(Object), - }), - }), - }) - .run(); -}); diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-trace/package.json b/test/e2e/test-apps/span-streaming/browser-profiling-trace/package.json deleted file mode 100644 index 913635a6e..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-trace/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "browser-profiling-trace", - "description": "Browser Profiling with Trace Lifecycle (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "dependencies": { - "@sentry/electron": "5.6.0" - } -} diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/index.html b/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/index.html deleted file mode 100644 index d214247d3..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/main.js b/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/main.js deleted file mode 100644 index 9be074235..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-trace/src/main.js +++ /dev/null @@ -1,25 +0,0 @@ -const path = require('path'); - -const { app, BrowserWindow } = require('electron'); -const { init } = require('@sentry/electron/main'); - -init({ - dsn: '__DSN__', - debug: true, - release: 'some-release', - enableRendererProfiling: true, - traceLifecycle: 'stream', - onFatalError: () => {}, -}); - -app.on('ready', () => { - const mainWindow = new BrowserWindow({ - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - - mainWindow.loadFile(path.join(__dirname, 'index.html')); -}); diff --git a/test/e2e/test-apps/span-streaming/browser-profiling-trace/test.ts b/test/e2e/test-apps/span-streaming/browser-profiling-trace/test.ts deleted file mode 100644 index ce1df046f..000000000 --- a/test/e2e/test-apps/span-streaming/browser-profiling-trace/test.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type { StreamedSpanJSON } from '@sentry/core'; -import { expect } from 'vitest'; -import { electronTestRunner, profileChunkEnvelope, SHORT_UUID_MATCHER, spanEnvelope, UUID_MATCHER } from '../../..'; - -// A child span for each `startSpan({ name: 'PBKDF2' })` call in the renderer -function pbkdf2Span(): StreamedSpanJSON { - return { - name: 'PBKDF2', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - parent_span_id: SHORT_UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: false, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.origin': { value: 'manual', type: 'string' }, - 'sentry.environment': { value: 'production', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.browser', type: 'string' }, - }), - }; -} - -electronTestRunner(__dirname, async (ctx) => { - await ctx - .ignoreExpectationOrder() - // The transaction is streamed as a span envelope. In trace mode the profiler - // automatically starts/stops with the span and attaches its id to the segment. - .expect({ - envelope: spanEnvelope( - 'Long work', - [ - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - { - name: 'Long work', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.origin': { value: 'manual', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - 'sentry.sample_rate': { value: 1, type: 'integer' }, - 'sentry.environment': { value: 'production', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.browser', type: 'string' }, - 'sentry.profiler_id': { value: UUID_MATCHER, type: 'string' }, - 'sentry.segment.name.source': { value: 'custom', type: 'string' }, - }), - }, - ], - { ingest_settings: { infer_ip: 'never', infer_user_agent: 'never' } }, - ), - }) - // Expect the profile_chunk envelope from UI profiling in trace mode - .expect({ - envelope: profileChunkEnvelope({ - release: 'some-release', - environment: 'development', - profile: expect.objectContaining({ - samples: expect.arrayContaining([ - expect.objectContaining({ - stack_id: expect.any(Number), - thread_id: expect.any(String), - timestamp: expect.any(Number), - }), - ]), - stacks: expect.any(Array), - frames: expect.arrayContaining([ - expect.objectContaining({ - function: expect.any(String), - abs_path: expect.stringContaining('app:///'), - }), - ]), - thread_metadata: expect.any(Object), - }), - }), - }) - .run(); -}); diff --git a/test/e2e/test-apps/span-streaming/browser-tracing/package.json b/test/e2e/test-apps/span-streaming/browser-tracing/package.json deleted file mode 100644 index fcdd9d4c7..000000000 --- a/test/e2e/test-apps/span-streaming/browser-tracing/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "browser-tracing", - "description": "Browser Tracing (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "dependencies": { - "@sentry/electron": "5.6.0" - } -} diff --git a/test/e2e/test-apps/span-streaming/browser-tracing/src/index.html b/test/e2e/test-apps/span-streaming/browser-tracing/src/index.html deleted file mode 100644 index 07b8e507c..000000000 --- a/test/e2e/test-apps/span-streaming/browser-tracing/src/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/test/e2e/test-apps/span-streaming/browser-tracing/src/main.js b/test/e2e/test-apps/span-streaming/browser-tracing/src/main.js deleted file mode 100644 index 8e48f3db3..000000000 --- a/test/e2e/test-apps/span-streaming/browser-tracing/src/main.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require('path'); - -const { app, BrowserWindow } = require('electron'); -const { init } = require('@sentry/electron/main'); - -init({ - dsn: '__DSN__', - debug: true, - release: 'some-release', - traceLifecycle: 'stream', - onFatalError: () => {}, -}); - -app.on('ready', () => { - const mainWindow = new BrowserWindow({ - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - - mainWindow.loadFile(path.join(__dirname, 'index.html')); -}); diff --git a/test/e2e/test-apps/span-streaming/browser-tracing/test.ts b/test/e2e/test-apps/span-streaming/browser-tracing/test.ts deleted file mode 100644 index 52e038005..000000000 --- a/test/e2e/test-apps/span-streaming/browser-tracing/test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { expect } from 'vitest'; -import { electronTestRunner, getSpansFromEnvelope } from '../../..'; - -electronTestRunner( - __dirname, - { - // Browser Tracing fails on Electron v24 - skip: (electronVersion) => electronVersion.major === 24, - }, - async (ctx) => { - await ctx - .expect({ - // The browser pageload transaction is streamed as a span envelope. The exact - // set of `browser.*` performance metric spans varies between Electron/Chromium - // versions, so we assert the pageload segment and the presence of the key - // metric spans rather than an exact list. - envelope: (envelope) => { - const [header] = envelope; - expect(header.sdk).toEqual({ name: 'sentry.javascript.electron', version: expect.any(String) }); - - const spans = getSpansFromEnvelope(envelope); - expect(spans).toBeDefined(); - - // The segment is the browser pageload span - const segment = spans?.find((s) => s.is_segment); - expect(segment).toMatchObject({ - name: 'app:///src/index.html', - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.op': { value: 'pageload', type: 'string' }, - 'sentry.origin': { value: 'auto.pageload.browser', type: 'string' }, - 'sentry.source': { value: 'url', type: 'string' }, - 'sentry.sample_rate': { value: 1, type: 'integer' }, - }), - }); - - // All spans share the same trace - for (const span of spans ?? []) { - expect(span.trace_id).toEqual(segment?.trace_id); - } - - // The key browser performance metric spans are present as children - const ops = (spans ?? []).map( - (s) => (s.attributes as Record | undefined)?.['sentry.op']?.value, - ); - for (const op of ['browser.connect', 'browser.cache', 'browser.DNS', 'browser.request', 'browser.response']) { - expect(ops).toContain(op); - } - }, - }) - .run(); - }, -); diff --git a/test/e2e/test-apps/span-streaming/custom-tracing/package.json b/test/e2e/test-apps/span-streaming/custom-tracing/package.json deleted file mode 100644 index eb99c6661..000000000 --- a/test/e2e/test-apps/span-streaming/custom-tracing/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "custom-tracing", - "description": "Custom Tracing (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "dependencies": { - "@sentry/electron": "5.6.0" - } -} diff --git a/test/e2e/test-apps/span-streaming/custom-tracing/src/main.js b/test/e2e/test-apps/span-streaming/custom-tracing/src/main.js deleted file mode 100644 index 7e96e7fe5..000000000 --- a/test/e2e/test-apps/span-streaming/custom-tracing/src/main.js +++ /dev/null @@ -1,22 +0,0 @@ -// eslint-disable-next-line import/order -const { app } = require('electron'); - -const Sentry = require('@sentry/electron/main'); - -Sentry.init({ - dsn: '__DSN__', - debug: true, - tracesSampleRate: 1.0, - traceLifecycle: 'stream', - onFatalError: () => {}, -}); - -async function doTransaction() { - await Sentry.startSpan({ name: 'InitSequence', op: 'task' }, async () => { - await Sentry.startSpan({ name: 'initializeServices' }, async () => { - await new Promise((resolve) => setTimeout(resolve, 500)); - }); - }); -} - -app.on('ready', () => doTransaction()); diff --git a/test/e2e/test-apps/span-streaming/custom-tracing/test.ts b/test/e2e/test-apps/span-streaming/custom-tracing/test.ts deleted file mode 100644 index 40a1f2e4e..000000000 --- a/test/e2e/test-apps/span-streaming/custom-tracing/test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { expect } from 'vitest'; -import { electronTestRunner, spanEnvelope, SHORT_UUID_MATCHER, UUID_MATCHER } from '../../..'; - -electronTestRunner( - __dirname, - { - // Browser Tracing fails on Electron v24 - skip: (electronVersion) => electronVersion.major === 24, - }, - async (ctx) => { - await ctx - .expect({ - envelope: spanEnvelope('InitSequence', [ - { - name: 'initializeServices', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - parent_span_id: SHORT_UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: false, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'InitSequence', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - }), - }, - { - name: 'InitSequence', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.op': { value: 'task', type: 'string' }, - 'sentry.sample_rate': { value: 1, type: 'integer' }, - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'InitSequence', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - 'sentry.sdk.integrations': { value: expect.any(Array), type: 'array' }, - 'os.name': { value: expect.any(String), type: 'string' }, - 'sentry.segment.name.source': { value: 'custom', type: 'string' }, - }), - }, - ]), - }) - .run(); - }, -); diff --git a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/package.json b/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/package.json deleted file mode 100644 index 4dfa303ef..000000000 --- a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "net-breadcrumbs-tracing", - "description": "Electron net Tracing (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "dependencies": { - "@sentry/electron": "5.6.0", - "electron-fetch": "1.7.4" - } -} diff --git a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/src/main.js b/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/src/main.js deleted file mode 100644 index c6a80f405..000000000 --- a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/src/main.js +++ /dev/null @@ -1,26 +0,0 @@ -const { app } = require('electron'); -const { init, startSpan, captureException } = require('@sentry/electron/main'); -const fetch = require('electron-fetch'); - -init({ - dsn: '__DSN__', - debug: true, - tracesSampleRate: 1, - propagateTraceparent: true, - traceLifecycle: 'stream', - onFatalError: () => {}, -}); - -app.on('ready', async () => { - try { - await startSpan({ name: 'some-transaction' }, async () => { - await fetch.default('http://localhost:8123/something'); - }); - } catch (e) { - captureException(e); - - setTimeout(() => { - app.quit(); - }, 1000); - } -}); diff --git a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/test.ts b/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/test.ts deleted file mode 100644 index dc02b98a5..000000000 --- a/test/e2e/test-apps/span-streaming/net-breadcrumbs-tracing/test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { expect } from 'vitest'; -import { electronTestRunner, eventEnvelope, SHORT_UUID_MATCHER, spanEnvelope, UUID_MATCHER } from '../../..'; - -electronTestRunner(__dirname, { skipEsmAutoTransform: true }, async (ctx) => { - await ctx - .expectErrorOutputToContain('Adding traceparent header') - .expect({ - envelope: eventEnvelope({ - level: 'error', - platform: 'node', - exception: { - values: [ - { - type: 'FetchError', - value: 'request to http://localhost:8123/something failed, reason: net::ERR_CONNECTION_REFUSED', - mechanism: expect.any(Object), - stacktrace: expect.any(Object), - }, - ], - }, - tags: { - 'event.environment': 'javascript', - 'event.origin': 'electron', - 'event.process': 'browser', - }, - }), - }) - .expect({ - envelope: spanEnvelope('some-transaction', [ - { - name: 'GET http://localhost:8123/something', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - parent_span_id: SHORT_UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: false, - status: 'error', - attributes: expect.objectContaining({ - 'sentry.op': { value: 'http.client', type: 'string' }, - url: { - value: 'http://localhost:8123/something', - type: 'string', - }, - type: { value: 'net.request', type: 'string' }, - 'http.method': { value: 'GET', type: 'string' }, - 'sentry.origin': { value: 'auto.http.electron.net', type: 'string' }, - 'http.response.status_code': { value: 500, type: 'integer' }, - 'sentry.release': { - value: 'net-breadcrumbs-tracing@1.0.0', - type: 'string', - }, - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'some-transaction', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - }), - }, - { - name: 'some-transaction', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: true, - status: 'error', - attributes: expect.objectContaining({ - 'sentry.sample_rate': { value: 1, type: 'integer' }, - 'sentry.release': { - value: 'net-breadcrumbs-tracing@1.0.0', - type: 'string', - }, - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'some-transaction', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - 'sentry.sdk.integrations': { value: expect.any(Array), type: 'array' }, - 'process.runtime.engine.name': { value: 'v8', type: 'string' }, - 'os.name': { value: expect.any(String), type: 'string' }, - 'sentry.segment.name.source': { value: 'custom', type: 'string' }, - }), - }, - ]), - }) - .run(); -}); diff --git a/test/e2e/test-apps/span-streaming/node-profiling/package.json b/test/e2e/test-apps/span-streaming/node-profiling/package.json deleted file mode 100644 index 1b63334a7..000000000 --- a/test/e2e/test-apps/span-streaming/node-profiling/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "node-profiling", - "description": "Node Profiling (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "scripts": { - "build": "electron-rebuild" - }, - "dependencies": { - "@electron/rebuild": "^3.7.1", - "@sentry/electron": "5.6.0", - "@sentry/profiling-node": "9.0.0" - } -} diff --git a/test/e2e/test-apps/span-streaming/node-profiling/src/index.html b/test/e2e/test-apps/span-streaming/node-profiling/src/index.html deleted file mode 100644 index 26aca2095..000000000 --- a/test/e2e/test-apps/span-streaming/node-profiling/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/test/e2e/test-apps/span-streaming/node-profiling/src/main.js b/test/e2e/test-apps/span-streaming/node-profiling/src/main.js deleted file mode 100644 index d75d40dcf..000000000 --- a/test/e2e/test-apps/span-streaming/node-profiling/src/main.js +++ /dev/null @@ -1,51 +0,0 @@ -const path = require('path'); -const crypto = require('crypto'); - -const { app, BrowserWindow } = require('electron'); -const { init, startSpan } = require('@sentry/electron/main'); -const { nodeProfilingIntegration } = require('@sentry/profiling-node'); - -init({ - dsn: '__DSN__', - debug: true, - release: 'some-release', - traceLifecycle: 'stream', - integrations: [nodeProfilingIntegration()], - tracesSampleRate: 1, - profileSessionSampleRate: 1, - profileLifecycle: 'trace', - onFatalError: () => {}, -}); - -function pbkdf2() { - return new Promise((resolve) => { - const salt = crypto.randomBytes(128).toString('base64'); - crypto.pbkdf2('myPassword', salt, 10000, 512, 'sha512', resolve); - }); -} - -async function longWork() { - for (let i = 0; i < 10; i++) { - await startSpan({ name: 'PBKDF2' }, async () => { - await pbkdf2(); - }); - } -} - -app.on('ready', () => { - const mainWindow = new BrowserWindow({ - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - - mainWindow.loadFile(path.join(__dirname, 'index.html')); - - setTimeout(() => { - startSpan({ name: 'Long work' }, async () => { - await longWork(); - }); - }, 500); -}); diff --git a/test/e2e/test-apps/span-streaming/node-profiling/test.ts b/test/e2e/test-apps/span-streaming/node-profiling/test.ts deleted file mode 100644 index 6a9465dab..000000000 --- a/test/e2e/test-apps/span-streaming/node-profiling/test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { StreamedSpanJSON } from '@sentry/core'; -import { expect } from 'vitest'; -import { electronTestRunner, profileChunkEnvelope, SHORT_UUID_MATCHER, spanEnvelope, UUID_MATCHER } from '../../..'; - -// A child span for each `startSpan({ name: 'PBKDF2' })` call in the main process -function pbkdf2Span(): StreamedSpanJSON { - return { - name: 'PBKDF2', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - parent_span_id: SHORT_UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: false, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.release': { value: 'some-release', type: 'string' }, - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - }), - }; -} - -electronTestRunner(__dirname, async (ctx) => { - await ctx - .ignoreExpectationOrder() - // The transaction is streamed as a span envelope. In trace mode the profiler - // automatically starts/stops with the span and attaches its id to the segment. - .expect({ - envelope: spanEnvelope('Long work', [ - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - pbkdf2Span(), - { - name: 'Long work', - span_id: SHORT_UUID_MATCHER, - trace_id: UUID_MATCHER, - start_timestamp: expect.any(Number), - end_timestamp: expect.any(Number), - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.sample_rate': { value: 1, type: 'integer' }, - 'sentry.release': { value: 'some-release', type: 'string' }, - 'sentry.environment': { value: 'development', type: 'string' }, - 'sentry.segment.name': { value: 'Long work', type: 'string' }, - 'sentry.segment.id': { value: SHORT_UUID_MATCHER, type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.source': { value: 'custom', type: 'string' }, - 'sentry.profiler_id': { value: UUID_MATCHER, type: 'string' }, - 'sentry.segment.name.source': { value: 'custom', type: 'string' }, - }), - }, - ]), - }) - // Expect the profile_chunk envelope from continuous node profiling - .expect({ - envelope: profileChunkEnvelope( - { - release: 'some-release', - environment: 'development', - measurements: expect.any(Object), - }, - 'node', - ), - }) - .run(); -}); diff --git a/test/e2e/test-apps/span-streaming/startup-tracing/package.json b/test/e2e/test-apps/span-streaming/startup-tracing/package.json deleted file mode 100644 index 126d9886f..000000000 --- a/test/e2e/test-apps/span-streaming/startup-tracing/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "startup-tracing", - "description": "Startup Tracing Integration (Span streaming)", - "version": "1.0.0", - "main": "src/main.js", - "dependencies": { - "@sentry/electron": "5.6.0" - } -} diff --git a/test/e2e/test-apps/span-streaming/startup-tracing/src/index.html b/test/e2e/test-apps/span-streaming/startup-tracing/src/index.html deleted file mode 100644 index 69e6cfda0..000000000 --- a/test/e2e/test-apps/span-streaming/startup-tracing/src/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Startup Tracing Test - - - - - diff --git a/test/e2e/test-apps/span-streaming/startup-tracing/src/main.js b/test/e2e/test-apps/span-streaming/startup-tracing/src/main.js deleted file mode 100644 index 0dbd909ea..000000000 --- a/test/e2e/test-apps/span-streaming/startup-tracing/src/main.js +++ /dev/null @@ -1,25 +0,0 @@ -const path = require('path'); - -const { app, BrowserWindow } = require('electron'); -const { init, startupTracingIntegration } = require('@sentry/electron/main'); - -init({ - dsn: '__DSN__', - debug: true, - tracesSampleRate: 1, - traceLifecycle: 'stream', - integrations: [startupTracingIntegration()], - onFatalError: () => {}, -}); - -app.on('ready', () => { - const mainWindow = new BrowserWindow({ - show: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - - mainWindow.loadFile(path.join(__dirname, 'index.html')); -}); diff --git a/test/e2e/test-apps/span-streaming/startup-tracing/test.ts b/test/e2e/test-apps/span-streaming/startup-tracing/test.ts deleted file mode 100644 index 3edae1f98..000000000 --- a/test/e2e/test-apps/span-streaming/startup-tracing/test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { expect } from 'vitest'; -import { electronTestRunner, getSpansFromEnvelope } from '../../..'; - -electronTestRunner( - __dirname, - { - // Browser tracing spans differ on < v25 - skip: (electronVersion) => electronVersion.major < 25, - }, - async (ctx) => { - await ctx - .expect({ - // In stream mode the renderer's pageload spans are streamed to the main process and - // merged into the single `Startup` segment (as in non-stream mode). The exact set of - // `browser.*`/`ui.long-task` spans varies between Electron/Chromium versions, so we - // assert the segment and the presence of the key main + renderer spans. - envelope: (envelope) => { - const [header] = envelope; - expect(header.sdk).toEqual({ name: 'sentry.javascript.electron', version: expect.any(String) }); - - const spans = getSpansFromEnvelope(envelope); - expect(spans).toBeDefined(); - - // The segment is the main process `Startup` span - const segment = spans?.find((s) => s.is_segment); - expect(segment).toMatchObject({ - name: 'Startup', - is_segment: true, - status: 'ok', - attributes: expect.objectContaining({ - 'sentry.op': { value: 'app.start', type: 'string' }, - 'sentry.origin': { value: 'auto.electron.startup', type: 'string' }, - 'sentry.release': { value: 'startup-tracing@1.0.0', type: 'string' }, - 'sentry.sdk.name': { value: 'sentry.javascript.electron', type: 'string' }, - 'sentry.sample_rate': { value: 1, type: 'integer' }, - // Renderer pageload measurements / trace metadata are merged onto the startup segment - 'sentry.idle_span_finish_reason': { value: 'idleTimeout', type: 'string' }, - // Numeric attribute types are inferred from the value so whole numbers get typed - // 'integer' and fractional values 'double' - 'browser.web_vital.ttfb.value': { - value: expect.any(Number), - type: expect.stringMatching(/^(integer|double)$/), - }, - 'browser.web_vital.ttfb.request_time': { - value: expect.any(Number), - type: expect.stringMatching(/^(integer|double)$/), - }, - 'network.connection.effective_type': { value: expect.any(String), type: 'string' }, - 'network.connection.rtt': { value: expect.any(Number), type: 'integer' }, - 'device.memory.estimated_capacity': { value: expect.any(Number), type: 'integer' }, - 'device.processor_count': { value: expect.any(Number), type: 'integer' }, - }), - }); - - // Everything is merged into the one startup trace/segment - for (const span of spans ?? []) { - expect(span.trace_id).toEqual(segment?.trace_id); - expect(span.attributes?.['sentry.segment.name']).toEqual({ value: 'Startup', type: 'string' }); - } - - // The main startup spans, the renderer wrapper span and the key browser metric spans - // are all present as children of the startup segment - const ops = (spans ?? []).map( - (s) => (s.attributes as Record | undefined)?.['sentry.op']?.value, - ); - for (const op of [ - 'electron.will-finish-launching', - 'electron.ready', - 'electron.web-contents.created', - 'electron.web-contents.dom-ready', - 'electron.renderer', - 'browser.connect', - 'browser.request', - 'browser.response', - ]) { - expect(ops).toContain(op); - } - }, - }) - .run(); - }, -); diff --git a/test/e2e/utils.ts b/test/e2e/utils.ts index fbb3654a6..33a933811 100644 --- a/test/e2e/utils.ts +++ b/test/e2e/utils.ts @@ -106,7 +106,7 @@ function getSdk(sdk: SdkInfo | undefined): SdkInfo { }, ], version: SDK_VERSION, - settings: { infer_ip: 'never' }, + settings: { infer_ip: 'auto' }, ...sdk, }; } diff --git a/test/e2e/versions.json b/test/e2e/versions.json index 223820f54..1067c9019 100644 --- a/test/e2e/versions.json +++ b/test/e2e/versions.json @@ -1 +1 @@ -["23.3.13","24.8.8","25.9.8","26.6.10","27.3.11","28.3.3","29.4.6","30.5.1","31.7.7","32.3.3","33.4.11","34.5.8","35.7.5","36.9.5","37.10.3","38.8.6","39.8.10","40.10.6","41.10.7","42.11.2","43.6.0","44.2.0"] +["35.7.5","36.9.5","37.10.3","38.8.6","39.8.10","40.10.6","41.10.7","42.11.2","43.6.0","44.2.0"] diff --git a/test/unit/net-trace-propagation.test.ts b/test/unit/net-trace-propagation.test.ts index e412fddf8..1bc328afb 100644 --- a/test/unit/net-trace-propagation.test.ts +++ b/test/unit/net-trace-propagation.test.ts @@ -26,34 +26,35 @@ vi.mock('electron', () => ({ })); import { net } from 'electron'; -import { context, propagation, trace } from '@opentelemetry/api'; -import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; import { createTransport, getActiveSpan, getCurrentScope, - getGlobalScope, - getIsolationScope, + getMainCarrier, resolvedSyncPromise, + SDK_VERSION, startSpan, } from '@sentry/core'; -import { getSentryResource, SentryPropagator, SentrySampler, SentrySpanProcessor } from '@sentry/opentelemetry'; -import { NodeClient, SentryContextManager, setNodeAsyncContextStrategy } from '@sentry/node'; +import { NodeClient } from '@sentry/node'; +import { setAsyncLocalStorageAsyncContextStrategy } from '@sentry/server-utils'; import { electronNetIntegration } from '../../src/main/integrations/net-breadcrumbs'; const TEST_DSN = 'https://username@domain/123'; const NIL_TRACE_ID = '00000000000000000000000000000000'; function resetGlobals(): void { - getCurrentScope().clear(); - getCurrentScope().setClient(undefined); - getIsolationScope().clear(); - getGlobalScope().clear(); + // Scope.clear() was removed in v11, so drop the scope singletons to force fresh scopes + const sentryCarrier = getMainCarrier().__SENTRY__?.[SDK_VERSION]; + if (sentryCarrier) { + delete sentryCarrier.globalScope; + delete sentryCarrier.defaultCurrentScope; + delete sentryCarrier.defaultIsolationScope; + } } function setupSdk(options: Record = {}): NodeClient { resetGlobals(); - setNodeAsyncContextStrategy(); + const asyncLocalStorage = setAsyncLocalStorageAsyncContextStrategy(); const client = new NodeClient({ dsn: TEST_DSN, @@ -64,33 +65,16 @@ function setupSdk(options: Record = {}): NodeClient { ...options, }); + client.asyncLocalStorageLookup = { asyncLocalStorage }; getCurrentScope().setClient(client); client.init(); - const provider = new BasicTracerProvider({ - sampler: new SentrySampler(client), - resource: getSentryResource('node'), - forceFlushTimeoutMillis: 500, - spanProcessors: [new SentrySpanProcessor()], - }); - - trace.setGlobalTracerProvider(provider); - propagation.setGlobalPropagator(new SentryPropagator()); - context.setGlobalContextManager(new SentryContextManager()); - return client; } -function cleanupOtel(): void { - trace.disable(); - context.disable(); - propagation.disable(); - resetGlobals(); -} - describe('electron net trace header propagation', () => { afterEach(() => { - cleanupOtel(); + resetGlobals(); }); test('TWP mode: propagates valid trace ID from scope propagation context', () => { diff --git a/yarn.lock b/yarn.lock index 3c26027b3..d5c3a8e78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,145 @@ # yarn lockfile v1 +"@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@^7.18.5": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== + dependencies: + "@babel/parser" "^7.29.8" + "@babel/types" "^7.29.8" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== + dependencies: + "@babel/types" "^7.29.8" + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.8" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.8" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.8" + debug "^4.3.1" + +"@babel/types@^7.29.7", "@babel/types@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@electron/get@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" @@ -56,11 +195,40 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jridgewell/sourcemap-codec@^1.5.5": +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@napi-rs/wasm-runtime@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" @@ -68,66 +236,11 @@ dependencies: "@tybys/wasm-util" "^0.10.1" -"@opentelemetry/api-logs@0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.220.0.tgz#b2ed235de4b5f3c1769adfa5f3bc247d82cdfbc9" - integrity sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w== - dependencies: - "@opentelemetry/api" "^1.3.0" - -"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.1": +"@opentelemetry/api@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.1.tgz#c1b0346de336ba55af2d5a7970882037baedec05" integrity sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q== -"@opentelemetry/core@2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.10.0.tgz#aa77f7138e74ba5399d5f3bb0deade0c168f00b2" - integrity sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ== - dependencies: - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/instrumentation@^0.220.0": - version "0.220.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.220.0.tgz#542b36bf4871dd83dc84e1373ac4bbcd35a8bfb8" - integrity sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw== - dependencies: - "@opentelemetry/api-logs" "0.220.0" - import-in-the-middle "^3.0.0" - require-in-the-middle "^8.0.0" - -"@opentelemetry/resources@2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.10.0.tgz#ce76c1c1baafce4c77bc29890965ba1f56671acc" - integrity sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA== - dependencies: - "@opentelemetry/core" "2.10.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/sdk-trace-base@^2.9.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz#3f9bf8a14c1dba8790619e28326f7c57f8b9e76f" - integrity sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ== - dependencies: - "@opentelemetry/core" "2.10.0" - "@opentelemetry/resources" "2.10.0" - "@opentelemetry/sdk-trace" "2.10.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/sdk-trace@2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz#76b0331092452b01a8b2f704480e2576641c7011" - integrity sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ== - dependencies: - "@opentelemetry/core" "2.10.0" - "@opentelemetry/resources" "2.10.0" - "@opentelemetry/semantic-conventions" "^1.29.0" - -"@opentelemetry/semantic-conventions@^1.29.0": - version "1.40.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz#10b2944ca559386590683392022a897eefd011d3" - integrity sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw== - "@oxc-project/types@=0.133.0": version "0.133.0" resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.133.0.tgz#2e282ef9e1d26e06b68ccd14b73f310a3b2cf7f8" @@ -579,59 +692,63 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz#4584a8a87b29188a4c1fe987a9fcf701e256d86c" integrity sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== -"@sentry/browser-utils@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/browser-utils/-/browser-utils-10.73.0.tgz#7349f5414f1663c005cca69db48cef1d63b3b1e2" - integrity sha512-qQygxJZ+RV779+iL1+lrJ4f4sZLgbgW0/JWPNp0YlcEAE62yCsdKbqoTEjB/EugdS4mSjBMX0chZC6rblu2Ycw== - dependencies: - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" - -"@sentry/browser@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-10.73.0.tgz#22c3636dd170479a58c9c81507bab72f88e94233" - integrity sha512-HqTe1S5RrWLufhX2LaFP3yNoMxfNDroh120bq1zdGHZfFDBMJQ0CDXxHO+L4UJfQ5dWdCCzWbXIAiZuWGa/DFQ== - dependencies: - "@sentry/browser-utils" "10.73.0" - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" - "@sentry/feedback" "10.73.0" - "@sentry/replay" "10.73.0" - "@sentry/replay-canvas" "10.73.0" - -"@sentry/conventions@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@sentry/conventions/-/conventions-0.16.0.tgz#3b58d15714cf44dca1518496c00749eec5525009" - integrity sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ== +"@sentry/browser-utils@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/browser-utils/-/browser-utils-11.0.0-rc.0.tgz#f7388f36c5399af218e1234947d07b936ab47948" + integrity sha512-Mxate9W4UEkx8Ez+78ygWdxB3KFMVjwXFSd5dwXjHl/Bv/+t375l8JCV1vW5IQ/V5qQBWi/ess/IA4Rq7pmQjQ== + dependencies: + "@sentry/conventions" "^0.23.0" + "@sentry/core" "11.0.0-rc.0" + web-vitals "^6.1.1" + +"@sentry/browser@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-11.0.0-rc.0.tgz#a8367813feed45babc4b2533e5a40e74e23d23b6" + integrity sha512-S/PSQvvoI0vtwJZt1jUMUJau4cxMH1a+rN8Ul5KOvDHP5P8tGkB5fl7GtHVchlil8JPp5xd4bp7PyFHPkvAPPw== + dependencies: + "@sentry/browser-utils" "11.0.0-rc.0" + "@sentry/conventions" "^0.23.0" + "@sentry/core" "11.0.0-rc.0" + "@sentry/feedback" "11.0.0-rc.0" + "@sentry/replay" "11.0.0-rc.0" + "@sentry/replay-canvas" "11.0.0-rc.0" + +"@sentry/bundler-plugins@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugins/-/bundler-plugins-11.0.0-rc.0.tgz#cf8cab739eb31b331fa79c03495fb4e467ffbdc8" + integrity sha512-mfRtTo7MNMgAghHsTzcRV5XwdpV+YqdqA4OGgOSRqLEY5H1jxfO8j+orEjUvLk8pCgR4Y1cORsXKqpVXI4nh3w== + dependencies: + "@babel/core" "^7.18.5" + "@sentry/core" "11.0.0-rc.0" + dotenv "^17.4.2" + glob "^13.0.6" + magic-string "~0.30.8" + sentry "^0.44.0" + supports-color "^8.1.1" + +"@sentry/conventions@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@sentry/conventions/-/conventions-0.23.0.tgz#26ecad45f91bcf70940325ab9af2b9544fa18242" + integrity sha512-+Euyo7CNVecoOusgUnq27oV97oshifgceKfnGnuKfXrPUVWA/cisvii3E1rlvy2yBrKvl9K1gCEo1Jqog5zjEQ== -"@sentry/core@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-10.73.0.tgz#464593d1a2cec6655da681911a2d60d26033e4ab" - integrity sha512-FLO1UgH19RyasVpofu612WCOgb2nEH0dZy+R72d7p65XU9i0wxlMKm3+sgfwKmiSJp1Qhilaaxs4Jg6BbiM5HA== +"@sentry/core@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-11.0.0-rc.0.tgz#a07f233bf3fc52a68673519003ce644b72ca3320" + integrity sha512-6KXLKGq1YgysUIzeD0cYQH/8Tg62V+UJV1d9FVNvKb0HnRgbiO9VWCCm1wGyYSENdGPdSa9zOOnk5ZC7WxLaAw== dependencies: - "@sentry/conventions" "^0.16.0" - -"@sentry/eslint-plugin-sdk@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/eslint-plugin-sdk/-/eslint-plugin-sdk-10.73.0.tgz#1fdc95f53906b6b8644d5ba803c29a4cb0ad8897" - integrity sha512-YwAGzb02UabNmCRIfyLc71cIvwHvOLWQBDJt1XWjU9o29oi37foVspw62al5eoWrKF9F8zDRW0ohTGB+QWZ9Sw== + "@sentry/conventions" "^0.23.0" -"@sentry/feedback@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/feedback/-/feedback-10.73.0.tgz#e086f789cf7f1f671d6a1ef08e80b2ef6db655a4" - integrity sha512-D6nSngX+e46Mae2/oh2bxBvxNK1z2NERbuMAhB5sx9x4xMBWIyGnYYTECehvEqV9+AqGAgxxhOZoYIG3AmRwww== - dependencies: - "@sentry/core" "10.73.0" +"@sentry/eslint-plugin-sdk@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/eslint-plugin-sdk/-/eslint-plugin-sdk-11.0.0-rc.0.tgz#ebcf91fdafbf0a77ff9862429f5c5217f8432ec3" + integrity sha512-TK1B6/RQsYQIHslL8PdPtmZvftBETMlIVA1nsIRzL8rbFBvs2fYBuwYJ/fy+fuC5bzg3bk7tPsw9Bjv7+vJ/0g== -"@sentry/node-core@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/node-core/-/node-core-10.73.0.tgz#bcc34284d134457f7497d545016879fe6f230bbe" - integrity sha512-GHAGUmZPmm6FKfxfv2maVVJ/A99YAmd7oFOuKMDmITI6O/Msl6JB3vPTEpopVAHLW0LYJQBOjddL9C7o+Jt44g== +"@sentry/feedback@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/feedback/-/feedback-11.0.0-rc.0.tgz#4135d29bd739078a17261772c90965fd1cb610eb" + integrity sha512-jb/xd0kxtYM8XVAZtsMxayv27Agv4aWHBumnVT0jxUSNj2eoX5Tfz0PsinV7lcqITZ8HaLeYkUQcll4ANqjX5w== dependencies: - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" - "@sentry/opentelemetry" "10.73.0" - import-in-the-middle "^3.0.0" + "@sentry/core" "11.0.0-rc.0" "@sentry/node-native-stacktrace@^0.5.1": version "0.5.1" @@ -641,61 +758,68 @@ detect-libc "^2.0.4" node-abi "^3.89.0" -"@sentry/node-native@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/node-native/-/node-native-10.73.0.tgz#af343f83056c8ab980e7235bf5256d754920448c" - integrity sha512-lN5M7QIev1jC8Vqcq2GhNgQ6hhKGr7WJwX6DtlYI07hoAUfS8w44uq9583VQHXWWn73mUh5oH0EJA1Ocq781OA== +"@sentry/node-native@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/node-native/-/node-native-11.0.0-rc.0.tgz#e6c169b75ab13a92e6a472394d373280b1e1e674" + integrity sha512-W5DTEjgiBcFVlWNNGgOpQLKXgUviQffJmZhI6REwtFrsC+V6V2FEL0gPkgUwoxcF+EFAJAOL6U2kBLrgAuHwkg== dependencies: - "@sentry/core" "10.73.0" - "@sentry/node" "10.73.0" + "@sentry/core" "11.0.0-rc.0" + "@sentry/node" "11.0.0-rc.0" "@sentry/node-native-stacktrace" "^0.5.1" -"@sentry/node@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-10.73.0.tgz#a6e98e41b4510c1eaaf9407238b3714521486de1" - integrity sha512-jiMJ6GgXDw6UMGzJY+o0c8OoeA9OfHqZ/xEpHfDqy75hn+9CEkRkbNGCIdMvsc7wW/Se1Os394hHfTpU+YEskg== +"@sentry/node@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-11.0.0-rc.0.tgz#9bd97f014514ab8450d04aa60da85b9e68e55e64" + integrity sha512-hztnJEx8Fcyp0wNJgVbrgWIy9jgkefo7A3c7Y7r7wrCwCl5gKwzzo53XYOkY2lf/rjTLaJCG8b21VjHaFldOZw== + dependencies: + "@opentelemetry/api" "^1.9.1" + "@sentry/bundler-plugins" "11.0.0-rc.0" + "@sentry/conventions" "^0.23.0" + "@sentry/core" "11.0.0-rc.0" + "@sentry/opentelemetry" "11.0.0-rc.0" + "@sentry/server-runtime-injection" "11.0.0-rc.0" + "@sentry/server-utils" "11.0.0-rc.0" + +"@sentry/opentelemetry@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-11.0.0-rc.0.tgz#fd5c7e05e48911184ef39d9b8c4cee76d7ba6818" + integrity sha512-28Yy+Qoo84Ckxu40f2sB/NE+J2uacVkT+rD/GnK3+ExZfW/o2nV7eotIwKUprhoHM1w8EaMQusjZAMTzHc4geQ== + dependencies: + "@sentry/conventions" "^0.23.0" + "@sentry/core" "11.0.0-rc.0" + +"@sentry/replay-canvas@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/replay-canvas/-/replay-canvas-11.0.0-rc.0.tgz#8e302128e0de1b51a65f030ec935d7012c88eab6" + integrity sha512-7KSOyhmhRjlMg0NX4P+gNsgaT40uAWhJrI+3hsHxSU1dsvBdylhBzHM3/2Qie5QuFvrdBWqJefeQ5tFs7GCPoQ== + dependencies: + "@sentry/core" "11.0.0-rc.0" + "@sentry/replay" "11.0.0-rc.0" + +"@sentry/replay@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-11.0.0-rc.0.tgz#9c27c8507fb7487fbbfad71c3a067141a6d7c487" + integrity sha512-7TIGKTFc0dfmC7uGj4HZ4sRyk25ZuUdvMO8yY4gcflIZfZAE18USE1S9fM+QTmCMlbrPEXgni7Iw2ij4zsxMYQ== + dependencies: + "@sentry/browser-utils" "11.0.0-rc.0" + "@sentry/core" "11.0.0-rc.0" + +"@sentry/server-runtime-injection@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/server-runtime-injection/-/server-runtime-injection-11.0.0-rc.0.tgz#d2e848d9da83622424892f786bc86a873a227f0a" + integrity sha512-x8XppxyzDZxweoHlfsW0l12ghquvp79o2UNXOcXETRb+40ud+RF+YdPtnv4yvsrByXScPkNzKVdJSjxevJCcrA== + dependencies: + "@sentry/core" "11.0.0-rc.0" + "@sentry/server-utils" "11.0.0-rc.0" + +"@sentry/server-utils@11.0.0-rc.0": + version "11.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@sentry/server-utils/-/server-utils-11.0.0-rc.0.tgz#9313817cfcb2a3a52e5503423f5d5b1001bbc3f0" + integrity sha512-0+nsGmRdz8U+U5Cbe52FVfsBztcSY8v7u37id3lsEOktZQi8uJRQShp7BgvD8+ReXEuoVK/L2w7LxzTdtmxQig== dependencies: "@opentelemetry/api" "^1.9.1" - "@opentelemetry/instrumentation" "^0.220.0" - "@opentelemetry/sdk-trace-base" "^2.9.0" - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" - "@sentry/node-core" "10.73.0" - "@sentry/opentelemetry" "10.73.0" - "@sentry/server-utils" "10.73.0" - import-in-the-middle "^3.0.0" - -"@sentry/opentelemetry@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-10.73.0.tgz#33af62e2693f0ca0d3963ddba5b67089b82fccdf" - integrity sha512-fQouPQKsH0CQrw6oAn1k0Z2I+tgyochCovifr5qNS69i0OzjknLa03WJyiZ/IuzXc4AVa5jAKfOeE9slABz8Qw== - dependencies: - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" - -"@sentry/replay-canvas@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/replay-canvas/-/replay-canvas-10.73.0.tgz#32fe5a7120d05c97fd9828ac15f09d37e1848f76" - integrity sha512-sxa2lKkHPfF/j5xFpW7gocthWXRqyoHz8KCPy6yGc8plT477nl57iGSKhQDYsx1Ny10TLjs7YkIuPP1GY/Ax2Q== - dependencies: - "@sentry/core" "10.73.0" - "@sentry/replay" "10.73.0" - -"@sentry/replay@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-10.73.0.tgz#25d53335e3dee9324c0b17511506ea4be17ac6dd" - integrity sha512-nN2wjN/Y0J5BOJV5hqRHUEBfxwUsipp1PKjcDHh6Fpxnrtfldu3Y99E8cQInseo5heFdzEvrOHBBrqWZXOHVKQ== - dependencies: - "@sentry/browser-utils" "10.73.0" - "@sentry/core" "10.73.0" - -"@sentry/server-utils@10.73.0": - version "10.73.0" - resolved "https://registry.yarnpkg.com/@sentry/server-utils/-/server-utils-10.73.0.tgz#041aa26349845deeca37f574f04d4298e3ffe157" - integrity sha512-QskripdKFbM/+gipC6mpa2crLwL7+VbkX84IpHg2z9UlYQ1kNKd3aMT+Qk9NLRSw/zu1rSIAvlbWfx4D3rgNAA== - dependencies: - "@sentry/conventions" "^0.16.0" - "@sentry/core" "10.73.0" + "@sentry/conventions" "^0.23.0" + "@sentry/core" "11.0.0-rc.0" "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -879,12 +1003,12 @@ dependencies: undici-types "~6.19.8" -"@types/node@^18.11.18": - version "18.19.59" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.59.tgz#2de1b95b0b468089b616b2feb809755d70a74949" - integrity sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ== +"@types/node@^22.7.7": + version "22.20.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.20.1.tgz#84e7cdf63cdaa20c134aa317ccc901aa21e16f0e" + integrity sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q== dependencies: - undici-types "~5.26.4" + undici-types "~6.21.0" "@types/qs@*": version "6.9.16" @@ -1000,16 +1124,6 @@ accepts@^1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - -acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1037,6 +1151,11 @@ balanced-match@^4.0.2: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== +baseline-browser-mapping@^2.11.12: + version "2.11.15" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz#9c0cac93d7d304f3d61bb41088a102cd62e68676" + integrity sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA== + boolean@^3.0.1: version "3.2.0" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" @@ -1049,6 +1168,24 @@ brace-expansion@^5.0.2: dependencies: balanced-match "^4.0.2" +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== + dependencies: + balanced-match "^4.0.2" + +browserslist@^4.24.0: + version "4.28.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.8.tgz#a3c79ceb70028527e5da7dafc887f3200b5168c0" + integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA== + dependencies: + baseline-browser-mapping "^2.11.12" + caniuse-lite "^1.0.30001809" + electron-to-chromium "^1.5.402" + node-releases "^2.0.53" + update-browserslist-db "^1.3.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1100,16 +1237,16 @@ call-bound@^1.0.2: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" +caniuse-lite@^1.0.30001809: + version "1.0.30001809" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz#e6cf71f14ddfe008f114dd2a846923be3c03a07b" + integrity sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ== + chai@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== -cjs-module-lexer@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz#b3ca5101843389259ade7d88c77bd06ce55849ca" - integrity sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== - clone-response@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" @@ -1184,13 +1321,20 @@ debug@^2.2.0: dependencies: ms "2.0.0" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.5: +debug@^4.1.0, debug@^4.1.1: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" +debug@^4.3.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -1261,6 +1405,11 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +dotenv@^17.4.2: + version "17.4.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" + integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -1280,13 +1429,18 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron@^25.9.8: - version "25.9.8" - resolved "https://registry.yarnpkg.com/electron/-/electron-25.9.8.tgz#7c125ccbddad02861736275b0d4a387c59a91469" - integrity sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg== +electron-to-chromium@^1.5.402: + version "1.5.411" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.411.tgz#d56c7e43f91e2b3abb53b4eecd646e20d0b18b34" + integrity sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg== + +electron@^35.7.5: + version "35.7.5" + resolved "https://registry.yarnpkg.com/electron/-/electron-35.7.5.tgz#294a4aebb2ad2a884de730c410f2358d061e8d53" + integrity sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw== dependencies: "@electron/get" "^2.0.0" - "@types/node" "^18.11.18" + "@types/node" "^22.7.7" extract-zip "^2.0.1" emoji-regex@^8.0.0: @@ -1343,6 +1497,11 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -1425,6 +1584,11 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" @@ -1468,6 +1632,15 @@ glob@^11.0.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" +glob@^13.0.6: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -1515,6 +1688,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-property-descriptors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" @@ -1584,16 +1762,6 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -import-in-the-middle@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-3.0.0.tgz#720c12b4c07ea58b32a54667e70a022e18cc36a3" - integrity sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg== - dependencies: - acorn "^8.15.0" - acorn-import-attributes "^1.9.5" - cjs-module-lexer "^2.2.0" - module-details-from-path "^1.0.4" - inflation@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.1.0.tgz#9214db11a47e6f756d111c4f9df96971c60f886c" @@ -1633,6 +1801,16 @@ jackspeak@^4.1.1: dependencies: "@isaacs/cliui" "^8.0.2" +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -1648,6 +1826,11 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -1799,7 +1982,14 @@ lru-cache@^11.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== -magic-string@^0.30.21: +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.30.21, magic-string@~0.30.8: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== @@ -1874,15 +2064,22 @@ minimatch@^10.0.3: dependencies: brace-expansion "^5.0.2" +minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" - integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== +minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== ms@2.0.0: version "2.0.0" @@ -1911,6 +2108,11 @@ node-abi@^3.89.0: dependencies: semver "^7.3.5" +node-releases@^2.0.53: + version "2.0.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.53.tgz#0fe5ad8a7935e075172f574e56f0c20f07fa41af" + integrity sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ== + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -2061,6 +2263,14 @@ path-scurry@^2.0.0: lru-cache "^11.0.0" minipass "^7.1.2" +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" @@ -2138,14 +2348,6 @@ read-package-json-fast@^4.0.0: json-parse-even-better-errors "^4.0.0" npm-normalize-package-bin "^4.0.0" -require-in-the-middle@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz#dbde2587f669398626d56b20c868ab87bf01cce4" - integrity sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ== - dependencies: - debug "^4.3.5" - module-details-from-path "^1.0.3" - resolve-alpn@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -2255,7 +2457,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^6.2.0: +semver@^6.2.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -2265,6 +2467,11 @@ semver@^7.3.2, semver@^7.3.5: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== +sentry@^0.44.0: + version "0.44.1" + resolved "https://registry.yarnpkg.com/sentry/-/sentry-0.44.1.tgz#d3747b3087e125766c8e939638fae024ee95c972" + integrity sha512-LK+RJ2PFsJKM+P0D/zYC+M5gFB1ytfVONU9DVUqJu67YFlwnj3wGJkUzBhCS8R4iUqRdRTAYbFbRKTAe03rW/Q== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -2439,6 +2646,13 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -2519,16 +2733,16 @@ typescript@^6.0.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - undici-types@~6.19.8: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -2539,6 +2753,14 @@ unpipe@1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz#a71c28dd22f505481dbc4689087b18d933e90afd" + integrity sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -2583,6 +2805,11 @@ vitest@^4.0.18: vite "^6.0.0 || ^7.0.0 || ^8.0.0-0" why-is-node-running "^2.3.0" +web-vitals@^6.1.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-6.2.2.tgz#ff4a7a8d7c5df18074a01f1c4f169e1a57df7193" + integrity sha512-oto5x6dLEgrRqfcWed+pZEUb2q6ikbFmqF54CRDhI/QGbn+qxC49b4C4OkbH+kb9C3a8shpFD3SgR9kRcs80ZQ== + which@^1.2.4: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -2643,6 +2870,11 @@ xvfb-maybe@^0.2.1: debug "^2.2.0" which "^1.2.4" +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yaml@^2.2.1: version "2.6.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3"