Skip to content

Commit 5fa214b

Browse files
committed
feat(nuxt): Conditionally use plugins based on Nitro version (v2/v3)
1 parent 9e3a4cb commit 5fa214b

4 files changed

Lines changed: 36 additions & 16 deletions

File tree

packages/nuxt/src/module.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,23 @@ export default defineNuxtModule<ModuleOptions>({
8181
const isNitroV3 = (await getNitroMajorVersion()) >= 3;
8282

8383
if (serverConfigFile) {
84-
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));
84+
if (isNitroV3) {
85+
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));
86+
} else {
87+
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));
88+
}
89+
8590
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));
8691

8792
addPlugin({
8893
src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'),
8994
mode: 'server',
9095
});
96+
97+
// Preps the middleware instrumentation module.
98+
addMiddlewareImports();
99+
addStorageInstrumentation(nuxt, !isNitroV3);
100+
addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);
91101
}
92102

93103
if (clientConfigFile || serverConfigFile) {
@@ -116,13 +126,6 @@ export default defineNuxtModule<ModuleOptions>({
116126
};
117127
});
118128

119-
// Preps the the middleware instrumentation module.
120-
if (serverConfigFile) {
121-
addMiddlewareImports();
122-
addStorageInstrumentation(nuxt);
123-
addDatabaseInstrumentation(nuxt.options.nitro, moduleOptions);
124-
}
125-
126129
// Add the sentry config file to the include array
127130
nuxt.hook('prepare:types', options => {
128131
const tsConfig = options.tsConfig as { include?: string[] };
@@ -148,7 +151,7 @@ export default defineNuxtModule<ModuleOptions>({
148151
return;
149152
}
150153

151-
if (serverConfigFile) {
154+
if (serverConfigFile && !isNitroV3) {
152155
addMiddlewareInstrumentation(nitro);
153156
}
154157

packages/nuxt/src/runtime/plugins/sentry.server.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ export default (nitroApp => {
1313

1414
// @ts-expect-error - 'render:html' is a valid hook name in the Nuxt context
1515
nitroApp.hooks.hook('render:html', (html: NuxtRenderHTMLContext, { event }: { event: H3Event }) => {
16-
const headers = event.node.res?.getHeaders() || {};
16+
// h3 v1 (Nuxt 4): event.node.res.getHeaders(); h3 v2 (Nuxt 5): event.node is undefined
17+
const nodeResHeadersH3v1 = event.node?.res?.getHeaders() || {};
18+
19+
// h3 v2 (Nuxt 5): response headers are on event.res.headers
20+
const isPreRenderedPage =
21+
Object.keys(nodeResHeadersH3v1).includes('x-nitro-prerender') ||
22+
// oxlint-disable-next-line typescript/no-explicit-any
23+
!!(event as any).res?.headers?.has?.('x-nitro-prerender');
1724

18-
const isPreRenderedPage = Object.keys(headers).includes('x-nitro-prerender');
19-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
2025
const isSWRCachedPage = event?.context?.cache?.options.swr as boolean | undefined;
2126

2227
if (!isPreRenderedPage && !isSWRCachedPage) {

packages/nuxt/src/vite/databaseConfig.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { addServerTemplate } from '../vendor/server-template';
77
/**
88
* Sets up the database instrumentation.
99
*/
10-
export function addDatabaseInstrumentation(nitro: NitroConfig, moduleOptions?: SentryNuxtModuleOptions): void {
10+
export function addDatabaseInstrumentation(
11+
nitro: NitroConfig,
12+
isLegacyNitro: boolean,
13+
moduleOptions?: SentryNuxtModuleOptions,
14+
): void {
1115
if (!nitro.experimental?.database) {
1216
// We cannot use DEBUG_BUILD here because it is a runtime flag, so it is not available for build time scripts
1317
// So we have to pass in the module options to the build time script
@@ -38,5 +42,9 @@ export function addDatabaseInstrumentation(nitro: NitroConfig, moduleOptions?: S
3842
},
3943
});
4044

41-
addServerPlugin(createResolver(import.meta.url).resolve('./runtime/plugins/database-legacy.server'));
45+
if (isLegacyNitro) {
46+
addServerPlugin(createResolver(import.meta.url).resolve('./runtime/plugins/database-legacy.server'));
47+
} else {
48+
addServerPlugin(createResolver(import.meta.url).resolve('./runtime/plugins/database.server'));
49+
}
4250
}

packages/nuxt/src/vite/storageConfig.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { addServerTemplate } from '../vendor/server-template';
55
/**
66
* Prepares the storage config export to be used in the runtime storage instrumentation.
77
*/
8-
export function addStorageInstrumentation(nuxt: Nuxt): void {
8+
export function addStorageInstrumentation(nuxt: Nuxt, isLegacyNitro: boolean): void {
99
const moduleDirResolver = createResolver(import.meta.url);
1010
const userStorageMounts = Object.keys(nuxt.options.nitro.storage || {});
1111

@@ -17,5 +17,9 @@ export function addStorageInstrumentation(nuxt: Nuxt): void {
1717
},
1818
});
1919

20-
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/storage-legacy.server'));
20+
if (isLegacyNitro) {
21+
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/storage-legacy.server'));
22+
} else {
23+
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/storage.server'));
24+
}
2125
}

0 commit comments

Comments
 (0)