diff --git a/dev-packages/e2e-tests/test-applications/nuxt-5/pnpm-workspace.yaml b/dev-packages/e2e-tests/test-applications/nuxt-5/pnpm-workspace.yaml index 227e243b2ee4..4210a62a804d 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-5/pnpm-workspace.yaml +++ b/dev-packages/e2e-tests/test-applications/nuxt-5/pnpm-workspace.yaml @@ -1,2 +1,3 @@ allowBuilds: '@sentry/cli': true +minimumReleaseAge: 0 diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index bc03deb58328..0b80077367a0 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -193,7 +193,7 @@ export default defineNuxtModule({ } if (serverConfigFile) { - addMiddlewareInstrumentation(nitro); + addMiddlewareInstrumentation(nitro, isNitroV3); if (!usesDeprecatedInjectMode) { addServerConfigShimWithWarning(nitro); diff --git a/packages/nuxt/src/vite/middlewareConfig.ts b/packages/nuxt/src/vite/middlewareConfig.ts index aa8f5a41ea23..f761c2b1dbff 100644 --- a/packages/nuxt/src/vite/middlewareConfig.ts +++ b/packages/nuxt/src/vite/middlewareConfig.ts @@ -19,8 +19,9 @@ export function addMiddlewareImports(): void { * Adds middleware instrumentation to the Nitro build. * * @param nitro Nitro instance + * @param isNitroV3 Whether the app builds with Nitro v3 (Nuxt 5) */ -export function addMiddlewareInstrumentation(nitro: Nitro): void { +export function addMiddlewareInstrumentation(nitro: Nitro, isNitroV3: boolean): void { nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => { if (!rollupConfig.plugins) { rollupConfig.plugins = []; @@ -30,7 +31,7 @@ export function addMiddlewareInstrumentation(nitro: Nitro): void { rollupConfig.plugins = [rollupConfig.plugins]; } - rollupConfig.plugins.push(middlewareInstrumentationPlugin(nitro)); + rollupConfig.plugins.push(middlewareInstrumentationPlugin(nitro, isNitroV3)); }); } @@ -38,10 +39,12 @@ export function addMiddlewareInstrumentation(nitro: Nitro): void { * Creates a rollup plugin for the middleware instrumentation by transforming the middleware code. * * @param nitro Nitro instance + * @param isNitroV3 Whether the app builds with Nitro v3 (Nuxt 5) * @returns The rollup plugin for the middleware instrumentation. */ -function middlewareInstrumentationPlugin(nitro: Nitro): InputPluginOption { +function middlewareInstrumentationPlugin(nitro: Nitro, isNitroV3: boolean): InputPluginOption { const middlewareFiles = new Set(); + const wrapperModule = isNitroV3 ? '#imports/server' : '#imports'; return { name: 'sentry-nuxt-middleware-instrumentation', @@ -58,7 +61,7 @@ function middlewareInstrumentationPlugin(nitro: Nitro): InputPluginOption { if (middlewareFiles.has(id)) { const fileName = path.basename(id); return { - code: wrapMiddlewareCode(code, fileName), + code: wrapMiddlewareCode(code, fileName, wrapperModule), map: null, }; } @@ -72,15 +75,16 @@ function middlewareInstrumentationPlugin(nitro: Nitro): InputPluginOption { * * @param originalCode The original user code of the middleware. * @param fileName The name of the middleware file, used for the span name and logging. + * @param wrapperModule Import specifier resolving to `wrapMiddlewareHandlerWithSentry`. * * @returns The wrapped user code of the middleware. */ -function wrapMiddlewareCode(originalCode: string, fileName: string): string { +function wrapMiddlewareCode(originalCode: string, fileName: string, wrapperModule: string): string { // Remove common file extensions const cleanFileName = fileName.replace(/\.(ts|js|mjs|mts|cts)$/, ''); return ` -import { wrapMiddlewareHandlerWithSentry } from '#imports'; +import { wrapMiddlewareHandlerWithSentry } from '${wrapperModule}'; function defineInstrumentedEventHandler(handlerOrObject) { return defineEventHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));