diff --git a/packages/nextjs/src/index.client.ts b/packages/nextjs/src/index.client.ts index e2423055a877..61a1b27da7f3 100644 --- a/packages/nextjs/src/index.client.ts +++ b/packages/nextjs/src/index.client.ts @@ -2,7 +2,7 @@ import { configureScope, init as reactInit, Integrations as BrowserIntegrations import { BrowserTracing, defaultRequestInstrumentationOptions } from '@sentry/tracing'; import { nextRouterInstrumentation } from './performance/client'; -import { MetadataBuilder } from './utils/metadataBuilder'; +import { buildMetadata } from './utils/metadata'; import { NextjsOptions } from './utils/nextjsOptions'; import { addIntegration, UserIntegrations } from './utils/userIntegrations'; @@ -13,8 +13,7 @@ export const Integrations = { ...BrowserIntegrations, BrowserTracing }; /** Inits the Sentry NextJS SDK on the browser with the React SDK. */ export function init(options: NextjsOptions): void { - const metadataBuilder = new MetadataBuilder(options, ['nextjs', 'react']); - metadataBuilder.addSdkMetadata(); + buildMetadata(options, ['nextjs', 'react']); options.environment = options.environment || process.env.NODE_ENV; // Only add BrowserTracing if a tracesSampleRate or tracesSampler is set diff --git a/packages/nextjs/src/index.server.ts b/packages/nextjs/src/index.server.ts index 9da9d88dd6ba..ac3d4c4bb6ce 100644 --- a/packages/nextjs/src/index.server.ts +++ b/packages/nextjs/src/index.server.ts @@ -6,7 +6,7 @@ import { escapeStringForRegex, logger } from '@sentry/utils'; import * as domainModule from 'domain'; import * as path from 'path'; -import { MetadataBuilder } from './utils/metadataBuilder'; +import { buildMetadata } from './utils/metadata'; import { NextjsOptions } from './utils/nextjsOptions'; import { addIntegration } from './utils/userIntegrations'; @@ -43,8 +43,7 @@ export function init(options: NextjsOptions): void { return; } - const metadataBuilder = new MetadataBuilder(options, ['nextjs', 'node']); - metadataBuilder.addSdkMetadata(); + buildMetadata(options, ['nextjs', 'node']); options.environment = options.environment || process.env.NODE_ENV; addServerIntegrations(options); // Right now we only capture frontend sessions for Next.js diff --git a/packages/nextjs/src/utils/metadata.ts b/packages/nextjs/src/utils/metadata.ts new file mode 100644 index 000000000000..7985ad6aa9cb --- /dev/null +++ b/packages/nextjs/src/utils/metadata.ts @@ -0,0 +1,23 @@ +import { SDK_VERSION } from '@sentry/core'; +import { Options, SdkInfo } from '@sentry/types'; + +const PACKAGE_NAME_PREFIX = 'npm:@sentry/'; + +/** + * A builder for the SDK metadata in the options for the SDK initialization. + * @param options sdk options object that gets mutated + * @param names list of package names + */ +export function buildMetadata(options: Options, names: string[]): void { + options._metadata = options._metadata || {}; + options._metadata.sdk = + options._metadata.sdk || + ({ + name: 'sentry.javascript.nextjs', + packages: names.map(name => ({ + name: `${PACKAGE_NAME_PREFIX}${name}`, + version: SDK_VERSION, + })), + version: SDK_VERSION, + } as SdkInfo); +} diff --git a/packages/nextjs/src/utils/metadataBuilder.ts b/packages/nextjs/src/utils/metadataBuilder.ts deleted file mode 100644 index 8dba9f821ebc..000000000000 --- a/packages/nextjs/src/utils/metadataBuilder.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { SDK_VERSION } from '@sentry/core'; -import { Package, SdkInfo } from '@sentry/types'; - -import { NextjsOptions } from './nextjsOptions'; - -export const SDK_NAME = 'sentry.javascript.nextjs'; -export const PACKAGE_NAME_PREFIX = 'npm:@sentry/'; - -/** - * A builder for the SDK metadata in the options for the SDK initialization. - */ -export class MetadataBuilder { - private _options: NextjsOptions; - private _packageNames: string[]; - - public constructor(options: NextjsOptions, packages: string[]) { - this._options = options; - this._packageNames = packages; - } - - /** JSDoc */ - public addSdkMetadata(): void { - this._options._metadata = this._options._metadata || {}; - this._options._metadata.sdk = this._getSdkInfo(); - } - - /** JSDoc */ - private _getSdkInfo(): SdkInfo { - return { - name: SDK_NAME, - version: SDK_VERSION, - packages: this._getPackages(), - }; - } - - /** JSDoc */ - private _getPackages(): Package[] { - return this._packageNames.map((pkgName: string) => { - return { - name: PACKAGE_NAME_PREFIX + pkgName, - version: SDK_VERSION, - }; - }); - } -} diff --git a/packages/nextjs/test/index.client.test.ts b/packages/nextjs/test/index.client.test.ts index 19171bc4346c..44edf997ef50 100644 --- a/packages/nextjs/test/index.client.test.ts +++ b/packages/nextjs/test/index.client.test.ts @@ -32,7 +32,16 @@ describe('Client init()', () => { sdk: { name: 'sentry.javascript.nextjs', version: expect.any(String), - packages: expect.any(Array), + packages: [ + { + name: 'npm:@sentry/nextjs', + version: expect.any(String), + }, + { + name: 'npm:@sentry/react', + version: expect.any(String), + }, + ], }, }, environment: 'test', diff --git a/packages/nextjs/test/index.server.test.ts b/packages/nextjs/test/index.server.test.ts index 41d721c0daaf..62d51a9aa860 100644 --- a/packages/nextjs/test/index.server.test.ts +++ b/packages/nextjs/test/index.server.test.ts @@ -37,7 +37,16 @@ describe('Server init()', () => { sdk: { name: 'sentry.javascript.nextjs', version: expect.any(String), - packages: expect.any(Array), + packages: [ + { + name: 'npm:@sentry/nextjs', + version: expect.any(String), + }, + { + name: 'npm:@sentry/node', + version: expect.any(String), + }, + ], }, }, autoSessionTracking: false, diff --git a/packages/nextjs/test/utils/metadataBuilder.test.ts b/packages/nextjs/test/utils/metadataBuilder.test.ts deleted file mode 100644 index 888a35f765d4..000000000000 --- a/packages/nextjs/test/utils/metadataBuilder.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { SDK_VERSION } from '@sentry/core'; -import { Package, SdkInfo } from '@sentry/types'; - -import { MetadataBuilder, PACKAGE_NAME_PREFIX, SDK_NAME } from '../../src/utils/metadataBuilder'; -import { NextjsOptions } from '../../src/utils/nextjsOptions'; - -describe('build metadata', () => { - test('without packages', () => { - const nextjsOptions: NextjsOptions = {}; - const metadataPackages: string[] = []; - testMetadataBuilder(nextjsOptions, metadataPackages); - }); - - test('with packages', () => { - const nextjsOptions: NextjsOptions = {}; - const metadataPackages: string[] = ['packageA', 'packageB']; - testMetadataBuilder(nextjsOptions, metadataPackages); - }); -}); - -function testMetadataBuilder(nextjsOptions: NextjsOptions, packages: string[]): void { - new MetadataBuilder(nextjsOptions, packages).addSdkMetadata(); - const optionsMetadata = nextjsOptions._metadata; - expect(optionsMetadata).toBeDefined(); - const sdkInfo = optionsMetadata?.sdk; - testSdkInfo(sdkInfo); - testSdkInfoPackages(sdkInfo?.packages, packages); -} - -function testSdkInfo(sdkInfo: SdkInfo | undefined): void { - expect(sdkInfo).toBeDefined(); - expect(sdkInfo?.name).toBeDefined(); - expect(sdkInfo?.name).toEqual(SDK_NAME); - expect(sdkInfo?.version).toEqual(expect.any(String)); - expect(sdkInfo?.packages).toEqual(expect.any(Array)); -} - -function testSdkInfoPackages(actualPkgs: Package[] | undefined, expectedPkgNames: string[]): void { - expect(actualPkgs).toBeDefined(); - expect(actualPkgs).toHaveLength(expectedPkgNames.length); - - const pkgNames = actualPkgs?.map((currentPkg: Package) => { - expect(currentPkg.version).toBeDefined(); - expect(currentPkg.version).toEqual(SDK_VERSION); - - expect(currentPkg.name).toBeDefined(); - const pkgPrefix = currentPkg.name.substring(0, PACKAGE_NAME_PREFIX.length); - expect(pkgPrefix).toEqual(PACKAGE_NAME_PREFIX); - return currentPkg.name.substring(PACKAGE_NAME_PREFIX.length); - }); - expect(pkgNames).toEqual(expectedPkgNames); -}