Skip to content

Conversation

@lubieowoce
Copy link
Member

No description provided.

Copy link
Member Author

lubieowoce commented Oct 15, 2025

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

This stack of pull requests is managed by Graphite. Learn more about stacking.

@lubieowoce lubieowoce changed the title abort and report on sync IO errors in dev [Cache Components] abort and report on sync IO errors in dev Oct 15, 2025
@ijjk
Copy link
Member

ijjk commented Oct 15, 2025

Failing test suites

Commit: b1ab340 | About building and testing Next.js

pnpm test-dev-turbo test/development/app-dir/cache-components-dev-errors/cache-components-dev-errors.test.ts (turbopack)

  • Cache Components Dev Errors > should show a red box error on the SSR render (DD)
  • Cache Components Dev Errors > should not show a red box error on client navigations (DD)
Expand output

● Cache Components Dev Errors › should show a red box error on the SSR render

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Dev Errors should show a red box error on the SSR render 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/error" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/error/page.tsx (2:23) @ Page
- > 2 |   const random = Math.random()
-     |                       ^",
-   "stack": [
-     "Page app/error/page.tsx (2:23)",
-     "Page <anonymous>",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  21 |     // Interestingly, it only appears on initial load, and not when
  22 |     // soft-navigating to the page (see test below).
> 23 |     await expect(browser).toDisplayCollapsedRedbox(`
     |                           ^
  24 |      {
  25 |        "description": "Route "/error" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  26 |        "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (development/app-dir/cache-components-dev-errors/cache-components-dev-errors.test.ts:23:27)

● Cache Components Dev Errors › should not show a red box error on client navigations

Expected no visible Redbox but found one
header: Runtime Error

Route "/error" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or `connection()`. Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
description: Route "/error" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or `connection()`. Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
source: app/error/page.tsx (2:23) @ Page

  1 | export default async function Page() {
> 2 |   const random = Math.random()
    |                       ^
  3 |   return <div id="another-random">{random}</div>
  4 | }
  5 |

  887 |     // If a redbox was opened unexpectedly, we use the `assertNoRedbox` helper
  888 |     // to print a useful error message containing the redbox contents.
> 889 |     await assertNoRedbox(browser, {
      |     ^
  890 |       // We already know the redbox is open, so we can skip waiting for it.
  891 |       waitInMs: 0,
  892 |     })

  at assertNoErrorToast (lib/next-test-utils.ts:889:5)
  at Object.<anonymous> (development/app-dir/cache-components-dev-errors/cache-components-dev-errors.test.ts:48:5)

pnpm test-dev-turbo test/e2e/app-dir/cache-components-create-component-tree/cache-components-create-component-tree.test.ts (turbopack)

  • hello-world > should not indicate there is an error when incidental math.random calls occur during component tree generation during dev (DD)
Expand output

● hello-world › should not indicate there is an error when incidental math.random calls occur during component tree generation during dev

Expected no visible Redbox but found one
header: Runtime Error

Route "/" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or `connection()`. Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
description: Route "/" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or `connection()`. Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random
source: app/layout.tsx (23:14) @ Symbol.for

  21 |     Symbol.for = (...args) => {
  22 |       if (args[0] === 'react.client.reference') {
> 23 |         Math.random()
     |              ^
  24 |       }
  25 |       return originalSymbolFor.apply(Symbol, args)
  26 |     }

  12 |     it('should not indicate there is an error when incidental math.random calls occur during component tree generation during dev', async () => {
  13 |       const browser = await next.browser('/')
> 14 |       await assertNoRedbox(browser)
     |       ^
  15 |
  16 |       // The redbox assertion is currently unreliable in this test and so this is an additional check to ensure the CLI didn't print anything with `Math.random()` in it.
  17 |       expect(next.cliOutput).not.toContain('Math.random()')

  at Object.<anonymous> (e2e/app-dir/cache-components-create-component-tree/cache-components-create-component-tree.test.ts:14:7)

pnpm test-dev-turbo test/e2e/app-dir/cache-components-bot-ua/cache-components-bot-ua.test.ts (turbopack)

  • cache-components PPR bot static generation bypass > should bypass static generation for DOM bot requests to avoid SSG_BAILOUT (DD)
Expand output

● cache-components PPR bot static generation bypass › should bypass static generation for DOM bot requests to avoid SSG_BAILOUT

expect(received).toBe(expected) // Object.is equality

Expected: 200
Received: 500

  15 |     // and use the fallback cache mechanism. This allows them to handle dynamic content
  16 |     // like Math.random() without triggering SSG_BAILOUT errors.
> 17 |     expect(res.status).toBe(200)
     |                        ^
  18 |
  19 |     // Verify that the response contains the page content
  20 |     const html = await res.text()

  at Object.toBe (e2e/app-dir/cache-components-bot-ua/cache-components-bot-ua.test.ts:17:24)

pnpm test-dev-turbo test/e2e/app-dir/node-extensions/node-extensions.random.test.ts (turbopack)

  • Node Extensions > Random > Cache Components > should not error when accessing pages that use Math.random() in App Router (DD)
Expand output

● Node Extensions › Random › Cache Components › should not error when accessing pages that use Math.random() in App Router

expect(received).toBe(expected) // Object.is equality

Expected: 200
Received: 500

  27 |
  28 |         res = await next.fetch('/app/prerendered/unstable-cache')
> 29 |         expect(res.status).toBe(200)
     |                            ^
  30 |         $ = await next.render$('/app/prerendered/unstable-cache')
  31 |         expect($('li').length).toBe(2)
  32 |

  at Object.toBe (e2e/app-dir/node-extensions/node-extensions.random.test.ts:29:28)

pnpm test-dev test/e2e/app-dir/cache-components-allow-otel-spans/cache-components-allow-otel-spans.test.ts

  • hello-world > should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Cache Component - without prerendering the page (DD)
  • hello-world > should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Cache Component - with prerendering the page (DD)
  • hello-world > should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Server Component - without prerendering the page (DD)
  • hello-world > should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Server Component - with prerendering the page (DD)
Expand output

● hello-world › should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Cache Component - without prerendering the page

Failed to start server after 10000ms, waiting for this log pattern: / ✓ Ready in /

  445 |     return setTimeout(() => {
  446 |       reject(
> 447 |         new Error(
      |         ^
  448 |           `Failed to start server after ${ms}ms, waiting for this log pattern: ${this.serverReadyPattern}`
  449 |         )
  450 |       )

  at Timeout._onTimeout (lib/next-modes/base.ts:447:9)

● hello-world › should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Cache Component - with prerendering the page

Failed to start server after 10000ms, waiting for this log pattern: / ✓ Ready in /

  445 |     return setTimeout(() => {
  446 |       reject(
> 447 |         new Error(
      |         ^
  448 |           `Failed to start server after ${ms}ms, waiting for this log pattern: ${this.serverReadyPattern}`
  449 |         )
  450 |       )

  at Timeout._onTimeout (lib/next-modes/base.ts:447:9)

● hello-world › should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Server Component - without prerendering the page

Failed to start server after 10000ms, waiting for this log pattern: / ✓ Ready in /

  445 |     return setTimeout(() => {
  446 |       reject(
> 447 |         new Error(
      |         ^
  448 |           `Failed to start server after ${ms}ms, waiting for this log pattern: ${this.serverReadyPattern}`
  449 |         )
  450 |       )

  at Timeout._onTimeout (lib/next-modes/base.ts:447:9)

● hello-world › should allow creating spans during cache component validation without triggering sync IO bailouts - inside a Server Component - with prerendering the page

Failed to start server after 10000ms, waiting for this log pattern: / ✓ Ready in /

  445 |     return setTimeout(() => {
  446 |       reject(
> 447 |         new Error(
      |         ^
  448 |           `Failed to start server after ${ms}ms, waiting for this log pattern: ${this.serverReadyPattern}`
  449 |         )
  450 |       )

  at Timeout._onTimeout (lib/next-modes/base.ts:447:9)

pnpm test-dev-turbo test/development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts (turbopack)

  • cache-components-dev-warmup - with runtime prefetch configs > initial load > cached data resolves in the correct phase > cached data + cached fetch (DD)
  • cache-components-dev-warmup - without runtime prefetch configs > initial load > cached data resolves in the correct phase > cached data + cached fetch (DD)
  • cache-components-dev-warmup - without runtime prefetch configs > navigation > cached data resolves in the correct phase > cached data + cached fetch (DD)
Expand output

● cache-components-dev-warmup - without runtime prefetch configs › initial load › cached data resolves in the correct phase › cached data + cached fetch

Found no logs matching 'after cache read - layout':

0. Failed to load resource: the server responded with a status of 500 (Internal Server Error)
1. %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
2. [HMR] connected
3. connected to ws at ws://localhost:37355/_next/webpack-hmr
4. Next.js page already hydrated
5. received ws message {"type":"isrManifest","data":{"/simple":false}}
6. received ws message {"type":"turbopack-connected","data":{"sessionId":1163852948036003}}
7. received ws message {"type":"building"}
8. received ws message {"type":"built","hash":"2","errors":[],"warnings":[]}
9. received ws message {"type":"sync","errors":[],"warnings":[],"hash":"","versionInfo":{"staleness":"fresh","installed":"16.0.0-canary.15"},"debug":{},"devIndicator":{"disabledUntil":0},"devToolsConfig":{}}}

  51 |       // If there's zero or more than one logs that match, the test is not set up correctly.
  52 |       if (messages.length === 0) {
> 53 |         throw new Error(
     |               ^
  54 |           `Found no logs matching '${message}':\n\n${logMessages.map((s, i) => `${i}. ${s}`).join('\n')}}`
  55 |         )
  56 |       }

  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:53:15)
  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:194:13)
  at retry (lib/next-test-utils.ts:808:14)
  at testInitialLoad (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:79:7)
  at Object.<anonymous> (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:205:13)

● cache-components-dev-warmup - without runtime prefetch configs › navigation › cached data resolves in the correct phase › cached data + cached fetch

Found no logs matching 'after cache read - layout':

0. %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
1. [HMR] connected
2. connected to ws at ws://localhost:41977/_next/webpack-hmr?id=-U_Ctou9vFqtVjtx9AkJn
3. received ws message {"type":"turbopack-connected","data":{"sessionId":3220159459437083}}
4. received ws message {"type":"building"}
5. Next.js page already hydrated
6. [Fast Refresh] rebuilding
7. [Fast Refresh] done in 101ms
8. received ws message {"type":"built","hash":"2","errors":[],"warnings":[]}
9. received ws message {"type":"sync","errors":[],"warnings":[],"hash":"","versionInfo":{"staleness":"fresh","installed":"16.0.0-canary.15"},"debug":{},"devIndicator":{"disabledUntil":0},"devToolsConfig":{}}
10. received ws message {"type":"building"}
11. [Fast Refresh] rebuilding
12. received ws message {"type":"cacheIndicator","state":"ready"}
13. [Fast Refresh] done in 964ms
14. received ws message {"type":"built","hash":"3","errors":[],"warnings":[]}
15. received ws message {"type":"building"}
16. received ws message {"type":"cacheIndicator","state":"filling"}
17. received ws message {"type":"built","hash":"4","errors":[],"warnings":[]}
18. received ws message {"type":"building"}
19. received ws message {"type":"built","hash":"5","errors":[],"warnings":[]}
20. received ws message {"type":"building"}
21. received ws message {"type":"built","hash":"6","errors":[],"warnings":[]}
22. received ws message {"type":"building"}
23. [Fast Refresh] rebuilding
24. [Fast Refresh] done in 811ms
25. received ws message {"type":"built","hash":"7","errors":[],"warnings":[]}
26. received ws message {"type":"building"}
27. received ws message {"type":"built","hash":"8","errors":[],"warnings":[]}
28. received ws message {"type":"building"}
29. [Fast Refresh] rebuilding
30. [Fast Refresh] done in 373ms
31. received ws message {"type":"built","hash":"9","errors":[],"warnings":[]}
32. received ws message {"type":"building"}
33. [Fast Refresh] rebuilding
34. Failed to load resource: net::ERR_TOO_MANY_REDIRECTS
35. Failed to fetch RSC payload for http://localhost:41977/simple. Falling back to browser navigation. TypeError: Failed to fetch

  at createFetch (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:2553:24)
  at fetchServerResponse (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:2456:27)
  at navigateDynamicallyWithNoPrefetch (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:7163:90)
  at Object.navigate (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:7014:15)
  at push.navigate (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:7396:289)
  at navigateReducer (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:7614:47)
  at clientReducer (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:11958:61)
  at Object.action (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:12170:55)
  at runAction (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:12075:38)
  at dispatchAction (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:12138:9)
  at Object.dispatch (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:12168:40)
  at ../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:1440:29
  at startTransition (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:5485:31)
  at dispatch (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:1439:13)
  at dispatchAppRouterAction (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:1423:5)
  at dispatchNavigateAction (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_client_49794a23._.js:12222:49)
  at ../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_fe1fc0d7._.js:617:13
  at Object.startTransition (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_b8877bea._.js:1279:31)
  at linkClicked (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_fe1fc0d7._.js:616:24)
  at onClick (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_fe1fc0d7._.js:857:13)
  at executeDispatch (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:10239:13)
  at runWithFiberInDEV (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:959:74)
  at processDispatchQueue (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:10265:41)
  at ../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:10540:13
  at batchedUpdates$1 (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:2247:44)
  at dispatchEventForPluginEventSystem (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:10341:9)
  at dispatchEvent (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:12855:37)
  at dispatchDiscreteEvent (../http:/localhost:41977/_next/static/chunks/8f23c_next_dist_compiled_react-dom_397ead43._.js:12837:64)
  36. [Fast Refresh] done in 189ms}
  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:53:15)
  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:194:13)
  at retry (lib/next-test-utils.ts:808:14)
  at testNavigation (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:129:7)
  at Object.<anonymous> (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:207:13)

● cache-components-dev-warmup - with runtime prefetch configs › initial load › cached data resolves in the correct phase › cached data + cached fetch

Found no logs matching 'after cache read - layout':

0. Failed to load resource: the server responded with a status of 500 (Internal Server Error)
1. %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
2. [HMR] connected
3. connected to ws at ws://localhost:33341/_next/webpack-hmr
4. Next.js page already hydrated
5. received ws message {"type":"isrManifest","data":{"/simple":false}}
6. received ws message {"type":"turbopack-connected","data":{"sessionId":6079707752752661}}
7. received ws message {"type":"building"}
8. received ws message {"type":"built","hash":"2","errors":[],"warnings":[]}
9. received ws message {"type":"sync","errors":[],"warnings":[],"hash":"","versionInfo":{"staleness":"fresh","installed":"16.0.0-canary.15"},"debug":{},"devIndicator":{"disabledUntil":0},"devToolsConfig":{}}}

  51 |       // If there's zero or more than one logs that match, the test is not set up correctly.
  52 |       if (messages.length === 0) {
> 53 |         throw new Error(
     |               ^
  54 |           `Found no logs matching '${message}':\n\n${logMessages.map((s, i) => `${i}. ${s}`).join('\n')}}`
  55 |         )
  56 |       }

  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:53:15)
  at assertLog (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:194:13)
  at retry (lib/next-test-utils.ts:808:14)
  at testInitialLoad (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:79:7)
  at Object.<anonymous> (development/app-dir/cache-components-dev-warmup/cache-components.dev-warmup.test.ts:205:13)

pnpm test-dev test/e2e/app-dir/cache-components/cache-components.test.ts

  • cache-components > should prerender pages that only use cached fetches (DD)
  • cache-components > should prerender pages that only use cached (unstable_cache) IO (DD)
Expand output

● cache-components › should prerender pages that only use cached fetches

expect(received).toBe(expected) // Object.is equality

Expected: "at runtime"
Received: ""

  103 |     const $ = await next.render$('/cases/fetch_cached', {})
  104 |     if (isNextDev) {
> 105 |       expect($('#layout').text()).toBe('at runtime')
      |                                   ^
  106 |       expect($('#page').text()).toBe('at runtime')
  107 |     } else {
  108 |       expect($('#layout').text()).toBe('at buildtime')

  at Object.toBe (e2e/app-dir/cache-components/cache-components.test.ts:105:35)

● cache-components › should prerender pages that only use cached (unstable_cache) IO

expect(received).toBe(expected) // Object.is equality

Expected: "at runtime"
Received: ""

  127 |     const $ = await next.render$('/cases/io_cached', {})
  128 |     if (isNextDev) {
> 129 |       expect($('#layout').text()).toBe('at runtime')
      |                                   ^
  130 |       expect($('#page').text()).toBe('at runtime')
  131 |     } else {
  132 |       expect($('#layout').text()).toBe('at buildtime')

  at Object.toBe (e2e/app-dir/cache-components/cache-components.test.ts:129:35)

pnpm test-dev-turbo test/e2e/app-dir/cache-components-errors/cache-components-errors.test.ts (turbopack)

  • Cache Components Errors > Dev > Dynamic Root > should show a collapsed redbox with two errors (DD)
  • Cache Components Errors > Dev > Sync Dynamic Platform > With Fallback - Math.random() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync Dynamic Platform > Without Fallback - Math.random() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Current Time - Date() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Current Time - Date.now() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Current Time - new Date() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - generateKeyPairSync() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - generateKeySync() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - generatePrimeSync() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - getRandomValues() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - random-bytes() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - random-fill-sync() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - random-int-between() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - random-int-up-to() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Node Crypto - random-uuid > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Random - Math.random() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Web Crypto - getRandomValue() > should show a collapsed redbox error (DD)
  • Cache Components Errors > Dev > Sync IO - Web Crypto - randomUUID() > should show a collapsed redbox error (DD)
Expand output

● Cache Components Errors › Dev › Dynamic Root › should show a collapsed redbox with two errors

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Dynamic Root should show a collapsed redbox with two errors 1`

- Snapshot  - 30
+ Received  +  1

- [
-   {
-     "description": "Route "/dynamic-root": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it. See more info: https://nextjs.org/docs/messages/next-prerender-missing-suspense",
-     "environmentLabel": "Server",
-     "label": "Console Error",
-     "source": "app/dynamic-root/page.tsx (59:26) @ fetchRandom
- > 59 |   const response = await fetch(
-      |                          ^",
-     "stack": [
-       "fetchRandom app/dynamic-root/page.tsx (59:26)",
-       "FetchingComponent app/dynamic-root/page.tsx (45:56)",
-       "Page app/dynamic-root/page.tsx (22:9)",
-       "LogSafely <anonymous>",
-     ],
-   },
-   {
-     "description": "Route "/dynamic-root": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it. See more info: https://nextjs.org/docs/messages/next-prerender-missing-suspense",
-     "environmentLabel": "Server",
-     "label": "Console Error",
-     "source": "app/dynamic-root/page.tsx (59:26) @ fetchRandom
- > 59 |   const response = await fetch(
-      |                          ^",
-     "stack": [
-       "fetchRandom app/dynamic-root/page.tsx (59:26)",
-       "FetchingComponent app/dynamic-root/page.tsx (45:56)",
-       "Page app/dynamic-root/page.tsx (27:7)",
-       "LogSafely <anonymous>",
-     ],
-   },
- ]
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  550 |
  551 |           if (isTurbopack) {
> 552 |             await expect(browser).toDisplayCollapsedRedbox(`
      |                                   ^
  553 |              [
  554 |                {
  555 |                  "description": "Route "/dynamic-root": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it. See more info: https://nextjs.org/docs/messages/next-prerender-missing-suspense",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:552:35)

● Cache Components Errors › Dev › Sync Dynamic Platform › With Fallback - Math.random() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync Dynamic Platform With Fallback - Math.random() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-random-with-fallback" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-random-with-fallback/page.tsx (37:23) @ RandomReadingComponent
- > 37 |   const random = Math.random()
-      |                       ^",
-   "stack": [
-     "RandomReadingComponent app/sync-random-with-fallback/page.tsx (37:23)",
-     "Page app/sync-random-with-fallback/page.tsx (18:11)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  863 |             const browser = await next.browser(pathname)
  864 |
> 865 |             await expect(browser).toDisplayCollapsedRedbox(`
      |                                   ^
  866 |              {
  867 |                "description": "Route "/sync-random-with-fallback" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  868 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:865:35)

● Cache Components Errors › Dev › Sync Dynamic Platform › Without Fallback - Math.random() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync Dynamic Platform Without Fallback - Math.random() should show a collapsed redbox error 1`

- Snapshot  - 14
+ Received  +  1

- {
-   "description": "Route "/sync-random-without-fallback" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-random-without-fallback/page.tsx (32:15) @ getRandomNumber
- > 32 |   return Math.random()
-      |               ^",
-   "stack": [
-     "getRandomNumber app/sync-random-without-fallback/page.tsx (32:15)",
-     "RandomReadingComponent app/sync-random-without-fallback/page.tsx (40:18)",
-     "Page app/sync-random-without-fallback/page.tsx (18:11)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  973 |             const browser = await next.browser(pathname)
  974 |
> 975 |             await expect(browser).toDisplayCollapsedRedbox(`
      |                                   ^
  976 |              {
  977 |                "description": "Route "/sync-random-without-fallback" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  978 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:975:35)

● Cache Components Errors › Dev › Sync IO - Current Time - Date() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Current Time - Date() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-current-time/date" used `Date()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-current-time/date/page.tsx (19:16) @ DateReadingComponent
- > 19 |   return <div>{Date()}</div>
-      |                ^",
-   "stack": [
-     "DateReadingComponent app/sync-io-current-time/date/page.tsx (19:16)",
-     "Page app/sync-io-current-time/date/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3281 |           const browser = await next.browser(pathname)
  3282 |
> 3283 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3284 |            {
  3285 |              "description": "Route "/sync-io-current-time/date" used \`Date()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
  3286 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3283:33)

● Cache Components Errors › Dev › Sync IO - Current Time - Date.now() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Current Time - Date.now() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-current-time/date-now" used `Date.now()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-current-time/date-now/page.tsx (19:21) @ DateReadingComponent
- > 19 |   return <div>{Date.now()}</div>
-      |                     ^",
-   "stack": [
-     "DateReadingComponent app/sync-io-current-time/date-now/page.tsx (19:21)",
-     "Page app/sync-io-current-time/date-now/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3384 |           const browser = await next.browser(pathname)
  3385 |
> 3386 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3387 |            {
  3388 |              "description": "Route "/sync-io-current-time/date-now" used \`Date.now()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
  3389 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3386:33)

● Cache Components Errors › Dev › Sync IO - Current Time - new Date() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Current Time - new Date() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-current-time/new-date" used `new Date()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-current-time/new-date/page.tsx (19:16) @ DateReadingComponent
- > 19 |   return <div>{new Date().toString()}</div>
-      |                ^",
-   "stack": [
-     "DateReadingComponent app/sync-io-current-time/new-date/page.tsx (19:16)",
-     "Page app/sync-io-current-time/new-date/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3487 |           const browser = await next.browser(pathname)
  3488 |
> 3489 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3490 |            {
  3491 |              "description": "Route "/sync-io-current-time/new-date" used \`new Date()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing the current time in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-current-time",
  3492 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3489:33)

● Cache Components Errors › Dev › Sync IO - Random - Math.random() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Random - Math.random() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-random/math-random" used `Math.random()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-random/math-random/page.tsx (19:21) @ SyncIOComponent
- > 19 |   return <div>{Math.random()}</div>
-      |                     ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-random/math-random/page.tsx (19:21)",
-     "Page app/sync-io-random/math-random/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3590 |           const browser = await next.browser(pathname)
  3591 |
> 3592 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3593 |            {
  3594 |              "description": "Route "/sync-io-random/math-random" used \`Math.random()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  3595 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3592:33)

● Cache Components Errors › Dev › Sync IO - Web Crypto - getRandomValue() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Web Crypto - getRandomValue() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-web-crypto/get-random-value" used `crypto.getRandomValues()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-web-crypto/get-random-value/page.tsx (20:10) @ SyncIOComponent
- > 20 |   crypto.getRandomValues(buffer)
-      |          ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-web-crypto/get-random-value/page.tsx (20:10)",
-     "Page app/sync-io-web-crypto/get-random-value/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3693 |           const browser = await next.browser(pathname)
  3694 |
> 3695 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3696 |            {
  3697 |              "description": "Route "/sync-io-web-crypto/get-random-value" used \`crypto.getRandomValues()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
  3698 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3695:33)

● Cache Components Errors › Dev › Sync IO - Web Crypto - randomUUID() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Web Crypto - randomUUID() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-web-crypto/random-uuid" used `crypto.randomUUID()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-web-crypto/random-uuid/page.tsx (19:23) @ SyncIOComponent
- > 19 |   return <div>{crypto.randomUUID()}</div>
-      |                       ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-web-crypto/random-uuid/page.tsx (19:23)",
-     "Page app/sync-io-web-crypto/random-uuid/page.tsx (11:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3799 |           const browser = await next.browser(pathname)
  3800 |
> 3801 |           await expect(browser).toDisplayCollapsedRedbox(`
       |                                 ^
  3802 |            {
  3803 |              "description": "Route "/sync-io-web-crypto/random-uuid" used \`crypto.randomUUID()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
  3804 |              "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3801:33)

● Cache Components Errors › Dev › Sync IO - Node Crypto - generateKeyPairSync() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - generateKeyPairSync() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/generate-key-pair-sync" used `require('node:crypto').generateKeyPairSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/generate-key-pair-sync/page.tsx (20:24) @ SyncIOComponent
- > 20 |   const first = crypto.generateKeyPairSync('rsa', keyGenOptions)
-      |                        ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/generate-key-pair-sync/page.tsx (20:24)",
-     "Page app/sync-io-node-crypto/generate-key-pair-sync/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  3903 |
  3904 |           if (isTurbopack) {
> 3905 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  3906 |              {
  3907 |                "description": "Route "/sync-io-node-crypto/generate-key-pair-sync" used \`require('node:crypto').generateKeyPairSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  3908 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:3905:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - generateKeySync() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - generateKeySync() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/generate-key-sync" used `require('node:crypto').generateKeySync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/generate-key-sync/page.tsx (21:6) @ SyncIOComponent
- > 21 |     .generateKeySync('hmac', {
-      |      ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/generate-key-sync/page.tsx (21:6)",
-     "Page app/sync-io-node-crypto/generate-key-sync/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4027 |
  4028 |           if (isTurbopack) {
> 4029 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4030 |              {
  4031 |                "description": "Route "/sync-io-node-crypto/generate-key-sync" used \`require('node:crypto').generateKeySync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4032 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4029:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - generatePrimeSync() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - generatePrimeSync() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/generate-prime-sync" used `require('node:crypto').generatePrimeSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/generate-prime-sync/page.tsx (20:39) @ SyncIOComponent
- > 20 |   const first = new Uint8Array(crypto.generatePrimeSync(128))
-      |                                       ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/generate-prime-sync/page.tsx (20:39)",
-     "Page app/sync-io-node-crypto/generate-prime-sync/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4151 |
  4152 |           if (isTurbopack) {
> 4153 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4154 |              {
  4155 |                "description": "Route "/sync-io-node-crypto/generate-prime-sync" used \`require('node:crypto').generatePrimeSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4156 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4153:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - getRandomValues() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - getRandomValues() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/get-random-values" used `crypto.getRandomValues()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/get-random-values/page.tsx (21:10) @ SyncIOComponent
- > 21 |   crypto.getRandomValues(first)
-      |          ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/get-random-values/page.tsx (21:10)",
-     "Page app/sync-io-node-crypto/get-random-values/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4275 |
  4276 |           if (isTurbopack) {
> 4277 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4278 |              {
  4279 |                "description": "Route "/sync-io-node-crypto/get-random-values" used \`crypto.getRandomValues()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random cryptographic values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-crypto",
  4280 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4277:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - random-bytes() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - random-bytes() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/random-bytes" used `require('node:crypto').randomBytes(size)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/random-bytes/page.tsx (20:24) @ SyncIOComponent
- > 20 |   const first = crypto.randomBytes(8)
-      |                        ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/random-bytes/page.tsx (20:24)",
-     "Page app/sync-io-node-crypto/random-bytes/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4399 |
  4400 |           if (isTurbopack) {
> 4401 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4402 |              {
  4403 |                "description": "Route "/sync-io-node-crypto/random-bytes" used \`require('node:crypto').randomBytes(size)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4404 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4401:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - random-fill-sync() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - random-fill-sync() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/random-fill-sync" used `require('node:crypto').randomFillSync(...)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/random-fill-sync/page.tsx (21:10) @ SyncIOComponent
- > 21 |   crypto.randomFillSync(first, 4, 8)
-      |          ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/random-fill-sync/page.tsx (21:10)",
-     "Page app/sync-io-node-crypto/random-fill-sync/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4523 |
  4524 |           if (isTurbopack) {
> 4525 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4526 |              {
  4527 |                "description": "Route "/sync-io-node-crypto/random-fill-sync" used \`require('node:crypto').randomFillSync(...)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4528 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4525:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - random-int-between() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - random-int-between() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/random-int-between" used `require('node:crypto').randomInt(min, max)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/random-int-between/page.tsx (20:24) @ SyncIOComponent
- > 20 |   const first = crypto.randomInt(128, 256)
-      |                        ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/random-int-between/page.tsx (20:24)",
-     "Page app/sync-io-node-crypto/random-int-between/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4647 |
  4648 |           if (isTurbopack) {
> 4649 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4650 |              {
  4651 |                "description": "Route "/sync-io-node-crypto/random-int-between" used \`require('node:crypto').randomInt(min, max)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4652 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4649:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - random-int-up-to() › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - random-int-up-to() should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/random-int-up-to" used `require('node:crypto').randomInt(min, max)` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/random-int-up-to/page.tsx (20:24) @ SyncIOComponent
- > 20 |   const first = crypto.randomInt(128)
-      |                        ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/random-int-up-to/page.tsx (20:24)",
-     "Page app/sync-io-node-crypto/random-int-up-to/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4771 |
  4772 |           if (isTurbopack) {
> 4773 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4774 |              {
  4775 |                "description": "Route "/sync-io-node-crypto/random-int-up-to" used \`require('node:crypto').randomInt(min, max)\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4776 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4773:35)

● Cache Components Errors › Dev › Sync IO - Node Crypto - random-uuid › should show a collapsed redbox error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Cache Components Errors Dev Sync IO - Node Crypto - random-uuid should show a collapsed redbox error 1`

- Snapshot  - 13
+ Received  +  1

- {
-   "description": "Route "/sync-io-node-crypto/random-uuid" used `require('node:crypto').randomUUID()` before accessing either uncached data (e.g. `fetch()`) or Request data (e.g. `cookies()`, `headers()`, `connection()`, and `searchParams`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
-   "environmentLabel": "Server",
-   "label": "Console Error",
-   "source": "app/sync-io-node-crypto/random-uuid/page.tsx (20:24) @ SyncIOComponent
- > 20 |   const first = crypto.randomUUID()
-      |                        ^",
-   "stack": [
-     "SyncIOComponent app/sync-io-node-crypto/random-uuid/page.tsx (20:24)",
-     "Page app/sync-io-node-crypto/random-uuid/page.tsx (12:9)",
-     "LogSafely <anonymous>",
-   ],
- }
+ "Redbox is already open. Use `toDisplayRedbox` instead."

  4895 |
  4896 |           if (isTurbopack) {
> 4897 |             await expect(browser).toDisplayCollapsedRedbox(`
       |                                   ^
  4898 |              {
  4899 |                "description": "Route "/sync-io-node-crypto/random-uuid" used \`require('node:crypto').randomUUID()\` before accessing either uncached data (e.g. \`fetch()\`) or Request data (e.g. \`cookies()\`, \`headers()\`, \`connection()\`, and \`searchParams\`). Accessing random values synchronously in a Server Component requires reading one of these data sources first. Alternatively, consider moving this expression into a Client Component or Cache Component. See more info here: https://nextjs.org/docs/messages/next-prerender-random",
  4900 |                "environmentLabel": "Server",

  at Object.toDisplayCollapsedRedbox (e2e/app-dir/cache-components-errors/cache-components-errors.test.ts:4897:35)

pnpm test-start-turbo test/e2e/app-dir/app-prefetch/prefetching.test.ts (turbopack)

  • app dir - prefetching > should immediately render the loading state for a dynamic segment when fetched from higher up in the tree (DD)
Expand output

● app dir - prefetching › should immediately render the loading state for a dynamic segment when fetched from higher up in the tree

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  302 |   })
  303 |
> 304 |   it('should immediately render the loading state for a dynamic segment when fetched from higher up in the tree', async () => {
      |   ^
  305 |     let act: ReturnType<typeof createRouterAct>
  306 |     const browser = await next.browser('/', {
  307 |       beforePageLoad(page) {

  at it (e2e/app-dir/app-prefetch/prefetching.test.ts:304:3)
  at Object.describe (e2e/app-dir/app-prefetch/prefetching.test.ts:11:1)

pnpm test-dev-turbo test/e2e/app-dir/next-after-app-api-usage/index.test.ts (turbopack)

  • nextjs APIs in after() > request APIs inside after() > cannot be called in a dynamic page (DD)
  • nextjs APIs in after() > request APIs inside after() > cannot be called in a prerendered page > with dynamic = "error" (DD)
  • nextjs APIs in after() > request APIs inside after() > cannot be called in a prerendered page > with dynamic = "force-static" (DD)
Expand output

● nextjs APIs in after() › request APIs inside after() › cannot be called in a dynamic page

expect(received).toContain(expected) // indexOf

Expected substring: "[/request-apis/page-dynamic] nested connection(): error: Error: Route /request-apis/page-dynamic used `connection()` inside `after()`."
Received string:    " ○ Compiling /request-apis/page-dynamic ...
 ✓ Compiled /request-apis/page-dynamic in 3.5s
 GET /request-apis/page-dynamic 200 in 4.4s (compile: 3.8s, render: 609ms)
[/request-apis/page-dynamic] headers(): error: Error: Route /request-apis/page-dynamic used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after

  at <unknown> (../app/request-apis/helpers.js:7:20)
     5 |   after(async () => {
     6 |     try {
  >  7 |       await headers()
       |                    ^
     8 |       console.log(`[${route}] headers(): ok`)
     9 |     } catch (err) {
    10 |       console.error(`[${route}] headers(): error:`, err)
  [/request-apis/page-dynamic] cookies(): error: Error: Route /request-apis/page-dynamic used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:27:20)
  at <unknown> (../app/request-apis/helpers.js:15:10)
    25 |   after(async () => {
    26 |     try {
  > 27 |       await cookies()
       |                    ^
    28 |       console.log(`[${route}] cookies(): ok`)
    29 |     } catch (err) {
    30 |       console.error(`[${route}] cookies(): error:`, err)
  [/request-apis/page-dynamic] connection(): error: Error: Route /request-apis/page-dynamic used `connection()` inside `after()`. The `connection()` function is used to indicate the subsequent code must only run when there is an actual Request, but `after()` executes after the request, so this function is not allowed in this scope. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:47:23)
  at <unknown> (../app/request-apis/helpers.js:35:10)
    45 |   after(async () => {
    46 |     try {
  > 47 |       await connection()
       |                       ^
    48 |       console.log(`[${route}] connection(): ok`)
    49 |     } catch (err) {
    50 |       console.error(`[${route}] connection(): error:`, err)
  [/request-apis/page-dynamic] nested headers(): error: Error: Route /request-apis/page-dynamic used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:17:22)
  at <unknown> (../app/request-apis/helpers.js:55:10)
    15 |     after(async () => {
    16 |       try {
  > 17 |         await headers()
       |                      ^
    18 |         console.log(`[${route}] nested headers(): ok`)
    19 |       } catch (err) {
    20 |         console.error(`[${route}] nested headers(): error:`, err)
  [/request-apis/page-dynamic] nested cookies(): error: Error: Route /request-apis/page-dynamic used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:37:22)
    35 |     after(async () => {
    36 |       try {
  > 37 |         await cookies()
       |                      ^
    38 |         console.log(`[${route}] nested cookies(): ok`)
    39 |       } catch (err) {
    40 |         console.error(`[${route}] nested cookies(): error:`, err)
  "
  at toContain (e2e/app-dir/next-after-app-api-usage/index.test.ts:82:22)
  at fn (lib/next-test-utils.ts:808:20)
  at Object.<anonymous> (e2e/app-dir/next-after-app-api-usage/index.test.ts:53:7)

● nextjs APIs in after() › request APIs inside after() › cannot be called in a prerendered page › with dynamic = "error"

expect(received).toContain(expected) // indexOf

Expected substring: "[/request-apis/page-dynamic-error] nested connection(): error: Error: Route /request-apis/page-dynamic-error used `connection()` inside `after()`."
Received string:    "[/request-apis/page-dynamic] nested connection(): error: Error: Route /request-apis/page-dynamic used `connection()` inside `after()`. The `connection()` function is used to indicate the subsequent code must only run when there is an actual Request, but `after()` executes after the request, so this function is not allowed in this scope. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after

  at <unknown> (../app/request-apis/helpers.js:57:25)
    55 |     after(async () => {
    56 |       try {
  > 57 |         await connection()
       |                         ^
    58 |         console.log(`[${route}] nested connection(): ok`)
    59 |       } catch (err) {
    60 |         console.error(`[${route}] nested connection(): error:`, err)
   ○ Compiling /request-apis/page-dynamic-error ...
   ✓ Compiled /request-apis/page-dynamic-error in 1171ms
   GET /request-apis/page-dynamic-error 200 in 1445ms (compile: 1289ms, render: 156ms)
  [/request-apis/page-dynamic-error] headers(): error: Error: Route /request-apis/page-dynamic-error used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:7:20)
     5 |   after(async () => {
     6 |     try {
  >  7 |       await headers()
       |                    ^
     8 |       console.log(`[${route}] headers(): ok`)
     9 |     } catch (err) {
    10 |       console.error(`[${route}] headers(): error:`, err)
  [/request-apis/page-dynamic-error] cookies(): error: Error: Route /request-apis/page-dynamic-error used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:27:20)
  at <unknown> (../app/request-apis/helpers.js:15:10)
    25 |   after(async () => {
    26 |     try {
  > 27 |       await cookies()
       |                    ^
    28 |       console.log(`[${route}] cookies(): ok`)
    29 |     } catch (err) {
    30 |       console.error(`[${route}] cookies(): error:`, err)
  [/request-apis/page-dynamic-error] connection(): error: Error: Route /request-apis/page-dynamic-error used `connection()` inside `after()`. The `connection()` function is used to indicate the subsequent code must only run when there is an actual Request, but `after()` executes after the request, so this function is not allowed in this scope. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:47:23)
  at <unknown> (../app/request-apis/helpers.js:35:10)
    45 |   after(async () => {
    46 |     try {
  > 47 |       await connection()
       |                       ^
    48 |       console.log(`[${route}] connection(): ok`)
    49 |     } catch (err) {
    50 |       console.error(`[${route}] connection(): error:`, err)
  [/request-apis/page-dynamic-error] nested headers(): error: Error: Route /request-apis/page-dynamic-error used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:17:22)
  at <unknown> (../app/request-apis/helpers.js:55:10)
    15 |     after(async () => {
    16 |       try {
  > 17 |         await headers()
       |                      ^
    18 |         console.log(`[${route}] nested headers(): ok`)
    19 |       } catch (err) {
    20 |         console.error(`[${route}] nested headers(): error:`, err)
  [/request-apis/page-dynamic-error] nested cookies(): error: Error: Route /request-apis/page-dynamic-error used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:37:22)
    35 |     after(async () => {
    36 |       try {
  > 37 |         await cookies()
       |                      ^
    38 |         console.log(`[${route}] nested cookies(): ok`)
    39 |       } catch (err) {
    40 |         console.error(`[${route}] nested cookies(): error:`, err)
  "
  at toContain (e2e/app-dir/next-after-app-api-usage/index.test.ts:129:24)
  at fn (lib/next-test-utils.ts:808:20)
  at e2e/app-dir/next-after-app-api-usage/index.test.ts:100:9

● nextjs APIs in after() › request APIs inside after() › cannot be called in a prerendered page › with dynamic = "force-static"

expect(received).toContain(expected) // indexOf

Expected substring: "[/request-apis/page-force-static] nested connection(): error: Error: Route /request-apis/page-force-static used `connection()` inside `after()`."
Received string:    "[/request-apis/page-dynamic-error] nested connection(): error: Error: Route /request-apis/page-dynamic-error used `connection()` inside `after()`. The `connection()` function is used to indicate the subsequent code must only run when there is an actual Request, but `after()` executes after the request, so this function is not allowed in this scope. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after

  at <unknown> (../app/request-apis/helpers.js:57:25)
    55 |     after(async () => {
    56 |       try {
  > 57 |         await connection()
       |                         ^
    58 |         console.log(`[${route}] nested connection(): ok`)
    59 |       } catch (err) {
    60 |         console.error(`[${route}] nested connection(): error:`, err)
   ○ Compiling /request-apis/page-force-static ...
   ✓ Compiled /request-apis/page-force-static in 807ms
   GET /request-apis/page-force-static 200 in 1024ms (compile: 857ms, render: 167ms)
  [/request-apis/page-force-static] headers(): error: Error: Route /request-apis/page-force-static used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:7:20)
     5 |   after(async () => {
     6 |     try {
  >  7 |       await headers()
       |                    ^
     8 |       console.log(`[${route}] headers(): ok`)
     9 |     } catch (err) {
    10 |       console.error(`[${route}] headers(): error:`, err)
  [/request-apis/page-force-static] cookies(): error: Error: Route /request-apis/page-force-static used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:27:20)
  at <unknown> (../app/request-apis/helpers.js:15:10)
    25 |   after(async () => {
    26 |     try {
  > 27 |       await cookies()
       |                    ^
    28 |       console.log(`[${route}] cookies(): ok`)
    29 |     } catch (err) {
    30 |       console.error(`[${route}] cookies(): error:`, err)
  [/request-apis/page-force-static] connection(): error: Error: Route /request-apis/page-force-static used `connection()` inside `after()`. The `connection()` function is used to indicate the subsequent code must only run when there is an actual Request, but `after()` executes after the request, so this function is not allowed in this scope. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:47:23)
  at <unknown> (../app/request-apis/helpers.js:35:10)
    45 |   after(async () => {
    46 |     try {
  > 47 |       await connection()
       |                       ^
    48 |       console.log(`[${route}] connection(): ok`)
    49 |     } catch (err) {
    50 |       console.error(`[${route}] connection(): error:`, err)
  [/request-apis/page-force-static] nested headers(): error: Error: Route /request-apis/page-force-static used `headers()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `headers()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:17:22)
  at <unknown> (../app/request-apis/helpers.js:55:10)
    15 |     after(async () => {
    16 |       try {
  > 17 |         await headers()
       |                      ^
    18 |         console.log(`[${route}] nested headers(): ok`)
    19 |       } catch (err) {
    20 |         console.error(`[${route}] nested headers(): error:`, err)
  [/request-apis/page-force-static] nested cookies(): error: Error: Route /request-apis/page-force-static used `cookies()` inside `after()`. This is not supported. If you need this data inside an `after()` callback, use `cookies()` outside of the callback. See more info here: https://nextjs.org/docs/canary/app/api-reference/functions/after
  at <unknown> (../app/request-apis/helpers.js:37:22)
    35 |     after(async () => {
    36 |       try {
  > 37 |         await cookies()
       |                      ^
    38 |         console.log(`[${route}] nested cookies(): ok`)
    39 |       } catch (err) {
    40 |         console.error(`[${route}] nested cookies(): error:`, err)
  "
  at toContain (e2e/app-dir/next-after-app-api-usage/index.test.ts:129:24)
  at fn (lib/next-test-utils.ts:808:20)
  at e2e/app-dir/next-after-app-api-usage/index.test.ts:100:9

pnpm test-dev test/e2e/app-dir/use-cache/use-cache.test.ts

  • use-cache > should cache results (DD)
  • use-cache > should cache results custom handler (DD)
  • use-cache > should revalidate caches nested in unstable_cache (DD)
Expand output

● use-cache › should cache results

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('#x') to be visible

  511 |
  512 |     return this.startChain(async () => {
> 513 |       const el = await page.waitForSelector(selector, {
      |                             ^
  514 |         timeout,
  515 |         state,
  516 |       })

  at waitForSelector (lib/browsers/playwright.ts:513:29)
  at Playwright._chain (lib/browsers/playwright.ts:643:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:624:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:512:17)
  at Object.waitForElementByCss (e2e/app-dir/use-cache/use-cache.test.ts:35:26)
  at Proxy._chain (lib/browsers/playwright.ts:643:23)
  at Proxy._chain (lib/browsers/playwright.ts:619:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:425:17)
  at Object.text (e2e/app-dir/use-cache/use-cache.test.ts:35:52)

● use-cache › should cache results custom handler

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('#x') to be visible

  511 |
  512 |     return this.startChain(async () => {
> 513 |       const el = await page.waitForSelector(selector, {
      |                             ^
  514 |         timeout,
  515 |         state,
  516 |       })

  at waitForSelector (lib/browsers/playwright.ts:513:29)
  at Playwright._chain (lib/browsers/playwright.ts:643:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:624:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:512:17)
  at Object.waitForElementByCss (e2e/app-dir/use-cache/use-cache.test.ts:61:26)
  at Proxy._chain (lib/browsers/playwright.ts:643:23)
  at Proxy._chain (lib/browsers/playwright.ts:619:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:425:17)
  at Object.text (e2e/app-dir/use-cache/use-cache.test.ts:61:52)

● use-cache › should revalidate caches nested in unstable_cache

expect(received).toBe(expected) // Object.is equality

Expected: ""
Received: "0.3989632752011252"

  364 |
  365 |     await browser.refresh()
> 366 |     expect(await browser.elementByCss('p').text()).toBe(value)
      |                                                    ^
  367 |
  368 |     await browser.elementByCss('button').click()
  369 |

  at Object.toBe (e2e/app-dir/use-cache/use-cache.test.ts:366:52)

pnpm test-start test/e2e/app-dir/segment-cache/prefetch-layout-sharing/prefetch-layout-sharing.test.ts

  • layout sharing in non-static prefetches > runtime prefetches should omit layouts that were already prefetched with a runtime prefetch (DD)
Expand output

● layout sharing in non-static prefetches › runtime prefetches should omit layouts that were already prefetched with a runtime prefetch

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  21 |   //   It includes cached IO, and allows access to cookies/params/searchParams/"use cache: private", but excludes uncached IO.
  22 |
> 23 |   it('runtime prefetches should omit layouts that were already prefetched with a runtime prefetch', async () => {
     |   ^
  24 |     // Prefetches should re-use results from previous prefetches with the same fetch strategy.
  25 |
  26 |     let page: Playwright.Page

  at it (e2e/app-dir/segment-cache/prefetch-layout-sharing/prefetch-layout-sharing.test.ts:23:3)
  at Object.describe (e2e/app-dir/segment-cache/prefetch-layout-sharing/prefetch-layout-sharing.test.ts:6:1)

pnpm test-start test/e2e/app-dir/segment-cache/search-params/segment-cache-search-params.test.ts

  • segment cache (search params) > when fetching without PPR (e.g. prefetch="unstable_forceStale"), includes the search params in the cache key (DD)
  • segment cache (search params) > stores prefetched data by its rewritten search params, not the original ones (DD)
Expand output

● segment cache (search params) › when fetching without PPR (e.g. prefetch="unstable_forceStale"), includes the search params in the cache key

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  68 |   })
  69 |
> 70 |   it('when fetching without PPR (e.g. prefetch="unstable_forceStale"), includes the search params in the cache key', async () => {
     |   ^
  71 |     let act: ReturnType<typeof createRouterAct>
  72 |     const browser = await next.browser('/search-params', {
  73 |       beforePageLoad(page) {

  at it (e2e/app-dir/segment-cache/search-params/segment-cache-search-params.test.ts:70:3)
  at Object.describe (e2e/app-dir/segment-cache/search-params/segment-cache-search-params.test.ts:5:1)

● segment cache (search params) › stores prefetched data by its rewritten search params, not the original ones

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  142 |   })
  143 |
> 144 |   it('stores prefetched data by its rewritten search params, not the original ones', async () => {
      |   ^
  145 |     let act: ReturnType<typeof createRouterAct>
  146 |     const browser = await next.browser('/search-params', {
  147 |       beforePageLoad(page) {

  at it (e2e/app-dir/segment-cache/search-params/segment-cache-search-params.test.ts:144:3)
  at Object.describe (e2e/app-dir/segment-cache/search-params/segment-cache-search-params.test.ts:5:1)

@ijjk
Copy link
Member

ijjk commented Oct 15, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
buildDuration 19.3s 16.1s N/A
buildDurationCached 14.8s 11.9s N/A
nodeModulesSize 451 MB 451 MB ⚠️ +131 kB
nextStartRea..uration (ms) 691ms 687ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
1916.HASH.js gzip 169 B 169 B
9056-HASH.js gzip 54 kB 53.9 kB N/A
9225-HASH.js gzip 5.32 kB 5.32 kB N/A
c57d0559-HASH.js gzip 62.1 kB 62.1 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 256 B 258 B N/A
main-HASH.js gzip 39.8 kB 39.8 kB N/A
webpack-HASH.js gzip 1.69 kB 1.69 kB N/A
Overall change 60 kB 60 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io 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 lubieowoce/three-task-sync-io Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 334 B 334 B
dynamic-HASH.js gzip 1.8 kB 1.8 kB N/A
edge-ssr-HASH.js gzip 256 B 255 B N/A
head-HASH.js gzip 350 B 352 B N/A
hooks-HASH.js gzip 384 B 381 B N/A
image-HASH.js gzip 4.79 kB 4.79 kB N/A
index-HASH.js gzip 259 B 260 B N/A
link-HASH.js gzip 2.5 kB 2.51 kB N/A
routerDirect..HASH.js gzip 318 B 317 B N/A
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.52 kB 1.52 kB
Client Build Manifests
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
_buildManifest.js gzip 716 B 719 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
index.html gzip 523 B 523 B
link.html gzip 536 B 538 B N/A
withRouter.html gzip 518 B 518 B
Overall change 1.04 kB 1.04 kB
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 259 kB 259 kB ⚠️ +427 B
Overall change 259 kB 259 kB ⚠️ +427 B
Middleware size
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
middleware-b..fest.js gzip 636 B 640 B N/A
middleware-r..fest.js gzip 156 B 157 B N/A
middleware.js gzip 33.3 kB 33.2 kB N/A
edge-runtime..pack.js gzip 846 B 846 B
Overall change 846 B 846 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
app-page-exp...dev.js gzip 293 kB 293 kB ⚠️ +227 B
app-page-exp..prod.js gzip 160 kB 160 kB N/A
app-page-tur...dev.js gzip 293 kB 293 kB ⚠️ +229 B
app-page-tur..prod.js gzip 160 kB 160 kB N/A
app-page-tur...dev.js gzip 289 kB 289 kB ⚠️ +224 B
app-page-tur..prod.js gzip 158 kB 158 kB N/A
app-page.run...dev.js gzip 289 kB 289 kB ⚠️ +225 B
app-page.run..prod.js gzip 158 kB 158 kB N/A
app-route-ex...dev.js gzip 70 kB 70 kB
app-route-ex..prod.js gzip 48.7 kB 48.7 kB
app-route-tu...dev.js gzip 70.1 kB 70.1 kB
app-route-tu..prod.js gzip 48.7 kB 48.7 kB
app-route-tu...dev.js gzip 69.7 kB 69.7 kB
app-route-tu..prod.js gzip 48.5 kB 48.5 kB
app-route.ru...dev.js gzip 69.7 kB 69.7 kB
app-route.ru..prod.js gzip 48.5 kB 48.5 kB
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 42 kB 42 kB
pages-api-tu..prod.js gzip 32 kB 32 kB
pages-api.ru...dev.js gzip 42 kB 42 kB
pages-api.ru..prod.js gzip 32 kB 32 kB
pages-turbo....dev.js gzip 51.9 kB 51.9 kB
pages-turbo...prod.js gzip 39.3 kB 39.3 kB
pages.runtim...dev.js gzip 51.9 kB 51.9 kB
pages.runtim..prod.js gzip 39.3 kB 39.3 kB
server.runti..prod.js gzip 78.2 kB 78.2 kB
Overall change 2.05 MB 2.05 MB ⚠️ +905 B
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/three-task-sync-io Change
0.pack gzip 3.15 MB 3.16 MB ⚠️ +3.96 kB
index.pack gzip 93.8 kB 93 kB N/A
Overall change 3.15 MB 3.16 MB ⚠️ +3.96 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
failed to diff
Diff for css-HASH.js
@@ -1,7 +1,31 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 3593: /***/ (
+    /***/ 5832: /***/ (module) => {
+      // extracted by mini-css-extract-plugin
+      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+      /***/
+    },
+
+    /***/ 6471: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/css",
+        function () {
+          return __webpack_require__(7839);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7839: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -15,7 +39,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7634);
+        __webpack_require__(5832);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -34,37 +58,13 @@
 
       /***/
     },
-
-    /***/ 4569: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/css",
-        function () {
-          return __webpack_require__(3593);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7634: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4569)
+      __webpack_exec__(6471)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 1033: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(2283);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 2283: /***/ (
+    /***/ 133: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4939);
+        __webpack_require__(7514);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -42,12 +25,12 @@
       const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
         () =>
           __webpack_require__
-            .e(/* import() */ 1916)
-            .then(__webpack_require__.bind(__webpack_require__, 1916))
+            .e(/* import() */ 3862)
+            .then(__webpack_require__.bind(__webpack_require__, 3862))
             .then((mod) => mod.Hello),
         {
           loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 1916],
+            webpack: () => [/*require.resolve*/ 3862],
           },
         }
       );
@@ -74,17 +57,24 @@
       /***/
     },
 
-    /***/ 4939: /***/ (
-      module,
+    /***/ 431: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(5121);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(133);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
 
-    /***/ 5121: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1709: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -117,7 +107,7 @@
         __webpack_require__(2223)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(7622)
+        __webpack_require__(2522)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -217,7 +207,7 @@
       /***/
     },
 
-    /***/ 5160: /***/ (
+    /***/ 2463: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -244,7 +234,7 @@
       /***/
     },
 
-    /***/ 7622: /***/ (
+    /***/ 2522: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -286,7 +276,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(2223)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(5160);
+      const _loadablecontextsharedruntime = __webpack_require__(2463);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -518,13 +508,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 
       /***/
     },
+
+    /***/ 7514: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(1709);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1033)
+      __webpack_exec__(431)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9804],
   {
-    /***/ 1679: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(9198);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 9198: /***/ (
+    /***/ 2592: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 3925: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(2592);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1679)
+      __webpack_exec__(3925)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js

Diff too large to display

Diff for index-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 3454: /***/ (
+    /***/ 8431: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(8972);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8972: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -19,30 +36,13 @@
 
       /***/
     },
-
-    /***/ 9241: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(3454);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9241)
+      __webpack_exec__(8431)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,26 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 1970: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
+    /***/ 2025: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(3072);
         },
-      });
-      let errorOnce = (_) => {};
+      ]);
       if (false) {
-      } //# sourceMappingURL=error-once.js.map
+      }
 
       /***/
     },
 
-    /***/ 3262: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3066: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -47,17 +45,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(2223)
       );
-      const _resolvehref = __webpack_require__(7868);
-      const _islocalurl = __webpack_require__(9350);
-      const _formaturl = __webpack_require__(6319);
-      const _utils = __webpack_require__(9889);
-      const _addlocale = __webpack_require__(9466);
-      const _routercontextsharedruntime = __webpack_require__(5691);
-      const _useintersection = __webpack_require__(3981);
-      const _getdomainlocale = __webpack_require__(4206);
-      const _addbasepath = __webpack_require__(9339);
-      const _usemergedref = __webpack_require__(6848);
-      const _erroronce = __webpack_require__(1970);
+      const _resolvehref = __webpack_require__(2776);
+      const _islocalurl = __webpack_require__(5770);
+      const _formaturl = __webpack_require__(8531);
+      const _utils = __webpack_require__(3565);
+      const _addlocale = __webpack_require__(8878);
+      const _routercontextsharedruntime = __webpack_require__(5111);
+      const _useintersection = __webpack_require__(6873);
+      const _getdomainlocale = __webpack_require__(4554);
+      const _addbasepath = __webpack_require__(9567);
+      const _usemergedref = __webpack_require__(4308);
+      const _erroronce = __webpack_require__(8910);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -436,7 +434,167 @@
       /***/
     },
 
-    /***/ 3981: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3072: /***/ (
+      __unused_webpack_module,
+      __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__(1503);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(6929);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_link__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      function aLink(props) {
+        return /*#__PURE__*/ (0,
+        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+          children: [
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+              children: "A Link page!",
+            }),
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+              {
+                href: "/",
+                children: "Go to /",
+              }
+            ),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+
+      /***/
+    },
+
+    /***/ 4308: /***/ (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__(2223);
+      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
+
+      /***/
+    },
+
+    /***/ 4554: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "getDomainLocale", {
+        enumerable: true,
+        get: function () {
+          return getDomainLocale;
+        },
+      });
+      const _normalizetrailingslash = __webpack_require__(7740);
+      const basePath =
+        /* unused pure expression or super */ null && (false || "");
+      function getDomainLocale(path, locale, locales, domainLocales) {
+        if (false) {
+        } else {
+          return false;
+        }
+      }
+      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=get-domain-locale.js.map
+
+      /***/
+    },
+
+    /***/ 6873: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -449,7 +607,7 @@
         },
       });
       const _react = __webpack_require__(2223);
-      const _requestidlecallback = __webpack_require__(1472);
+      const _requestidlecallback = __webpack_require__(6892);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -561,189 +719,31 @@
       /***/
     },
 
-    /***/ 4206: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "getDomainLocale", {
-        enumerable: true,
-        get: function () {
-          return getDomainLocale;
-        },
-      });
-      const _normalizetrailingslash = __webpack_require__(6704);
-      const basePath =
-        /* unused pure expression or super */ null && (false || "");
-      function getDomainLocale(path, locale, locales, domainLocales) {
-        if (false) {
-        } else {
-          return false;
-        }
-      }
-      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=get-domain-locale.js.map
-
-      /***/
-    },
-
-    /***/ 6691: /***/ (
+    /***/ 6929: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(3262);
+      module.exports = __webpack_require__(3066);
 
       /***/
     },
 
-    /***/ 6771: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(8178);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 6848: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8910: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "useMergedRef", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return useMergedRef;
+          return errorOnce;
         },
       });
-      const _react = __webpack_require__(2223);
-      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
-
-      /***/
-    },
-
-    /***/ 8178: /***/ (
-      __unused_webpack_module,
-      __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__(1503);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(6691);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_link__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      function aLink(props) {
-        return /*#__PURE__*/ (0,
-        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
-          children: [
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
-              children: "A Link page!",
-            }),
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
-              {
-                href: "/",
-                children: "Go to /",
-              }
-            ),
-          ],
-        });
-      }
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
 
       /***/
     },
@@ -753,7 +753,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6771)
+      __webpack_exec__(2025)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 286: /***/ (
+    /***/ 417: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/routerDirect",
+        function () {
+          return __webpack_require__(504);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 504: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +33,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -36,29 +53,12 @@
       /***/
     },
 
-    /***/ 4283: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/routerDirect",
-        function () {
-          return __webpack_require__(286);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7798: /***/ (
+    /***/ 1840: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(9587);
+      module.exports = __webpack_require__(1903);
 
       /***/
     },
@@ -68,7 +68,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4283)
+      __webpack_exec__(417)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,7 +1,34 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 661: /***/ (
+    /***/ 2398: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(2397);
+
+      /***/
+    },
+
+    /***/ 4305: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(8543);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8543: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +43,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5964);
+        __webpack_require__(2398);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -48,40 +75,13 @@
 
       /***/
     },
-
-    /***/ 5964: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(297);
-
-      /***/
-    },
-
-    /***/ 8803: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(661);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(8803)
+      __webpack_exec__(4305)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,24 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 3163: /***/ (
-      __unused_webpack_module,
+    /***/ 1840: /***/ (
+      module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(3295);
-        },
-      ]);
-      if (false) {
-      }
+      module.exports = __webpack_require__(1903);
 
       /***/
     },
 
-    /***/ 3295: /***/ (
+    /***/ 2037: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -52,12 +45,19 @@
       /***/
     },
 
-    /***/ 7798: /***/ (
-      module,
+    /***/ 4041: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(9587);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(2037);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -67,7 +67,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3163)
+      __webpack_exec__(4041)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 4498-HASH.js
failed to diff
Diff for 9225-HASH.js
@@ -1,32 +1,81 @@
 "use strict";
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
-  [9225],
+  [8439],
   {
-    /***/ 2: /***/ (__unused_webpack_module, exports, __webpack_require__) => {
+    /***/ 405: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "ImageConfigContext", {
+      Object.defineProperty(exports, "default", {
         enumerable: true,
         get: function () {
-          return ImageConfigContext;
+          return SideEffect;
         },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8879)
-      );
-      const _imageconfig = __webpack_require__(1686);
-      const ImageConfigContext = _react.default.createContext(
-        _imageconfig.imageConfigDefault
-      );
-      if (false) {
-      } //# sourceMappingURL=image-config-context.shared-runtime.js.map
+      const _react = __webpack_require__(1774);
+      const isServer = "object" === "undefined";
+      const useClientOnlyLayoutEffect = isServer
+        ? () => {}
+        : _react.useLayoutEffect;
+      const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
+      function SideEffect(props) {
+        const { headManager, reduceComponentsToState } = props;
+        function emitChange() {
+          if (headManager && headManager.mountedInstances) {
+            const headElements = _react.Children.toArray(
+              Array.from(headManager.mountedInstances).filter(Boolean)
+            );
+            headManager.updateHead(reduceComponentsToState(headElements));
+          }
+        }
+        if (isServer) {
+          headManager?.mountedInstances?.add(props.children);
+          emitChange();
+        }
+        useClientOnlyLayoutEffect(() => {
+          headManager?.mountedInstances?.add(props.children);
+          return () => {
+            headManager?.mountedInstances?.delete(props.children);
+          };
+        });
+        // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
+        // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
+        // being rendered, we only trigger the method from the last one.
+        // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
+        // singleton in the layout effect pass, and actually trigger it in the effect pass.
+        useClientOnlyLayoutEffect(() => {
+          if (headManager) {
+            headManager._pendingUpdate = emitChange;
+          }
+          return () => {
+            if (headManager) {
+              headManager._pendingUpdate = emitChange;
+            }
+          };
+        });
+        useClientOnlyEffect(() => {
+          if (headManager && headManager._pendingUpdate) {
+            headManager._pendingUpdate();
+            headManager._pendingUpdate = null;
+          }
+          return () => {
+            if (headManager && headManager._pendingUpdate) {
+              headManager._pendingUpdate();
+              headManager._pendingUpdate = null;
+            }
+          };
+        });
+        return null;
+      } //# sourceMappingURL=side-effect.js.map
 
       /***/
     },
 
-    /***/ 1169: /***/ (
+    /***/ 1155: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -40,9 +89,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(4352);
-      const _imageblursvg = __webpack_require__(2314);
-      const _imageconfig = __webpack_require__(1686);
+      const _warnonce = __webpack_require__(5358);
+      const _imageblursvg = __webpack_require__(6924);
+      const _imageconfig = __webpack_require__(9712);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -473,245 +522,60 @@
       /***/
     },
 
-    /***/ 1666: /***/ (module, exports, __webpack_require__) => {
-      /* __next_internal_client_entry_do_not_use__  cjs */
+    /***/ 1417: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      0 && 0;
-      function _export(target, all) {
-        for (var name in all)
-          Object.defineProperty(target, name, {
-            enumerable: true,
-            get: all[name],
-          });
-      }
-      _export(exports, {
-        default: function () {
+      Object.defineProperty(exports, "default", {
+        enumerable: true,
+        get: function () {
           return _default;
         },
-        defaultHead: function () {
-          return defaultHead;
-        },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _interop_require_wildcard = __webpack_require__(2275);
-      const _jsxruntime = __webpack_require__(1024);
-      const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8879)
-      );
-      const _sideeffect = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(2543)
-      );
-      const _headmanagercontextsharedruntime = __webpack_require__(5428);
-      const _warnonce = __webpack_require__(4352);
-      function defaultHead() {
-        const head = [
-          /*#__PURE__*/ (0, _jsxruntime.jsx)(
-            "meta",
-            {
-              charSet: "utf-8",
-            },
-            "charset"
-          ),
-          /*#__PURE__*/ (0, _jsxruntime.jsx)(
-            "meta",
+      const _findclosestquality = __webpack_require__(1639);
+      function defaultLoader({ config, src, width, quality }) {
+        if (
+          src.startsWith("/") &&
+          src.includes("?") &&
+          config.localPatterns?.length === 1 &&
+          config.localPatterns[0].pathname === "**" &&
+          config.localPatterns[0].search === ""
+        ) {
+          throw Object.defineProperty(
+            new Error(
+              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
+                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
+            ),
+            "__NEXT_ERROR_CODE",
             {
-              name: "viewport",
-              content: "width=device-width",
-            },
-            "viewport"
-          ),
-        ];
-        return head;
-      }
-      function onlyReactElement(list, child) {
-        // React children can be "string" or "number" in this case we ignore them for backwards compat
-        if (typeof child === "string" || typeof child === "number") {
-          return list;
-        }
-        // Adds support for React.Fragment
-        if (child.type === _react.default.Fragment) {
-          return list.concat(
-            _react.default.Children.toArray(child.props.children).reduce(
-              (fragmentList, fragmentChild) => {
-                if (
-                  typeof fragmentChild === "string" ||
-                  typeof fragmentChild === "number"
-                ) {
-                  return fragmentList;
-                }
-                return fragmentList.concat(fragmentChild);
-              },
-              []
-            )
+              value: "E871",
+              enumerable: false,
+              configurable: true,
+            }
           );
         }
-        return list.concat(child);
-      }
-      const METATYPES = ["name", "httpEquiv", "charSet", "itemProp"];
-      /*
- returns a function for filtering head child elements
- which shouldn't be duplicated, like <title/>
- Also adds support for deduplicated `key` properties
-*/ function unique() {
-        const keys = new Set();
-        const tags = new Set();
-        const metaTypes = new Set();
-        const metaCategories = {};
-        return (h) => {
-          let isUnique = true;
-          let hasKey = false;
-          if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) {
-            hasKey = true;
-            const key = h.key.slice(h.key.indexOf("$") + 1);
-            if (keys.has(key)) {
-              isUnique = false;
-            } else {
-              keys.add(key);
-            }
-          }
-          // eslint-disable-next-line default-case
-          switch (h.type) {
-            case "title":
-            case "base":
-              if (tags.has(h.type)) {
-                isUnique = false;
-              } else {
-                tags.add(h.type);
-              }
-              break;
-            case "meta":
-              for (let i = 0, len = METATYPES.length; i < len; i++) {
-                const metatype = METATYPES[i];
-                if (!h.props.hasOwnProperty(metatype)) continue;
-                if (metatype === "charSet") {
-                  if (metaTypes.has(metatype)) {
-                    isUnique = false;
-                  } else {
-                    metaTypes.add(metatype);
-                  }
-                } else {
-                  const category = h.props[metatype];
-                  const categories = metaCategories[metatype] || new Set();
-                  if (
-                    (metatype !== "name" || !hasKey) &&
-                    categories.has(category)
-                  ) {
-                    isUnique = false;
-                  } else {
-                    categories.add(category);
-                    metaCategories[metatype] = categories;
-                  }
-                }
-              }
-              break;
-          }
-          return isUnique;
-        };
-      }
-      /**
-       *
-       * @param headChildrenElements List of children of <Head>
-       */ function reduceComponents(headChildrenElements) {
-        return headChildrenElements
-          .reduce(onlyReactElement, [])
-          .reverse()
-          .concat(defaultHead().reverse())
-          .filter(unique())
-          .reverse()
-          .map((c, i) => {
-            const key = c.key || i;
-            if (false) {
-            }
-            return /*#__PURE__*/ _react.default.cloneElement(c, {
-              key,
-            });
-          });
-      }
-      /**
-       * This component injects elements to `<head>` of your page.
-       * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.
-       */ function Head({ children }) {
-        const headManager = (0, _react.useContext)(
-          _headmanagercontextsharedruntime.HeadManagerContext
-        );
-        return /*#__PURE__*/ (0, _jsxruntime.jsx)(_sideeffect.default, {
-          reduceComponentsToState: reduceComponents,
-          headManager: headManager,
-          children: children,
-        });
-      }
-      const _default = Head;
-      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=head.js.map
-
-      /***/
-    },
-
-    /***/ 1686: /***/ (__unused_webpack_module, exports) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      0 && 0;
-      function _export(target, all) {
-        for (var name in all)
-          Object.defineProperty(target, name, {
-            enumerable: true,
-            get: all[name],
-          });
+        if (false) {
+        }
+        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
+        return `${config.path}?url=${encodeURIComponent(
+          src
+        )}&w=${width}&q=${q}${
+          src.startsWith("/_next/static/media/") && false ? 0 : ""
+        }`;
       }
-      _export(exports, {
-        VALID_LOADERS: function () {
-          return VALID_LOADERS;
-        },
-        imageConfigDefault: function () {
-          return imageConfigDefault;
-        },
-      });
-      const VALID_LOADERS = [
-        "default",
-        "imgix",
-        "cloudinary",
-        "akamai",
-        "custom",
-      ];
-      const imageConfigDefault = {
-        deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
-        imageSizes: [32, 48, 64, 96, 128, 256, 384],
-        path: "/_next/image",
-        loader: "default",
-        loaderFile: "",
-        /**
-         * @deprecated Use `remotePatterns` instead to protect your application from malicious users.
-         */ domains: [],
-        disableStaticImages: false,
-        minimumCacheTTL: 14400,
-        formats: ["image/webp"],
-        maximumRedirects: 3,
-        dangerouslyAllowLocalIP: false,
-        dangerouslyAllowSVG: false,
-        contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,
-        contentDispositionType: "attachment",
-        localPatterns: undefined,
-        remotePatterns: [],
-        qualities: [75],
-        unoptimized: false,
-      }; //# sourceMappingURL=image-config.js.map
+      // We use this to determine if the import is the default loader
+      // or a custom loader defined by the user in next.config.js
+      defaultLoader.__next_img_default = true;
+      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
 
       /***/
     },
 
-    /***/ 2285: /***/ (__unused_webpack_module, exports) => {
+    /***/ 1639: /***/ (__unused_webpack_module, exports) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -735,7 +599,35 @@
       /***/
     },
 
-    /***/ 2314: /***/ (__unused_webpack_module, exports) => {
+    /***/ 2896: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "ImageConfigContext", {
+        enumerable: true,
+        get: function () {
+          return ImageConfigContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1774)
+      );
+      const _imageconfig = __webpack_require__(9712);
+      const ImageConfigContext = _react.default.createContext(
+        _imageconfig.imageConfigDefault
+      );
+      if (false) {
+      } //# sourceMappingURL=image-config-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 6924: /***/ (__unused_webpack_module, exports) => {
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
        */
@@ -774,133 +666,7 @@
       /***/
     },
 
-    /***/ 2543: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return SideEffect;
-        },
-      });
-      const _react = __webpack_require__(8879);
-      const isServer = "object" === "undefined";
-      const useClientOnlyLayoutEffect = isServer
-        ? () => {}
-        : _react.useLayoutEffect;
-      const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
-      function SideEffect(props) {
-        const { headManager, reduceComponentsToState } = props;
-        function emitChange() {
-          if (headManager && headManager.mountedInstances) {
-            const headElements = _react.Children.toArray(
-              Array.from(headManager.mountedInstances).filter(Boolean)
-            );
-            headManager.updateHead(reduceComponentsToState(headElements));
-          }
-        }
-        if (isServer) {
-          headManager?.mountedInstances?.add(props.children);
-          emitChange();
-        }
-        useClientOnlyLayoutEffect(() => {
-          headManager?.mountedInstances?.add(props.children);
-          return () => {
-            headManager?.mountedInstances?.delete(props.children);
-          };
-        });
-        // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
-        // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
-        // being rendered, we only trigger the method from the last one.
-        // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
-        // singleton in the layout effect pass, and actually trigger it in the effect pass.
-        useClientOnlyLayoutEffect(() => {
-          if (headManager) {
-            headManager._pendingUpdate = emitChange;
-          }
-          return () => {
-            if (headManager) {
-              headManager._pendingUpdate = emitChange;
-            }
-          };
-        });
-        useClientOnlyEffect(() => {
-          if (headManager && headManager._pendingUpdate) {
-            headManager._pendingUpdate();
-            headManager._pendingUpdate = null;
-          }
-          return () => {
-            if (headManager && headManager._pendingUpdate) {
-              headManager._pendingUpdate();
-              headManager._pendingUpdate = null;
-            }
-          };
-        });
-        return null;
-      } //# sourceMappingURL=side-effect.js.map
-
-      /***/
-    },
-
-    /***/ 8035: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return _default;
-        },
-      });
-      const _findclosestquality = __webpack_require__(2285);
-      function defaultLoader({ config, src, width, quality }) {
-        if (
-          src.startsWith("/") &&
-          src.includes("?") &&
-          config.localPatterns?.length === 1 &&
-          config.localPatterns[0].pathname === "**" &&
-          config.localPatterns[0].search === ""
-        ) {
-          throw Object.defineProperty(
-            new Error(
-              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
-                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
-            ),
-            "__NEXT_ERROR_CODE",
-            {
-              value: "E871",
-              enumerable: false,
-              configurable: true,
-            }
-          );
-        }
-        if (false) {
-        }
-        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
-        return `${config.path}?url=${encodeURIComponent(
-          src
-        )}&w=${width}&q=${q}${
-          src.startsWith("/_next/static/media/") && false ? 0 : ""
-        }`;
-      }
-      // We use this to determine if the import is the default loader
-      // or a custom loader defined by the user in next.config.js
-      defaultLoader.__next_img_default = true;
-      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
-
-      /***/
-    },
-
-    /***/ 8848: /***/ (module, exports, __webpack_require__) => {
+    /***/ 7614: /***/ (module, exports, __webpack_require__) => {
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
@@ -910,7 +676,7 @@
           return useMergedRef;
         },
       });
-      const _react = __webpack_require__(8879);
+      const _react = __webpack_require__(1774);
       function useMergedRef(refA, refB) {
         const cleanupA = (0, _react.useRef)(null);
         const cleanupB = (0, _react.useRef)(null);
@@ -976,32 +742,7 @@
       /***/
     },
 
-    /***/ 9059: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "RouterContext", {
-        enumerable: true,
-        get: function () {
-          return RouterContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(9010);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8879)
-      );
-      const RouterContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=router-context.shared-runtime.js.map
-
-      /***/
-    },
-
-    /***/ 9225: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8439: /***/ (module, exports, __webpack_require__) => {
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
         value: true,
@@ -1012,27 +753,27 @@
           return Image;
         },
       });
-      const _interop_require_default = __webpack_require__(9010);
-      const _interop_require_wildcard = __webpack_require__(2275);
-      const _jsxruntime = __webpack_require__(1024);
+      const _interop_require_default = __webpack_require__(2570);
+      const _interop_require_wildcard = __webpack_require__(5643);
+      const _jsxruntime = __webpack_require__(2014);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
-        __webpack_require__(8879)
+        __webpack_require__(1774)
       );
       const _reactdom = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3869)
+        __webpack_require__(7499)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(1666)
+        __webpack_require__(9452)
       );
-      const _getimgprops = __webpack_require__(1169);
-      const _imageconfig = __webpack_require__(1686);
-      const _imageconfigcontextsharedruntime = __webpack_require__(2);
-      const _warnonce = __webpack_require__(4352);
-      const _routercontextsharedruntime = __webpack_require__(9059);
+      const _getimgprops = __webpack_require__(1155);
+      const _imageconfig = __webpack_require__(9712);
+      const _imageconfigcontextsharedruntime = __webpack_require__(2896);
+      const _warnonce = __webpack_require__(5358);
+      const _routercontextsharedruntime = __webpack_require__(9813);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8035)
+        __webpack_require__(1417)
       );
-      const _usemergedref = __webpack_require__(8848);
+      const _usemergedref = __webpack_require__(7614);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -1358,5 +1099,268 @@
 
       /***/
     },
+
+    /***/ 9452: /***/ (module, exports, __webpack_require__) => {
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      0 && 0;
+      function _export(target, all) {
+        for (var name in all)
+          Object.defineProperty(target, name, {
+            enumerable: true,
+            get: all[name],
+          });
+      }
+      _export(exports, {
+        default: function () {
+          return _default;
+        },
+        defaultHead: function () {
+          return defaultHead;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _interop_require_wildcard = __webpack_require__(5643);
+      const _jsxruntime = __webpack_require__(2014);
+      const _react = /*#__PURE__*/ _interop_require_wildcard._(
+        __webpack_require__(1774)
+      );
+      const _sideeffect = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(405)
+      );
+      const _headmanagercontextsharedruntime = __webpack_require__(5326);
+      const _warnonce = __webpack_require__(5358);
+      function defaultHead() {
+        const head = [
+          /*#__PURE__*/ (0, _jsxruntime.jsx)(
+            "meta",
+            {
+              charSet: "utf-8",
+            },
+            "charset"
+          ),
+          /*#__PURE__*/ (0, _jsxruntime.jsx)(
+            "meta",
+            {
+              name: "viewport",
+              content: "width=device-width",
+            },
+            "viewport"
+          ),
+        ];
+        return head;
+      }
+      function onlyReactElement(list, child) {
+        // React children can be "string" or "number" in this case we ignore them for backwards compat
+        if (typeof child === "string" || typeof child === "number") {
+          return list;
+        }
+        // Adds support for React.Fragment
+        if (child.type === _react.default.Fragment) {
+          return list.concat(
+            _react.default.Children.toArray(child.props.children).reduce(
+              (fragmentList, fragmentChild) => {
+                if (
+                  typeof fragmentChild === "string" ||
+                  typeof fragmentChild === "number"
+                ) {
+                  return fragmentList;
+                }
+                return fragmentList.concat(fragmentChild);
+              },
+              []
+            )
+          );
+        }
+        return list.concat(child);
+      }
+      const METATYPES = ["name", "httpEquiv", "charSet", "itemProp"];
+      /*
+ returns a function for filtering head child elements
+ which shouldn't be duplicated, like <title/>
+ Also adds support for deduplicated `key` properties
+*/ function unique() {
+        const keys = new Set();
+        const tags = new Set();
+        const metaTypes = new Set();
+        const metaCategories = {};
+        return (h) => {
+          let isUnique = true;
+          let hasKey = false;
+          if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) {
+            hasKey = true;
+            const key = h.key.slice(h.key.indexOf("$") + 1);
+            if (keys.has(key)) {
+              isUnique = false;
+            } else {
+              keys.add(key);
+            }
+          }
+          // eslint-disable-next-line default-case
+          switch (h.type) {
+            case "title":
+            case "base":
+              if (tags.has(h.type)) {
+                isUnique = false;
+              } else {
+                tags.add(h.type);
+              }
+              break;
+            case "meta":
+              for (let i = 0, len = METATYPES.length; i < len; i++) {
+                const metatype = METATYPES[i];
+                if (!h.props.hasOwnProperty(metatype)) continue;
+                if (metatype === "charSet") {
+                  if (metaTypes.has(metatype)) {
+                    isUnique = false;
+                  } else {
+                    metaTypes.add(metatype);
+                  }
+                } else {
+                  const category = h.props[metatype];
+                  const categories = metaCategories[metatype] || new Set();
+                  if (
+                    (metatype !== "name" || !hasKey) &&
+                    categories.has(category)
+                  ) {
+                    isUnique = false;
+                  } else {
+                    categories.add(category);
+                    metaCategories[metatype] = categories;
+                  }
+                }
+              }
+              break;
+          }
+          return isUnique;
+        };
+      }
+      /**
+       *
+       * @param headChildrenElements List of children of <Head>
+       */ function reduceComponents(headChildrenElements) {
+        return headChildrenElements
+          .reduce(onlyReactElement, [])
+          .reverse()
+          .concat(defaultHead().reverse())
+          .filter(unique())
+          .reverse()
+          .map((c, i) => {
+            const key = c.key || i;
+            if (false) {
+            }
+            return /*#__PURE__*/ _react.default.cloneElement(c, {
+              key,
+            });
+          });
+      }
+      /**
+       * This component injects elements to `<head>` of your page.
+       * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.
+       */ function Head({ children }) {
+        const headManager = (0, _react.useContext)(
+          _headmanagercontextsharedruntime.HeadManagerContext
+        );
+        return /*#__PURE__*/ (0, _jsxruntime.jsx)(_sideeffect.default, {
+          reduceComponentsToState: reduceComponents,
+          headManager: headManager,
+          children: children,
+        });
+      }
+      const _default = Head;
+      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=head.js.map
+
+      /***/
+    },
+
+    /***/ 9712: /***/ (__unused_webpack_module, exports) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      0 && 0;
+      function _export(target, all) {
+        for (var name in all)
+          Object.defineProperty(target, name, {
+            enumerable: true,
+            get: all[name],
+          });
+      }
+      _export(exports, {
+        VALID_LOADERS: function () {
+          return VALID_LOADERS;
+        },
+        imageConfigDefault: function () {
+          return imageConfigDefault;
+        },
+      });
+      const VALID_LOADERS = [
+        "default",
+        "imgix",
+        "cloudinary",
+        "akamai",
+        "custom",
+      ];
+      const imageConfigDefault = {
+        deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+        imageSizes: [32, 48, 64, 96, 128, 256, 384],
+        path: "/_next/image",
+        loader: "default",
+        loaderFile: "",
+        /**
+         * @deprecated Use `remotePatterns` instead to protect your application from malicious users.
+         */ domains: [],
+        disableStaticImages: false,
+        minimumCacheTTL: 14400,
+        formats: ["image/webp"],
+        maximumRedirects: 3,
+        dangerouslyAllowLocalIP: false,
+        dangerouslyAllowSVG: false,
+        contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,
+        contentDispositionType: "attachment",
+        localPatterns: undefined,
+        remotePatterns: [],
+        qualities: [75],
+        unoptimized: false,
+      }; //# sourceMappingURL=image-config.js.map
+
+      /***/
+    },
+
+    /***/ 9813: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "RouterContext", {
+        enumerable: true,
+        get: function () {
+          return RouterContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(2570);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1774)
+      );
+      const RouterContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=router-context.shared-runtime.js.map
+
+      /***/
+    },
   },
 ]);
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],
   {
-    /***/ 6329: /***/ (
+    /***/ 2788: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
+
+    /***/ 5709: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7455, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7641, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2436, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8833, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4220, 23)
+        __webpack_require__.t.bind(__webpack_require__, 202, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6179, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5505, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 477, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9743, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 45, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2067, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4644, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1166, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8713, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3791, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1432, 23)
+        __webpack_require__.t.bind(__webpack_require__, 666, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5011, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9993, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2560, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1706, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5161)
+        __webpack_require__.bind(__webpack_require__, 6335)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7801, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3883, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9992, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7030, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2066, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3712, 23)
       );
 
       /***/
     },
-
-    /***/ 7854: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [9137, 4498],
-      () => (__webpack_exec__(1225), __webpack_exec__(6329))
+      [2494, 6734],
+      () => (__webpack_exec__(9303), __webpack_exec__(5709))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for app-page-exp..ntime.dev.js
failed to diff
Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js
failed to diff
Diff for app-page.runtime.prod.js

Diff too large to display

Commit: b1ab340

@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from 48aa542 to df056a6 Compare October 15, 2025 14:41
@lubieowoce lubieowoce force-pushed the lubieowoce/multi-task-dev-render branch from e617eaf to 6835e98 Compare October 15, 2025 14:41
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from df056a6 to b12f6b6 Compare October 15, 2025 15:10
@lubieowoce lubieowoce force-pushed the lubieowoce/multi-task-dev-render branch from 6835e98 to 6d8820e Compare October 15, 2025 15:10
Comment on lines +112 to +113
workUnitStore,
applyOwnerStack(new Error(message), workUnitStore)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
workUnitStore,
applyOwnerStack(new Error(message), workUnitStore)
workUnitStore as DevRequestStoreModern,
applyOwnerStack(new Error(message), workUnitStore as DevRequestStoreModern)

Type mismatch: trackSynchronousPlatformIOAccessInDev expects DevRequestStoreModern but receives RequestStore which is a broader union type that includes production and legacy stores.

View Details

Analysis

TypeScript type mismatch in trackSynchronousPlatformIOAccessInDev call

What fails: trackSynchronousPlatformIOAccessInDev() in packages/next/src/server/node-environment-extensions/utils.tsx:112-113 expects DevRequestStoreModern but receives workUnitStore typed as RequestStore (broader union type)

How to reproduce:

cd packages/next && npx tsc --noEmit --skipLibCheck src/server/node-environment-extensions/utils.tsx

Result: TypeScript compilation error: "Argument of type 'RequestStore' is not assignable to parameter of type 'DevRequestStoreModern'"

Expected: Clean compilation. The runtime guard if (workUnitStore.stagedRendering) ensures only modern dev stores are passed, but TypeScript control flow analysis cannot narrow the union type properly due to complex type intersection logic.

@lubieowoce lubieowoce force-pushed the lubieowoce/multi-task-dev-render branch from 6d8820e to 868f28d Compare October 15, 2025 22:02
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from b12f6b6 to 3dd1939 Compare October 15, 2025 22:02
@ijjk ijjk added the tests label Oct 15, 2025
@lubieowoce lubieowoce force-pushed the lubieowoce/multi-task-dev-render branch from 868f28d to bf57ecb Compare October 16, 2025 10:29
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from 3dd1939 to 1f62ec4 Compare October 16, 2025 10:29
Base automatically changed from lubieowoce/multi-task-dev-render to canary October 16, 2025 15:08
@lubieowoce lubieowoce changed the base branch from canary to graphite-base/84907 October 17, 2025 15:19
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from 1f62ec4 to 041d3e1 Compare October 17, 2025 15:19
@lubieowoce lubieowoce changed the base branch from graphite-base/84907 to lubieowoce/less-runtime-cache-warming October 17, 2025 15:19
@github-actions
Copy link
Contributor

github-actions bot commented Oct 17, 2025

All broken links are now fixed, thank you!

@codspeed-hq
Copy link

codspeed-hq bot commented Oct 17, 2025

CodSpeed Performance Report

Merging #84907 will not alter performance

Comparing lubieowoce/three-task-sync-io (041d3e1) with canary (71ce95d)1

Summary

✅ 17 untouched
⏩ 3 skipped2

Footnotes

  1. No successful run was found on lubieowoce/less-runtime-cache-warming (997ac1e) during the generation of this report, so canary (71ce95d) was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

  2. 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.

@lubieowoce lubieowoce changed the base branch from lubieowoce/less-runtime-cache-warming to graphite-base/84907 October 20, 2025 00:26
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from 041d3e1 to c4ae6b6 Compare October 20, 2025 00:26
@lubieowoce lubieowoce changed the base branch from graphite-base/84907 to lubieowoce/fix-hanging-cache-deadlock October 20, 2025 00:26
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from c4ae6b6 to 8f106c7 Compare October 20, 2025 00:35
@lubieowoce lubieowoce force-pushed the lubieowoce/fix-hanging-cache-deadlock branch from 758a91a to 74ac764 Compare October 20, 2025 00:35
@lubieowoce lubieowoce force-pushed the lubieowoce/three-task-sync-io branch from 8f106c7 to b1ab340 Compare October 20, 2025 19:22
@lubieowoce lubieowoce force-pushed the lubieowoce/fix-hanging-cache-deadlock branch from 74ac764 to 66c194a Compare October 20, 2025 19:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants