Skip to content

perf(dev): print Ready early and defer initialization - #87942

Closed
feedthejim wants to merge 1 commit into
perf-dev-rust-clifrom
perf-dev-early-ready
Closed

feedthejim wants to merge 1 commit into
perf-dev-rust-clifrom
perf-dev-early-ready

Conversation

@feedthejim

@feedthejim feedthejim commented Dec 30, 2025 •

Copy link
Copy Markdown
Contributor

Summary

  • Print "Ready in Xms" immediately when HTTP server starts listening
  • Defer heavy initialization (config, bundler, etc.) to background
  • First request waits for init via existing handlersPromise mechanism
  • Fix shell script symlink resolution for pnpm node_modules/.bin
  • Fix Rust CLI canonicalize for symlink resolution

Test Fixes

Early ready prints "Ready" before initialization completes, so tests that expect errors/behavior at startup need adjustment:

  • invalid-custom-routes/test/index.test.ts - Add killApp cleanup between tests, make a request to trigger lazy route validation, wait for stderr to be populated
  • isolated-dev-build/isolated-dev-build.test.ts - Make a request before checking for .next/dev directory (created during lazy init)
  • isolated-dev-build/next.config.js - Restore experimental.isolatedDevBuild: true config

Test Plan

  • Run benchmark script to verify improvements
  • Build passes
  • Dev server shows "Ready" and handles requests correctly
  • First request waits for full initialization
  • Tests properly trigger lazy initialization before assertions

feedthejim commented Dec 30, 2025 •

Copy link
Copy Markdown
Contributor Author

@nextjs-bot

Copy link
Copy Markdown
Contributor

Allow CI Workflow Run

  • approve CI run for commit: 28a223cc3718eded8f5e42454ff7da8e2fba2815

Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer

@feedthejim
feedthejim force-pushed the perf-dev-early-ready branch 2 times, most recently from 5b2a7f2 to e66e783 Compare December 30, 2025 14:07
@feedthejim
feedthejim force-pushed the perf-dev-rust-cli branch 2 times, most recently from 5541176 to e359b2b Compare December 30, 2025 14:11
@feedthejim
feedthejim force-pushed the perf-dev-early-ready branch 2 times, most recently from a171bf5 to 619e232 Compare December 30, 2025 14:33
@feedthejim
feedthejim changed the base branch from perf-dev-rust-cli to graphite-base/87942 December 30, 2025 14:49
@feedthejim
feedthejim changed the base branch from graphite-base/87942 to perf-dev-rust-cli December 30, 2025 14:56
Comment on lines +376 to +389
// Print "Ready" immediately for fast perceived startup
// Requests will wait via handlersPromise until init completes
const startServerProcessDuration =
performance.mark('next-start-end') &&
performance.measure(
'next-start-duration',
'next-start',
'next-start-end'
).duration
const formatDurationText =
startServerProcessDuration > 2000
? `${Math.round(startServerProcessDuration / 100) / 10}s`
: `${Math.round(startServerProcessDuration)}ms`
Log.event(`Ready in ${formatDurationText}`)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "Ready in Xms" message is printed before the heavy initialization completes. If initialization fails (at line 457-469), the misleading "Ready" message has already been logged, but the server exits with an error.

View Details
📝 Patch Details
diff --git a/packages/next/src/server/lib/start-server.ts b/packages/next/src/server/lib/start-server.ts
index ea219758a9..169b46a716 100644
--- a/packages/next/src/server/lib/start-server.ts
+++ b/packages/next/src/server/lib/start-server.ts
@@ -373,21 +373,6 @@ export async function startServer(
           logBundler: isDev,
         })
 
-        // Print "Ready" immediately for fast perceived startup
-        // Requests will wait via handlersPromise until init completes
-        const startServerProcessDuration =
-          performance.mark('next-start-end') &&
-          performance.measure(
-            'next-start-duration',
-            'next-start',
-            'next-start-end'
-          ).duration
-        const formatDurationText =
-          startServerProcessDuration > 2000
-            ? `${Math.round(startServerProcessDuration / 100) / 10}s`
-            : `${Math.round(startServerProcessDuration)}ms`
-        Log.event(`Ready in ${formatDurationText}`)
-
         let cleanupStarted = false
         let closeUpgraded: (() => void) | null = null
         const cleanup = () => {
@@ -474,6 +459,20 @@ export async function startServer(
 
         handlersReady()
 
+        // Print "Ready" only after successful initialization
+        const startServerProcessDuration =
+          performance.mark('next-start-end') &&
+          performance.measure(
+            'next-start-duration',
+            'next-start',
+            'next-start-end'
+          ).duration
+        const formatDurationText =
+          startServerProcessDuration > 2000
+            ? `${Math.round(startServerProcessDuration / 100) / 10}s`
+            : `${Math.round(startServerProcessDuration)}ms`
+        Log.event(`Ready in ${formatDurationText}`)
+
         if (process.env.TURBOPACK && isDev) {
           await validateTurboNextConfig({
             dir: serverOptions.dir,

Analysis

Misleading "Ready in Xms" message logged before critical initialization completes

What fails: Server prints "Ready in Xms" message at line 389 before calling getRequestHandlers() at line 457. If initialization fails, the "Ready" message has already been logged to the user's console, but then the server exits with an error.

How to reproduce:

  1. Create a configuration scenario that causes getRequestHandlers() to throw an error (e.g., corrupted config, missing dependencies during initialization)
  2. Start the Next.js dev server
  3. Observe that "Ready in Xms" is logged to console
  4. The server then exits with an error code and prints the error stack trace

Result: Users see misleading output suggesting the server started successfully when it actually failed during initialization.

Expected: The "Ready" message should only be logged after getRequestHandlers() completes successfully. If initialization fails, the "Ready" message should never be printed.

Root cause: Commit 3e57cf5 ("perf(dev): print Ready early and defer initialization") moved the "Ready" log message before the critical getRequestHandlers() initialization call as a performance optimization. While the defensive mechanism via handlersPromise prevents request processing until initialization completes, it does not prevent the misleading log message from being printed on failure.

Fix: Moved the "Ready in Xms" log message to after handlersReady() is called (line 461-475), ensuring it only prints after successful initialization. The log now correctly appears after all critical initialization in getRequestHandlers() completes.

@vercel vercel deleted a comment from nextjs-bot Jan 1, 2026
@vercel vercel deleted a comment from nextjs-bot Jan 1, 2026
@vercel vercel deleted a comment from codspeed Bot Jan 1, 2026
@vercel vercel deleted a comment from nextjs-bot Jan 1, 2026
@vercel vercel deleted a comment from nextjs-bot Jan 1, 2026
@feedthejim
feedthejim force-pushed the perf-dev-early-ready branch from 20a8c76 to 79adf32 Compare January 1, 2026 20:32
@codspeed

codspeed Bot commented Jan 1, 2026 •

Copy link
Copy Markdown

CodSpeed Performance Report

Merging #87942 will not alter performance

Comparing perf-dev-early-ready (11dbdb9) with perf-dev-rust-cli (09cbf1b)

Summary

✅ 17 untouched
⏩ 3 skipped1

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

@feedthejim
feedthejim force-pushed the perf-dev-early-ready branch from 79adf32 to bfd34ec Compare January 2, 2026 10:35
@feedthejim
feedthejim force-pushed the perf-dev-rust-cli branch 2 times, most recently from 5550f78 to fb95fe5 Compare January 2, 2026 10:39
@feedthejim
feedthejim force-pushed the perf-dev-early-ready branch from bfd34ec to c28dc9c Compare January 2, 2026 10:39
@nextjs-bot

nextjs-bot commented Jan 2, 2026 •

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 2 regressions, 11 improvements

Metric Canary PR Change
node_modules Size 457 MB 462 MB 🔴 +5.71 MB (+1%)
Webpack Build Time 13.879s 13.894s 🔴 +15ms (+0%)
Turbo Build Time 4.242s 4.079s 🟢 163ms (-4%)
Turbo Build Time (cached) 4.136s 4.091s 🟢 45ms (-1%)
Turbo Cold (Boot) 456ms 355ms 🟢 101ms (-22%)
Turbo Cold (Ready) 1.187s 1.153s 🟢 34ms (-3%)
Turbo Warm (Boot) 457ms 354ms 🟢 103ms (-23%)
Turbo Warm (Ready) 404ms 334ms 🟢 70ms (-17%)
Webpack Build Time (cached) 14.036s 13.998s 🟢 38ms (0%)
Webpack Cold (Boot) 457ms 355ms 🟢 102ms (-22%)
Webpack Cold (Ready) 1.856s 1.815s 🟢 41ms (-2%)
Webpack Warm (Boot) 455ms 356ms 🟢 99ms (-22%)
Webpack Warm (Ready) 1.888s 1.794s 🟢 94ms (-5%)
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 10ms AND < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 456ms 355ms 🟢 101ms (-22%)
Cold (First Request) 1.187s 1.153s 🟢 34ms (-3%)
Warm (Listen) 457ms 354ms 🟢 103ms (-23%)
Warm (First Request) 404ms 334ms 🟢 70ms (-17%)
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 457ms 355ms 🟢 102ms (-22%)
Cold (First Request) 1.856s 1.815s 🟢 41ms (-2%)
Warm (Listen) 455ms 356ms 🟢 99ms (-22%)
Warm (First Request) 1.888s 1.794s 🟢 94ms (-5%)

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.242s 4.079s 🟢 163ms (-4%)
Cached Build 4.136s 4.091s 🟢 45ms (-1%)
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 13.879s 13.894s 🔴 +15ms (+0%)
Cached Build 14.036s 13.998s 🟢 38ms (0%)
node_modules Size 457 MB 462 MB 🔴 +5.71 MB (+1%) ▁████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Client Bundles (main, webpack) (Turbopack)
Canary PR Change
02069f30d0d06047.js gzip 12.6 kB N/A -
033668e22423e026.js gzip 159 B N/A -
089159762797868b.js gzip 39.7 kB N/A -
0b02037753b0b4f1.js gzip 8.39 kB N/A -
0b54c5fafa2733c8.js gzip 6.3 kB N/A -
1ac0b96d61fef0f8.js gzip 162 B N/A -
1e2fda25d939c4f8.js gzip 5.48 kB N/A -
24ae09d915c5342b.js gzip 449 B N/A -
3143edb75fc4a439.js gzip 225 B N/A -
35be367382eb476d.js gzip 162 B N/A -
3997abf0116dfa20.js gzip 164 B N/A -
39d8d11a8f75c91b.js gzip 175 B N/A -
3d2bbd8eeca258cb.js gzip 168 B N/A -
3f48514043a9f910.js gzip 65.6 kB N/A -
4473c84e5b1ecd43.js gzip 13.1 kB N/A -
484a114ec46812db.js gzip 8.38 kB N/A -
48cc60c22d0389dc.js gzip 162 B N/A -
4c3cbe92816ec967.js gzip 2.29 kB N/A -
58fa317e3b5181d3.js gzip 8.33 kB N/A -
5999d057f7b2b7db.js gzip 8.41 kB N/A -
5f879bfea71d12c4.js gzip 164 B N/A -
606861785163..490.css gzip 110 B 110 B ✓
6d7c6d66af18c3fb.js gzip 161 B N/A -
707c8e711181cd8e.js gzip 164 B N/A -
77edc4893a7b88b6.js gzip 10.2 kB N/A -
81d7dc1aebd11c36.js gzip 168 B N/A -
85e5a9da88552af4.js gzip 12.8 kB N/A -
9e8311494c07a7bc.js gzip 7.41 kB N/A -
a12334fca185dcf1.js gzip 8.4 kB N/A -
a286bb0a6ce5d8f6.js gzip 164 B N/A -
a6dad97d9634a72d.js gzip 39.4 kB 39.4 kB ✓
a6dad97d9634...js.map gzip 39.9 kB 39.9 kB ✓
b544162efd1039e3.js gzip 162 B N/A -
b6baa11b4e06ffa0.js gzip 8.38 kB N/A -
bd8184425e096fd5.js gzip 8.33 kB N/A -
d579a3be9548c23e.js gzip 10 kB N/A -
dac0c32b8825306c.js gzip 9.62 kB N/A -
e4c2f244236b04a7.js gzip 9.11 kB N/A -
e7e00b1389b16abe.js gzip 214 B N/A -
f82cba3977d0b628.js gzip 1.47 kB N/A -
fb2b433459da31d2.js gzip 69.9 kB N/A -
fd8715ff3d58edc1.js gzip 8.44 kB N/A -
turbopack-HASH.js gzip 4.03 kB 4.03 kB ✓
08164710c41f8d24.js gzip N/A 5.49 kB -
096056d9d41999fc.js gzip N/A 12.6 kB -
09f8a8ff6d2dee18.js gzip N/A 7.4 kB -
0d14c53ffaaf4f60.js gzip N/A 161 B -
1373e3e9cf6ee15e.js gzip N/A 161 B -
1478eb435a0bee23.js gzip N/A 213 B -
14a89c7337562a0d.js gzip N/A 8.41 kB -
16259c56ab84126f.js gzip N/A 6.3 kB -
1a6417b64f3f3ab8.js gzip N/A 69.9 kB -
1a817045a1531811.js gzip N/A 225 B -
24b222fdae35315b.js gzip N/A 161 B -
2973a44ed012a2b1.js gzip N/A 8.39 kB -
29cdcfd4f0364a7f.js gzip N/A 163 B -
3607210e081cab27.js gzip N/A 65.6 kB -
3aee505f8ef943a5.js gzip N/A 161 B -
3eec7ccab26ca61a.js gzip N/A 39.7 kB -
4134395f3e951be8.js gzip N/A 162 B -
43ddee7f2b2cc43c.js gzip N/A 8.33 kB -
63d838cacf795d8a.js gzip N/A 1.47 kB -
684d38ad3bb66acc.js gzip N/A 10.2 kB -
72adbe84e4f22cdb.js gzip N/A 8.44 kB -
793b8540179d16ed.js gzip N/A 449 B -
7da167d7ec2ef7e7.js gzip N/A 164 B -
81aea3f9d959d77e.js gzip N/A 159 B -
84cb7ee722d2557d.js gzip N/A 174 B -
88ccf3270fb50d89.js gzip N/A 8.38 kB -
965e64477529d230.js gzip N/A 8.41 kB -
9ecba6b3f9f48d14.js gzip N/A 168 B -
a0f7ce4a21d94b45.js gzip N/A 10 kB -
a488536570d8cbc9.js gzip N/A 12.8 kB -
b5b270dbde99572e.js gzip N/A 9.11 kB -
b72f885321e98388.js gzip N/A 167 B -
b9ce21ed3f096a57.js gzip N/A 162 B -
bdc9fd6392e02d75.js gzip N/A 2.29 kB -
c98f7a0930162d5f.js gzip N/A 164 B -
dc9486dd309defeb.js gzip N/A 9.62 kB -
ec04b93b2429ae27.js gzip N/A 8.38 kB -
ed272ab406ad65e0.js gzip N/A 8.33 kB -
f2a283a6e51b8589.js gzip N/A 13.1 kB -
Total 429 kB 429 kB ✅ -1 B

Server

Middleware size (Turbopack)
Canary PR Change
middleware-b..fest.js gzip 798 B 788 B 🟢 10 B (-1%)
Total 798 B 788 B ✅ -10 B
Next Runtimes (Turbopack)
Canary PR Change
app-page-exp...dev.js gzip 301 kB 301 kB ✓
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB ✓
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB ✓
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB ✓
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 59.9 kB ✓
Total 2.67 MB 2.67 MB ⚠️ +1 B
Build Details
Client Build Manifests (Turbopack)
Canary PR Change
_buildManifest.js gzip 451 B 451 B ✓
Total 451 B 451 B ✓

📦 Webpack

Client

Client Bundles (main, webpack) (Webpack)
Canary PR Change
2086.HASH.js gzip 169 B N/A -
2161-HASH.js gzip 5.39 kB N/A -
2747-HASH.js gzip 4.48 kB N/A -
4322-HASH.js gzip 51.2 kB N/A -
ec793fe8-HASH.js gzip 62.3 kB N/A -
framework-HASH.js gzip 59.8 kB 59.8 kB ✓
main-app-HASH.js gzip 251 B 253 B ✓
main-HASH.js gzip 38.4 kB 38.7 kB ✓
webpack-HASH.js gzip 1.68 kB 1.69 kB ✓
1596.HASH.js gzip N/A 169 B -
2658-HASH.js gzip N/A 51 kB -
6349-HASH.js gzip N/A 4.46 kB -
7019-HASH.js gzip N/A 5.41 kB -
b17a3386-HASH.js gzip N/A 62.3 kB -
Total 224 kB 224 kB ⚠️ +117 B
Legacy Client Bundles (polyfills) (Webpack)
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB ✓
Total 39.4 kB 39.4 kB ✓
Client Pages (Webpack)
Canary PR Change
_app-HASH.js gzip 194 B 193 B ✓
_error-HASH.js gzip 182 B 182 B ✓
css-HASH.js gzip 336 B 335 B ✓
dynamic-HASH.js gzip 1.8 kB 1.8 kB ✓
edge-ssr-HASH.js gzip 256 B 256 B ✓
head-HASH.js gzip 352 B 349 B ✓
hooks-HASH.js gzip 385 B 384 B ✓
image-HASH.js gzip 580 B 580 B ✓
index-HASH.js gzip 259 B 258 B ✓
link-HASH.js gzip 2.5 kB 2.51 kB ✓
routerDirect..HASH.js gzip 319 B 317 B ✓
script-HASH.js gzip 385 B 387 B ✓
withRouter-HASH.js gzip 316 B 315 B ✓
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Total 7.97 kB 7.96 kB ✅ -8 B

Server

Edge SSR bundle Size (Webpack)
Canary PR Change
edge-ssr.js gzip 124 kB 124 kB ✓
page.js gzip 237 kB 238 kB ✓
Total 362 kB 362 kB ⚠️ +605 B
Middleware size (Webpack)
Canary PR Change
middleware-b..fest.js gzip 654 B 655 B ✓
middleware-r..fest.js gzip 155 B 156 B ✓
middleware.js gzip 32.8 kB 32.9 kB ✓
edge-runtime..pack.js gzip 846 B 846 B ✓
Total 34.5 kB 34.6 kB ⚠️ +74 B
Next Runtimes (Webpack)
Canary PR Change
app-page-exp...dev.js gzip 301 kB 301 kB ✓
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB ✓
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB ✓
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB ✓
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 59.9 kB ✓
Total 2.67 MB 2.67 MB ⚠️ +1 B
Build Details
Client Build Manifests (Webpack)
Canary PR Change
_buildManifest.js gzip 738 B 738 B ✓
Total 738 B 738 B ✓
build cache (Webpack)
Canary PR Change
0.pack gzip 3.61 MB 3.61 MB 🔴 +4.97 kB (+0%)
index.pack gzip 98.8 kB 98.8 kB ✓
Total 3.71 MB 3.71 MB ⚠️ +4.97 kB
📝 Changed Files (2 files)

Files with changes:

  • 6ea59619a32bc38f.json
  • 98d38c92d195aa45.json
View diffs
6ea59619a32bc38f.json
@@ -0,0 +1,7 @@
+{
+  "version": 2,
+  "sourceHash": "72f9dda18ea087c4",
+  "nodeVersion": "v20.9.0",
+  "v8Version": "11.3.244.8-node.16",
+  "mtime": 1767365454572.828
+}
98d38c92d195aa45.json
@@ -0,0 +1,7 @@
+{
+  "version": 2,
+  "sourceHash": "f001b70e0d1a6661",
+  "nodeVersion": "v20.9.0",
+  "v8Version": "11.3.244.8-node.16",
+  "mtime": 1767365542453.4155
+}

@nextjs-bot

nextjs-bot commented Jan 2, 2026 •

Copy link
Copy Markdown
Contributor

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
buildDuration 17.2s 15.2s N/A
buildDurationCached 13.8s 11s N/A
nodeModulesSize 457 MB 463 MB ⚠️ +5.98 MB
nextStartRea..uration (ms) 716ms 754ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
2086.HASH.js gzip 169 B 169 B ✓
2161-HASH.js gzip 5.39 kB 5.41 kB N/A
2747-HASH.js gzip 4.48 kB 4.46 kB N/A
4322-HASH.js gzip 51.2 kB 51 kB N/A
ec793fe8-HASH.js gzip 62.3 kB 62.3 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB N/A
main-app-HASH.js gzip 251 B 254 B N/A
main-HASH.js gzip 38.4 kB 38.7 kB ⚠️ +368 B
webpack-HASH.js gzip 1.68 kB 1.69 kB N/A
Overall change 38.5 kB 38.9 kB ⚠️ +368 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB ✓
Overall change 39.4 kB 39.4 kB ✓
Client Pages
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
_app-HASH.js gzip 194 B 193 B N/A
_error-HASH.js gzip 182 B 182 B ✓
css-HASH.js gzip 336 B 335 B N/A
dynamic-HASH.js gzip 1.8 kB 1.8 kB N/A
edge-ssr-HASH.js gzip 256 B 256 B ✓
head-HASH.js gzip 352 B 349 B N/A
hooks-HASH.js gzip 385 B 384 B N/A
image-HASH.js gzip 580 B 580 B ✓
index-HASH.js gzip 259 B 258 B N/A
link-HASH.js gzip 2.5 kB 2.51 kB N/A
routerDirect..HASH.js gzip 319 B 317 B N/A
script-HASH.js gzip 385 B 387 B N/A
withRouter-HASH.js gzip 316 B 315 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Overall change 1.12 kB 1.12 kB ✓
Client Build Manifests
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
_buildManifest.js gzip 738 B 738 B ✓
Overall change 738 B 738 B ✓
Rendered Page Sizes
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
index.html gzip 523 B 525 B N/A
link.html gzip 537 B 539 B N/A
withRouter.html gzip 520 B 521 B N/A
Overall change 0 B 0 B ✓
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
edge-ssr.js gzip 124 kB 124 kB N/A
page.js gzip 237 kB 238 kB ⚠️ +604 B
Overall change 237 kB 238 kB ⚠️ +604 B
Middleware size Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
middleware-b..fest.js gzip 651 B 656 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 32.8 kB 33 kB ⚠️ +144 B
edge-runtime..pack.js gzip 846 B 846 B ✓
Overall change 33.7 kB 33.8 kB ⚠️ +144 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
app-page-exp...dev.js gzip 301 kB 302 kB ⚠️ +229 B
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB ⚠️ +236 B
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB ⚠️ +245 B
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB ⚠️ +240 B
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 60.3 kB ⚠️ +394 B
Overall change 2.67 MB 2.67 MB ⚠️ +1.34 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-early-ready Change
0.pack gzip 3.61 MB 3.61 MB ⚠️ +2.55 kB
index.pack gzip 98.3 kB 99.7 kB ⚠️ +1.36 kB
Overall change 3.71 MB 3.71 MB ⚠️ +3.91 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
       numHashes: NaN,
       bitArray: [],
     },
-    "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+    "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
     "/_error": [
-      "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+      "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
     ],
     "/css": [
       "static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
-      "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+      "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
     ],
     "/dynamic": [
-      "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+      "static\u002Fchunks\u002Fpages\u002Fdynamic-8ed3486bb68dd6c6.js",
     ],
     "/edge-ssr": [
-      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
     ],
-    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
-    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
     "/image": [
-      "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
-      "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+      "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+      "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
     ],
-    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
     "/routerDirect": [
-      "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+      "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
     ],
     "/script": [
-      "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+      "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
     ],
     "/withRouter": [
-      "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+      "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
     ],
     sortedPages: [
       "\u002F",
Diff for dynamic-HASH.js
@@ -1,17 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 1231: /***/ (
-      module,
+    /***/ 2604: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(4464);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(3643);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
 
-    /***/ 2101: /***/ (
+    /***/ 3401: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -38,24 +45,63 @@
       /***/
     },
 
-    /***/ 3458: /***/ (
+    /***/ 3643: /***/ (
       __unused_webpack_module,
-      __unused_webpack_exports,
+      __webpack_exports__,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(9381);
-        },
-      ]);
-      if (false) {
-      }
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(3108);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(3973);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+        () =>
+          __webpack_require__
+            .e(/* import() */ 1596)
+            .then(__webpack_require__.bind(__webpack_require__, 1596))
+            .then((mod) => mod.Hello),
+        {
+          loadableGenerated: {
+            webpack: () => [/*require.resolve*/ 1596],
+          },
+        }
+      );
+      const Page = () =>
+        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+          {
+            children: [
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+                children: "testing next/dynamic size",
+              }),
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+                DynamicHello,
+                {}
+              ),
+            ],
+          }
+        );
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
 
       /***/
     },
 
-    /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3660: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -88,7 +134,7 @@
         __webpack_require__(4312)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(9799)
+        __webpack_require__(4539)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +234,17 @@
       /***/
     },
 
-    /***/ 9381: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
+    /***/ 3973: /***/ (
+      module,
+      __unused_webpack_exports,
       __webpack_require__
     ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(3108);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1231);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
-        () =>
-          __webpack_require__
-            .e(/* import() */ 2086)
-            .then(__webpack_require__.bind(__webpack_require__, 2086))
-            .then((mod) => mod.Hello),
-        {
-          loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 2086],
-          },
-        }
-      );
-      const Page = () =>
-        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
-          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
-          {
-            children: [
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
-                children: "testing next/dynamic size",
-              }),
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-                DynamicHello,
-                {}
-              ),
-            ],
-          }
-        );
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+      module.exports = __webpack_require__(3660);
 
       /***/
     },
 
-    /***/ 9799: /***/ (
+    /***/ 4539: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -286,7 +286,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(4312)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(2101);
+      const _loadablecontextsharedruntime = __webpack_require__(3401);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -524,7 +524,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3458)
+      __webpack_exec__(2604)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [676],
   {
-    /***/ 1564: /***/ (
+    /***/ 7046: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/edge-ssr",
+        function () {
+          return __webpack_require__(7142);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7142: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -20,30 +37,13 @@
 
       /***/
     },
-
-    /***/ 4300: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/edge-ssr",
-        function () {
-          return __webpack_require__(1564);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4300)
+      __webpack_exec__(7046)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for head-HASH.js
@@ -1,34 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [5350],
   {
-    /***/ 1548: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/head",
-        function () {
-          return __webpack_require__(4282);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 3952: /***/ (
+    /***/ 3770: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(1653);
+      module.exports = __webpack_require__(9025);
 
       /***/
     },
 
-    /***/ 4282: /***/ (
+    /***/ 6236: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(3952);
+        __webpack_require__(3770);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 6510: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/head",
+        function () {
+          return __webpack_require__(6236);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1548)
+      __webpack_exec__(6510)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for index-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 6376: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(8460);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 8460: /***/ (
+    /***/ 830: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -36,13 +19,30 @@
 
       /***/
     },
+
+    /***/ 1938: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(830);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6376)
+      __webpack_exec__(1938)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,7 +1,220 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 857: /***/ (module, exports, __webpack_require__) => {
+    /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useIntersection", {
+        enumerable: true,
+        get: function () {
+          return useIntersection;
+        },
+      });
+      const _react = __webpack_require__(4312);
+      const _requestidlecallback = __webpack_require__(9413);
+      const hasIntersectionObserver =
+        typeof IntersectionObserver === "function";
+      const observers = new Map();
+      const idList = [];
+      function createObserver(options) {
+        const id = {
+          root: options.root || null,
+          margin: options.rootMargin || "",
+        };
+        const existing = idList.find(
+          (obj) => obj.root === id.root && obj.margin === id.margin
+        );
+        let instance;
+        if (existing) {
+          instance = observers.get(existing);
+          if (instance) {
+            return instance;
+          }
+        }
+        const elements = new Map();
+        const observer = new IntersectionObserver((entries) => {
+          entries.forEach((entry) => {
+            const callback = elements.get(entry.target);
+            const isVisible =
+              entry.isIntersecting || entry.intersectionRatio > 0;
+            if (callback && isVisible) {
+              callback(isVisible);
+            }
+          });
+        }, options);
+        instance = {
+          id,
+          observer,
+          elements,
+        };
+        idList.push(id);
+        observers.set(id, instance);
+        return instance;
+      }
+      function observe(element, callback, options) {
+        const { id, observer, elements } = createObserver(options);
+        elements.set(element, callback);
+        observer.observe(element);
+        return function unobserve() {
+          elements.delete(element);
+          observer.unobserve(element);
+          // Destroy observer when there's nothing left to watch:
+          if (elements.size === 0) {
+            observer.disconnect();
+            observers.delete(id);
+            const index = idList.findIndex(
+              (obj) => obj.root === id.root && obj.margin === id.margin
+            );
+            if (index > -1) {
+              idList.splice(index, 1);
+            }
+          }
+        };
+      }
+      function useIntersection({ rootRef, rootMargin, disabled }) {
+        const isDisabled = disabled || !hasIntersectionObserver;
+        const [visible, setVisible] = (0, _react.useState)(false);
+        const elementRef = (0, _react.useRef)(null);
+        const setElement = (0, _react.useCallback)((element) => {
+          elementRef.current = element;
+        }, []);
+        (0, _react.useEffect)(() => {
+          if (hasIntersectionObserver) {
+            if (isDisabled || visible) return;
+            const element = elementRef.current;
+            if (element && element.tagName) {
+              const unobserve = observe(
+                element,
+                (isVisible) => isVisible && setVisible(isVisible),
+                {
+                  root: rootRef?.current,
+                  rootMargin,
+                }
+              );
+              return unobserve;
+            }
+          } else {
+            if (!visible) {
+              const idleCallback = (0,
+              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+              return () =>
+                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+            }
+          }
+          // eslint-disable-next-line react-hooks/exhaustive-deps
+        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+        const resetVisible = (0, _react.useCallback)(() => {
+          setVisible(false);
+        }, []);
+        return [setElement, visible, resetVisible];
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-intersection.js.map
+
+      /***/
+    },
+
+    /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useMergedRef", {
+        enumerable: true,
+        get: function () {
+          return useMergedRef;
+        },
+      });
+      const _react = __webpack_require__(4312);
+      function useMergedRef(refA, refB) {
+        const cleanupA = (0, _react.useRef)(null);
+        const cleanupB = (0, _react.useRef)(null);
+        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+        // (because it hasn't been updated for React 19)
+        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+        return (0, _react.useCallback)(
+          (current) => {
+            if (current === null) {
+              const cleanupFnA = cleanupA.current;
+              if (cleanupFnA) {
+                cleanupA.current = null;
+                cleanupFnA();
+              }
+              const cleanupFnB = cleanupB.current;
+              if (cleanupFnB) {
+                cleanupB.current = null;
+                cleanupFnB();
+              }
+            } else {
+              if (refA) {
+                cleanupA.current = applyRef(refA, current);
+              }
+              if (refB) {
+                cleanupB.current = applyRef(refB, current);
+              }
+            }
+          },
+          [refA, refB]
+        );
+      }
+      function applyRef(refA, current) {
+        if (typeof refA === "function") {
+          const cleanup = refA(current);
+          if (typeof cleanup === "function") {
+            return cleanup;
+          } else {
+            return () => refA(null);
+          }
+        } else {
+          refA.current = current;
+          return () => {
+            refA.current = null;
+          };
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-merged-ref.js.map
+
+      /***/
+    },
+
+    /***/ 3440: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(4757);
+
+      /***/
+    },
+
+    /***/ 4757: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
           return useLinkStatus;
         },
       });
-      const _interop_require_wildcard = __webpack_require__(8781);
+      const _interop_require_wildcard = __webpack_require__(1162);
       const _jsxruntime = __webpack_require__(3108);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(4312)
       );
-      const _resolvehref = __webpack_require__(4055);
-      const _islocalurl = __webpack_require__(7175);
-      const _formaturl = __webpack_require__(9674);
-      const _utils = __webpack_require__(7424);
-      const _addlocale = __webpack_require__(589);
-      const _routercontextsharedruntime = __webpack_require__(7010);
-      const _useintersection = __webpack_require__(2330);
-      const _getdomainlocale = __webpack_require__(7207);
-      const _addbasepath = __webpack_require__(9942);
-      const _usemergedref = __webpack_require__(8067);
-      const _erroronce = __webpack_require__(1945);
+      const _resolvehref = __webpack_require__(4691);
+      const _islocalurl = __webpack_require__(4763);
+      const _formaturl = __webpack_require__(3246);
+      const _utils = __webpack_require__(7372);
+      const _addlocale = __webpack_require__(1809);
+      const _routercontextsharedruntime = __webpack_require__(2254);
+      const _useintersection = __webpack_require__(2774);
+      const _getdomainlocale = __webpack_require__(8803);
+      const _addbasepath = __webpack_require__(5834);
+      const _usemergedref = __webpack_require__(3351);
+      const _erroronce = __webpack_require__(6021);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -417,168 +630,43 @@
       /***/
     },
 
-    /***/ 1945: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
+    /***/ 5326: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(9058);
         },
-      });
-      let errorOnce = (_) => {};
+      ]);
       if (false) {
-      } //# sourceMappingURL=error-once.js.map
+      }
 
       /***/
     },
 
-    /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+    /***/ 6021: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "useIntersection", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return useIntersection;
+          return errorOnce;
         },
       });
-      const _react = __webpack_require__(4312);
-      const _requestidlecallback = __webpack_require__(601);
-      const hasIntersectionObserver =
-        typeof IntersectionObserver === "function";
-      const observers = new Map();
-      const idList = [];
-      function createObserver(options) {
-        const id = {
-          root: options.root || null,
-          margin: options.rootMargin || "",
-        };
-        const existing = idList.find(
-          (obj) => obj.root === id.root && obj.margin === id.margin
-        );
-        let instance;
-        if (existing) {
-          instance = observers.get(existing);
-          if (instance) {
-            return instance;
-          }
-        }
-        const elements = new Map();
-        const observer = new IntersectionObserver((entries) => {
-          entries.forEach((entry) => {
-            const callback = elements.get(entry.target);
-            const isVisible =
-              entry.isIntersecting || entry.intersectionRatio > 0;
-            if (callback && isVisible) {
-              callback(isVisible);
-            }
-          });
-        }, options);
-        instance = {
-          id,
-          observer,
-          elements,
-        };
-        idList.push(id);
-        observers.set(id, instance);
-        return instance;
-      }
-      function observe(element, callback, options) {
-        const { id, observer, elements } = createObserver(options);
-        elements.set(element, callback);
-        observer.observe(element);
-        return function unobserve() {
-          elements.delete(element);
-          observer.unobserve(element);
-          // Destroy observer when there's nothing left to watch:
-          if (elements.size === 0) {
-            observer.disconnect();
-            observers.delete(id);
-            const index = idList.findIndex(
-              (obj) => obj.root === id.root && obj.margin === id.margin
-            );
-            if (index > -1) {
-              idList.splice(index, 1);
-            }
-          }
-        };
-      }
-      function useIntersection({ rootRef, rootMargin, disabled }) {
-        const isDisabled = disabled || !hasIntersectionObserver;
-        const [visible, setVisible] = (0, _react.useState)(false);
-        const elementRef = (0, _react.useRef)(null);
-        const setElement = (0, _react.useCallback)((element) => {
-          elementRef.current = element;
-        }, []);
-        (0, _react.useEffect)(() => {
-          if (hasIntersectionObserver) {
-            if (isDisabled || visible) return;
-            const element = elementRef.current;
-            if (element && element.tagName) {
-              const unobserve = observe(
-                element,
-                (isVisible) => isVisible && setVisible(isVisible),
-                {
-                  root: rootRef?.current,
-                  rootMargin,
-                }
-              );
-              return unobserve;
-            }
-          } else {
-            if (!visible) {
-              const idleCallback = (0,
-              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
-              return () =>
-                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
-            }
-          }
-          // eslint-disable-next-line react-hooks/exhaustive-deps
-        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
-        const resetVisible = (0, _react.useCallback)(() => {
-          setVisible(false);
-        }, []);
-        return [setElement, visible, resetVisible];
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-intersection.js.map
-
-      /***/
-    },
-
-    /***/ 4972: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(7600);
-        },
-      ]);
+      let errorOnce = (_) => {};
       if (false) {
-      }
+      } //# sourceMappingURL=error-once.js.map
 
       /***/
     },
 
-    /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8803: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
           return getDomainLocale;
         },
       });
-      const _normalizetrailingslash = __webpack_require__(151);
+      const _normalizetrailingslash = __webpack_require__(1315);
       const basePath =
         /* unused pure expression or super */ null && (false || "");
       function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
       /***/
     },
 
-    /***/ 7600: /***/ (
+    /***/ 9058: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -629,7 +717,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7830);
+        __webpack_require__(3440);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
 
       /***/
     },
-
-    /***/ 7830: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(857);
-
-      /***/
-    },
-
-    /***/ 8067: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "useMergedRef", {
-        enumerable: true,
-        get: function () {
-          return useMergedRef;
-        },
-      });
-      const _react = __webpack_require__(4312);
-      function useMergedRef(refA, refB) {
-        const cleanupA = (0, _react.useRef)(null);
-        const cleanupB = (0, _react.useRef)(null);
-        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
-        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
-        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
-        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
-        // (because it hasn't been updated for React 19)
-        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
-        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
-        return (0, _react.useCallback)(
-          (current) => {
-            if (current === null) {
-              const cleanupFnA = cleanupA.current;
-              if (cleanupFnA) {
-                cleanupA.current = null;
-                cleanupFnA();
-              }
-              const cleanupFnB = cleanupB.current;
-              if (cleanupFnB) {
-                cleanupB.current = null;
-                cleanupFnB();
-              }
-            } else {
-              if (refA) {
-                cleanupA.current = applyRef(refA, current);
-              }
-              if (refB) {
-                cleanupB.current = applyRef(refB, current);
-              }
-            }
-          },
-          [refA, refB]
-        );
-      }
-      function applyRef(refA, current) {
-        if (typeof refA === "function") {
-          const cleanup = refA(current);
-          if (typeof cleanup === "function") {
-            return cleanup;
-          } else {
-            return () => refA(null);
-          }
-        } else {
-          refA.current = current;
-          return () => {
-            refA.current = null;
-          };
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-merged-ref.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4972)
+      __webpack_exec__(5326)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 1179: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9864);
-
-      /***/
-    },
-
-    /***/ 1640: /***/ (
+    /***/ 2014: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1179);
+        __webpack_require__(4169);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
       /***/
     },
 
-    /***/ 2172: /***/ (
+    /***/ 4169: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(9700);
+
+      /***/
+    },
+
+    /***/ 4414: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -54,7 +54,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/routerDirect",
         function () {
-          return __webpack_require__(1640);
+          return __webpack_require__(2014);
         },
       ]);
       if (false) {
@@ -68,7 +68,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2172)
+      __webpack_exec__(4414)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,17 +1,34 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 4977: /***/ (
+    /***/ 2591: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(326);
+      module.exports = __webpack_require__(4634);
 
       /***/
     },
 
-    /***/ 5887: /***/ (
+    /***/ 5030: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(7557);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7557: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +43,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4977);
+        __webpack_require__(2591);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
 
       /***/
     },
-
-    /***/ 6268: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(5887);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6268)
+      __webpack_exec__(5030)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 1179: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9864);
-
-      /***/
-    },
-
-    /***/ 2028: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(4501);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 4501: /***/ (
+    /***/ 559: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1179);
+        __webpack_require__(4169);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
 
       /***/
     },
+
+    /***/ 726: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(559);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 4169: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(9700);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2028)
+      __webpack_exec__(726)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 2161-HASH.js

Diff too large to display

Diff for 2747-HASH.js

Diff too large to display

Diff for 4322-HASH.js
failed to diff
Diff for main-HASH.js

Diff too large to display

Diff for main-app-HASH.js
@@ -1,64 +1,64 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4977],
   {
-    /***/ 341: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
-
-    /***/ 6280: /***/ (
+    /***/ 2044: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 375, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7413, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2972, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9898, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7508, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9854, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6043, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9261, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9797, 23)
+        __webpack_require__.t.bind(__webpack_require__, 867, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2933, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2463, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4220, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1866, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 97, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9667, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 464, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8822, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 619, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1717, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1464, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5366, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5297)
+        __webpack_require__.bind(__webpack_require__, 1155)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7937, 23)
+        __webpack_require__.t.bind(__webpack_require__, 391, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7584, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7346, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6826, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1340, 23)
       );
 
       /***/
     },
+
+    /***/ 2751: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [5639, 4322],
-      () => (__webpack_exec__(2193), __webpack_exec__(6280))
+      [8580, 2658],
+      () => (__webpack_exec__(9851), __webpack_exec__(2044))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for app-page-exp..ntime.dev.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: f7a9ed2

- Print "Ready in Xms" immediately when HTTP server starts listening
- Defer heavy initialization (config, bundler, etc.) to background
- First request waits for init via existing handlersPromise mechanism
- Fix shell script symlink resolution for pnpm node_modules/.bin
- Fix Rust CLI canonicalize for symlink resolution
- Extract getSupportedBrowsers to lightweight module

This reduces perceived startup time from ~300ms to ~50-100ms.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@nextjs-bot

Copy link
Copy Markdown
Contributor

❌ 120 failing tests in 31 jobs

Updated 2026-01-05 10:08:21 UTC · Commit: f7a9ed2

File Failures Category
test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts 3 cache components dev, turbopack dev, dev
test/development/app-dir/server-navigation-error/server-navigation-error.test.ts 6 cache components dev, turbopack dev
test/development/app-dir/typed-env/typed-env-prod.test.ts 2 dev, turbopack dev
test/development/jsconfig-path-reloading/index.test.ts 4 dev
test/development/middleware-errors/index.test.ts 5 dev, turbopack dev
test/development/tsconfig-path-reloading/index.test.ts 4 dev
test/e2e/app-dir/cache-components-errors/cache-components-console-patch.test.ts 1 turbopack dev
test/e2e/app-dir/cache-components-errors/cache-components-dev-cache-bypass.test.ts 4 turbopack production, dev, prod, turbopack dev
test/e2e/app-dir/cache-components-errors/cache-components-errors.test.ts 6 turbopack production, prod
test/e2e/app-dir/disable-logging-route/disable-logging-route.test.ts 1 dev
test/e2e/app-dir/proxy-with-middleware/proxy-with-middleware.test.ts 2 dev, cache components dev
test/e2e/app-dir/typed-routes-validator/typed-routes-validator.test.ts 1 turbopack dev
test/e2e/app-dir/use-cache-unknown-cache-kind/use-cache-unknown-cache-kind.test.ts 1 cache components dev
test/integration/cli/test/index.test.ts 9 turbopack production integration, turbopack development integration, integration
test/integration/edge-runtime-dynamic-code/test/index.test.ts 6 turbopack development integration
test/integration/edge-runtime-with-node.js-apis/test/index.test.ts 38 integration
test/integration/server-side-dev-errors/test/index.test.ts 27 integration, turbopack development integration, turbopack production integration

Details

📁 test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts — 3 failures
app-dir - devtool-copy-button > should has inspect url copy button · cache components dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts -t "should has inspect url copy button"
page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('[data-nextjs-data-runtime-error-copy-devtools-url]') to be visible

    at waitForSelector (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:521:29)

    at Playwright._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Playwright._chain [as startChain] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:632:17)
    at Playwright.startChain [as waitForElementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:520:17)
    at Playwright.waitForElementByCss [as elementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:405:17)
    at Object.elementByCss (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:16:10)

    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:627:17)
    at Proxy.continueChain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:455:17)
    at Object.getAttribute (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:17:10)
app-dir - devtool-copy-button > should has inspect url copy button · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts -t "should has inspect url copy button"
page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('[data-nextjs-data-runtime-error-copy-devtools-url]') to be visible

    at waitForSelector (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:521:29)

    at Playwright._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Playwright._chain [as startChain] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:632:17)
    at Playwright.startChain [as waitForElementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:520:17)
    at Playwright.waitForElementByCss [as elementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:405:17)
    at Object.elementByCss (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:16:10)

    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:627:17)
    at Proxy.continueChain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:455:17)
    at Object.getAttribute (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:17:10)
app-dir - devtool-copy-button > should has inspect url copy button · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts -t "should has inspect url copy button"
page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('[data-nextjs-data-runtime-error-copy-devtools-url]') to be visible

    at waitForSelector (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:521:29)

    at Playwright._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Playwright._chain [as startChain] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:632:17)
    at Playwright.startChain [as waitForElementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:520:17)
    at Playwright.waitForElementByCss [as elementByCss] (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:405:17)
    at Object.elementByCss (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:16:10)

    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:651:23)
    at Proxy._chain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:627:17)
    at Proxy.continueChain (/root/actions-runner/_work/next.js/next.js/test/lib/browsers/playwright.ts:455:17)
    at Object.getAttribute (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/devtool-copy-button/devtool-copy-button.test.ts:17:10)
📁 test/development/app-dir/server-navigation-error/server-navigation-error.test.ts — 6 failures
server-navigation-error > pages router > should error on navigation API redirect · cache components dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API redirect"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error pages router should error on navigation API redirect 1`

- Snapshot  - 4
+ Received  + 2

  {
    "description": "Next.js navigation API is not allowed to be used in Pages Router.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "pages/pages/redirect.tsx (4:11) @ Page
- > 4 |   redirect('/')
-     |           ^",
+   "source": null,
    "stack": [
-     "Page pages/pages/redirect.tsx (4:11)",
+     "Page ./pages/redirect.tsx",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:12:29)
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
server-navigation-error > pages router > should error on navigation API notFound · cache components dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API notFound"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error pages router should error on navigation API notFound 1`

- Snapshot  - 4
+ Received  + 2

  {
    "description": "Next.js navigation API is not allowed to be used in Pages Router.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "pages/pages/not-found.tsx (4:11) @ Page
- > 4 |   notFound()
-     |           ^",
+   "source": null,
    "stack": [
-     "Page pages/pages/not-found.tsx (4:11)",
+     "Page ./pages/not-found.tsx",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:30:29)
server-navigation-error > pages router > should error on navigation API redirect · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API redirect"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error pages router should error on navigation API redirect 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "Next.js navigation API is not allowed to be used in Pages Router.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "pages/pages/redirect.tsx (4:11) @ Page
+   "source": "pages/redirect.tsx (4:11) @ Page
  > 4 |   redirect('/')
      |           ^",
    "stack": [
-     "Page pages/pages/redirect.tsx (4:11)",
+     "Page pages/redirect.tsx (4:11)",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:12:29)
server-navigation-error > pages router > should error on navigation API notFound · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API notFound"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error pages router should error on navigation API notFound 1`

- Snapshot  - 2
+ Received  + 2

  {
    "description": "Next.js navigation API is not allowed to be used in Pages Router.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "pages/pages/not-found.tsx (4:11) @ Page
+   "source": "pages/not-found.tsx (4:11) @ Page
  > 4 |   notFound()
      |           ^",
    "stack": [
-     "Page pages/pages/not-found.tsx (4:11)",
+     "Page pages/not-found.tsx (4:11)",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:30:29)
server-navigation-error > middleware > should error on navigation API redirect · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API redirect "
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error middleware should error on navigation API redirect  1`

- Snapshot  - 4
+ Received  + 8

  {
    "description": "Next.js navigation API is not allowed to be used in Middleware.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "middleware.ts (8:13) @ middleware
- >  8 |     redirect('/')
-      |             ^",
+   "source": null,
    "stack": [
-     "middleware middleware.ts (8:13)",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:52:29)
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
server-navigation-error > middleware > should error on navigation API not-found · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/server-navigation-error/server-navigation-error.test.ts -t "should error on navigation API not-found"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-navigation-error middleware should error on navigation API not-found 1`

- Snapshot  - 4
+ Received  + 7

  {
    "description": "Next.js navigation API is not allowed to be used in Middleware.",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "middleware.ts (6:13) @ middleware
- > 6 |     notFound()
-     |             ^",
+   "source": null,
    "stack": [
-     "middleware middleware.ts (6:13)",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/server-navigation-error/server-navigation-error.test.ts:70:29)
📁 test/development/app-dir/typed-env/typed-env-prod.test.ts — 2 failures
typed-env > should have env types from next config · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/app-dir/typed-env/typed-env-prod.test.ts -t "should have env types from next config"
Error: expect(received).not.toContain(expected) // indexOf

Expected substring: not "FROM_ENV_DEV"
Received string:        "// Type definitions for Next.js environment variables
declare global {
  namespace NodeJS {
    interface ProcessEnv {
      /** Loaded from `.env.development.local` */
      FROM_ENV_DEV_LOCAL?: string
      /** Loaded from `.env.local` */
      FROM_ENV_LOCAL?: string
      /** Loaded from `.env.development` */
      FROM_ENV_DEV?: string
      /** Loaded from `.env` */
      FROM_ENV?: string
      /** Loaded from `next.config.js` */
      FROM_NEXT_CONFIG?: string
    }
  }
}
export {}"
    at toContain (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/typed-env/typed-env-prod.test.ts:17:26)
    at retry (/root/actions-runner/_work/next.js/next.js/test/lib/next-test-utils.ts:797:14)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/typed-env/typed-env-prod.test.ts:13:5)
typed-env > should have env types from next config · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/app-dir/typed-env/typed-env-prod.test.ts -t "should have env types from next config"
Error: expect(received).not.toContain(expected) // indexOf

Expected substring: not "FROM_ENV_DEV"
Received string:        "// Type definitions for Next.js environment variables
declare global {
  namespace NodeJS {
    interface ProcessEnv {
      /** Loaded from `.env.development.local` */
      FROM_ENV_DEV_LOCAL?: string
      /** Loaded from `.env.local` */
      FROM_ENV_LOCAL?: string
      /** Loaded from `.env.development` */
      FROM_ENV_DEV?: string
      /** Loaded from `.env` */
      FROM_ENV?: string
      /** Loaded from `next.config.js` */
      FROM_NEXT_CONFIG?: string
    }
  }
}
export {}"
    at toContain (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/typed-env/typed-env-prod.test.ts:17:26)
    at retry (/root/actions-runner/_work/next.js/next.js/test/lib/next-test-utils.ts:797:14)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/app-dir/typed-env/typed-env-prod.test.ts:13:5)
📁 test/development/jsconfig-path-reloading/index.test.ts — 4 failures
jsconfig-path-reloading > jsconfig > should recover from module not found when paths is updated · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/jsconfig-path-reloading/index.test.ts -t "should recover from module not found when paths is updated"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@lib/second-data'
description: Module not found: Can't resolve '@lib/second-data'
source: ./pages/index.js (1:1)
Module not found: Can't resolve '@lib/second-data'
> 1 | import {secondData} from "@lib/second-data"
    | ^
  2 | import { Button1 } from '@c/button-1'
  3 | import { Button2 } from '@mybutton'
  4 | import { firstData } from '@lib/first-data'

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/jsconfig-path-reloading/index.test.ts:106:9)
jsconfig-path-reloading > jsconfig > should automatically fast refresh content when path is added without error · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/jsconfig-path-reloading/index.test.ts -t "should automatically fast refresh content when path is added without error"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@myotherbutton'
description: Module not found: Can't resolve '@myotherbutton'
source: ./pages/index.js (2:1)
Module not found: Can't resolve '@myotherbutton'
  1 | import { Button1 } from '@c/button-1'
> 2 | import { Button2 } from '@myotherbutton'
    | ^
  3 | import { firstData } from '@lib/first-data'
  4 |
  5 | export default function Page(props) {

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/jsconfig-path-reloading/index.test.ts:161:9)
jsconfig-path-reloading > jsconfig added after starting dev > should recover from module not found when paths is updated · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/jsconfig-path-reloading/index.test.ts -t "should recover from module not found when paths is updated"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@lib/second-data'
description: Module not found: Can't resolve '@lib/second-data'
source: ./pages/index.js (1:1)
Module not found: Can't resolve '@lib/second-data'
> 1 | import {secondData} from "@lib/second-data"
    | ^
  2 | import { Button1 } from '@c/button-1'
  3 | import { Button2 } from '@mybutton'
  4 | import { firstData } from '@lib/first-data'

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/jsconfig-path-reloading/index.test.ts:106:9)
jsconfig-path-reloading > jsconfig added after starting dev > should automatically fast refresh content when path is added without error · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/jsconfig-path-reloading/index.test.ts -t "should automatically fast refresh content when path is added without error"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@myotherbutton'
description: Module not found: Can't resolve '@myotherbutton'
source: ./pages/index.js (2:1)
Module not found: Can't resolve '@myotherbutton'
  1 | import { Button1 } from '@c/button-1'
> 2 | import { Button2 } from '@myotherbutton'
    | ^
  3 | import { firstData } from '@lib/first-data'
  4 |
  5 | export default function Page(props) {

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/jsconfig-path-reloading/index.test.ts:161:9)
📁 test/development/middleware-errors/index.test.ts — 5 failures
middleware - development errors > when throwing while loading the module > logs the error correctly · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/middleware-errors/index.test.ts -t "logs the error correctly"
Error: expect(received).toContain(expected) // indexOf

Expected substring: "
⨯ Error: booooom!
    at <unknown> (middleware.js:3)
    at eval (middleware.js:3:13)
    at (middleware)/./middleware.js (.next/dev/server/middleware.js:18:1)
    at __webpack_require__ "
Received string:    "▲ Next.js 16.1.1-canary.12 (webpack)
- Local:         http://localhost:41193
- Network:       http://65.21.220.145:41193
- Experiments (use with caution):
  ✓ strictRouteTypes (enabled by `__NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES`)·
✓ Ready in 115ms
⚠ The \"middleware\" file convention is deprecated. Please use \"proxy\" instead. Learn more: https://nextjs.org/docs/messages/middleware-to-proxy
⨯ Error: booooom!
    at <unknown> (middleware.js:3)
    at eval (middleware.js:3:13)
    at <unknown> (middleware)/./middleware.js (.next/dev/server/middleware.js:18:1)
    at __webpack_require__ (.next/dev/server/edge-runtime-webpack.js:37:33)
    at fn (.next/dev/server/edge-runtime-webpack.js:273:21)
    at __webpack_require__ (.next/dev/server/edge-runtime-webpack.js:37:33)
    at __webpack_exec__ (.next/dev/server/middleware.js:1043:48)
    at <unknown> (.next/dev/server/middleware.js:1044:37)
    at webpackJsonpCallback (.next/dev/server/edge-runtime-webpack.js:1128:39)
  1 |
  2 |       import { NextResponse } from 'next/server'
> 3 |       throw new Error('booooom!')
    |             ^
  4 |       export default function () {
  5 |         return NextResponse.next()
  6 |       }
"
    at Object.toContain (/root/actions-runner/_work/next.js/next.js/test/development/middleware-errors/index.test.ts:304:41)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
middleware - development errors > when throwing while loading the module > renders the error correctly and recovers · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/middleware-errors/index.test.ts -t "renders the error correctly and recovers"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `middleware - development errors when throwing while loading the module renders the error correctly and recovers 1`

- Snapshot  - 1
+ Received  + 0

@@ -13,8 +13,7 @@
      "<FIXME-next-dist-dir>",
      "<FIXME-next-dist-dir>",
      "<FIXME-next-dist-dir>",
      "<FIXME-next-dist-dir>",
      "<FIXME-next-dist-dir>",
-     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/middleware-errors/index.test.ts:366:31)
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
middleware - development errors > when middleware throws synchronously > renders the error correctly and recovers · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/middleware-errors/index.test.ts -t "renders the error correctly and recovers"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `middleware - development errors when middleware throws synchronously renders the error correctly and recovers 1`

- Snapshot  - 4
+ Received  + 6

  {
    "description": "boom",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "middleware.js (3:15) @ {default export}
- > 3 |         throw new Error('boom')
-     |               ^",
+   "source": null,
    "stack": [
-     "{default export} middleware.js (3:15)",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/middleware-errors/index.test.ts:59:31)
middleware - development errors > when running invalid dynamic code with eval > renders the error correctly and recovers · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/middleware-errors/index.test.ts -t "renders the error correctly and recovers"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `middleware - development errors when running invalid dynamic code with eval renders the error correctly and recovers 1`

- Snapshot  - 6
+ Received  + 8

  {
    "description": "test is not defined",
    "environmentLabel": null,
    "label": "Runtime ReferenceError",
-   "source": "middleware.js (4:9) @ eval
- > 4 |         eval('test')
-     |         ^",
+   "source": null,
    "stack": [
-     "eval middleware.js (4:9)",
-     "<unknown> middleware.js (4:9)",
-     "{default export} middleware.js (3:22)",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/middleware-errors/index.test.ts:225:31)
middleware - development errors > when throwing while loading the module > renders the error correctly and recovers · turbopack dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev-turbo test/development/middleware-errors/index.test.ts -t "renders the error correctly and recovers"
Error: expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `middleware - development errors when throwing while loading the module renders the error correctly and recovers 1`

- Snapshot  -  4
+ Received  + 11

  {
    "description": "booooom!",
    "environmentLabel": null,
    "label": "Runtime Error",
-   "source": "middleware.js (3:13) @ module evaluation
- > 3 |       throw new Error('booooom!')
-     |             ^",
+   "source": null,
    "stack": [
-     "module evaluation middleware.js (3:13)",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
+     "<FIXME-next-dist-dir>",
    ],
  }
    at Object.toDisplayRedbox (/root/actions-runner/_work/next.js/next.js/test/development/middleware-errors/index.test.ts:329:31)
📁 test/development/tsconfig-path-reloading/index.test.ts — 4 failures
tsconfig-path-reloading > tsconfig > should recover from module not found when paths is updated · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/tsconfig-path-reloading/index.test.ts -t "should recover from module not found when paths is updated"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@lib/second-data'
description: Module not found: Can't resolve '@lib/second-data'
source: ./pages/index.tsx (1:1)
Module not found: Can't resolve '@lib/second-data'
> 1 | import {secondData} from "@lib/second-data"
    | ^
  2 | import { Button1 } from '@c/button-1'
  3 | import { Button2 } from '@mybutton'
  4 | import { firstData } from '@lib/first-data'

https://nextjs.org/docs/messages/module-not-found
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/tsconfig-path-reloading/index.test.ts:106:9)
tsconfig-path-reloading > tsconfig > should automatically fast refresh content when path is added without error · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/tsconfig-path-reloading/index.test.ts -t "should automatically fast refresh content when path is added without error"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@myotherbutton'
description: Module not found: Can't resolve '@myotherbutton'
source: ./pages/index.tsx (2:1)
Module not found: Can't resolve '@myotherbutton'
  1 | import { Button1 } from '@c/button-1'
> 2 | import { Button2 } from '@myotherbutton'
    | ^
  3 | import { firstData } from '@lib/first-data'
  4 |
  5 | export default function Page(props) {

https://nextjs.org/docs/messages/module-not-found
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/tsconfig-path-reloading/index.test.ts:161:9)
tsconfig-path-reloading > tsconfig added after starting dev > should recover from module not found when paths is updated · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/tsconfig-path-reloading/index.test.ts -t "should recover from module not found when paths is updated"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@lib/second-data'
description: Module not found: Can't resolve '@lib/second-data'
source: ./pages/index.tsx (1:1)
Module not found: Can't resolve '@lib/second-data'
> 1 | import {secondData} from "@lib/second-data"
    | ^
  2 | import { Button1 } from '@c/button-1'
  3 | import { Button2 } from '@mybutton'
  4 | import { firstData } from '@lib/first-data'

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/tsconfig-path-reloading/index.test.ts:106:9)
tsconfig-path-reloading > tsconfig added after starting dev > should automatically fast refresh content when path is added without error · dev

Datadog Job · 7-day History · CI Logs

pnpm test-dev test/development/tsconfig-path-reloading/index.test.ts -t "should automatically fast refresh content when path is added without error"
Error: Expected no visible Redbox but found one
header: Build Error
Module not found: Can't resolve '@myotherbutton'
description: Module not found: Can't resolve '@myotherbutton'
source: ./pages/index.tsx (2:1)
Module not found: Can't resolve '@myotherbutton'
  1 | import { Button1 } from '@c/button-1'
> 2 | import { Button2 } from '@myotherbutton'
    | ^
  3 | import { firstData } from '@lib/first-data'
  4 |
  5 | export default function Page(props) {

https://nextjs.org/docs/messages/module-not-found
    at runNextTicks (node:internal/process/task_queues:60:5)
    at processImmediate (node:internal/timers:449:9)
    at process.callbackTrampoline (node:internal/async_hooks:130:17)
    at Object.<anonymous> (/root/actions-runner/_work/next.js/next.js/test/development/tsconfig-path-reloading/index.test.ts:161:9)

⚠️ 96 more failures (details omitted due to size limit)

...mponents-errors/cache-components-dev-cache-bypass.test.ts (4)

Cache Components Errors > Warning for Bypassing Caches in Dev > does not warn if you render with cache-control: no-cache in dev on initial page load

  • turbopack production · DD
  • prod · DD

Cache Components Errors > Warning for Bypassing Caches in Dev > warns if you render with cache-control: no-cache in dev on initial page load

  • dev · DD
  • turbopack dev · DD
...r/cache-components-errors/cache-components-errors.test.ts (6)

Cache Components Errors > Build With --prerender-debug > Inside use cache > throwing an error at runtime > should log an error at runtime

  • turbopack production · DD
  • prod · DD

Cache Components Errors > Build With --prerender-debug > Inside use cache > catching an error at runtime > should log an error at runtime

  • turbopack production · DD
  • prod · DD

Cache Components Errors > Build Without --prerender-debug > Inside use cache > throwing an error at runtime > should log an error at runtime

  • turbopack production · DD

Cache Components Errors > Build Without --prerender-debug > Inside use cache > catching an error at runtime > should log an error at runtime

  • turbopack production · DD
...p-dir/disable-logging-route/disable-logging-route.test.ts (1)

app-dir - disable-logging-route > should not log if disabled logging

  • dev · DD
...p-dir/proxy-with-middleware/proxy-with-middleware.test.ts (2)

proxy-with-middleware > should error when both middleware and proxy files are detected

  • dev · DD
  • cache components dev · DD
...dir/typed-routes-validator/typed-routes-validator.test.ts (1)

typed-routes-validator > should generate route validation correctly

  • turbopack dev · DD
...e-unknown-cache-kind/use-cache-unknown-cache-kind.test.ts (1)

use-cache-unknown-cache-kind > should recover from the build error if the cache handler is defined

  • cache components dev · DD
test/integration/cli/test/index.test.ts (9)

CLI Usage > dev > --inspect

  • turbopack production integration · DD
  • turbopack development integration · DD
  • integration · DD

CLI Usage > dev > --inspect 0

  • turbopack production integration · DD
  • turbopack development integration · DD
  • integration · DD

CLI Usage > dev > --inspect [port]

  • turbopack production integration · DD
  • turbopack development integration · DD
  • integration · DD
.../integration/edge-runtime-dynamic-code/test/index.test.ts (6)

Middleware usage of dynamic code evaluation > development mode > shows a warning when running code with eval

  • turbopack development integration · DD

Middleware usage of dynamic code evaluation > development mode > shows a warning when running WebAssembly.compile

  • turbopack development integration · DD

Middleware usage of dynamic code evaluation > development mode > shows a warning when running WebAssembly.instantiate with a buffer parameter

  • turbopack development integration · DD

Edge route usage of dynamic code evaluation > development mode > shows a warning when running code with eval

  • turbopack development integration · DD

Edge route usage of dynamic code evaluation > development mode > shows a warning when running WebAssembly.compile

  • turbopack development integration · DD

Edge route usage of dynamic code evaluation > development mode > shows a warning when running WebAssembly.instantiate with a buffer parameter

  • turbopack development integration · DD
...gration/edge-runtime-with-node.js-apis/test/index.test.ts (38)

Middleware using Node.js API > development mode > throws error when using setImmediate

  • integration · DD

Middleware using Node.js API > development mode > throws error when using clearImmediate

  • integration · DD

Middleware using Node.js API > development mode > throws error when using process.cwd

  • integration · DD

Middleware using Node.js API > development mode > throws error when using process.cpuUsage

  • integration · DD

Middleware using Node.js API > development mode > throws error when using process.getuid

  • integration · DD

Middleware using Node.js API > development mode > throws error when using BroadcastChannel

  • integration · DD

Middleware using Node.js API > development mode > throws error when using ByteLengthQueuingStrategy

  • integration · DD

Middleware using Node.js API > development mode > throws error when using CompressionStream

  • integration · DD

Middleware using Node.js API > development mode > throws error when using CountQueuingStrategy

  • integration · DD

Middleware using Node.js API > development mode > throws error when using DecompressionStream

  • integration · DD

Middleware using Node.js API > development mode > throws error when using DomException

  • integration · DD

Middleware using Node.js API > development mode > throws error when using MessageChannel

  • integration · DD

Middleware using Node.js API > development mode > throws error when using MessageEvent

  • integration · DD

Middleware using Node.js API > development mode > throws error when using MessagePort

  • integration · DD

Middleware using Node.js API > development mode > throws error when using ReadableByteStreamController

  • integration · DD

Middleware using Node.js API > development mode > throws error when using ReadableStreamBYOBRequest

  • integration · DD

Middleware using Node.js API > development mode > throws error when using ReadableStreamDefaultController

  • integration · DD

Middleware using Node.js API > development mode > throws error when using TransformStreamDefaultController

  • integration · DD

Middleware using Node.js API > development mode > throws error when using WritableStreamDefaultController

  • integration · DD

Edge route using Node.js API > development mode > throws error when using setImmediate

  • integration · DD

Edge route using Node.js API > development mode > throws error when using clearImmediate

  • integration · DD

Edge route using Node.js API > development mode > throws error when using process.cwd

  • integration · DD

Edge route using Node.js API > development mode > throws error when using process.cpuUsage

  • integration · DD

Edge route using Node.js API > development mode > throws error when using process.getuid

  • integration · DD

Edge route using Node.js API > development mode > throws error when using BroadcastChannel

  • integration · DD

Edge route using Node.js API > development mode > throws error when using ByteLengthQueuingStrategy

  • integration · DD

Edge route using Node.js API > development mode > throws error when using CompressionStream

  • integration · DD

Edge route using Node.js API > development mode > throws error when using CountQueuingStrategy

  • integration · DD

Edge route using Node.js API > development mode > throws error when using DecompressionStream

  • integration · DD

Edge route using Node.js API > development mode > throws error when using DomException

  • integration · DD

Edge route using Node.js API > development mode > throws error when using MessageChannel

  • integration · DD

Edge route using Node.js API > development mode > throws error when using MessageEvent

  • integration · DD

Edge route using Node.js API > development mode > throws error when using MessagePort

  • integration · DD

Edge route using Node.js API > development mode > throws error when using ReadableByteStreamController

  • integration · DD

Edge route using Node.js API > development mode > throws error when using ReadableStreamBYOBRequest

  • integration · DD

Edge route using Node.js API > development mode > throws error when using ReadableStreamDefaultController

  • integration · DD

Edge route using Node.js API > development mode > throws error when using TransformStreamDefaultController

  • integration · DD

Edge route using Node.js API > development mode > throws error when using WritableStreamDefaultController

  • integration · DD
test/integration/server-side-dev-errors/test/index.test.ts (27)

server-side dev errors > should show server-side error for gsp page correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for gssp page correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for dynamic gssp page correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for api route correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for dynamic api route correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for uncaught rejection correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for uncaught empty rejection correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for uncaught exception correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

server-side dev errors > should show server-side error for uncaught empty exception correctly

  • integration · DD
  • turbopack development integration · DD
  • turbopack production integration · DD

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

created-by: Next.js team PRs by the Next.js team. Documentation Related to Next.js' official documentation. locked tests Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants