From e972651f57dae92603db264e6e4cd7babeb483c5 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 11 Feb 2026 11:59:59 +0100 Subject: [PATCH 1/3] Set nitro to latest --- .../test-applications/tanstackstart-react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json b/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json index d75ebb148639..d931d44449cb 100644 --- a/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json +++ b/dev-packages/e2e-tests/test-applications/tanstackstart-react/package.json @@ -16,6 +16,7 @@ "@sentry/tanstackstart-react": "latest || *", "@tanstack/react-start": "^1.136.0", "@tanstack/react-router": "^1.136.0", + "nitro": "latest", "react": "^19.2.0", "react-dom": "^19.2.0" }, @@ -29,7 +30,6 @@ "typescript": "^5.9.0", "vite": "7.2.0", "vite-tsconfig-paths": "^5.1.4", - "nitro": "^3.0.0", "@playwright/test": "~1.56.0", "@sentry-internal/test-utils": "link:../../../test-utils" }, From 3a0109dd9582042c26a64ea90011a3ca60c06cbe Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 11 Feb 2026 13:30:25 +0100 Subject: [PATCH 2/3] fix build issue by externalizing sentry deps --- .../tanstackstart-react/src/vite/nitro.ts | 22 +++++++++++ .../src/vite/sentryTanstackStart.ts | 3 +- .../test/vite/nitro.test.ts | 17 ++++++++ .../test/vite/sentryTanstackStart.test.ts | 39 +++++++++++++++---- 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 packages/tanstackstart-react/src/vite/nitro.ts create mode 100644 packages/tanstackstart-react/test/vite/nitro.test.ts diff --git a/packages/tanstackstart-react/src/vite/nitro.ts b/packages/tanstackstart-react/src/vite/nitro.ts new file mode 100644 index 000000000000..b6843ea91f5a --- /dev/null +++ b/packages/tanstackstart-react/src/vite/nitro.ts @@ -0,0 +1,22 @@ +import type { Plugin, UserConfig } from 'vite'; + +/** + * Creates a Vite plugin that configures Nitro to treat `@sentry/*` packages as external dependencies. + * + * We need this to prevent build issues we were seeing with recent versions of Nitro. + */ +export function makeNitroSentryExternalPlugin(): Plugin { + return { + name: 'sentry-tanstack-start-nitro-external', + config() { + // The `nitro` property is not part of Vite's UserConfig type but is read by the Nitro Vite plugin + return { + nitro: { + rollupConfig: { + external: [/^@sentry\//], + }, + }, + } as UserConfig; + }, + }; +} diff --git a/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts b/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts index d14033ff052d..379156e5a85b 100644 --- a/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts +++ b/packages/tanstackstart-react/src/vite/sentryTanstackStart.ts @@ -1,6 +1,7 @@ import type { BuildTimeOptionsBase } from '@sentry/core'; import type { Plugin } from 'vite'; import { makeAutoInstrumentMiddlewarePlugin } from './autoInstrumentMiddleware'; +import { makeNitroSentryExternalPlugin } from './nitro'; import { makeAddSentryVitePlugin, makeEnableSourceMapsVitePlugin } from './sourceMaps'; /** @@ -51,7 +52,7 @@ export function sentryTanstackStart(options: SentryTanstackStartOptions = {}): P return []; } - const plugins: Plugin[] = [...makeAddSentryVitePlugin(options)]; + const plugins: Plugin[] = [makeNitroSentryExternalPlugin(), ...makeAddSentryVitePlugin(options)]; // middleware auto-instrumentation if (options.autoInstrumentMiddleware !== false) { diff --git a/packages/tanstackstart-react/test/vite/nitro.test.ts b/packages/tanstackstart-react/test/vite/nitro.test.ts new file mode 100644 index 000000000000..2d43de735139 --- /dev/null +++ b/packages/tanstackstart-react/test/vite/nitro.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; +import { makeNitroSentryExternalPlugin } from '../../src/vite/nitro'; + +describe('makeNitroSentryExternalPlugin()', () => { + it('returns nitro config to externalize @sentry/* packages', () => { + const plugin = makeNitroSentryExternalPlugin(); + const config = (plugin.config as () => unknown)(); + + expect(config).toEqual({ + nitro: { + rollupConfig: { + external: [/^@sentry\//], + }, + }, + }); + }); +}); diff --git a/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts b/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts index ef18da74d03a..4d7ffecd468f 100644 --- a/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts +++ b/packages/tanstackstart-react/test/vite/sentryTanstackStart.test.ts @@ -28,6 +28,11 @@ const mockMiddlewarePlugin: Plugin = { transform: vi.fn(), }; +const expectedNitroExternalPlugin = expect.objectContaining({ + name: 'sentry-tanstack-start-nitro-external', + config: expect.any(Function), +}); + vi.mock('../../src/vite/sourceMaps', () => ({ makeAddSentryVitePlugin: vi.fn(() => [mockSourceMapsConfigPlugin, mockSentryVitePlugin]), makeEnableSourceMapsVitePlugin: vi.fn(() => [mockEnableSourceMapsPlugin]), @@ -51,7 +56,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([ + expectedNitroExternalPlugin, + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockEnableSourceMapsPlugin, + ]); }); it('returns no plugins in development mode', () => { @@ -68,7 +78,7 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: true }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin]); + expect(plugins).toEqual([expectedNitroExternalPlugin, mockSourceMapsConfigPlugin, mockSentryVitePlugin]); }); it('returns Sentry Vite plugins but not enable source maps plugin when sourcemaps.disable is "disable-upload"', () => { @@ -77,7 +87,7 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: 'disable-upload' }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin]); + expect(plugins).toEqual([expectedNitroExternalPlugin, mockSourceMapsConfigPlugin, mockSentryVitePlugin]); }); it('returns Sentry Vite plugins and enable source maps plugin when sourcemaps.disable is false', () => { @@ -86,7 +96,12 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: false }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin, mockEnableSourceMapsPlugin]); + expect(plugins).toEqual([ + expectedNitroExternalPlugin, + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockEnableSourceMapsPlugin, + ]); }); }); @@ -94,7 +109,12 @@ describe('sentryTanstackStart()', () => { it('includes middleware plugin by default', () => { const plugins = sentryTanstackStart({ sourcemaps: { disable: true } }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin, mockMiddlewarePlugin]); + expect(plugins).toEqual([ + expectedNitroExternalPlugin, + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockMiddlewarePlugin, + ]); }); it('includes middleware plugin when autoInstrumentMiddleware is true', () => { @@ -103,7 +123,12 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: true }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin, mockMiddlewarePlugin]); + expect(plugins).toEqual([ + expectedNitroExternalPlugin, + mockSourceMapsConfigPlugin, + mockSentryVitePlugin, + mockMiddlewarePlugin, + ]); }); it('does not include middleware plugin when autoInstrumentMiddleware is false', () => { @@ -112,7 +137,7 @@ describe('sentryTanstackStart()', () => { sourcemaps: { disable: true }, }); - expect(plugins).toEqual([mockSourceMapsConfigPlugin, mockSentryVitePlugin]); + expect(plugins).toEqual([expectedNitroExternalPlugin, mockSourceMapsConfigPlugin, mockSentryVitePlugin]); }); it('passes correct options to makeAutoInstrumentMiddlewarePlugin', () => { From 1b7665f7beed28cc678322a27433c993a3125637 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 11 Feb 2026 15:31:02 +0100 Subject: [PATCH 3/3] seems like we need to enforce that this runs pre --- packages/tanstackstart-react/src/vite/nitro.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tanstackstart-react/src/vite/nitro.ts b/packages/tanstackstart-react/src/vite/nitro.ts index b6843ea91f5a..7d4fa8140b14 100644 --- a/packages/tanstackstart-react/src/vite/nitro.ts +++ b/packages/tanstackstart-react/src/vite/nitro.ts @@ -8,6 +8,7 @@ import type { Plugin, UserConfig } from 'vite'; export function makeNitroSentryExternalPlugin(): Plugin { return { name: 'sentry-tanstack-start-nitro-external', + enforce: 'pre', config() { // The `nitro` property is not part of Vite's UserConfig type but is read by the Nitro Vite plugin return {