From 92f2b5f19283bf5f089633b8ffaac788daa604cf Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 7 Aug 2024 13:37:16 +0200 Subject: [PATCH 1/3] fix(browser): Initialize default integration if `defaultIntegrations: undefined` --- packages/browser/src/sdk.ts | 8 ++++++++ packages/browser/test/sdk.test.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 1421814ae9e5..fd454a7f7910 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -57,6 +57,14 @@ function applyDefaultOptions(optionsArg: BrowserOptions = {}): BrowserOptions { sendClientReports: true, }; + // TODO: Instead of dropping just `defaultIntegrations`, we should simply + // call `dropUndefinedKeys` on the entire `optionsArg`. + // However, for this to work we need to adjust the `hasTracingEnabled()` logic + // first as it differentiates between `undefined` and the key not being in the object. + if (optionsArg.defaultIntegrations === undefined) { + delete optionsArg.defaultIntegrations; + } + return { ...defaultOptions, ...optionsArg }; } diff --git a/packages/browser/test/sdk.test.ts b/packages/browser/test/sdk.test.ts index 80e54e3d49d2..618333532a09 100644 --- a/packages/browser/test/sdk.test.ts +++ b/packages/browser/test/sdk.test.ts @@ -6,6 +6,7 @@ import type { Mock } from 'vitest'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import * as SentryCore from '@sentry/core'; import { Scope, createTransport } from '@sentry/core'; import type { Client, Integration } from '@sentry/types'; import { resolvedSyncPromise } from '@sentry/utils'; @@ -79,6 +80,18 @@ describe('init', () => { expect(DEFAULT_INTEGRATIONS[1]!.setupOnce as Mock).toHaveBeenCalledTimes(1); }); + it('installs default integrations if `defaultIntegrations: undefined`', () => { + // @ts-expect-error this is fine for testing + const initAndBindSpy = vi.spyOn(SentryCore, 'initAndBind').mockImplementationOnce(() => {}); + const options = getDefaultBrowserOptions({ dsn: PUBLIC_DSN, defaultIntegrations: undefined }); + init(options); + + expect(initAndBindSpy).toHaveBeenCalledTimes(1); + + const optionsPassed = initAndBindSpy.mock.calls[0]?.[1]; + expect(optionsPassed?.integrations?.length).toBeGreaterThan(0); + }); + test("doesn't install default integrations if told not to", () => { const DEFAULT_INTEGRATIONS: Integration[] = [ new MockIntegration('MockIntegration 0.3'), @@ -150,6 +163,7 @@ describe('init', () => { Object.defineProperty(WINDOW, 'browser', { value: undefined, writable: true }); Object.defineProperty(WINDOW, 'nw', { value: undefined, writable: true }); Object.defineProperty(WINDOW, 'window', { value: WINDOW, writable: true }); + vi.clearAllMocks(); }); it('logs a browser extension error if executed inside a Chrome extension', () => { From 0d6647544eb4208da941ced0b89a84bd299c82f0 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 7 Aug 2024 14:01:54 +0200 Subject: [PATCH 2/3] adjust size limit :( --- .size-limit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.size-limit.js b/.size-limit.js index 72050f7225f3..437e466a89e1 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -22,7 +22,7 @@ module.exports = [ path: 'packages/browser/build/npm/esm/index.js', import: createImport('init', 'browserTracingIntegration', 'replayIntegration'), gzip: true, - limit: '72 KB', + limit: '73 KB', }, { name: '@sentry/browser (incl. Tracing, Replay) - with treeshaking flags', From 5a261066b6afadf340cf166c8baf85f60e5d604d Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 7 Aug 2024 14:36:43 +0200 Subject: [PATCH 3/3] Update packages/browser/src/sdk.ts Co-authored-by: Francesco Novy --- packages/browser/src/sdk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index fd454a7f7910..04aa82b5f0e6 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -61,7 +61,7 @@ function applyDefaultOptions(optionsArg: BrowserOptions = {}): BrowserOptions { // call `dropUndefinedKeys` on the entire `optionsArg`. // However, for this to work we need to adjust the `hasTracingEnabled()` logic // first as it differentiates between `undefined` and the key not being in the object. - if (optionsArg.defaultIntegrations === undefined) { + if (optionsArg.defaultIntegrations == null) { delete optionsArg.defaultIntegrations; }