From f61bb28dc8a20ba0234eb0c146df3fbdac025a9c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 10:20:27 +0200 Subject: [PATCH 1/6] test(nextjs): Debug nextjs-16 webpack prerender failure Co-Authored-By: Claude Opus 5.5 --- dev-packages/e2e-tests/test-applications/nextjs-16/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json index 34b8d7f62dc9..c699763741aa 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json @@ -7,7 +7,7 @@ "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "clean": "npx rimraf node_modules pnpm-lock.yaml .tmp_dev_server_logs", "dev:webpack": "next dev --webpack", - "build-webpack": "next build --webpack > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", + "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && cat pnpm-lock.yaml && exit 1)", "start": "next start", "lint": "eslint", "test:prod": "TEST_ENV=production playwright test", From 24b75caefa95d8b028339de0cd5e4a0afa2fcbad Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 10:27:04 +0200 Subject: [PATCH 2/6] test(nextjs): Print client manifest on nextjs-16 webpack build failure Co-Authored-By: Claude Opus 5.5 --- dev-packages/e2e-tests/test-applications/nextjs-16/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json index c699763741aa..713e864f77bd 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json @@ -7,7 +7,7 @@ "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "clean": "npx rimraf node_modules pnpm-lock.yaml .tmp_dev_server_logs", "dev:webpack": "next dev --webpack", - "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && cat pnpm-lock.yaml && exit 1)", + "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; grep -o \"[^\"]*global-error[^\"]*\" .next/server/app/_global-error/page_client-reference-manifest.js | sort -u; head -c 6000 .next/server/app/_global-error/page_client-reference-manifest.js; exit 1)", "start": "next start", "lint": "eslint", "test:prod": "TEST_ENV=production playwright test", From b120e15e353faa4ed2e9960f00ca08913a47b389 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 10:32:44 +0200 Subject: [PATCH 3/6] test(nextjs): Print client manifest entries on build failure Co-Authored-By: Claude Opus 5.5 --- dev-packages/e2e-tests/test-applications/nextjs-16/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json index 713e864f77bd..003540d25e6c 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json @@ -7,7 +7,7 @@ "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "clean": "npx rimraf node_modules pnpm-lock.yaml .tmp_dev_server_logs", "dev:webpack": "next dev --webpack", - "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; grep -o \"[^\"]*global-error[^\"]*\" .next/server/app/_global-error/page_client-reference-manifest.js | sort -u; head -c 6000 .next/server/app/_global-error/page_client-reference-manifest.js; exit 1)", + "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; for f in .next/server/app/_global-error/page_client-reference-manifest.js .next/server/app/page_client-reference-manifest.js; do echo MANIFEST $f; tr , '\\n' < $f | grep -v node_modules | grep -v chunks; done; grep -rl global-error .next/static/chunks | head; exit 1)", "start": "next start", "lint": "eslint", "test:prod": "TEST_ENV=production playwright test", From 962c1d2d6dfe0f22bc9d39ee19109b47d3c105ae Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 10:44:57 +0200 Subject: [PATCH 4/6] test(nextjs): Dump client chunks on build failure Co-Authored-By: Claude Opus 5.5 --- .../nextjs-16/debug-build.mjs | 29 +++++++++++++++++++ .../test-applications/nextjs-16/package.json | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs b/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs new file mode 100644 index 000000000000..9175ea15e5b1 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs @@ -0,0 +1,29 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const chunksDir = '.next/static/chunks'; +const walk = dir => + fs.readdirSync(dir, { withFileTypes: true }).flatMap(e => { + const p = path.join(dir, e.name); + return e.isDirectory() ? walk(p) : [p]; + }); + +console.log('readdir app:', fs.readdirSync('app').join(' ')); + +for (const file of walk(chunksDir)) { + const src = fs.readFileSync(file, 'utf8'); + if (!/global-error|GlobalError|statusCode:0/.test(src) && !file.includes('global-error')) continue; + const push = /\.push\(\[\[([^\]]*)\]/.exec(src); + const ids = [...src.matchAll(/[,{](\d+):(?:\(|function)/g)].map(m => m[1]); + console.log('CHUNK', file, 'chunkIds', push?.[1], 'modules', ids.join(' '), 'size', src.length); + const entry = /\.O\(0,\[([^\]]*)\],\(\)=>[^)]*\((\d+)\)\)/.exec(src); + if (entry) console.log(' entry deps', entry[1], 'entry module', entry[2]); + const tail = src.slice(-400); + console.log(' tail', tail); +} + +const stats = '.next/server/app/_global-error/page.js'; +const serverSrc = fs.readFileSync(stats, 'utf8'); +for (const m of serverSrc.matchAll(/[^"'`]{0,120}global-error[^"'`]{0,120}/g)) { + console.log('SERVER REF', m[0]); +} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json index 003540d25e6c..707bcd8b95f5 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json @@ -7,7 +7,7 @@ "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "clean": "npx rimraf node_modules pnpm-lock.yaml .tmp_dev_server_logs", "dev:webpack": "next dev --webpack", - "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; for f in .next/server/app/_global-error/page_client-reference-manifest.js .next/server/app/page_client-reference-manifest.js; do echo MANIFEST $f; tr , '\\n' < $f | grep -v node_modules | grep -v chunks; done; grep -rl global-error .next/static/chunks | head; exit 1)", + "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; for f in .next/server/app/_global-error/page_client-reference-manifest.js .next/server/app/page_client-reference-manifest.js; do echo MANIFEST $f; tr , '\\n' < $f | grep -v node_modules | grep -v chunks; done; node debug-build.mjs; exit 1)", "start": "next start", "lint": "eslint", "test:prod": "TEST_ENV=production playwright test", From f487d6c2b38629af5ffd95c49f09687366ba6429 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 10:49:07 +0200 Subject: [PATCH 5/6] test(nextjs): Dump global-error chunk modules Co-Authored-By: Claude Opus 5.5 --- .../e2e-tests/test-applications/nextjs-16/debug-build.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs b/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs index 9175ea15e5b1..a7502d4a910e 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs @@ -18,8 +18,11 @@ for (const file of walk(chunksDir)) { console.log('CHUNK', file, 'chunkIds', push?.[1], 'modules', ids.join(' '), 'size', src.length); const entry = /\.O\(0,\[([^\]]*)\],\(\)=>[^)]*\((\d+)\)\)/.exec(src); if (entry) console.log(' entry deps', entry[1], 'entry module', entry[2]); - const tail = src.slice(-400); - console.log(' tail', tail); + if (file.includes('global-error-')) { + for (const m of src.matchAll(/[,{](\d+):(?:\(|function)/g)) { + console.log(' MODULE', m[1], src.slice(m.index, m.index + 600).replace(/\s+/g, ' ')); + } + } } const stats = '.next/server/app/_global-error/page.js'; From a1e6166b8557d0fca7798404ed68ade1dd569eab Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 23 Oct 2026 11:01:31 +0200 Subject: [PATCH 6/6] test(nextjs): Bump nextjs-16 test app to Next.js 16.4.2 Next.js 16.3.8 drops a client component from the client reference manifest when webpack gives its concatenated module the id 0, because it checks the id for truthiness. The deterministic module ids depend on the module identifiers, which include the pnpm directory names of the loaders. Since webpack 5.112.1 was published, the peer suffix of @sentry/nextjs changed and `app/global-error.tsx` got the id 0 on CI, so prerendering failed. Next.js 16.4.0 fixed the check (vercel/next.js#97936). Co-Authored-By: Claude Opus 5.5 --- .../nextjs-16/debug-build.mjs | 32 ------------------- .../test-applications/nextjs-16/package.json | 4 +-- 2 files changed, 2 insertions(+), 34 deletions(-) delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs b/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs deleted file mode 100644 index a7502d4a910e..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/debug-build.mjs +++ /dev/null @@ -1,32 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; - -const chunksDir = '.next/static/chunks'; -const walk = dir => - fs.readdirSync(dir, { withFileTypes: true }).flatMap(e => { - const p = path.join(dir, e.name); - return e.isDirectory() ? walk(p) : [p]; - }); - -console.log('readdir app:', fs.readdirSync('app').join(' ')); - -for (const file of walk(chunksDir)) { - const src = fs.readFileSync(file, 'utf8'); - if (!/global-error|GlobalError|statusCode:0/.test(src) && !file.includes('global-error')) continue; - const push = /\.push\(\[\[([^\]]*)\]/.exec(src); - const ids = [...src.matchAll(/[,{](\d+):(?:\(|function)/g)].map(m => m[1]); - console.log('CHUNK', file, 'chunkIds', push?.[1], 'modules', ids.join(' '), 'size', src.length); - const entry = /\.O\(0,\[([^\]]*)\],\(\)=>[^)]*\((\d+)\)\)/.exec(src); - if (entry) console.log(' entry deps', entry[1], 'entry module', entry[2]); - if (file.includes('global-error-')) { - for (const m of src.matchAll(/[,{](\d+):(?:\(|function)/g)) { - console.log(' MODULE', m[1], src.slice(m.index, m.index + 600).replace(/\s+/g, ' ')); - } - } -} - -const stats = '.next/server/app/_global-error/page.js'; -const serverSrc = fs.readFileSync(stats, 'utf8'); -for (const m of serverSrc.matchAll(/[^"'`]{0,120}global-error[^"'`]{0,120}/g)) { - console.log('SERVER REF', m[0]); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json index 707bcd8b95f5..691cefcdc21a 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-16/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-16/package.json @@ -7,7 +7,7 @@ "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "clean": "npx rimraf node_modules pnpm-lock.yaml .tmp_dev_server_logs", "dev:webpack": "next dev --webpack", - "build-webpack": "next build --webpack --debug-prerender > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && pwd && pwd -P && uname -a && ls .next/static/chunks/app; for f in .next/server/app/_global-error/page_client-reference-manifest.js .next/server/app/page_client-reference-manifest.js; do echo MANIFEST $f; tr , '\\n' < $f | grep -v node_modules | grep -v chunks; done; node debug-build.mjs; exit 1)", + "build-webpack": "next build --webpack > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", "start": "next start", "lint": "eslint", "test:prod": "TEST_ENV=production playwright test", @@ -38,7 +38,7 @@ "ai": "^3.0.0", "import-in-the-middle": "^2", "ioredis": "5.10.1", - "next": "16.3.8", + "next": "16.4.2", "openai": "5.18.1", "pg": "^8.13.1", "react": "19.1.0",