diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 9d14fd94a221..e603cba661dd 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -9,13 +9,14 @@ import type { Severity, SeverityLevel, } from '@sentry/types'; -import { createClientReportEnvelope, dsnToString, logger, serializeEnvelope } from '@sentry/utils'; +import { createClientReportEnvelope, dsnToString, getSDKSource, logger, serializeEnvelope } from '@sentry/utils'; import { eventFromException, eventFromMessage } from './eventbuilder'; import { WINDOW } from './helpers'; import type { Breadcrumbs } from './integrations'; import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs'; import type { BrowserTransportOptions } from './transports/types'; + /** * Configuration options for the Sentry Browser SDK. * @see @sentry/types Options for more information. @@ -41,12 +42,14 @@ export class BrowserClient extends BaseClient { * @param options Configuration options for this SDK. */ public constructor(options: BrowserClientOptions) { + const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource(); + options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.browser', packages: [ { - name: 'npm:@sentry/browser', + name: `${sdkSource}:@sentry/browser`, version: SDK_VERSION, }, ], diff --git a/packages/browser/test/unit/index.test.ts b/packages/browser/test/unit/index.test.ts index 8bc3ffab36e1..122637ea91d4 100644 --- a/packages/browser/test/unit/index.test.ts +++ b/packages/browser/test/unit/index.test.ts @@ -1,4 +1,5 @@ import { getReportDialogEndpoint, SDK_VERSION } from '@sentry/core'; +import * as utils from '@sentry/utils'; import type { Event } from '../../src'; import { @@ -277,6 +278,27 @@ describe('SentryBrowser initialization', () => { expect(sdkData?.version).toBe(SDK_VERSION); }); + it('uses SDK source from window for package name', () => { + global.SENTRY_SDK_SOURCE = 'loader'; + init({ dsn }); + + const sdkData = (getCurrentHub().getClient() as any).getOptions()._metadata.sdk; + + expect(sdkData?.packages[0].name).toBe('loader:@sentry/browser'); + delete global.SENTRY_SDK_SOURCE; + }); + + it('uses SDK source from global for package name', () => { + const spy = jest.spyOn(utils, 'getSDKSource').mockReturnValue('cdn'); + init({ dsn }); + + const sdkData = (getCurrentHub().getClient() as any).getOptions()._metadata.sdk; + + expect(sdkData?.packages[0].name).toBe('cdn:@sentry/browser'); + expect(utils.getSDKSource).toBeCalledTimes(1); + spy.mockRestore(); + }); + it('should set SDK data when instantiating a client directly', () => { const options = getDefaultBrowserClientOptions({ dsn }); const client = new BrowserClient(options); diff --git a/packages/utils/src/env.ts b/packages/utils/src/env.ts index 8d622f8836cd..95dfc698dabc 100644 --- a/packages/utils/src/env.ts +++ b/packages/utils/src/env.ts @@ -15,7 +15,7 @@ declare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined; -type SdkSource = 'npm' | 'cdn' | 'loader'; +export type SdkSource = 'npm' | 'cdn' | 'loader'; /** * Figures out if we're building a browser bundle. diff --git a/packages/utils/src/worldwide.ts b/packages/utils/src/worldwide.ts index e341339bc980..4cc141cc3d65 100644 --- a/packages/utils/src/worldwide.ts +++ b/packages/utils/src/worldwide.ts @@ -14,6 +14,8 @@ import type { Integration } from '@sentry/types'; +import type { SdkSource } from './env'; + /** Internal global with common properties and Sentry extensions */ export interface InternalGlobal { navigator?: { userAgent?: string }; @@ -26,6 +28,7 @@ export interface InternalGlobal { SENTRY_RELEASE?: { id?: string; }; + SENTRY_SDK_SOURCE?: SdkSource; __SENTRY__: { globalEventProcessors: any; hub: any;