diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-browser-spans/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-browser-spans/test.ts index b60cdce9703b..2b2d5fa8bae5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-browser-spans/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-browser-spans/test.ts @@ -14,10 +14,11 @@ sentryTest('should add browser-related spans to pageload transaction', async ({ const eventData = await getFirstSentryEnvelopeRequest(page, url); const browserSpans = eventData.spans?.filter(({ op }) => op === 'browser'); - // Spans `connect`, `cache` and `DNS` are not always inside `pageload` transaction. + // Spans `domContentLoadedEvent`, `connect`, `cache` and `DNS` are not + // always inside `pageload` transaction. expect(browserSpans?.length).toBeGreaterThanOrEqual(4); - ['domContentLoadedEvent', 'loadEvent', 'request', 'response'].forEach(eventDesc => + ['loadEvent', 'request', 'response'].forEach(eventDesc => expect(browserSpans).toContainEqual( expect.objectContaining({ description: eventDesc, diff --git a/packages/browser-utils/.eslintrc.js b/packages/browser-utils/.eslintrc.js index 7346008450be..9d8a86b13b96 100644 --- a/packages/browser-utils/.eslintrc.js +++ b/packages/browser-utils/.eslintrc.js @@ -11,9 +11,10 @@ module.exports = { }, }, { - files: ['src/browser/web-vitals/**'], + files: ['src/metrics/**'], rules: { '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', }, }, ], diff --git a/packages/browser-utils/src/browser/index.ts b/packages/browser-utils/src/browser/index.ts deleted file mode 100644 index 948a09c0dda4..000000000000 --- a/packages/browser-utils/src/browser/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type { RequestInstrumentationOptions } from './request'; - -export { - BROWSER_TRACING_INTEGRATION_ID, - browserTracingIntegration, - startBrowserTracingNavigationSpan, - startBrowserTracingPageLoadSpan, -} from './browserTracingIntegration'; - -export { instrumentOutgoingRequests, defaultRequestInstrumentationOptions } from './request'; - -export { - addPerformanceInstrumentationHandler, - addClsInstrumentationHandler, - addFidInstrumentationHandler, - addTtfbInstrumentationHandler, - addLcpInstrumentationHandler, -} from './instrument'; diff --git a/packages/browser-utils/src/index.ts b/packages/browser-utils/src/index.ts index 0824c9f50358..f65c78a6d3bf 100644 --- a/packages/browser-utils/src/index.ts +++ b/packages/browser-utils/src/index.ts @@ -1,16 +1,17 @@ export { - browserTracingIntegration, - startBrowserTracingNavigationSpan, - startBrowserTracingPageLoadSpan, - BROWSER_TRACING_INTEGRATION_ID, - instrumentOutgoingRequests, - defaultRequestInstrumentationOptions, addPerformanceInstrumentationHandler, addClsInstrumentationHandler, addFidInstrumentationHandler, addTtfbInstrumentationHandler, addLcpInstrumentationHandler, -} from './browser'; +} from './metrics/instrument'; + +export { + addPerformanceEntries, + startTrackingInteractions, + startTrackingLongTasks, + startTrackingWebVitals, +} from './metrics/browserMetrics'; export { addClickKeypressInstrumentationHandler } from './instrument/dom'; @@ -20,5 +21,3 @@ export { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY, } from './instrument/xhr'; - -export type { RequestInstrumentationOptions } from './browser'; diff --git a/packages/browser-utils/src/instrument/dom.ts b/packages/browser-utils/src/instrument/dom.ts index 4dfa5992aa07..5e813f23eb67 100644 --- a/packages/browser-utils/src/instrument/dom.ts +++ b/packages/browser-utils/src/instrument/dom.ts @@ -1,7 +1,7 @@ import type { HandlerDataDom } from '@sentry/types'; import { addHandler, addNonEnumerableProperty, fill, maybeInstrument, triggerHandlers, uuid4 } from '@sentry/utils'; -import { WINDOW } from '../browser/types'; +import { WINDOW } from '../metrics/types'; type SentryWrappedTarget = HTMLElement & { _sentryId?: string }; diff --git a/packages/browser-utils/src/instrument/history.ts b/packages/browser-utils/src/instrument/history.ts index c918cd4ce2dc..f791bcef5389 100644 --- a/packages/browser-utils/src/instrument/history.ts +++ b/packages/browser-utils/src/instrument/history.ts @@ -1,6 +1,6 @@ import type { HandlerDataHistory } from '@sentry/types'; import { addHandler, fill, maybeInstrument, supportsHistory, triggerHandlers } from '@sentry/utils'; -import { WINDOW } from '../browser/types'; +import { WINDOW } from '../metrics/types'; let lastHref: string | undefined; diff --git a/packages/browser-utils/src/instrument/xhr.ts b/packages/browser-utils/src/instrument/xhr.ts index 05db402872ed..c504c8dce5f6 100644 --- a/packages/browser-utils/src/instrument/xhr.ts +++ b/packages/browser-utils/src/instrument/xhr.ts @@ -1,7 +1,7 @@ import type { HandlerDataXhr, SentryWrappedXMLHttpRequest, WrappedFunction } from '@sentry/types'; import { addHandler, fill, isString, maybeInstrument, triggerHandlers } from '@sentry/utils'; -import { WINDOW } from '../browser/types'; +import { WINDOW } from '../metrics/types'; export const SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__'; diff --git a/packages/browser-utils/src/browser/metrics/index.ts b/packages/browser-utils/src/metrics/browserMetrics.ts similarity index 98% rename from packages/browser-utils/src/browser/metrics/index.ts rename to packages/browser-utils/src/metrics/browserMetrics.ts index ec3de991d593..7c6620ff7911 100644 --- a/packages/browser-utils/src/browser/metrics/index.ts +++ b/packages/browser-utils/src/metrics/browserMetrics.ts @@ -5,18 +5,18 @@ import type { Measurements, Span, SpanAttributes, StartSpanOptions } from '@sent import { browserPerformanceTimeOrigin, getComponentName, htmlTreeAsString, logger, parseUrl } from '@sentry/utils'; import { spanToJSON } from '@sentry/core'; -import { DEBUG_BUILD } from '../../debug-build'; +import { DEBUG_BUILD } from '../debug-build'; import { addClsInstrumentationHandler, addFidInstrumentationHandler, addLcpInstrumentationHandler, addPerformanceInstrumentationHandler, addTtfbInstrumentationHandler, -} from '../instrument'; -import { WINDOW } from '../types'; -import { getNavigationEntry } from '../web-vitals/lib/getNavigationEntry'; -import { getVisibilityWatcher } from '../web-vitals/lib/getVisibilityWatcher'; +} from './instrument'; +import { WINDOW } from './types'; import { isMeasurementValue, startAndEndSpan } from './utils'; +import { getNavigationEntry } from './web-vitals/lib/getNavigationEntry'; +import { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher'; interface NavigatorNetworkInformation { readonly connection?: NetworkInformation; diff --git a/packages/browser-utils/src/browser/instrument.ts b/packages/browser-utils/src/metrics/instrument.ts similarity index 100% rename from packages/browser-utils/src/browser/instrument.ts rename to packages/browser-utils/src/metrics/instrument.ts diff --git a/packages/browser-utils/src/browser/types.ts b/packages/browser-utils/src/metrics/types.ts similarity index 100% rename from packages/browser-utils/src/browser/types.ts rename to packages/browser-utils/src/metrics/types.ts diff --git a/packages/browser-utils/src/browser/metrics/utils.ts b/packages/browser-utils/src/metrics/utils.ts similarity index 100% rename from packages/browser-utils/src/browser/metrics/utils.ts rename to packages/browser-utils/src/metrics/utils.ts diff --git a/packages/browser-utils/src/browser/web-vitals/README.md b/packages/browser-utils/src/metrics/web-vitals/README.md similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/README.md rename to packages/browser-utils/src/metrics/web-vitals/README.md diff --git a/packages/browser-utils/src/browser/web-vitals/getCLS.ts b/packages/browser-utils/src/metrics/web-vitals/getCLS.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/getCLS.ts rename to packages/browser-utils/src/metrics/web-vitals/getCLS.ts diff --git a/packages/browser-utils/src/browser/web-vitals/getFID.ts b/packages/browser-utils/src/metrics/web-vitals/getFID.ts similarity index 96% rename from packages/browser-utils/src/browser/web-vitals/getFID.ts rename to packages/browser-utils/src/metrics/web-vitals/getFID.ts index f79b388c042d..92543b89e170 100644 --- a/packages/browser-utils/src/browser/web-vitals/getFID.ts +++ b/packages/browser-utils/src/metrics/web-vitals/getFID.ts @@ -35,14 +35,14 @@ export const FIDThresholds: MetricRatingThresholds = [100, 300]; * _**Important:** since FID is only reported after the user interacts with the * page, it's possible that it will not be reported for some page loads._ */ -export const onFID = (onReport: FIDReportCallback, opts: ReportOpts = {}): void => { +export const onFID = (onReport: FIDReportCallback, opts: ReportOpts = {}) => { whenActivated(() => { const visibilityWatcher = getVisibilityWatcher(); const metric = initMetric('FID'); // eslint-disable-next-line prefer-const let report: ReturnType; - const handleEntry = (entry: PerformanceEventTiming) => { + const handleEntry = (entry: PerformanceEventTiming): void => { // Only report if the page wasn't hidden prior to the first input. if (entry.startTime < visibilityWatcher.firstHiddenTime) { metric.value = entry.processingStart - entry.startTime; diff --git a/packages/browser-utils/src/browser/web-vitals/getINP.ts b/packages/browser-utils/src/metrics/web-vitals/getINP.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/getINP.ts rename to packages/browser-utils/src/metrics/web-vitals/getINP.ts diff --git a/packages/browser-utils/src/browser/web-vitals/getLCP.ts b/packages/browser-utils/src/metrics/web-vitals/getLCP.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/getLCP.ts rename to packages/browser-utils/src/metrics/web-vitals/getLCP.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/bindReporter.ts b/packages/browser-utils/src/metrics/web-vitals/lib/bindReporter.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/bindReporter.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/bindReporter.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/generateUniqueID.ts b/packages/browser-utils/src/metrics/web-vitals/lib/generateUniqueID.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/generateUniqueID.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/generateUniqueID.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/getActivationStart.ts b/packages/browser-utils/src/metrics/web-vitals/lib/getActivationStart.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/getActivationStart.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/getActivationStart.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/getNavigationEntry.ts b/packages/browser-utils/src/metrics/web-vitals/lib/getNavigationEntry.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/getNavigationEntry.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/getNavigationEntry.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/getVisibilityWatcher.ts b/packages/browser-utils/src/metrics/web-vitals/lib/getVisibilityWatcher.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/getVisibilityWatcher.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/getVisibilityWatcher.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/initMetric.ts b/packages/browser-utils/src/metrics/web-vitals/lib/initMetric.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/initMetric.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/initMetric.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/observe.ts b/packages/browser-utils/src/metrics/web-vitals/lib/observe.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/observe.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/observe.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/onHidden.ts b/packages/browser-utils/src/metrics/web-vitals/lib/onHidden.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/onHidden.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/onHidden.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/polyfills/interactionCountPolyfill.ts b/packages/browser-utils/src/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/polyfills/interactionCountPolyfill.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/runOnce.ts b/packages/browser-utils/src/metrics/web-vitals/lib/runOnce.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/runOnce.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/runOnce.ts diff --git a/packages/browser-utils/src/browser/web-vitals/lib/whenActivated.ts b/packages/browser-utils/src/metrics/web-vitals/lib/whenActivated.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/lib/whenActivated.ts rename to packages/browser-utils/src/metrics/web-vitals/lib/whenActivated.ts diff --git a/packages/browser-utils/src/browser/web-vitals/onFCP.ts b/packages/browser-utils/src/metrics/web-vitals/onFCP.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/onFCP.ts rename to packages/browser-utils/src/metrics/web-vitals/onFCP.ts diff --git a/packages/browser-utils/src/browser/web-vitals/onTTFB.ts b/packages/browser-utils/src/metrics/web-vitals/onTTFB.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/onTTFB.ts rename to packages/browser-utils/src/metrics/web-vitals/onTTFB.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types.ts b/packages/browser-utils/src/metrics/web-vitals/types.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types.ts rename to packages/browser-utils/src/metrics/web-vitals/types.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/base.ts b/packages/browser-utils/src/metrics/web-vitals/types/base.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/base.ts rename to packages/browser-utils/src/metrics/web-vitals/types/base.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/cls.ts b/packages/browser-utils/src/metrics/web-vitals/types/cls.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/cls.ts rename to packages/browser-utils/src/metrics/web-vitals/types/cls.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/fcp.ts b/packages/browser-utils/src/metrics/web-vitals/types/fcp.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/fcp.ts rename to packages/browser-utils/src/metrics/web-vitals/types/fcp.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/fid.ts b/packages/browser-utils/src/metrics/web-vitals/types/fid.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/fid.ts rename to packages/browser-utils/src/metrics/web-vitals/types/fid.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/inp.ts b/packages/browser-utils/src/metrics/web-vitals/types/inp.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/inp.ts rename to packages/browser-utils/src/metrics/web-vitals/types/inp.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/lcp.ts b/packages/browser-utils/src/metrics/web-vitals/types/lcp.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/lcp.ts rename to packages/browser-utils/src/metrics/web-vitals/types/lcp.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/polyfills.ts b/packages/browser-utils/src/metrics/web-vitals/types/polyfills.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/polyfills.ts rename to packages/browser-utils/src/metrics/web-vitals/types/polyfills.ts diff --git a/packages/browser-utils/src/browser/web-vitals/types/ttfb.ts b/packages/browser-utils/src/metrics/web-vitals/types/ttfb.ts similarity index 100% rename from packages/browser-utils/src/browser/web-vitals/types/ttfb.ts rename to packages/browser-utils/src/metrics/web-vitals/types/ttfb.ts diff --git a/packages/browser-utils/test/browser/backgroundtab.test.ts b/packages/browser-utils/test/browser/backgroundtab.test.ts deleted file mode 100644 index e25eaa168fd4..000000000000 --- a/packages/browser-utils/test/browser/backgroundtab.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { addTracingExtensions, getCurrentScope } from '@sentry/core'; -import { setCurrentClient, spanToJSON, startSpan } from '@sentry/core'; -import { JSDOM } from 'jsdom'; - -import { registerBackgroundTabDetection } from '../../src/browser/backgroundtab'; -import { TestClient, getDefaultClientOptions } from '../utils/TestClient'; - -describe('registerBackgroundTabDetection', () => { - let events: Record = {}; - beforeEach(() => { - const dom = new JSDOM(); - global.document = dom.window.document; - - const options = getDefaultClientOptions({ tracesSampleRate: 1 }); - const client = new TestClient(options); - setCurrentClient(client); - client.init(); - - addTracingExtensions(); - - global.document.addEventListener = jest.fn((event, callback) => { - events[event] = callback; - }); - }); - - afterEach(() => { - events = {}; - getCurrentScope().clear(); - }); - - it('does not create an event listener if global document is undefined', () => { - // @ts-expect-error need to override global document - global.document = undefined; - registerBackgroundTabDetection(); - expect(events).toMatchObject({}); - }); - - it('creates an event listener', () => { - registerBackgroundTabDetection(); - expect(events).toMatchObject({ visibilitychange: expect.any(Function) }); - }); - - it('finishes a transaction on visibility change', () => { - registerBackgroundTabDetection(); - startSpan({ name: 'test' }, span => { - // Simulate document visibility hidden event - // @ts-expect-error need to override global document - global.document.hidden = true; - events.visibilitychange(); - - const { status, timestamp, data } = spanToJSON(span); - - expect(status).toBe('cancelled'); - expect(status).toBeDefined(); - expect(data!['sentry.cancellation_reason']).toBe('document.hidden'); - expect(timestamp).toBeDefined(); - }); - }); -}); diff --git a/packages/browser-utils/test/browser/metrics/index.test.ts b/packages/browser-utils/test/browser/browserMetrics.test.ts similarity index 97% rename from packages/browser-utils/test/browser/metrics/index.test.ts rename to packages/browser-utils/test/browser/browserMetrics.test.ts index 8c4476d4b6b2..b6d6aaa087aa 100644 --- a/packages/browser-utils/test/browser/metrics/index.test.ts +++ b/packages/browser-utils/test/browser/browserMetrics.test.ts @@ -9,10 +9,10 @@ import { spanToJSON, } from '@sentry/core'; import type { Span } from '@sentry/types'; -import type { ResourceEntry } from '../../../src/browser/metrics'; -import { _addMeasureSpans, _addResourceSpans } from '../../../src/browser/metrics'; -import { WINDOW } from '../../../src/browser/types'; -import { TestClient, getDefaultClientOptions } from '../../utils/TestClient'; +import type { ResourceEntry } from '../../src/metrics/browserMetrics'; +import { _addMeasureSpans, _addResourceSpans } from '../../src/metrics/browserMetrics'; +import { WINDOW } from '../../src/metrics/types'; +import { TestClient, getDefaultClientOptions } from '../utils/TestClient'; const mockWindowLocation = { ancestorOrigins: {}, diff --git a/packages/browser-utils/test/browser/metrics/utils.test.ts b/packages/browser-utils/test/browser/utils.test.ts similarity index 92% rename from packages/browser-utils/test/browser/metrics/utils.test.ts rename to packages/browser-utils/test/browser/utils.test.ts index 1ec79514af67..56f06f222366 100644 --- a/packages/browser-utils/test/browser/metrics/utils.test.ts +++ b/packages/browser-utils/test/browser/utils.test.ts @@ -6,8 +6,8 @@ import { setCurrentClient, spanToJSON, } from '@sentry/core'; -import { startAndEndSpan } from '../../../src/browser/metrics/utils'; -import { TestClient, getDefaultClientOptions } from '../../utils/TestClient'; +import { startAndEndSpan } from '../../src/metrics/utils'; +import { TestClient, getDefaultClientOptions } from '../utils/TestClient'; describe('startAndEndSpan()', () => { beforeEach(() => { diff --git a/packages/browser/src/index.bundle.tracing.replay.feedback.ts b/packages/browser/src/index.bundle.tracing.replay.feedback.ts index 7f178e87c789..feaedf21e8d4 100644 --- a/packages/browser/src/index.bundle.tracing.replay.feedback.ts +++ b/packages/browser/src/index.bundle.tracing.replay.feedback.ts @@ -28,6 +28,6 @@ export { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, -} from '@sentry-internal/browser-utils'; +} from './tracing/browserTracingIntegration'; export { replayIntegration } from '@sentry-internal/replay'; diff --git a/packages/browser/src/index.bundle.tracing.replay.ts b/packages/browser/src/index.bundle.tracing.replay.ts index 494932f6aef3..fbf0e24faa73 100644 --- a/packages/browser/src/index.bundle.tracing.replay.ts +++ b/packages/browser/src/index.bundle.tracing.replay.ts @@ -26,7 +26,7 @@ export { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, -} from '@sentry-internal/browser-utils'; +} from './tracing/browserTracingIntegration'; export { feedbackIntegrationShim as feedbackIntegration, diff --git a/packages/browser/src/index.bundle.tracing.ts b/packages/browser/src/index.bundle.tracing.ts index b020549f6968..66d1df7792fe 100644 --- a/packages/browser/src/index.bundle.tracing.ts +++ b/packages/browser/src/index.bundle.tracing.ts @@ -28,7 +28,7 @@ export { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, -} from '@sentry-internal/browser-utils'; +} from './tracing/browserTracingIntegration'; export { feedbackIntegrationShim as feedbackIntegration, diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index bea2adda57ee..1bdee34b1c6a 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -41,11 +41,13 @@ export { export { defaultRequestInstrumentationOptions, instrumentOutgoingRequests, +} from './tracing/request'; +export { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, -} from '@sentry-internal/browser-utils'; -export type { RequestInstrumentationOptions } from '@sentry-internal/browser-utils'; +} from './tracing/browserTracingIntegration'; +export type { RequestInstrumentationOptions } from './tracing/request'; export { addTracingExtensions, getActiveSpan, diff --git a/packages/browser-utils/src/browser/backgroundtab.ts b/packages/browser/src/tracing/backgroundtab.ts similarity index 97% rename from packages/browser-utils/src/browser/backgroundtab.ts rename to packages/browser/src/tracing/backgroundtab.ts index a3ed7d88bd3e..307892862649 100644 --- a/packages/browser-utils/src/browser/backgroundtab.ts +++ b/packages/browser/src/tracing/backgroundtab.ts @@ -3,7 +3,7 @@ import { spanToJSON } from '@sentry/core'; import { logger } from '@sentry/utils'; import { DEBUG_BUILD } from '../debug-build'; -import { WINDOW } from './types'; +import { WINDOW } from '../helpers'; /** * Add a listener that cancels and finishes a transaction when the global diff --git a/packages/browser-utils/src/browser/browserTracingIntegration.ts b/packages/browser/src/tracing/browserTracingIntegration.ts similarity index 97% rename from packages/browser-utils/src/browser/browserTracingIntegration.ts rename to packages/browser/src/tracing/browserTracingIntegration.ts index c0a786b600f9..d41073f46191 100644 --- a/packages/browser-utils/src/browser/browserTracingIntegration.ts +++ b/packages/browser/src/tracing/browserTracingIntegration.ts @@ -1,3 +1,10 @@ +import { + addHistoryInstrumentationHandler, + addPerformanceEntries, + startTrackingInteractions, + startTrackingLongTasks, + startTrackingWebVitals, +} from '@sentry-internal/browser-utils'; import { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, @@ -19,16 +26,9 @@ import type { Span } from '@sentry/types'; import { browserPerformanceTimeOrigin, getDomElement, logger, uuid4 } from '@sentry/utils'; import { DEBUG_BUILD } from '../debug-build'; -import { addHistoryInstrumentationHandler } from '../instrument/history'; +import { WINDOW } from '../helpers'; import { registerBackgroundTabDetection } from './backgroundtab'; -import { - addPerformanceEntries, - startTrackingInteractions, - startTrackingLongTasks, - startTrackingWebVitals, -} from './metrics'; import { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request'; -import { WINDOW } from './types'; export const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing'; @@ -224,8 +224,6 @@ export const browserTracingIntegration = ((_options: Partial {}, afterAllSetup(client) { const { markBackgroundSpan, traceFetch, traceXHR, shouldCreateSpanForRequest, enableHTTPTimings, _experiments } = options; @@ -249,7 +247,7 @@ export const browserTracingIntegration = ((_options: Partial { + client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => { if (getClient() !== client) { return; } @@ -260,8 +258,8 @@ export const browserTracingIntegration = ((_options: Partial = {}): BrowserClientOptions { return { + dsn: 'http://examplePublicKey@localhost/0', integrations: [], transport: () => createTransport({ recordDroppedEvent: () => undefined }, _ => resolvedSyncPromise({})), stackParser: () => [], diff --git a/packages/browser/test/unit/index.bundle.tracing.replay.feedback.test.ts b/packages/browser/test/unit/index.bundle.tracing.replay.feedback.test.ts index 873c41bfc769..847f610ca702 100644 --- a/packages/browser/test/unit/index.bundle.tracing.replay.feedback.test.ts +++ b/packages/browser/test/unit/index.bundle.tracing.replay.feedback.test.ts @@ -1,11 +1,10 @@ -import { browserTracingIntegration } from '@sentry-internal/browser-utils'; import { + browserTracingIntegration, feedbackIntegration, feedbackModalIntegration, feedbackScreenshotIntegration, replayIntegration, -} from '@sentry/browser'; - +} from '../../src'; import * as TracingReplayFeedbackBundle from '../../src/index.bundle.tracing.replay.feedback'; describe('index.bundle.tracing.replay.feedback', () => { diff --git a/packages/browser/test/unit/index.bundle.tracing.replay.test.ts b/packages/browser/test/unit/index.bundle.tracing.replay.test.ts index 3e2a79e081a9..f0228e575e68 100644 --- a/packages/browser/test/unit/index.bundle.tracing.replay.test.ts +++ b/packages/browser/test/unit/index.bundle.tracing.replay.test.ts @@ -1,11 +1,10 @@ -import { browserTracingIntegration } from '@sentry-internal/browser-utils'; import { feedbackIntegrationShim, feedbackModalIntegrationShim, feedbackScreenshotIntegrationShim, } from '@sentry-internal/integration-shims'; -import { replayIntegration } from '@sentry/browser'; +import { browserTracingIntegration, replayIntegration } from '../../src'; import * as TracingReplayBundle from '../../src/index.bundle.tracing.replay'; describe('index.bundle.tracing.replay', () => { diff --git a/packages/browser/test/unit/index.bundle.tracing.test.ts b/packages/browser/test/unit/index.bundle.tracing.test.ts index 10ec0c6f0fd2..67a530b0e376 100644 --- a/packages/browser/test/unit/index.bundle.tracing.test.ts +++ b/packages/browser/test/unit/index.bundle.tracing.test.ts @@ -1,4 +1,3 @@ -import { browserTracingIntegration } from '@sentry-internal/browser-utils'; import { feedbackIntegrationShim, feedbackModalIntegrationShim, @@ -6,6 +5,7 @@ import { replayIntegrationShim, } from '@sentry-internal/integration-shims'; +import { browserTracingIntegration } from '../../src'; import * as TracingBundle from '../../src/index.bundle.tracing'; describe('index.bundle.tracing', () => { diff --git a/packages/browser/test/unit/tracing/backgroundtab.test.ts b/packages/browser/test/unit/tracing/backgroundtab.test.ts new file mode 100644 index 000000000000..d31f53584521 --- /dev/null +++ b/packages/browser/test/unit/tracing/backgroundtab.test.ts @@ -0,0 +1,56 @@ +import { addTracingExtensions, getCurrentScope } from '@sentry/core'; +import { setCurrentClient } from '@sentry/core'; + +import { TextDecoder, TextEncoder } from 'util'; +const patchedEncoder = (!global.window.TextEncoder && (global.window.TextEncoder = TextEncoder)) || true; +// @ts-expect-error patch the encoder on the window, else importing JSDOM fails (deleted in afterAll) +const patchedDecoder = (!global.window.TextDecoder && (global.window.TextDecoder = TextDecoder)) || true; + +import { JSDOM } from 'jsdom'; + +import { BrowserClient } from '../../../src/client'; +import { registerBackgroundTabDetection } from '../../../src/tracing/backgroundtab'; +import { getDefaultBrowserClientOptions } from '../helper/browser-client-options'; + +describe('registerBackgroundTabDetection', () => { + afterAll(() => { + // @ts-expect-error patch the encoder on the window, else importing JSDOM fails + patchedEncoder && delete global.window.TextEncoder; + // @ts-expect-error patch the encoder on the window, else importing JSDOM fails + patchedDecoder && delete global.window.TextDecoder; + }); + + let events: Record = {}; + beforeEach(() => { + const dom = new JSDOM(); + global.document = dom.window.document; + + const options = getDefaultBrowserClientOptions({ tracesSampleRate: 1 }); + const client = new BrowserClient(options); + setCurrentClient(client); + client.init(); + + addTracingExtensions(); + + global.document.addEventListener = jest.fn((event, callback) => { + events[event] = callback; + }); + }); + + afterEach(() => { + events = {}; + getCurrentScope().clear(); + }); + + it('does not create an event listener if global document is undefined', () => { + // @ts-expect-error need to override global document + global.document = undefined; + registerBackgroundTabDetection(); + expect(events).toMatchObject({}); + }); + + it('creates an event listener', () => { + registerBackgroundTabDetection(); + expect(events).toMatchObject({ visibilitychange: expect.any(Function) }); + }); +}); diff --git a/packages/browser-utils/test/browser/browserTracingIntegration.test.ts b/packages/browser/test/unit/tracing/browserTracingIntegration.test.ts similarity index 89% rename from packages/browser-utils/test/browser/browserTracingIntegration.test.ts rename to packages/browser/test/unit/tracing/browserTracingIntegration.test.ts index b537d684c8eb..30bf265cf20e 100644 --- a/packages/browser-utils/test/browser/browserTracingIntegration.test.ts +++ b/packages/browser/test/unit/tracing/browserTracingIntegration.test.ts @@ -1,3 +1,14 @@ +import { TextDecoder, TextEncoder } from 'util'; +const oldTextEncoder = global.window.TextEncoder; +const oldTextDecoder = global.window.TextDecoder; +// @ts-expect-error patch the encoder on the window, else importing JSDOM fails (deleted in afterAll) +delete global.window.TextEncoder; +// @ts-expect-error patch the encoder on the window, else importing JSDOM fails (deleted in afterAll) +delete global.window.TextDecoder; +global.window.TextEncoder = TextEncoder; +// @ts-expect-error patch the encoder on the window, else importing JSDOM fails (deleted in afterAll) +global.window.TextDecoder = TextDecoder; + import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, @@ -16,9 +27,14 @@ import { import type { Span, StartSpanOptions } from '@sentry/types'; import { timestampInSeconds } from '@sentry/utils'; import { JSDOM } from 'jsdom'; -import { browserTracingIntegration, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan } from '../..'; -import { WINDOW } from '../../src/browser/types'; -import { TestClient, getDefaultClientOptions } from '../utils/TestClient'; +import { BrowserClient } from '../../../src/client'; +import { WINDOW } from '../../../src/helpers'; +import { + browserTracingIntegration, + startBrowserTracingNavigationSpan, + startBrowserTracingPageLoadSpan, +} from '../../../src/tracing/browserTracingIntegration'; +import { getDefaultBrowserClientOptions } from '../helper/browser-client-options'; // We're setting up JSDom here because the Next.js routing instrumentations requires a few things to be present on pageload: // 1. Access to window.document API for `window.document.getElementById` @@ -51,9 +67,14 @@ describe('browserTracingIntegration', () => { getActiveSpan()?.end(); }); + afterAll(() => { + global.window.TextEncoder = oldTextEncoder; + global.window.TextDecoder = oldTextDecoder; + }); + it('works with tracing enabled', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration()], }), @@ -81,8 +102,8 @@ describe('browserTracingIntegration', () => { }); it('works with tracing disabled', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [browserTracingIntegration()], }), ); @@ -94,8 +115,8 @@ describe('browserTracingIntegration', () => { }); it("doesn't create a pageload span when instrumentPageLoad is false", () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), ); @@ -107,8 +128,8 @@ describe('browserTracingIntegration', () => { }); it('works with tracing enabled but unsampled', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [browserTracingIntegration()], }), @@ -122,8 +143,8 @@ describe('browserTracingIntegration', () => { }); it('starts navigation when URL changes', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration()], }), @@ -206,8 +227,8 @@ describe('browserTracingIntegration', () => { }); it("trims pageload transactions to the max duration of the transaction's children", async () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ idleTimeout: 10 })], }), @@ -230,8 +251,8 @@ describe('browserTracingIntegration', () => { describe('startBrowserTracingPageLoadSpan', () => { it('works without integration setup', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [], }), ); @@ -244,8 +265,8 @@ describe('browserTracingIntegration', () => { }); it('works with unsampled span', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), @@ -260,8 +281,8 @@ describe('browserTracingIntegration', () => { }); it('works with integration setup', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), @@ -290,8 +311,8 @@ describe('browserTracingIntegration', () => { }); it('allows to overwrite properties', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), @@ -328,8 +349,8 @@ describe('browserTracingIntegration', () => { it('calls before beforeStartSpan', () => { const mockBeforeStartSpan = jest.fn((options: StartSpanOptions) => options); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ instrumentPageLoad: false, beforeStartSpan: mockBeforeStartSpan }), @@ -355,8 +376,8 @@ describe('browserTracingIntegration', () => { op: 'test op', })); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ @@ -378,8 +399,8 @@ describe('browserTracingIntegration', () => { }); it('sets the pageload span name on `scope.transactionName`', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [browserTracingIntegration()], }), ); @@ -398,8 +419,8 @@ describe('browserTracingIntegration', () => { name: 'changed', })); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ @@ -423,8 +444,8 @@ describe('browserTracingIntegration', () => { describe('startBrowserTracingNavigationSpan', () => { it('works without integration setup', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [], }), ); @@ -437,8 +458,8 @@ describe('browserTracingIntegration', () => { }); it('works with unsampled span', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [browserTracingIntegration({ instrumentNavigation: false })], }), @@ -453,8 +474,8 @@ describe('browserTracingIntegration', () => { }); it('works with integration setup', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentNavigation: false })], }), @@ -483,8 +504,8 @@ describe('browserTracingIntegration', () => { }); it('allows to overwrite properties', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentNavigation: false })], }), @@ -521,8 +542,8 @@ describe('browserTracingIntegration', () => { it('calls before beforeStartSpan', () => { const mockBeforeStartSpan = jest.fn((options: StartSpanOptions) => options); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ @@ -552,8 +573,8 @@ describe('browserTracingIntegration', () => { op: 'test op', })); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ @@ -580,8 +601,8 @@ describe('browserTracingIntegration', () => { name: 'changed', })); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 0, integrations: [ browserTracingIntegration({ @@ -604,8 +625,8 @@ describe('browserTracingIntegration', () => { }); it('sets the navigation span name on `scope.transactionName`', () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [browserTracingIntegration()], }), ); @@ -618,8 +639,8 @@ describe('browserTracingIntegration', () => { }); it("resets the scopes' propagationContexts", () => { - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ integrations: [browserTracingIntegration()], }), ); @@ -663,8 +684,8 @@ describe('browserTracingIntegration', () => { '' + ''; - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration()], }), @@ -700,8 +721,8 @@ describe('browserTracingIntegration', () => { '' + ''; - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration()], }), @@ -736,8 +757,8 @@ describe('browserTracingIntegration', () => { '' + ''; - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), @@ -768,7 +789,7 @@ describe('browserTracingIntegration', () => { expect(dynamicSamplingContext).toBeDefined(); expect(dynamicSamplingContext).toStrictEqual({ environment: 'production', - public_key: 'username', + public_key: 'examplePublicKey', sample_rate: '1', sampled: 'true', trace_id: expect.not.stringContaining('12312012123120121231201212312012'), @@ -785,8 +806,8 @@ describe('browserTracingIntegration', () => { '' + ''; - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ instrumentPageLoad: false })], }), @@ -831,8 +852,8 @@ describe('browserTracingIntegration', () => { describe('idleTimeout', () => { it('is created by default', () => { jest.useFakeTimers(); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration()], }), @@ -866,8 +887,8 @@ describe('browserTracingIntegration', () => { it('can be a custom value', () => { jest.useFakeTimers(); - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ idleTimeout: 2000 })], }), @@ -906,8 +927,8 @@ describe('browserTracingIntegration', () => { const interval = 200; - const client = new TestClient( - getDefaultClientOptions({ + const client = new BrowserClient( + getDefaultBrowserClientOptions({ tracesSampleRate: 1, integrations: [browserTracingIntegration({ heartbeatInterval: interval })], }), diff --git a/packages/browser-utils/test/browser/request.test.ts b/packages/browser/test/unit/tracing/request.test.ts similarity index 96% rename from packages/browser-utils/test/browser/request.test.ts rename to packages/browser/test/unit/tracing/request.test.ts index 0671e8d5805c..521ff1327b01 100644 --- a/packages/browser-utils/test/browser/request.test.ts +++ b/packages/browser/test/unit/tracing/request.test.ts @@ -1,9 +1,8 @@ +import * as browserUtils from '@sentry-internal/browser-utils'; import * as utils from '@sentry/utils'; +import { WINDOW } from '../../../src/helpers'; -import * as xhrInstrumentation from '../../src/instrument/xhr'; - -import { extractNetworkProtocol, instrumentOutgoingRequests, shouldAttachHeaders } from '../../src/browser/request'; -import { WINDOW } from '../../src/browser/types'; +import { extractNetworkProtocol, instrumentOutgoingRequests, shouldAttachHeaders } from '../../../src/tracing/request'; beforeAll(() => { // @ts-expect-error need to override global Request because it's not in the jest environment (even with an @@ -18,7 +17,7 @@ describe('instrumentOutgoingRequests', () => { it('instruments fetch and xhr requests', () => { const addFetchSpy = jest.spyOn(utils, 'addFetchInstrumentationHandler'); - const addXhrSpy = jest.spyOn(xhrInstrumentation, 'addXhrInstrumentationHandler'); + const addXhrSpy = jest.spyOn(browserUtils, 'addXhrInstrumentationHandler'); instrumentOutgoingRequests(); @@ -35,7 +34,7 @@ describe('instrumentOutgoingRequests', () => { }); it('does not instrument xhr requests if traceXHR is false', () => { - const addXhrSpy = jest.spyOn(xhrInstrumentation, 'addXhrInstrumentationHandler'); + const addXhrSpy = jest.spyOn(browserUtils, 'addXhrInstrumentationHandler'); instrumentOutgoingRequests({ traceXHR: false }); @@ -114,6 +113,8 @@ describe('shouldAttachHeaders', () => { beforeAll(() => { originalWindowLocation = WINDOW.location; + // @ts-expect-error Override delete + delete WINDOW.location; // @ts-expect-error We are missing some fields of the Origin interface but it doesn't matter for these tests. WINDOW.location = new URL('https://my-origin.com'); }); @@ -154,6 +155,8 @@ describe('shouldAttachHeaders', () => { beforeAll(() => { originalWindowLocation = WINDOW.location; + // @ts-expect-error Override delete + delete WINDOW.location; // @ts-expect-error We are missing some fields of the Origin interface but it doesn't matter for these tests. WINDOW.location = new URL('https://my-origin.com/api/my-route'); }); @@ -277,6 +280,8 @@ describe('shouldAttachHeaders', () => { beforeAll(() => { originalWindowLocation = WINDOW.location; + // @ts-expect-error Override delete + delete WINDOW.location; // @ts-expect-error We need to simulate an edge-case WINDOW.location = undefined; }); diff --git a/packages/sveltekit/test/client/browserTracingIntegration.test.ts b/packages/sveltekit/test/client/browserTracingIntegration.test.ts index cdbe093e201b..a76f0e187c35 100644 --- a/packages/sveltekit/test/client/browserTracingIntegration.test.ts +++ b/packages/sveltekit/test/client/browserTracingIntegration.test.ts @@ -41,7 +41,7 @@ describe('browserTracingIntegration', () => { updateName: vi.fn(), setAttribute: vi.fn(), }; - return createdRootSpan; + return createdRootSpan as Span; }); const startBrowserTracingNavigationSpanSpy = vi @@ -52,7 +52,7 @@ describe('browserTracingIntegration', () => { updateName: vi.fn(), setAttribute: vi.fn(), }; - return createdRootSpan; + return createdRootSpan as Span; }); const fakeClient = { getOptions: () => ({}), on: () => {} }; @@ -75,7 +75,6 @@ describe('browserTracingIntegration', () => { it('implements required hooks', () => { const integration = browserTracingIntegration(); expect(integration.name).toEqual('BrowserTracing'); - expect(integration.setupOnce).toBeDefined(); expect(integration.afterAllSetup).toBeDefined(); });