From 4e5024643e8c0f4f083ff0b1912e25ba7de15f5a Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 18 Feb 2026 14:04:59 +0100 Subject: [PATCH] Set sourcemapexcludesources to false from vite plugin --- .../src/vite/sentryTanstackStart.ts | 7 +++++- .../src/vite/sourceMaps.ts | 25 +++++++++++++++++++ .../test/vite/sentryTanstackStart.test.ts | 22 ++++++++++++++-- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts b/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts index d14033ff052d..538906be8545 100644 --- a/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts +++ b/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts @@ -1,7 +1,11 @@ import type { BuildTimeOptionsBase } from '@sentry/core'; import type { Plugin } from 'vite'; import { makeAutoInstrumentMiddlewarePlugin } from './autoInstrumentMiddleware'; -import { makeAddSentryVitePlugin, makeEnableSourceMapsVitePlugin } from './sourceMaps'; +import { + makeAddSentryVitePlugin, + makeEnableSourceMapsVitePlugin, + makeNitroSourcemapExcludeSourcesPlugin, +} from './sourceMaps'; /** * Build-time options for the Sentry TanStack Start SDK. @@ -62,6 +66,7 @@ export function sentryTanstackStart(options: SentryTanstackStartOptions = {}): P const sourceMapsDisabled = options.sourcemaps?.disable === true || options.sourcemaps?.disable === 'disable-upload'; if (!sourceMapsDisabled) { plugins.push(...makeEnableSourceMapsVitePlugin(options)); + plugins.push(makeNitroSourcemapExcludeSourcesPlugin(options)); } return plugins; diff --git a/packages/tanstackstart-react/src/vite/sourceMaps.ts b/packages/tanstackstart-react/src/vite/sourceMaps.ts index e9ee193b8d8a..3eef46bf743a 100644 --- a/packages/tanstackstart-react/src/vite/sourceMaps.ts +++ b/packages/tanstackstart-react/src/vite/sourceMaps.ts @@ -101,6 +101,31 @@ export function makeEnableSourceMapsVitePlugin(options: BuildTimeOptionsBase): P ]; } +/** + * A Sentry plugin for TanStack Start to set `sourcemapExcludeSources: false` in the Nitro config. + * + * By default, Nitro sets `sourcemapExcludeSources: true`, which means the original source code is not included + * in the source maps. This makes it impossible for Sentry to display un-minified code snippets on the Issues page. + */ +export function makeNitroSourcemapExcludeSourcesPlugin(_options: BuildTimeOptionsBase): Plugin { + return { + name: 'sentry-tanstackstart-nitro-sourcemap-exclude-sources', + apply: 'build', + enforce: 'post', + config() { + return { + nitro: { + rollupConfig: { + output: { + sourcemapExcludeSources: false, + }, + }, + }, + } as UserConfig; + }, + }; +} + /** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993) * * 1. User explicitly disabled source maps diff --git a/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts b/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts index ef18da74d03a..1b5fdadcac00 100644 --- a/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts +++ b/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts @@ -22,6 +22,13 @@ const mockEnableSourceMapsPlugin: Plugin = { config: vi.fn(), }; +const mockNitroSourcemapExcludeSourcesPlugin: Plugin = { + name: 'sentry-tanstackstart-nitro-sourcemap-exclude-sources', + apply: 'build', + enforce: 'post', + config: vi.fn(), +}; + const mockMiddlewarePlugin: Plugin = { name: 'sentry-tanstack-middleware-auto-instrument', apply: 'build', @@ -31,6 +38,7 @@ const mockMiddlewarePlugin: Plugin = { vi.mock('../../src/vite/sourceMaps', () => ({ makeAddSentryVitePlugin: vi.fn(() => [mockSourceMapsConfigPlugin, mockSentryVitePlugin]), makeEnableSourceMapsVitePlugin: vi.fn(() => [mockEnableSourceMapsPlugin]), + makeNitroSourcemapExcludeSourcesPlugin: vi.fn(() => mockNitroSourcemapExcludeSourcesPlugin), })); vi.mock('../../src/vite/autoInstrumentMiddleware', () => ({ @@ -51,7 +59,12 @@ describe('sentryTanstackStart()', () => { it('returns source maps plugins in production mode', () => { const plugins = sentryTanstackStart({ autoInstrumentMiddleware: false }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin, mockEnableSourceMapsPlugin]); + expect(plugins).toEqual([ + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockEnableSourceMapsPlugin, + mockNitroSourcemapExcludeSourcesPlugin, + ]); }); it('returns no plugins in development mode', () => { @@ -86,7 +99,12 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: false }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin, mockEnableSourceMapsPlugin]); + expect(plugins).toEqual([ + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockEnableSourceMapsPlugin, + mockNitroSourcemapExcludeSourcesPlugin, + ]); }); });