From f1b2f2020afe8373dd38deca996092896d1970e2 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Tue, 29 Jul 2025 13:01:35 +0200 Subject: [PATCH] [segment explorer] normalize path when running inside monorepo --- packages/next/src/server/app-render/app-render.tsx | 6 +++--- .../src/server/app-render/create-component-tree.tsx | 12 ++++++------ .../src/server/app-render/segment-explorer-path.ts | 8 +++++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index d8c90e1ea249..85f616ae5556 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -4201,9 +4201,9 @@ const getGlobalErrorStyles = async ( } if (ctx.renderOpts.dev) { const dir = - process.env.NEXT_RUNTIME === 'edge' - ? process.env.__NEXT_EDGE_PROJECT_DIR! - : ctx.renderOpts.dir || '' + (process.env.NEXT_RUNTIME === 'edge' + ? process.env.__NEXT_EDGE_PROJECT_DIR + : ctx.renderOpts.dir) || '' const globalErrorModulePath = normalizeConventionFilePath( dir, diff --git a/packages/next/src/server/app-render/create-component-tree.tsx b/packages/next/src/server/app-render/create-component-tree.tsx index 9e1ca07f214e..ee173548df23 100644 --- a/packages/next/src/server/app-render/create-component-tree.tsx +++ b/packages/next/src/server/app-render/create-component-tree.tsx @@ -417,9 +417,9 @@ async function createComponentTreeInternal( process.env.NODE_ENV === 'development' && ctx.renderOpts.devtoolSegmentExplorer const dir = - process.env.NEXT_RUNTIME === 'edge' - ? process.env.__NEXT_EDGE_PROJECT_DIR! - : ctx.renderOpts.dir || '' + (process.env.NEXT_RUNTIME === 'edge' + ? process.env.__NEXT_EDGE_PROJECT_DIR + : ctx.renderOpts.dir) || '' // Use the same condition to render metadataOutlet as metadata const metadataOutlet = StreamingMetadataOutlet ? ( @@ -1139,9 +1139,9 @@ async function createBoundaryConventionElement({ process.env.NODE_ENV === 'development' && ctx.renderOpts.devtoolSegmentExplorer const dir = - process.env.NEXT_RUNTIME === 'edge' - ? process.env.__NEXT_EDGE_PROJECT_DIR! - : ctx.renderOpts.dir || '' + (process.env.NEXT_RUNTIME === 'edge' + ? process.env.__NEXT_EDGE_PROJECT_DIR + : ctx.renderOpts.dir) || '' const { SegmentViewNode } = ctx.componentMod const element = Component ? ( <> diff --git a/packages/next/src/server/app-render/segment-explorer-path.ts b/packages/next/src/server/app-render/segment-explorer-path.ts index b5f7482eb6e5..852f2204e8a9 100644 --- a/packages/next/src/server/app-render/segment-explorer-path.ts +++ b/packages/next/src/server/app-render/segment-explorer-path.ts @@ -9,11 +9,17 @@ export function normalizeConventionFilePath( projectDir: string, conventionPath: string | undefined ) { + // Turbopack project path is formed as: "/". + // When project root is not the working directory, we can extract the relative project root path. + // This is mostly used for running Next.js inside a monorepo. const cwd = process.env.NEXT_RUNTIME === 'edge' ? '' : process.cwd() + const relativeProjectRoot = projectDir.replace(cwd, '') let relativePath = (conventionPath || '') // remove turbopack [project] prefix - .replace(/^\[project\][\\/]/, '') + .replace(/^\[project\]/, '') + // remove turbopack relative project path, everything after [project] and before the working directory. + .replace(relativeProjectRoot, '') // remove the project root from the path .replace(projectDir, '') // remove cwd prefix