From 0cd03f0c8c41846b7dca226aba3e41321da335f3 Mon Sep 17 00:00:00 2001 From: hafzism Date: Fri, 4 Sep 2026 10:00:16 +0530 Subject: [PATCH 1/3] fix(nextjs): Print unsupported Turbopack warning once Co-Authored-By: OpenAI Codex --- .../getFinalConfigObjectBundlerUtils.ts | 11 ++++++++- .../test/config/withSentryConfig.test.ts | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/src/config/withSentryConfig/getFinalConfigObjectBundlerUtils.ts b/packages/nextjs/src/config/withSentryConfig/getFinalConfigObjectBundlerUtils.ts index 60b2d3e96538..76432027ae56 100644 --- a/packages/nextjs/src/config/withSentryConfig/getFinalConfigObjectBundlerUtils.ts +++ b/packages/nextjs/src/config/withSentryConfig/getFinalConfigObjectBundlerUtils.ts @@ -13,6 +13,8 @@ import { constructWebpackConfigFunction } from '../webpack'; import { DEFAULT_SERVER_EXTERNAL_PACKAGES } from './constants'; import type { VercelCronsConfigResult } from './getFinalConfigObjectUtils'; +const UNSUPPORTED_TURBOPACK_WARNING_SHOWN = '__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__'; + /** * Information about the active bundler and feature support based on Next.js version. */ @@ -43,7 +45,14 @@ export function maybeWarnAboutUnsupportedTurbopack( silent?: boolean, ): void { // Warn if using turbopack with an unsupported Next.js version - if (!bundlerInfo.isTurbopackSupported && bundlerInfo.isTurbopack) { + if ( + !bundlerInfo.isTurbopackSupported && + bundlerInfo.isTurbopack && + !silent && + process.env[UNSUPPORTED_TURBOPACK_WARNING_SHOWN] !== '1' + ) { + // Next.js may evaluate its config in child processes, which inherit this state from their parent. + process.env[UNSUPPORTED_TURBOPACK_WARNING_SHOWN] = '1'; getBuildLogger(silent).warn( `[@sentry/nextjs] WARNING: You are using the Sentry SDK with Turbopack. The Sentry SDK is compatible with Turbopack on Next.js version 15.4.1 or later. You are currently on ${nextJsVersion}. Please upgrade to a newer Next.js version to use the Sentry SDK with Turbopack.`, ); diff --git a/packages/nextjs/test/config/withSentryConfig.test.ts b/packages/nextjs/test/config/withSentryConfig.test.ts index 303b3413f7a8..69a190bab8c7 100644 --- a/packages/nextjs/test/config/withSentryConfig.test.ts +++ b/packages/nextjs/test/config/withSentryConfig.test.ts @@ -17,8 +17,17 @@ const EXPECTED_DEFAULT_EXTERNALS = [ ...filterInstrumentedExternals(DEFAULT_SERVER_EXTERNAL_PACKAGES, BUNDLE_SAFE_INSTRUMENTED_PACKAGES), ...ORCHESTRION_RUNTIME_EXTERNAL_PACKAGES, ]; +const originalTurbopackWarningShown = process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; describe('withSentryConfig', () => { + afterEach(() => { + if (originalTurbopackWarningShown === undefined) { + delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; + } else { + process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__ = originalTurbopackWarningShown; + } + }); + // `next.config.js` / `next.config.mjs` get no type checking, so this warning is the only signal // those users receive that the option is gone. describe('removed `unstable_sentryWebpackPluginOptions`', () => { @@ -1280,6 +1289,21 @@ describe('withSentryConfig', () => { consoleWarnSpy.mockRestore(); }); + it('warns only once when the config is materialized repeatedly', () => { + process.env.TURBOPACK = '1'; + vi.spyOn(util, 'getNextjsVersion').mockReturnValue('15.4.0'); + vi.spyOn(util, 'supportsProductionCompileHook').mockReturnValue(false); + const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + materializeFinalNextConfig(exportedNextConfig); + materializeFinalNextConfig(exportedNextConfig); + materializeFinalNextConfig(exportedNextConfig); + + expect(consoleWarnSpy).toHaveBeenCalledTimes(1); + + consoleWarnSpy.mockRestore(); + }); + it('does not warn when Turbopack is enabled with supported Next.js version', () => { process.env.TURBOPACK = '1'; // @ts-expect-error - NODE_ENV is read-only in types but we need to set it for testing From 9b9d94c4cac40d77bd9a7d3cfaad613dae95480e Mon Sep 17 00:00:00 2001 From: hafzism Date: Fri, 4 Sep 2026 10:33:33 +0530 Subject: [PATCH 2/3] test(nextjs): Isolate Turbopack warning marker Co-Authored-By: OpenAI Codex --- packages/nextjs/test/config/silent.test.ts | 8 ++++++++ packages/nextjs/test/config/withSentryConfig.test.ts | 11 +++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/test/config/silent.test.ts b/packages/nextjs/test/config/silent.test.ts index 0892fe80dfe1..3cd414fc2867 100644 --- a/packages/nextjs/test/config/silent.test.ts +++ b/packages/nextjs/test/config/silent.test.ts @@ -21,6 +21,14 @@ const WEBPACK: BundlerInfo = { isTurbopack: false, isWebpack: true, isTurbopackS // variants need distinct paths to both actually scan. Neither is a directory, which is what makes it log. const NOT_A_DIRECTORY = { silent: __filename, notSilent: path.join(__dirname, 'testUtils.ts') }; +beforeEach(() => { + delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; +}); + +afterEach(() => { + delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; +}); + describe('getBuildLogger', () => { it('forwards to the console when not silent', () => { const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); diff --git a/packages/nextjs/test/config/withSentryConfig.test.ts b/packages/nextjs/test/config/withSentryConfig.test.ts index 69a190bab8c7..bd5cf10019a4 100644 --- a/packages/nextjs/test/config/withSentryConfig.test.ts +++ b/packages/nextjs/test/config/withSentryConfig.test.ts @@ -17,15 +17,14 @@ const EXPECTED_DEFAULT_EXTERNALS = [ ...filterInstrumentedExternals(DEFAULT_SERVER_EXTERNAL_PACKAGES, BUNDLE_SAFE_INSTRUMENTED_PACKAGES), ...ORCHESTRION_RUNTIME_EXTERNAL_PACKAGES, ]; -const originalTurbopackWarningShown = process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; describe('withSentryConfig', () => { + beforeEach(() => { + delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; + }); + afterEach(() => { - if (originalTurbopackWarningShown === undefined) { - delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; - } else { - process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__ = originalTurbopackWarningShown; - } + delete process.env.__SENTRY_UNSUPPORTED_TURBOPACK_WARNING_SHOWN__; }); // `next.config.js` / `next.config.mjs` get no type checking, so this warning is the only signal From 534b9f24bd768bd1b3edce03e2cf35a0cd2a9a5d Mon Sep 17 00:00:00 2001 From: hafzism Date: Fri, 4 Sep 2026 10:40:39 +0530 Subject: [PATCH 3/3] test(nextjs): Scope Turbopack warning assertion Co-Authored-By: OpenAI Codex --- packages/nextjs/test/config/withSentryConfig.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/test/config/withSentryConfig.test.ts b/packages/nextjs/test/config/withSentryConfig.test.ts index bd5cf10019a4..977bd4ae72ed 100644 --- a/packages/nextjs/test/config/withSentryConfig.test.ts +++ b/packages/nextjs/test/config/withSentryConfig.test.ts @@ -1298,7 +1298,10 @@ describe('withSentryConfig', () => { materializeFinalNextConfig(exportedNextConfig); materializeFinalNextConfig(exportedNextConfig); - expect(consoleWarnSpy).toHaveBeenCalledTimes(1); + const turbopackWarnings = consoleWarnSpy.mock.calls.filter(([message]) => + String(message).includes('WARNING: You are using the Sentry SDK with Turbopack'), + ); + expect(turbopackWarnings).toHaveLength(1); consoleWarnSpy.mockRestore(); });