Skip to content

wip: not-found optimization #80556

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed

Conversation

gaojude
Copy link
Contributor

@gaojude gaojude commented Jun 16, 2025

No description provided.

Copy link
Contributor Author

gaojude commented Jun 16, 2025

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

@ijjk
Copy link
Member

ijjk commented Jun 16, 2025

Failing test suites

Commit: ddf893f

pnpm test-dev-turbo test/development/acceptance-app/rsc-runtime-errors.test.ts (turbopack)

  • Error overlay - RSC runtime errors > should show runtime errors if invalid server API from node_modules is executed
Expand output

● Error overlay - RSC runtime errors › should show runtime errors if invalid server API from node_modules is executed

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Error overlay - RSC runtime errors should show runtime errors if invalid server API from node_modules is executed 1`

- Snapshot  -   9
+ Received  + 117

- {
-   "description": "`cookies` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "app/client/page.js (4:15) @ Page
+ [
+   {
+     "description": "params are being enumerated. `params` should be unwrapped with `React.use()` before using its value. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "The keys of `searchParams` were accessed directly. `searchParams` should be unwrapped with `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "`cookies` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context",
+     "environmentLabel": null,
+     "label": "Runtime Error",
+     "source": "app/client/page.js (4:15) @ Page
  > 4 |   callServerApi()
      |               ^",
-   "stack": [
-     "Page app/client/page.js (4:15)",
-   ],
- }
+     "stack": [
+       "Page app/client/page.js (4:15)",
+     ],
+   },
+ ]

  54 |     // TODO(veil): Inconsistent cursor position
  55 |     if (isTurbopack) {
> 56 |       await expect(browser).toDisplayRedbox(`
     |                             ^
  57 |        {
  58 |          "description": "\`cookies\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context",
  59 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance-app/rsc-runtime-errors.test.ts:56:29)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-turbo test/development/app-dir/dev-indicator/route-type.test.ts (turbopack)

  • app dir dev indicator - route type > should have route type as dynamic when changing to dynamic page
  • app dir dev indicator - route type > should have route type as dynamic when using force-dynamic
Expand output

● app dir dev indicator - route type › should have route type as dynamic when changing to dynamic page

Expected DevTools Indicator but found no visible one.

  952 |   browser: Playwright
  953 | ): Promise<void> {
> 954 |   const devToolsIndicator = await assertHasDevToolsIndicator(browser)
      |                             ^
  955 |
  956 |   try {
  957 |     await devToolsIndicator.click()

  at openDevToolsIndicatorPopover (lib/next-test-utils.ts:954:29)
  at getRouteTypeFromDevToolsIndicator (lib/next-test-utils.ts:995:3)
  at development/app-dir/dev-indicator/route-type.test.ts:28:16
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (development/app-dir/dev-indicator/route-type.test.ts:27:7)

● app dir dev indicator - route type › should have route type as dynamic when using force-dynamic

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('#ready')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Object.waitForElementByCss (development/app-dir/dev-indicator/route-type.test.ts:57:19)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-rspack test/development/app-dir/error-overlay/duplicate-runtime-error/duplicate-runtime-error.test.ts(rspack)

  • duplicate-runtime-error > should not rerender the overlay for the same runtime error
Expand output

● duplicate-runtime-error › should not rerender the overlay for the same runtime error

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('[data-next-badge]')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/error-overlay/duplicate-runtime-error/duplicate-runtime-error.test.ts:11:33)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-turbo test/development/app-dir/hook-function-names/hook-function-names.test.ts (turbopack)

  • hook-function-names > should show readable hook names in stacks
Expand output

● hook-function-names › should show readable hook names in stacks

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `hook-function-names should show readable hook names in stacks 1`

- Snapshot  -  12
+ Received  + 120

- {
-   "description": "Kaputt!",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "app/button/page.tsx (7:11) @ Button.useCallback[handleClick]
+ [
+   {
+     "description": "params are being enumerated. `params` should be unwrapped with `React.use()` before using its value. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "The keys of `searchParams` were accessed directly. `searchParams` should be unwrapped with `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "Kaputt!",
+     "environmentLabel": null,
+     "label": "Runtime Error",
+     "source": "app/button/page.tsx (7:11) @ Button.useCallback[handleClick]
  >  7 |     throw new Error(message)
       |           ^",
-   "stack": [
-     "Button.useCallback[handleClick] app/button/page.tsx (7:11)",
-     "button <anonymous> (0:0)",
-     "Button app/button/page.tsx (11:5)",
-     "Page app/button/page.tsx (18:10)",
-   ],
- }
+     "stack": [
+       "Button.useCallback[handleClick] app/button/page.tsx (7:11)",
+       "button <anonymous> (0:0)",
+       "Button app/button/page.tsx (11:5)",
+       "Page app/button/page.tsx (18:10)",
+     ],
+   },
+ ]

  11 |     await browser.elementByCss('button').click()
  12 |
> 13 |     await expect(browser).toDisplayCollapsedRedbox(`
     |                           ^
  14 |      {
  15 |        "description": "Kaputt!",
  16 |        "environmentLabel": null,

  at Object.toDisplayCollapsedRedbox (development/app-dir/hook-function-names/hook-function-names.test.ts:13:27)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-rspack test/development/app-dir/basic/basic.test.ts(rspack)

  • basic app-dir tests > should reload app pages without error
Expand output

● basic app-dir tests › should reload app pages without error

locator.isVisible: Target crashed 
Call log:
  -   checking visibility of locator('nextjs-portal [aria-labelledby="nextjs__container_errors_label"]')

  859 |   const redbox = browser.locateRedbox()
  860 |
> 861 |   if (await redbox.isVisible()) {
      |                    ^
  862 |     const [redboxHeader, redboxDescription, redboxSource] = await Promise.all([
  863 |       getRedboxHeader(browser).catch(() => '<missing>'),
  864 |       getRedboxDescription(browser).catch(() => '<missing>'),

  at isVisible (lib/next-test-utils.ts:861:20)
  at Object.<anonymous> (development/app-dir/basic/basic.test.ts:13:5)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-rspack test/development/app-dir/experimental-lightningcss/experimental-lightningcss.test.ts(rspack)

  • experimental-lightningcss with default mode > in dev server > should support browserslist
Expand output

● experimental-lightningcss with default mode › in dev server › should support browserslist

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('.nested')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/experimental-lightningcss/experimental-lightningcss.test.ts:33:22)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (development/app-dir/experimental-lightningcss/experimental-lightningcss.test.ts:33:46)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-turbo test/development/app-dir/serialize-circular-error/serialize-circular-error.test.ts (turbopack)

  • serialize-circular-error > should serialize the object from client component in console correctly
Expand output

● serialize-circular-error › should serialize the object from client component in console correctly

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `serialize-circular-error should serialize the object from client component in console correctly 1`

- Snapshot  -   1
+ Received  + 109

+ [
+   {
+     "description": "params are being enumerated. `params` should be unwrapped with `React.use()` before using its value. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "The keys of `searchParams` were accessed directly. `searchParams` should be unwrapped with `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
    {
      "description": "[object Object]",
      "environmentLabel": null,
      "label": "Runtime Error",
      "source": null,
      "stack": [],
- }
+   },
+ ]

  28 |
  29 |     // TODO: Format arbitrary messages in Redbox
> 30 |     await expect(browser).toDisplayRedbox(`
     |                           ^
  31 |      {
  32 |        "description": "[object Object]",
  33 |        "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/serialize-circular-error/serialize-circular-error.test.ts:30:27)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/next-dynamic-css-asset-prefix/test/index.test.js(rspack)

  • next/dynamic with assetPrefix > development mode > should load a App Router page correctly
Expand output

● next/dynamic with assetPrefix › development mode › should load a App Router page correctly

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('body div:nth-child(3)')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (integration/next-dynamic-css-asset-prefix/test/index.test.js:43:10)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:405:17)
  at Object.getComputedCss (integration/next-dynamic-css-asset-prefix/test/index.test.js:44:10)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-turbo test/development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts (turbopack)

  • hmr-parallel-routes > should update parallel routes via HMR
Expand output

● hmr-parallel-routes › should update parallel routes via HMR

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

   7 |   })
   8 |
>  9 |   it('should update parallel routes via HMR', async () => {
     |   ^
  10 |     const browser = await next.browser('/')
  11 |     expect(await browser.elementByCss('#bar').text()).toBe('Bar Page')
  12 |     expect(await browser.elementByCss('#foo').text()).toBe('Foo Page')

  at it (development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts:9:3)
  at Object.describe (development/app-dir/hmr-parallel-routes/hmr-parallel-routes.test.ts:4:1)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev-rspack test/development/acceptance-app/error-recovery.test.ts(rspack)

  • Error recovery app > can recover from a event handler error
  • Error recovery app > server component can recover from a component error
Expand output

● Error recovery app › can recover from a event handler error

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

Expected: "0"
Received: null

  279 |     expect(
  280 |       await session.evaluate(() => document.querySelector('p').textContent)
> 281 |     ).toBe('0')
      |       ^
  282 |     await session.evaluate(() => document.querySelector('button').click())
  283 |     expect(
  284 |       await session.evaluate(() => document.querySelector('p').textContent)

  at Object.toBe (development/acceptance-app/error-recovery.test.ts:281:7)

● Error recovery app › server component can recover from a component error

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('p')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/acceptance-app/error-recovery.test.ts:390:26)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (development/acceptance-app/error-recovery.test.ts:390:44)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/next-dynamic-css/test/index.test.js(rspack)

  • next/dynamic > development mode > should load a App Router page correctly
Expand output

● next/dynamic › development mode › should load a App Router page correctly

thrown: "Exceeded timeout of 60000 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."

  30 |   })
  31 |
> 32 |   it('should load a App Router page correctly', async () => {
     |   ^
  33 |     const browser = await webdriver(appPort, '/test-app')
  34 |
  35 |     expect(

  at it (integration/next-dynamic-css/test/index.test.js:32:3)
  at runTests (integration/next-dynamic-css/test/index.test.js:57:7)
  at integration/next-dynamic-css/test/index.test.js:48:58
  at Object.describe (integration/next-dynamic-css/test/index.test.js:47:1)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/build-indicator/test/index.test.js(rspack)

  • Build Activity Indicator > Enabled - (app) > Shows build indicator when page is built from modifying
  • Build Activity Indicator > Enabled - (app) > webpack only > Shows the build indicator when a page is built during navigation
Expand output

● Build Activity Indicator › Enabled - (app) › webpack only › Shows the build indicator when a page is built during navigation

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('#to-a')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (integration/build-indicator/test/index.test.js:78:25)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:425:17)
  at Object.click (integration/build-indicator/test/index.test.js:78:47)

● Build Activity Indicator › Enabled - (app) › Shows build indicator when page is built from modifying

thrown: "Exceeded timeout of 60000 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."

  85 |     )
  86 |
> 87 |     it('Shows build indicator when page is built from modifying', async () => {
     |     ^
  88 |       const browser = await webdriver(
  89 |         appPort,
  90 |         pagesOrApp === 'pages' ? '/b' : '/app/b'

  at it (integration/build-indicator/test/index.test.js:87:5)
      at Array.forEach (<anonymous>)
  at integration/build-indicator/test/index.test.js:62:33
  at Object.describe (integration/build-indicator/test/index.test.js:27:1)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/server-side-dev-errors/test/index.test.js(rspack)

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

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

page.$$: Execution context was destroyed, most likely because of a navigation

  438 |   elementsByCss(selector: string) {
  439 |     return this.startChain(() =>
> 440 |       page.$$(selector).then((els) => {
      |            ^
  441 |         return els.map((el) => {
  442 |           const origGetAttribute = el.getAttribute.bind(el)
  443 |           el.getAttribute = (name) => {

  at $$ (lib/browsers/playwright.ts:440:12)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as elementsByCss] (lib/browsers/playwright.ts:439:17)
  at elementsByCss (lib/next-test-utils.ts:1377:53)
  at createErrorSnapshot (lib/add-redbox-matchers.ts:96:30)
  at createErrorSnapshot (lib/add-redbox-matchers.ts:203:33)
  at Object.toDisplayRedbox (lib/add-redbox-matchers.ts:266:20)
  at Object.<anonymous> (integration/server-side-dev-errors/test/index.test.js:265:7)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/link-ref-app/test/index.test.js (turbopack)

  • Invalid hrefs > development mode > should not show error for function component with forwardRef
  • Invalid hrefs > development mode > should not show error for class component as child of next/link
  • Invalid hrefs > development mode > should handle child ref with React.createRef
  • Invalid hrefs > development mode > should handle child ref that is a function
  • Invalid hrefs > development mode > should handle child ref that is a function that returns a cleanup function
Expand output

● Invalid hrefs › development mode › should not show error for function component with forwardRef

TypeError: Cannot read properties of null (reading 'forEach')

  90 |         const legacyBehaviorDeprecation =
  91 |           '`legacyBehavior` is deprecated and will be removed in a future release.'
> 92 |         errors.forEach((error) => {
     |                ^
  93 |           expect(error).toContain(legacyBehaviorDeprecation)
  94 |         })
  95 |       })

  at Object.forEach (integration/link-ref-app/test/index.test.js:92:16)

● Invalid hrefs › development mode › should not show error for class component as child of next/link

TypeError: Cannot read properties of null (reading 'forEach')

   99 |         const legacyBehaviorDeprecation =
  100 |           '`legacyBehavior` is deprecated and will be removed in a future release.'
> 101 |         errors.forEach((error) => {
      |                ^
  102 |           expect(error).toContain(legacyBehaviorDeprecation)
  103 |         })
  104 |       })

  at Object.forEach (integration/link-ref-app/test/index.test.js:101:16)

● Invalid hrefs › development mode › should handle child ref with React.createRef

expect(received).toEqual(expected) // deep equality

Expected: []
Received: null

  36 | const noError = async (pathname) => {
  37 |   const errors = await collectErrors(pathname)
> 38 |   expect(errors).toEqual([])
     |                  ^
  39 |   return errors
  40 | }
  41 |

  at toEqual (integration/link-ref-app/test/index.test.js:38:18)
  at Object.<anonymous> (integration/link-ref-app/test/index.test.js:107:9)

● Invalid hrefs › development mode › should handle child ref that is a function

expect(received).toEqual(expected) // deep equality

Expected: []
Received: null

  36 | const noError = async (pathname) => {
  37 |   const errors = await collectErrors(pathname)
> 38 |   expect(errors).toEqual([])
     |                  ^
  39 |   return errors
  40 | }
  41 |

  at toEqual (integration/link-ref-app/test/index.test.js:38:18)
  at Object.<anonymous> (integration/link-ref-app/test/index.test.js:111:9)

● Invalid hrefs › development mode › should handle child ref that is a function that returns a cleanup function

expect(received).toEqual(expected) // deep equality

Expected: []
Received: null

  36 | const noError = async (pathname) => {
  37 |   const errors = await collectErrors(pathname)
> 38 |   expect(errors).toEqual([])
     |                  ^
  39 |   return errors
  40 | }
  41 |

  at toEqual (integration/link-ref-app/test/index.test.js:38:18)
  at Object.<anonymous> (integration/link-ref-app/test/index.test.js:115:9)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/app-dir-export/test/dynamicapiroute-dev.test.ts(rspack)

  • app dir - with output export - dynamic api route dev > development mode > should work in dev with dynamicApiRoute 'error'
  • app dir - with output export - dynamic api route dev > development mode > should work in dev with dynamicApiRoute 'force-static'
Expand output

● app dir - with output export - dynamic api route dev › development mode › should work in dev with dynamicApiRoute 'error'

TIMED OUT: Another

undefined

Error: page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('h1')

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at runTests (integration/app-dir-export/test/utils.ts:201:7)
  at integration/app-dir-export/test/dynamicapiroute-dev.test.ts:23:11

● app dir - with output export - dynamic api route dev › development mode › should work in dev with dynamicApiRoute 'force-static'

TIMED OUT: Another

undefined

Error: page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('h1')

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at runTests (integration/app-dir-export/test/utils.ts:201:7)
  at integration/app-dir-export/test/dynamicapiroute-dev.test.ts:23:11

Read more about building and testing Next.js in contributing.md.

pnpm test-dev test/development/app-dir/hmr-asset-prefix-full-url/asset-prefix.test.ts

  • app-dir assetPrefix full URL > should not break HMR when asset prefix set to full URL
Expand output

● app-dir assetPrefix full URL › should not break HMR when asset prefix set to full URL

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('p')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/hmr-asset-prefix-full-url/asset-prefix.test.ts:21:32)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (development/app-dir/hmr-asset-prefix-full-url/asset-prefix.test.ts:21:50)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev test/development/app-dir/hmr-deleted-page/hmr-deleted-page.test.ts

  • hmr-deleted-page > should not show errors for a deleted page
Expand output

● hmr-deleted-page › should not show errors for a deleted page

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('p')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/hmr-deleted-page/hmr-deleted-page.test.ts:16:26)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (development/app-dir/hmr-deleted-page/hmr-deleted-page.test.ts:16:44)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/not-found/group-route-root-not-found/index.test.ts (turbopack)

  • app dir - group routes with root not-found > should render root not found for group routes if hit 404
Expand output

● app dir - group routes with root not-found › should render root not found for group routes if hit 404

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('p')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/not-found/group-route-root-not-found/index.test.ts:24:26)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/not-found/group-route-root-not-found/index.test.ts:24:44)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/next-image-new/app-dir-qualities/test/index.test.ts(rspack)

  • Image localPatterns config > development mode > should load img when quality is undefined
  • Image localPatterns config > development mode > should load img when quality 42
  • Image localPatterns config > development mode > should load img when quality 88
Expand output

● Image localPatterns config › development mode › should load img when quality is undefined

thrown: "Exceeded timeout of 60000 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."

  33 |
  34 | function runTests(mode: 'dev' | 'server') {
> 35 |   it('should load img when quality is undefined', async () => {
     |   ^
  36 |     const browser = await webdriver(appPort, '/')
  37 |     if (mode === 'dev') {
  38 |       await assertNoRedbox(browser)

  at it (integration/next-image-new/app-dir-qualities/test/index.test.ts:35:3)
  at runTests (integration/next-image-new/app-dir-qualities/test/index.test.ts:136:7)
  at integration/next-image-new/app-dir-qualities/test/index.test.ts:125:58
  at Object.describe (integration/next-image-new/app-dir-qualities/test/index.test.ts:124:1)

● Image localPatterns config › development mode › should load img when quality 42

locator.isVisible: Target crashed 
Call log:
  -   checking visibility of locator('nextjs-portal [aria-labelledby="nextjs__container_errors_label"]')

  859 |   const redbox = browser.locateRedbox()
  860 |
> 861 |   if (await redbox.isVisible()) {
      |                    ^
  862 |     const [redboxHeader, redboxDescription, redboxSource] = await Promise.all([
  863 |       getRedboxHeader(browser).catch(() => '<missing>'),
  864 |       getRedboxDescription(browser).catch(() => '<missing>'),

  at isVisible (lib/next-test-utils.ts:861:20)
  at Object.<anonymous> (integration/next-image-new/app-dir-qualities/test/index.test.ts:49:7)

● Image localPatterns config › development mode › should load img when quality 88

thrown: "Exceeded timeout of 60000 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."

  64 |   })
  65 |
> 66 |   it('should load img when quality 88', async () => {
     |   ^
  67 |     const browser = await webdriver(appPort, '/')
  68 |     if (mode === 'dev') {
  69 |       await assertNoRedbox(browser)

  at it (integration/next-image-new/app-dir-qualities/test/index.test.ts:66:3)
  at runTests (integration/next-image-new/app-dir-qualities/test/index.test.ts:136:7)
  at integration/next-image-new/app-dir-qualities/test/index.test.ts:125:58
  at Object.describe (integration/next-image-new/app-dir-qualities/test/index.test.ts:124:1)

Read more about building and testing Next.js in contributing.md.

pnpm test-dev test/development/app-dir/edge-errors-hmr/index.test.ts

  • develop - app-dir - edge errros hmr > should recover from build errors when server component error
  • develop - app-dir - edge errros hmr > should recover from build errors when client component error
Expand output

● develop - app-dir - edge errros hmr › should recover from build errors when server component error

Expected Redbox but found no visible one.

  15 |     })
  16 |
> 17 |     await assertHasRedbox(browser)
     |     ^
  18 |
  19 |     await next.patchFile('app/comp.server.js', clientComponentSource)
  20 |

  at Object.<anonymous> (development/app-dir/edge-errors-hmr/index.test.ts:17:5)

● develop - app-dir - edge errros hmr › should recover from build errors when client component error

Expected no visible Redbox but found one
header: Build Error

  x Expression expected
description:   x Expression expected
source: ./app/comp.server.js
Error:   x Expression expected
    ,-[9:1]
  6 |       <p>- This is a component (server)</p>
  7 |       {/* Uncomment the following line and save file to see the error: */}
  8 |       <
  9 |     </div>
    :     ^
 10 |   )
 11 | }
    `----
  x Unterminated regexp literal
    ,-[9:1]
  6 |       <p>- This is a component (server)</p>
  7 |       {/* Uncomment the following line and save file to see the error: */}
  8 |       <
  9 |     </div>
    :      ^^^^^
 10 |   )
 11 | }
    `----

Caused by:
    Syntax Error

  34 |     await next.patchFile('app/comp.client.js', clientComponentSource)
  35 |
> 36 |     await assertNoRedbox(browser)
     |     ^
  37 |   })
  38 | })
  39 |

  at Object.<anonymous> (development/app-dir/edge-errors-hmr/index.test.ts:36:5)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/global-not-found/not-present/not-present.test.ts (turbopack)

  • global-not-found - not-present > should render custom not-found.js boundary when global-not-found is not defined but enabled
Expand output

● global-not-found - not-present › should render custom not-found.js boundary when global-not-found is not defined but enabled

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

Expected: "en"
Received: null

  18 |     const htmlLang = await browser.elementByCss('html').getAttribute('lang')
  19 |     // Render the root layout
> 20 |     expect(htmlLang).toBe('en')
     |                      ^
  21 |     // Render the not-found.js boundary
  22 |     expect(bodyText).toBe('not-found.js')
  23 |   })

  at Object.toBe (e2e/app-dir/global-not-found/not-present/not-present.test.ts:20:22)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/metadata-navigation/metadata-navigation.test.ts (turbopack)

  • app dir - metadata navigation > navigation > should support notFound in generateMetadata
Expand output

● app dir - metadata navigation › navigation › should support notFound in generateMetadata

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

Expected substring: "Local found boundary"
Received string:    "1:\\\"$Sreact.fragment\\\"\\n2:I[44178,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"default\\\"]\\n3:I[13647,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"default\\\"]\\n4:I[89537,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"OutletBoundary\\\"]\\n6:I[81922,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n8:I[89537,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"ViewportBoundary\\\"]\\na:I[89537,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"MetadataBoundary\\\"]\\nb:\\\"$Sreact.suspense\\\"\\nd:I[16348,[\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"/_next/static/chunks/484d703948cf17c4.js\\\"],\\\"default\\\"]\\n0:{\\\"P\\\":null,\\\"b\\\":\\\"oclUGME0y79skiYCPnYYn\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"async\\\",\\\"not-found\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"async\\\",{\\\"children\\\":[\\\"not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/fbc88da981f86adb.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/484d703948cf17c4.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{}],[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"async\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"not-found\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"not-found-text\\\",null,[\\\"$\\\",\\\"$L4\\\",null,{\\\"children\\\":[\\\"$L5\\\",[\\\"$\\\",\\\"$L6\\\",null,{\\\"promise\\\":\\\"$@7\\\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[[\\\"$\\\",\\\"$L8\\\",null,{\\\"children\\\":\\\"$L9\\\"}],null],[\\\"$\\\",\\\"$La\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$b\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$Lc\\\"}]}]}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$d\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":false}\\n9:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n5:null\\n7:{\\\"metadata\\\":[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"Local not found\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"description\\\",\\\"content\\\":\\\"Local not found description\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"2\\\",{\\\"name\\\":\\\"keywords\\\",\\\"content\\\":\\\"parent\\\"}]],\\\"error\\\":\\\"$Z\\\",\\\"digest\\\":\\\"NEXT_HTTP_ERROR_FALLBACK;404\\\"}\\nc:\\\"$7:metadata\\\"\\n"

  48 |         }
  49 |       }
> 50 |       expect(flightText).toContain('Local found boundary')
     |                          ^
  51 |
  52 |       // Should contain default metadata and noindex tag
  53 |       const matchHtml = createMultiHtmlMatcher($)

  at Object.toContain (e2e/app-dir/metadata-navigation/metadata-navigation.test.ts:50:26)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/app-dir-export/test/dynamicpage-dev.test.ts (turbopack)

  • app dir - with output export - dynamic page dev > development mode > should work in dev with dynamicPage undefined
  • app dir - with output export - dynamic page dev > development mode > should work in dev with dynamicPage 'error'
  • app dir - with output export - dynamic page dev > development mode > should work in dev with dynamicPage 'force-static'
Expand output

● app dir - with output export - dynamic page dev › development mode › should work in dev with dynamicPage undefined

TIMED OUT: Another

undefined

Error: page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('h1')

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at runTests (integration/app-dir-export/test/utils.ts:201:7)
  at integration/app-dir-export/test/dynamicpage-dev.test.ts:19:11

● app dir - with output export - dynamic page dev › development mode › should work in dev with dynamicPage 'error'

TIMED OUT: Another

undefined

Error: page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('h1')

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at runTests (integration/app-dir-export/test/utils.ts:201:7)
  at integration/app-dir-export/test/dynamicpage-dev.test.ts:19:11

● app dir - with output export - dynamic page dev › development mode › should work in dev with dynamicPage 'force-static'

TIMED OUT: Another

undefined

Error: page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('h1')

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at runTests (integration/app-dir-export/test/utils.ts:201:7)
  at integration/app-dir-export/test/dynamicpage-dev.test.ts:19:11

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/development/app-dir/hmr-move-file/hmr-move-file.test.ts (PPR)

  • HMR Move File > should work when moving a component to another directory
Expand output

● HMR Move File › should work when moving a component to another directory

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('#hello-world-button')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/hmr-move-file/hmr-move-file.test.ts:11:26)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (development/app-dir/hmr-move-file/hmr-move-file.test.ts:11:62)

Read more about building and testing Next.js in contributing.md.

pnpm test-start test/e2e/app-dir/app/index.test.ts

  • app dir - basic > known bugs > should handle router.refresh without resetting state
Expand output

● app dir - basic › known bugs › should handle router.refresh without resetting state

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('#refreshed')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Object.waitForElementByCss (e2e/app-dir/app/index.test.ts:1581:28)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/app/index.test.ts:1581:62)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/development/app-dir/hmr-shared-css/hmr-shared-css.test.ts (PPR)

  • hmr-app-and-pages > should do HMR when app router and pages router have shared CSS
Expand output

● hmr-app-and-pages › should do HMR when app router and pages router have shared CSS

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('body')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (development/app-dir/hmr-shared-css/hmr-shared-css.test.ts:14:21)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:405:17)
  at Object.getComputedCss (development/app-dir/hmr-shared-css/hmr-shared-css.test.ts:14:42)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/global-not-found/basic/global-not-found-basic.test.ts (turbopack)

  • global-not-found - basic > should render not-found boundary when calling notFound() in a page
Expand output

● global-not-found - basic › should render not-found boundary when calling notFound() in a page

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

Expected: "en"
Received: null

  35 |       await browser.elementByCss('html').getAttribute('data-global-not-found')
  36 |     ).toBeNull()
> 37 |     expect(await browser.elementByCss('html').getAttribute('lang')).toBe('en')
     |                                                                     ^
  38 |
  39 |     // There's no not-found boundary in the root layout, show the default not-found.js
  40 |     expect(await browser.elementByCss('body').text()).toBe(

  at Object.toBe (e2e/app-dir/global-not-found/basic/global-not-found-basic.test.ts:37:69)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts (PPR)

  • app-dir action allowed origins > should pass if localhost is set as a safe origin
Expand output

● app-dir action allowed origins › should pass if localhost is set as a safe origin

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('button')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts:23:19)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:425:17)
  at Object.click (e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts:23:42)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/next-image-new/app-dir-image-from-node-modules/test/index.test.ts

  • Image Component from node_modules development mode > should apply image config for node_modules
Expand output

● Image Component from node_modules development mode › should apply image config for node_modules

page.waitForSelector: Target crashed 
Call log:
  - waiting for locator('#image-from-node-modules')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Playwright.elementByCss [as elementById] (lib/browsers/playwright.ts:379:17)
  at Object.elementById (integration/next-image-new/app-dir-image-from-node-modules/test/index.test.ts:20:8)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:409:17)
  at Object.getAttribute (integration/next-image-new/app-dir-image-from-node-modules/test/index.test.ts:21:8)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/development/acceptance-app/ReactRefreshLogBoxMisc.test.ts (PPR)

  • ReactRefreshLogBox app > server-side only compilation errors
Expand output

● ReactRefreshLogBox app › server-side only compilation errors

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox app server-side only compilation errors 1`

- Snapshot  - 20
+ Received  +  1

- {
-   "description": "  x "getStaticProps" is not supported in app/. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./app/page.js
- Error:   x "getStaticProps" is not supported in app/. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching
-   |
-    ,-[3:1]
-  1 | 'use client'
-  2 | import myLibrary from 'my-non-existent-library'
-  3 | export async function getStaticProps() {
-    :                       ^^^^^^^^^^^^^^
-  4 |   return {
-  5 |     props: {
-  6 |       result: myLibrary()
-    `----
- Import trace for requested module:
- ./app/page.js",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  46 |       `)
  47 |     } else {
> 48 |       await expect(browser).toDisplayRedbox(`
     |                             ^
  49 |        {
  50 |          "description": "  x "getStaticProps" is not supported in app/. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching",
  51 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance-app/ReactRefreshLogBoxMisc.test.ts:48:29)

Read more about building and testing Next.js in contributing.md.

pnpm test-start test/e2e/app-dir/global-not-found/both-present/both-present.test.ts

  • global-not-found - both-present > should render not-found boundary when calling notFound() in a page
Expand output

● global-not-found - both-present › should render not-found boundary when calling notFound() in a page

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#not-found-boundary')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/global-not-found/both-present/both-present.test.ts:24:26)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/global-not-found/both-present/both-present.test.ts:24:62)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/unstable-rethrow/unstable-rethrow.test.ts (turbopack)

  • unstable-rethrow > should correctly trigger the not found page as not found
Expand output

● unstable-rethrow › should correctly trigger the not found page as not found

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

Expected substring: "This page could not be found."
Received string:    ""

   8 |   it('should correctly trigger the not found page as not found', async () => {
   9 |     const browser = await next.browser('/not-found-page')
> 10 |     expect(await browser.elementByCss('body').text()).toContain(
     |                                                       ^
  11 |       'This page could not be found.'
  12 |     )
  13 |   })

  at Object.toContain (e2e/app-dir/unstable-rethrow/unstable-rethrow.test.ts:10:55)

Read more about building and testing Next.js in contributing.md.

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

  • app-dir static/dynamic handling > should correctly handle statusCode with notFound + ISR
  • app-dir static/dynamic handling > should render not found pages correctly and fallback to the default one
Expand output

● app-dir static/dynamic handling › should correctly handle statusCode with notFound + ISR

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

Expected substring: "This page could not be found"
Received string:    "<!DOCTYPE html><html id=\"__next_error__\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/8e0fb9d61627bf23.js\"/><script src=\"/_next/static/chunks/74b3c177360ebfe2.js\" async=\"\"></script><script src=\"/_next/static/chunks/619e4d08ad0b0e59.js\" async=\"\"></script><script src=\"/_next/static/chunks/e21fd1a67af5728c.js\" async=\"\"></script><script src=\"/_next/static/chunks/051fa6e5a48c2486.js\" async=\"\"></script><script src=\"/_next/static/chunks/c156480526af92b6.js\" async=\"\"></script><script src=\"/_next/static/chunks/c3f05becc429566c.js\" async=\"\"></script><script src=\"/_next/static/chunks/0eef8c9683cbc78c.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><script src=\"/_next/static/chunks/ec548c7ce307cf6d.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><script src=\"/_next/static/chunks/8e0fb9d61627bf23.js\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[57768,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n3:I[18126,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n5:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"OutletBoundary\\\"]\\n7:I[26664,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n9:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"ViewportBoundary\\\"]\\nb:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"MetadataBoundary\\\"]\\nc:\\\"$Sreact.suspense\\\"\\ne:I[10440,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4TjltrR7RLsRZpUo5pwMI\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"articles\\\",\\\"non-existent\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"articles\\\",{\\\"children\\\":[[\\\"slug\\\",\\\"non-existent\\\",\\\"d\\\"],{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"my static blog\\\"}]}],[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"articles\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"slug\\\",\\\"non-existent\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L4\\\",null,[\\\"$\\\",\\\"$L5\\\",null,{\\\"children\\\":[\\\"$L6\\\",[\\\"$\\\",\\\"$L7\\\",null,{\\\"promise\\\":\\\"$@8\\\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[[\\\"$\\\",\\\"$L9\\\",null,{\\\"children\\\":\\\"$La\\\"}],null],[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$c\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$Ld\\\"}]}]}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$e\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"4:E{\\\"digest\\\":\\\"NEXT_HTTP_ERROR_FALLBACK;404\\\"}\\n\"])</script><script>self.__next_f.push([1,\"a:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n6:null\\n\"])</script><script>self.__next_f.push([1,\"8:{\\\"metadata\\\":[],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n\"])</script><script>self.__next_f.push([1,\"d:\\\"$8:metadata\\\"\\n\"])</script></body></html>"

  2824 |         expect(res.status).toBe(404)
  2825 |       }
> 2826 |       expect(await res.text()).toContain('This page could not be found')
       |                                ^
  2827 |       await waitFor(500)
  2828 |     }
  2829 |   })

  at Object.toContain (e2e/app-dir/app-static/app-static.test.ts:2826:32)

● app-dir static/dynamic handling › should render not found pages correctly and fallback to the default one

expect(received).toInclude(expected)

Expected string to include:
  "This page could not be found."
Received:
  "<!DOCTYPE html><html id=\"__next_error__\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/8e0fb9d61627bf23.js\"/><script src=\"/_next/static/chunks/74b3c177360ebfe2.js\" async=\"\"></script><script src=\"/_next/static/chunks/619e4d08ad0b0e59.js\" async=\"\"></script><script src=\"/_next/static/chunks/e21fd1a67af5728c.js\" async=\"\"></script><script src=\"/_next/static/chunks/051fa6e5a48c2486.js\" async=\"\"></script><script src=\"/_next/static/chunks/c156480526af92b6.js\" async=\"\"></script><script src=\"/_next/static/chunks/c3f05becc429566c.js\" async=\"\"></script><script src=\"/_next/static/chunks/0eef8c9683cbc78c.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><script src=\"/_next/static/chunks/ec548c7ce307cf6d.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><script src=\"/_next/static/chunks/8e0fb9d61627bf23.js\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[57768,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n3:I[18126,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n6:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"OutletBoundary\\\"]\\n8:I[26664,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\na:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"ViewportBoundary\\\"]\\nc:I[75241,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"MetadataBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:I[10440,[\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\"],\\\"default\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"4TjltrR7RLsRZpUo5pwMI\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"blog\\\",\\\"shu\\\",\\\"hi\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"blog\\\",{\\\"children\\\":[[\\\"author\\\",\\\"shu\\\",\\\"d\\\"],{\\\"children\\\":[[\\\"slug\\\",\\\"hi\\\",\\\"d\\\"],{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/c3f05becc429566c.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/0eef8c9683cbc78c.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"my static blog\\\"}]}],[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"blog\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"author\\\",\\\"shu\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,\\\"$L4\\\"]}],{\\\"children\\\":[[\\\"slug\\\",\\\"hi\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L5\\\",null,[\\\"$\\\",\\\"$L6\\\",null,{\\\"children\\\":[\\\"$L7\\\",[\\\"$\\\",\\\"$L8\\\",null,{\\\"promise\\\":\\\"$@9\\\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[[\\\"$\\\",\\\"$La\\\",null,{\\\"children\\\":\\\"$Lb\\\"}],null],[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$Le\\\"}]}]}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$f\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"4:[[\\\"$\\\",\\\"p\\\",null,{\\\"id\\\":\\\"author-layout-params\\\",\\\"children\\\":\\\"{\\\\\\\"author\\\\\\\":\\\\\\\"shu\\\\\\\"}\\\"}],[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]\\n5:E{\\\"digest\\\":\\\"NEXT_HTTP_ERROR_FALLBACK;404\\\"}\\n\"])</script><script>self.__next_f.push([1,\"b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n7:null\\n\"])</script><script>self.__next_f.push([1,\"9:{\\\"metadata\\\":[],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n\"])</script><script>self.__next_f.push([1,\"e:\\\"$9:metadata\\\"\\n\"])</script></body></html>"

  3966 |     const html = await res.text()
  3967 |     expect(html).toInclude('"noindex"')
> 3968 |     expect(html).toInclude('This page could not be found.')
       |                  ^
  3969 |
  3970 |     if (process.env.__NEXT_EXPERIMENTAL_PPR && !isNextDev) {
  3971 |       expect(res.status).toBe(200)

  at Object.toInclude (e2e/app-dir/app-static/app-static.test.ts:3968:18)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts (PPR)

  • parallel-route-not-found > should handle notFound() in generateMetadata on a page that also renders a parallel route
  • parallel-route-not-found > should handle notFound() in a slot
Expand output

● parallel-route-not-found › should handle notFound() in generateMetadata on a page that also renders a parallel route

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

Expected substring: "Custom Not Found!"
Received string:    "404
This page could not be found."

  75 |     // The page's `generateMetadata` function threw a `notFound()` error,
  76 |     // so we should see the not found page.
> 77 |     expect(await browser.elementByCss('body').text()).toContain(
     |                                                       ^
  78 |       'Custom Not Found!'
  79 |     )
  80 |   })

  at Object.toContain (e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts:77:55)

● parallel-route-not-found › should handle notFound() in a slot

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

Expected substring: "Custom Not Found!"
Received string:    "404
This page could not be found."

  85 |     // The page's `generateMetadata` function threw a `notFound()` error,
  86 |     // so we should see the not found page.
> 87 |     expect(await browser.elementByCss('body').text()).toContain(
     |                                                       ^
  88 |       'Custom Not Found!'
  89 |     )
  90 |   })

  at Object.toContain (e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts:87:55)

Read more about building and testing Next.js in contributing.md.

pnpm test-start test/e2e/app-dir/app-css/index.test.ts

  • app dir - css > css support > special entries > should include css imported in client not-found.js
  • app dir - css > css support > special entries > should include css imported in server not-found.js
Expand output

● app dir - css › css support › special entries › should include css imported in client not-found.js

TIMED OUT: rgb(255, 0, 0)

rgb(210, 105, 30)

undefined

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at Object.<anonymous> (e2e/app-dir/app-css/index.test.ts:222:9)

● app dir - css › css support › special entries › should include css imported in server not-found.js

TIMED OUT: rgb(255, 0, 0)

rgb(210, 105, 30)

undefined

  736 |
  737 |   if (hardError) {
> 738 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  739 |   }
  740 |   return false
  741 | }

  at check (lib/next-test-utils.ts:738:11)
  at Object.<anonymous> (e2e/app-dir/app-css/index.test.ts:233:9)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/not-found/basic/index.test.ts (PPR)

  • app dir - not-found - basic > should propagate notFound errors past a segment's error boundary
  • app dir - not-found - basic > with default runtime > should match dynamic route not-found boundary correctly
  • app dir - not-found - basic > with runtime = edge > should match dynamic route not-found boundary correctly
Expand output

● app dir - not-found - basic › should propagate notFound errors past a segment's error boundary

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

Expected: "Not Found (error-boundary/nested)"
Received: "Root Not Found"

  19 |     browser = await next.browser('/error-boundary/nested/nested-2')
  20 |     await browser.elementByCss('button').click()
> 21 |     expect(await browser.elementByCss('h1').text()).toBe(
     |                                                     ^
  22 |       'Not Found (error-boundary/nested)'
  23 |     )
  24 |

  at Object.toBe (e2e/app-dir/not-found/basic/index.test.ts:21:53)

● app dir - not-found - basic › with default runtime › should match dynamic route not-found boundary correctly

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#not-found')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/not-found/basic/index.test.ts:78:38)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/not-found/basic/index.test.ts:78:65)

● app dir - not-found - basic › with runtime = edge › should match dynamic route not-found boundary correctly

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#not-found')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/not-found/basic/index.test.ts:78:38)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/not-found/basic/index.test.ts:78:65)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts (PPR)

  • dynamic-interception-route-revalidate > should refresh the dynamic intercepted route when the interception route is revalidated
Expand output

● dynamic-interception-route-revalidate › should refresh the dynamic intercepted route when the interception route is revalidated

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#result')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at elementByCss (e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts:28:36)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts:27:5)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at text (e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts:28:60)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts:27:5)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/not-found-default/index.test.ts (PPR)

  • app dir - not found with default 404 page > should be able to navigate to page calling not-found
  • app dir - not found with default 404 page > should be able to navigate to page with calling not-found in metadata
  • app dir - not found with default 404 page > should render default not found for group routes if not found is not defined
Expand output

● app dir - not found with default 404 page › should be able to navigate to page calling not-found

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('.next-error-h1')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Object.waitForElementByCss (e2e/app-dir/not-found-default/index.test.ts:68:19)

● app dir - not found with default 404 page › should be able to navigate to page with calling not-found in metadata

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('.next-error-h1')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Object.waitForElementByCss (e2e/app-dir/not-found-default/index.test.ts:80:19)

● app dir - not found with default 404 page › should render default not found for group routes if not found is not defined

page.waitForSelector: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('.group-root-layout')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Object.waitForElementByCss (e2e/app-dir/not-found-default/index.test.ts:96:19)

Read more about building and testing Next.js in contributing.md.

pnpm test-start-turbo test/e2e/app-dir/app-static/app-static-custom-handler.test.ts (turbopack)

  • app-dir static/dynamic handling > should correctly handle statusCode with notFound + ISR
  • app-dir static/dynamic handling > should render not found pages correctly and fallback to the default one
Expand output

● app-dir static/dynamic handling › should correctly handle statusCode with notFound + ISR

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

Expected substring: "This page could not be found"
Received string:    "<!DOCTYPE html><html id=\"__next_error__\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/fb966754e615f068.js\"/><script src=\"/_next/static/chunks/d44463bf3e78b58e.js\" async=\"\"></script><script src=\"/_next/static/chunks/b1776370ca609871.js\" async=\"\"></script><script src=\"/_next/static/chunks/5c729b236046e15d.js\" async=\"\"></script><script src=\"/_next/static/chunks/bc5411f1a5a6469e.js\" async=\"\"></script><script src=\"/_next/static/chunks/da4c3124cd6e0118.js\" async=\"\"></script><script src=\"/_next/static/chunks/6377937a41fb7fd8.js\" async=\"\"></script><script src=\"/_next/static/chunks/c7ba53c8e8025dd9.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><script src=\"/_next/static/chunks/ec548c7ce307cf6d.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><script src=\"/_next/static/chunks/fb966754e615f068.js\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[52896,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n3:I[40925,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n5:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"OutletBoundary\\\"]\\n7:I[30831,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n9:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"ViewportBoundary\\\"]\\nb:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"MetadataBoundary\\\"]\\nc:\\\"$Sreact.suspense\\\"\\ne:I[88012,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"EUjcnQxI5BTWxyiHX2TF-\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"articles\\\",\\\"non-existent\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"articles\\\",{\\\"children\\\":[[\\\"slug\\\",\\\"non-existent\\\",\\\"d\\\"],{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"my static blog\\\"}]}],[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"articles\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"slug\\\",\\\"non-existent\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L4\\\",null,[\\\"$\\\",\\\"$L5\\\",null,{\\\"children\\\":[\\\"$L6\\\",[\\\"$\\\",\\\"$L7\\\",null,{\\\"promise\\\":\\\"$@8\\\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[[\\\"$\\\",\\\"$L9\\\",null,{\\\"children\\\":\\\"$La\\\"}],null],[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$c\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$Ld\\\"}]}]}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$e\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"4:E{\\\"digest\\\":\\\"NEXT_HTTP_ERROR_FALLBACK;404\\\"}\\n\"])</script><script>self.__next_f.push([1,\"a:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n6:null\\n\"])</script><script>self.__next_f.push([1,\"8:{\\\"metadata\\\":[],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n\"])</script><script>self.__next_f.push([1,\"d:\\\"$8:metadata\\\"\\n\"])</script></body></html>"

  2824 |         expect(res.status).toBe(404)
  2825 |       }
> 2826 |       expect(await res.text()).toContain('This page could not be found')
       |                                ^
  2827 |       await waitFor(500)
  2828 |     }
  2829 |   })

  at Object.toContain (e2e/app-dir/app-static/app-static.test.ts:2826:32)

● app-dir static/dynamic handling › should render not found pages correctly and fallback to the default one

expect(received).toInclude(expected)

Expected string to include:
  "This page could not be found."
Received:
  "<!DOCTYPE html><html id=\"__next_error__\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/fb966754e615f068.js\"/><script src=\"/_next/static/chunks/d44463bf3e78b58e.js\" async=\"\"></script><script src=\"/_next/static/chunks/b1776370ca609871.js\" async=\"\"></script><script src=\"/_next/static/chunks/5c729b236046e15d.js\" async=\"\"></script><script src=\"/_next/static/chunks/bc5411f1a5a6469e.js\" async=\"\"></script><script src=\"/_next/static/chunks/da4c3124cd6e0118.js\" async=\"\"></script><script src=\"/_next/static/chunks/6377937a41fb7fd8.js\" async=\"\"></script><script src=\"/_next/static/chunks/c7ba53c8e8025dd9.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><script src=\"/_next/static/chunks/ec548c7ce307cf6d.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$--><!--/$--></div><script src=\"/_next/static/chunks/fb966754e615f068.js\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[52896,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n3:I[40925,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n6:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"OutletBoundary\\\"]\\n8:I[30831,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\na:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"ViewportBoundary\\\"]\\nc:I[33459,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"MetadataBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:I[88012,[\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\"],\\\"default\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"EUjcnQxI5BTWxyiHX2TF-\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"blog\\\",\\\"shu\\\",\\\"hi\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"blog\\\",{\\\"children\\\":[[\\\"author\\\",\\\"shu\\\",\\\"d\\\"],{\\\"children\\\":[[\\\"slug\\\",\\\"hi\\\",\\\"d\\\"],{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/chunks/6377937a41fb7fd8.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/chunks/c7ba53c8e8025dd9.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"my static blog\\\"}]}],[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"blog\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[[\\\"author\\\",\\\"shu\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,\\\"$L4\\\"]}],{\\\"children\\\":[[\\\"slug\\\",\\\"hi\\\",\\\"d\\\"],[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$L5\\\",null,[\\\"$\\\",\\\"$L6\\\",null,{\\\"children\\\":[\\\"$L7\\\",[\\\"$\\\",\\\"$L8\\\",null,{\\\"promise\\\":\\\"$@9\\\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[[\\\"$\\\",\\\"$La\\\",null,{\\\"children\\\":\\\"$Lb\\\"}],null],[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$Le\\\"}]}]}]]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$f\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"4:[[\\\"$\\\",\\\"p\\\",null,{\\\"id\\\":\\\"author-layout-params\\\",\\\"children\\\":\\\"{\\\\\\\"author\\\\\\\":\\\\\\\"shu\\\\\\\"}\\\"}],[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"lazyNotFound\\\":true,\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]\\n5:E{\\\"digest\\\":\\\"NEXT_HTTP_ERROR_FALLBACK;404\\\"}\\n\"])</script><script>self.__next_f.push([1,\"b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n7:null\\n\"])</script><script>self.__next_f.push([1,\"9:{\\\"metadata\\\":[],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n\"])</script><script>self.__next_f.push([1,\"e:\\\"$9:metadata\\\"\\n\"])</script></body></html>"

  3966 |     const html = await res.text()
  3967 |     expect(html).toInclude('"noindex"')
> 3968 |     expect(html).toInclude('This page could not be found.')
       |                  ^
  3969 |
  3970 |     if (process.env.__NEXT_EXPERIMENTAL_PPR && !isNextDev) {
  3971 |       expect(res.status).toBe(200)

  at Object.toInclude (e2e/app-dir/app-static/app-static.test.ts:3968:18)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/app-dir-export/test/trailing-slash-dev.test.ts

  • app dir - with output export - trailing slash dev > development mode > should work in dev with trailingSlash 'false'
  • app dir - with output export - trailing slash dev > development mode > should work in dev with trailingSlash 'true'
Expand output

● app dir - with output export - trailing slash dev › development mode › should work in dev with trailingSlash 'false'

thrown: "Exceeded timeout of 60000 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."

   5 |     'development mode',
   6 |     () => {
>  7 |       it.each([{ trailingSlash: false }, { trailingSlash: true }])(
     |                                                                  ^
   8 |         "should work in dev with trailingSlash '$trailingSlash'",
   9 |         async ({ trailingSlash }) => {
  10 |           await runTests({ isDev: true, trailingSlash })

  at ../node_modules/.pnpm/jest-each@29.7.0/node_modules/jest-each/build/bind.js:47:15
      at Array.forEach (<anonymous>)
  at integration/app-dir-export/test/trailing-slash-dev.test.ts:7:66
  at integration/app-dir-export/test/trailing-slash-dev.test.ts:4:58
  at Object.describe (integration/app-dir-export/test/trailing-slash-dev.test.ts:3:1)

● app dir - with output export - trailing slash dev › development mode › should work in dev with trailingSlash 'true'

Failed to replace content.

Pattern: trailingSlash: true,

Content: /** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
  // distDir: '.next-custom',
  trailingSlash: false,
  generateBuildId() {
    return 'test-build-id'
  },
}

module.exports = nextConfig

  769 |     } else if (typeof pattern === 'string') {
  770 |       if (!currentContent.includes(pattern)) {
> 771 |         throw new Error(
      |               ^
  772 |           `Failed to replace content.\n\nPattern: ${pattern}\n\nContent: ${currentContent}`
  773 |         )
  774 |       }

  at File.replace (lib/next-test-utils.ts:771:15)
  at replace (integration/app-dir-export/test/utils.ts:123:16)
  at integration/app-dir-export/test/trailing-slash-dev.test.ts:10:25

Read more about building and testing Next.js in contributing.md.

pnpm test-dev test/development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts

  • app-dir - owner-stack-invalid-element-type > should catch invalid element from on ssr client component
Expand output

● app-dir - owner-stack-invalid-element-type › should catch invalid element from on ssr client component

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `app-dir - owner-stack-invalid-element-type should catch invalid element from on ssr client component 1`

- Snapshot  -  10
+ Received  + 118

- {
-   "description": "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
+ [
+   {
+     "description": "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.

  Check the render method of `Inner`.",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "app/ssr/page.js (7:10) @ Inner
+     "environmentLabel": null,
+     "label": "Runtime Error",
+     "source": "app/ssr/page.js (7:10) @ Inner
  >  7 |   return <Foo />
       |          ^",
-   "stack": [
-     "Inner app/ssr/page.js (7:10)",
-     "Page app/ssr/page.js (13:7)",
-   ],
- }
+     "stack": [
+       "Inner app/ssr/page.js (7:10)",
+       "Page app/ssr/page.js (13:7)",
+     ],
+   },
+   {
+     "description": "params are being enumerated. `params` should be unwrapped with `React.use()` before using its value. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+   {
+     "description": "The keys of `searchParams` were accessed directly. `searchParams` should be unwrapped with `React.use()` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis",
+     "environmentLabel": null,
+     "label": "Console Error",
+     "source": null,
+     "stack": [
+       "Function.keys <anonymous> (0:0)",
+       "innerSerialize <anonymous> (191:33)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+       "innerSerialize <anonymous> (201:32)",
+       "serialize <anonymous> (129:12)",
+     ],
+   },
+ ]

  52 |     const browser = await next.browser('/ssr')
  53 |
> 54 |     await expect(browser).toDisplayRedbox(`
     |                           ^
  55 |      {
  56 |        "description": "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
  57 | 

  at Object.toDisplayRedbox (development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts:54:27)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/metadata-streaming/metadata-streaming.test.ts (PPR)

  • app-dir - metadata-streaming > navigation API > should trigger not-found boundary when call notFound
  • app-dir - metadata-streaming > navigation API > should trigger custom not-found in the boundary
Expand output

● app-dir - metadata-streaming › navigation API › should trigger not-found boundary when call notFound

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('h1')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at elementByCss (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:114:30)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:113:7)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at text (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:114:49)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:113:7)

● app-dir - metadata-streaming › navigation API › should trigger custom not-found in the boundary

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('h1')

  454 |   waitForElementByCss(selector: string, timeout = 10_000) {
  455 |     return this.startChain(async () => {
> 456 |       const el = await page.waitForSelector(selector, {
      |                             ^
  457 |         timeout,
  458 |         state: 'attached',
  459 |       })

  at waitForSelector (lib/browsers/playwright.ts:456:29)
  at Playwright._chain (lib/browsers/playwright.ts:568:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:549:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:455:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:375:17)
  at Object.elementByCss (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:127:28)
  at Proxy._chain (lib/browsers/playwright.ts:568:23)
  at Proxy._chain (lib/browsers/playwright.ts:544:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:387:17)
  at Object.text (e2e/app-dir/metadata-streaming/metadata-streaming.test.ts:127:47)

Read more about building and testing Next.js in contributing.md.

@ijjk
Copy link
Member

ijjk commented Jun 16, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
buildDuration 23.6s 1m 8.6s ⚠️ +45s
buildDurationCached 14.7s 12.7s N/A
nodeModulesSize 433 MB 433 MB N/A
nextStartRea..uration (ms) 366ms 386ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
194b18f3-HASH.js gzip 53.7 kB 53.7 kB N/A
2192.HASH.js gzip 169 B 169 B
4719-HASH.js gzip 5.47 kB 5.44 kB N/A
6236-HASH.js gzip 44.4 kB 45.1 kB ⚠️ +680 B
framework-HASH.js gzip 57.4 kB 57.4 kB N/A
main-app-HASH.js gzip 252 B 256 B N/A
main-HASH.js gzip 33.5 kB 33.5 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 44.5 kB 45.2 kB ⚠️ +680 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization 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 06-16-wip_not-found_optimization Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 182 B 182 B
amp-HASH.js gzip 501 B 500 B N/A
css-HASH.js gzip 335 B 333 B N/A
dynamic-HASH.js gzip 1.83 kB 1.83 kB N/A
edge-ssr-HASH.js gzip 256 B 255 B N/A
head-HASH.js gzip 350 B 351 B N/A
hooks-HASH.js gzip 382 B 382 B
image-HASH.js gzip 4.68 kB 4.66 kB N/A
index-HASH.js gzip 259 B 259 B
link-HASH.js gzip 2.52 kB 2.52 kB N/A
routerDirect..HASH.js gzip 319 B 316 B N/A
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 316 B 315 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.51 kB 1.51 kB
Client Build Manifests
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
_buildManifest.js gzip 752 B 752 B
Overall change 752 B 752 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
index.html gzip 529 B 530 B N/A
link.html gzip 543 B 543 B
withRouter.html gzip 524 B 526 B N/A
Overall change 543 B 543 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
edge-ssr.js gzip 140 kB 139 kB N/A
page.js gzip 232 kB 227 kB N/A
Overall change 0 B 0 B
Middleware size Overall increase ⚠️
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
middleware-b..fest.js gzip 678 B 675 B N/A
middleware-r..fest.js gzip 155 B 157 B N/A
middleware.js gzip 32.3 kB 32.6 kB ⚠️ +282 B
edge-runtime..pack.js gzip 853 B 853 B
Overall change 33.2 kB 33.5 kB ⚠️ +282 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
app-page-exp...dev.js gzip 275 kB 275 kB ⚠️ +156 B
app-page-exp..prod.js gzip 158 kB 158 kB N/A
app-page-tur...dev.js gzip 275 kB 275 kB ⚠️ +147 B
app-page-tur..prod.js gzip 158 kB 158 kB N/A
app-page-tur...dev.js gzip 267 kB 267 kB ⚠️ +147 B
app-page-tur..prod.js gzip 154 kB 154 kB N/A
app-page.run...dev.js gzip 267 kB 267 kB ⚠️ +144 B
app-page.run..prod.js gzip 154 kB 154 kB N/A
app-route-ex...dev.js gzip 69.8 kB 69.9 kB N/A
app-route-ex..prod.js gzip 48.1 kB 48.2 kB N/A
app-route-tu...dev.js gzip 69.9 kB 69.9 kB N/A
app-route-tu..prod.js gzip 48.1 kB 48.2 kB N/A
app-route-tu...dev.js gzip 69.3 kB 69.3 kB N/A
app-route-tu..prod.js gzip 47.8 kB 47.8 kB N/A
app-route.ru...dev.js gzip 69.2 kB 69.3 kB N/A
app-route.ru..prod.js gzip 47.8 kB 47.8 kB N/A
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 43.6 kB 43.6 kB N/A
pages-api-tu..prod.js gzip 32.6 kB 32.6 kB N/A
pages-api.ru...dev.js gzip 43.6 kB 43.6 kB N/A
pages-api.ru..prod.js gzip 32.6 kB 32.6 kB N/A
pages-turbo....dev.js gzip 53.4 kB 53.5 kB N/A
pages-turbo...prod.js gzip 39.7 kB 39.7 kB N/A
pages.runtim...dev.js gzip 53.6 kB 53.6 kB N/A
pages.runtim..prod.js gzip 39.8 kB 39.9 kB N/A
server.runti..prod.js gzip 64.3 kB 64.3 kB N/A
Overall change 1.08 MB 1.08 MB ⚠️ +594 B
build cache
vercel/next.js canary vercel/next.js 06-16-wip_not-found_optimization Change
0.pack gzip 3.91 MB 3.91 MB N/A
index.pack gzip 92.1 kB 90.8 kB N/A
Overall change 0 B 0 B
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,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 1586: /***/ (
+    /***/ 2628: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/css",
         function () {
-          return __webpack_require__(4362);
+          return __webpack_require__(8707);
         },
       ]);
       if (false) {
@@ -18,14 +18,7 @@
       /***/
     },
 
-    /***/ 4350: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
-
-    /***/ 4362: /***/ (
+    /***/ 8707: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -39,7 +32,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4350);
+        __webpack_require__(9080);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -58,13 +51,20 @@
 
       /***/
     },
+
+    /***/ 9080: /***/ (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__(1586)
+      __webpack_exec__(2628)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,17 +1,117 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 283: /***/ (
+    /***/ 2001: /***/ (
+      __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__(5640);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(9553);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+        () =>
+          __webpack_require__
+            .e(/* import() */ 8042)
+            .then(__webpack_require__.bind(__webpack_require__, 8042))
+            .then((mod) => mod.Hello),
+        {
+          loadableGenerated: {
+            webpack: () => [/*require.resolve*/ 8042],
+          },
+        }
+      );
+      const Page = () =>
+        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+          {
+            children: [
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+                children: "testing next/dynamic size",
+              }),
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+                DynamicHello,
+                {}
+              ),
+            ],
+          }
+        );
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+
+      /***/
+    },
+
+    /***/ 2976: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(2001);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7807: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      "use strict";
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "LoadableContext", {
+        enumerable: true,
+        get: function () {
+          return LoadableContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(148)
+      );
+      const LoadableContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 9553: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(6990);
+      module.exports = __webpack_require__(9986);
 
       /***/
     },
 
-    /***/ 505: /***/ (
+    /***/ 9829: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -53,7 +153,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(148)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(6179);
+      const _loadablecontextsharedruntime = __webpack_require__(7807);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -288,90 +388,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 5703: /***/ (
-      __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__(5640);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(283);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
-        () =>
-          __webpack_require__
-            .e(/* import() */ 2192)
-            .then(__webpack_require__.bind(__webpack_require__, 2192))
-            .then((mod) => mod.Hello),
-        {
-          loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 2192],
-          },
-        }
-      );
-      const Page = () =>
-        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
-          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
-          {
-            children: [
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
-                children: "testing next/dynamic size",
-              }),
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-                DynamicHello,
-                {}
-              ),
-            ],
-          }
-        );
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
-
-      /***/
-    },
-
-    /***/ 6179: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-      /* __next_internal_client_entry_do_not_use__  cjs */
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "LoadableContext", {
-        enumerable: true,
-        get: function () {
-          return LoadableContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(148)
-      );
-      const LoadableContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
-
-      /***/
-    },
-
-    /***/ 6990: /***/ (module, exports, __webpack_require__) => {
+    /***/ 9986: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -404,7 +421,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
         __webpack_require__(148)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(505)
+        __webpack_require__(9829)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -504,30 +521,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 
       /***/
     },
-
-    /***/ 9254: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(5703);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9254)
+      __webpack_exec__(2976)
     );
     /******/ 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],
   {
-    /***/ 1664: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(6130);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 6130: /***/ (
+    /***/ 4756: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 5426: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(4756);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1664)
+      __webpack_exec__(5426)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2983],
   {
-    /***/ 2198: /***/ (
+    /***/ 264: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/image",
         function () {
-          return __webpack_require__(3444);
+          return __webpack_require__(3594);
         },
       ]);
       if (false) {
@@ -18,7 +18,190 @@
       /***/
     },
 
-    /***/ 2514: /***/ (
+    /***/ 1206: /***/ (__unused_webpack_module, exports) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "default", {
+        enumerable: true,
+        get: function () {
+          return _default;
+        },
+      });
+      const DEFAULT_Q = 75;
+      function defaultLoader(param) {
+        let { config, src, width, quality } = param;
+        var _config_qualities;
+        if (false) {
+        }
+        const q =
+          quality ||
+          ((_config_qualities = config.qualities) == null
+            ? void 0
+            : _config_qualities.reduce((prev, cur) =>
+                Math.abs(cur - DEFAULT_Q) < Math.abs(prev - DEFAULT_Q)
+                  ? cur
+                  : prev
+              )) ||
+          DEFAULT_Q;
+        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
+
+      /***/
+    },
+
+    /***/ 1765: /***/ (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__(148);
+      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 (e.g. 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
+
+      /***/
+    },
+
+    /***/ 3353: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5526);
+
+      /***/
+    },
+
+    /***/ 3594: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      // ESM COMPAT FLAG
+      __webpack_require__.r(__webpack_exports__);
+
+      // EXPORTS
+      __webpack_require__.d(__webpack_exports__, {
+        __N_SSP: () => /* binding */ __N_SSP,
+        default: () => /* binding */ pages_image,
+      });
+
+      // EXTERNAL MODULE: ./node_modules/.pnpm/react@19.1.0/node_modules/react/jsx-runtime.js
+      var jsx_runtime = __webpack_require__(5640);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/image.js
+      var next_image = __webpack_require__(3353);
+      var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
+      /* harmony default export */ const nextjs = {
+        src: "/_next/static/media/nextjs.cae0b805.png",
+        height: 1347,
+        width: 1626,
+        blurDataURL:
+          "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAMAAAACh/xsAAAAD1BMVEX////x8fH6+vrb29vo6Oh8o70bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAH0lEQVR4nGNgwARMjIyMjCAGCzMzMwsTRISJCcRABwAEcAAkLCQfgAAAAABJRU5ErkJggg==",
+        blurWidth: 8,
+        blurHeight: 7,
+      }; // ./pages/image.js
+      function ImagePage(props) {
+        return /*#__PURE__*/ (0, jsx_runtime.jsxs)(jsx_runtime.Fragment, {
+          children: [
+            /*#__PURE__*/ (0, jsx_runtime.jsx)("h1", {
+              children: "next/image example",
+            }),
+            /*#__PURE__*/ (0, jsx_runtime.jsx)(image_default(), {
+              src: nextjs,
+              placeholder: "blur",
+            }),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const pages_image = ImagePage;
+
+      /***/
+    },
+
+    /***/ 3854: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -34,9 +217,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(5127);
-      const _imageblursvg = __webpack_require__(4287);
-      const _imageconfig = __webpack_require__(2795);
+      const _warnonce = __webpack_require__(3603);
+      const _imageblursvg = __webpack_require__(7835);
+      const _imageconfig = __webpack_require__(6799);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -463,55 +646,69 @@
       /***/
     },
 
-    /***/ 3444: /***/ (
+    /***/ 5526: /***/ (
       __unused_webpack_module,
-      __webpack_exports__,
+      exports,
       __webpack_require__
     ) => {
       "use strict";
-      // ESM COMPAT FLAG
-      __webpack_require__.r(__webpack_exports__);
 
-      // EXPORTS
-      __webpack_require__.d(__webpack_exports__, {
-        __N_SSP: () => /* binding */ __N_SSP,
-        default: () => /* binding */ pages_image,
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
       });
-
-      // EXTERNAL MODULE: ./node_modules/.pnpm/react@19.1.0/node_modules/react/jsx-runtime.js
-      var jsx_runtime = __webpack_require__(5640);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/image.js
-      var next_image = __webpack_require__(6359);
-      var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
-      /* harmony default export */ const nextjs = {
-        src: "/_next/static/media/nextjs.cae0b805.png",
-        height: 1347,
-        width: 1626,
-        blurDataURL:
-          "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAMAAAACh/xsAAAAD1BMVEX////x8fH6+vrb29vo6Oh8o70bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAH0lEQVR4nGNgwARMjIyMjCAGCzMzMwsTRISJCcRABwAEcAAkLCQfgAAAAABJRU5ErkJggg==",
-        blurWidth: 8,
-        blurHeight: 7,
-      }; // ./pages/image.js
-      function ImagePage(props) {
-        return /*#__PURE__*/ (0, jsx_runtime.jsxs)(jsx_runtime.Fragment, {
-          children: [
-            /*#__PURE__*/ (0, jsx_runtime.jsx)("h1", {
-              children: "next/image example",
-            }),
-            /*#__PURE__*/ (0, jsx_runtime.jsx)(image_default(), {
-              src: nextjs,
-              placeholder: "blur",
-            }),
-          ],
+      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;
+        },
+        getImageProps: function () {
+          return getImageProps;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _getimgprops = __webpack_require__(3854);
+      const _imagecomponent = __webpack_require__(8350);
+      const _imageloader = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1206)
+      );
+      function getImageProps(imgProps) {
+        const { props } = (0, _getimgprops.getImgProps)(imgProps, {
+          defaultLoader: _imageloader.default,
+          // This is replaced by webpack define plugin
+          imgConf: {
+            deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+            imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
+            path: "/_next/image",
+            loader: "default",
+            dangerouslyAllowSVG: false,
+            unoptimized: false,
+          },
         });
+        // Normally we don't care about undefined props because we pass to JSX,
+        // but this exported function could be used by the end user for anything
+        // so we delete undefined props to clean it up a little.
+        for (const [key, value] of Object.entries(props)) {
+          if (value === undefined) {
+            delete props[key];
+          }
+        }
+        return {
+          props,
+        };
       }
-      var __N_SSP = true;
-      /* harmony default export */ const pages_image = ImagePage;
+      const _default = _imagecomponent.Image; //# sourceMappingURL=image-external.js.map
 
       /***/
     },
 
-    /***/ 4287: /***/ (__unused_webpack_module, exports) => {
+    /***/ 7835: /***/ (__unused_webpack_module, exports) => {
       "use strict";
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
@@ -566,85 +763,7 @@
       /***/
     },
 
-    /***/ 4985: /***/ (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__(148);
-      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 (e.g. 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
-
-      /***/
-    },
-
-    /***/ 5898: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8350: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -666,17 +785,17 @@
         __webpack_require__(7897)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5207)
+        __webpack_require__(8843)
       );
-      const _getimgprops = __webpack_require__(2514);
-      const _imageconfig = __webpack_require__(2795);
-      const _imageconfigcontextsharedruntime = __webpack_require__(2349);
-      const _warnonce = __webpack_require__(5127);
-      const _routercontextsharedruntime = __webpack_require__(3556);
+      const _getimgprops = __webpack_require__(3854);
+      const _imageconfig = __webpack_require__(6799);
+      const _imageconfigcontextsharedruntime = __webpack_require__(3905);
+      const _warnonce = __webpack_require__(3603);
+      const _routercontextsharedruntime = __webpack_require__(6712);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5970)
+        __webpack_require__(1206)
       );
-      const _usemergedref = __webpack_require__(4985);
+      const _usemergedref = __webpack_require__(1765);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -1001,132 +1120,13 @@
 
       /***/
     },
-
-    /***/ 5970: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return _default;
-        },
-      });
-      const DEFAULT_Q = 75;
-      function defaultLoader(param) {
-        let { config, src, width, quality } = param;
-        var _config_qualities;
-        if (false) {
-        }
-        const q =
-          quality ||
-          ((_config_qualities = config.qualities) == null
-            ? void 0
-            : _config_qualities.reduce((prev, cur) =>
-                Math.abs(cur - DEFAULT_Q) < Math.abs(prev - DEFAULT_Q)
-                  ? cur
-                  : prev
-              )) ||
-          DEFAULT_Q;
-        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
-
-      /***/
-    },
-
-    /***/ 6359: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(8986);
-
-      /***/
-    },
-
-    /***/ 8986: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-
-      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;
-        },
-        getImageProps: function () {
-          return getImageProps;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _getimgprops = __webpack_require__(2514);
-      const _imagecomponent = __webpack_require__(5898);
-      const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5970)
-      );
-      function getImageProps(imgProps) {
-        const { props } = (0, _getimgprops.getImgProps)(imgProps, {
-          defaultLoader: _imageloader.default,
-          // This is replaced by webpack define plugin
-          imgConf: {
-            deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
-            imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
-            path: "/_next/image",
-            loader: "default",
-            dangerouslyAllowSVG: false,
-            unoptimized: false,
-          },
-        });
-        // Normally we don't care about undefined props because we pass to JSX,
-        // but this exported function could be used by the end user for anything
-        // so we delete undefined props to clean it up a little.
-        for (const [key, value] of Object.entries(props)) {
-          if (value === undefined) {
-            delete props[key];
-          }
-        }
-        return {
-          props,
-        };
-      }
-      const _default = _imagecomponent.Image; //# sourceMappingURL=image-external.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2198)
+      __webpack_exec__(264)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for index-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 9418: /***/ (
+    /***/ 8230: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(8696);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8696: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -19,30 +36,13 @@
 
       /***/
     },
-
-    /***/ 9532: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(9418);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9532)
+      __webpack_exec__(8230)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,125 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 1854: /***/ (
-      __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__(5640);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(8770);
-      /* 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;
-
-      /***/
-    },
-
-    /***/ 3199: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
-        },
-      });
-      let errorOnce = (_) => {};
-      if (false) {
-      } //# sourceMappingURL=error-once.js.map
-
-      /***/
-    },
-
-    /***/ 3568: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(1854);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 3857: /***/ (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__(4869);
-      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
-
-      /***/
-    },
-
-    /***/ 3947: /***/ (module, exports, __webpack_require__) => {
+    /***/ 591: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -146,17 +28,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(148)
       );
-      const _resolvehref = __webpack_require__(3161);
-      const _islocalurl = __webpack_require__(2309);
-      const _formaturl = __webpack_require__(3768);
-      const _utils = __webpack_require__(5554);
-      const _addlocale = __webpack_require__(7591);
-      const _routercontextsharedruntime = __webpack_require__(3556);
-      const _useintersection = __webpack_require__(5624);
-      const _getdomainlocale = __webpack_require__(3857);
-      const _addbasepath = __webpack_require__(4356);
-      const _usemergedref = __webpack_require__(4985);
-      const _erroronce = __webpack_require__(3199);
+      const _resolvehref = __webpack_require__(5837);
+      const _islocalurl = __webpack_require__(5953);
+      const _formaturl = __webpack_require__(6212);
+      const _utils = __webpack_require__(6950);
+      const _addlocale = __webpack_require__(6467);
+      const _routercontextsharedruntime = __webpack_require__(6712);
+      const _useintersection = __webpack_require__(9692);
+      const _getdomainlocale = __webpack_require__(6850);
+      const _addbasepath = __webpack_require__(4928);
+      const _usemergedref = __webpack_require__(1765);
+      const _erroronce = __webpack_require__(8659);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -545,7 +427,17 @@
       /***/
     },
 
-    /***/ 4985: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1148: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(591);
+
+      /***/
+    },
+
+    /***/ 1765: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -623,7 +515,125 @@
       /***/
     },
 
-    /***/ 5624: /***/ (module, exports, __webpack_require__) => {
+    /***/ 5436: /***/ (
+      __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__(5640);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(1148);
+      /* 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;
+
+      /***/
+    },
+
+    /***/ 6850: /***/ (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__(6457);
+      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
+
+      /***/
+    },
+
+    /***/ 8659: /***/ (__unused_webpack_module, exports) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "errorOnce", {
+        enumerable: true,
+        get: function () {
+          return errorOnce;
+        },
+      });
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
+
+      /***/
+    },
+
+    /***/ 9666: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(5436);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9692: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -636,7 +646,7 @@
         },
       });
       const _react = __webpack_require__(148);
-      const _requestidlecallback = __webpack_require__(3543);
+      const _requestidlecallback = __webpack_require__(315);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -748,23 +758,13 @@
 
       /***/
     },
-
-    /***/ 8770: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(3947);
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3568)
+      __webpack_exec__(9666)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 3618: /***/ (
+    /***/ 76: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4631);
+        __webpack_require__(9413);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -36,17 +36,7 @@
       /***/
     },
 
-    /***/ 4631: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7086);
-
-      /***/
-    },
-
-    /***/ 7824: /***/ (
+    /***/ 1810: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -54,7 +44,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/routerDirect",
         function () {
-          return __webpack_require__(3618);
+          return __webpack_require__(76);
         },
       ]);
       if (false) {
@@ -62,13 +52,23 @@
 
       /***/
     },
+
+    /***/ 9413: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5282);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(7824)
+      __webpack_exec__(1810)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,24 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 1984: /***/ (
-      __unused_webpack_module,
+    /***/ 2227: /***/ (
+      module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(5769);
-        },
-      ]);
-      if (false) {
-      }
+      module.exports = __webpack_require__(5984);
 
       /***/
     },
 
-    /***/ 5769: /***/ (
+    /***/ 3043: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(8293);
+        __webpack_require__(2227);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -66,12 +59,19 @@
       /***/
     },
 
-    /***/ 8293: /***/ (
-      module,
+    /***/ 3642: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(900);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(3043);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -81,7 +81,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1984)
+      __webpack_exec__(3642)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 4631: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7086);
-
-      /***/
-    },
-
-    /***/ 9216: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(9803);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 9803: /***/ (
+    /***/ 1089: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4631);
+        __webpack_require__(9413);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
 
       /***/
     },
+
+    /***/ 3962: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(1089);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9413: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5282);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9216)
+      __webpack_exec__(3962)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 4719-HASH.js

Diff too large to display

Diff for 6236-HASH.js

Diff too large to display

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],
   {
-    /***/ 3505: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
-
-    /***/ 4268: /***/ (
+    /***/ 2576: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8790, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5356, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7382, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4304, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9442, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3152, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 94, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9464, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 693, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1675, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2439, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7601, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5083, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2553, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8103, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1925, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5625, 23)
+        __webpack_require__.t.bind(__webpack_require__, 959, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4247, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9389, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5602, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8628, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5223)
+        __webpack_require__.bind(__webpack_require__, 8685)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 227, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3077, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6734, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7812, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4120, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5774, 23)
       );
 
       /***/
     },
+
+    /***/ 3579: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [1305, 6236],
-      () => (__webpack_exec__(9679), __webpack_exec__(4268))
+      [9910, 4860],
+      () => (__webpack_exec__(1389), __webpack_exec__(2576))
     );
     /******/ 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
failed to diff
Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..time.prod.js
failed to diff
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

Diff for app-route-ex..ntime.dev.js

Diff too large to display

Diff for app-route-ex..time.prod.js

Diff too large to display

Diff for app-route-tu..ntime.dev.js

Diff too large to display

Diff for app-route-tu..time.prod.js

Diff too large to display

Diff for app-route-tu..ntime.dev.js

Diff too large to display

Diff for app-route-tu..time.prod.js

Diff too large to display

Diff for app-route.runtime.dev.js

Diff too large to display

Diff for app-route.ru..time.prod.js

Diff too large to display

Diff for pages-api-tu..ntime.dev.js

Diff too large to display

Diff for pages-api-tu..time.prod.js

Diff too large to display

Diff for pages-api.runtime.dev.js

Diff too large to display

Diff for pages-api.ru..time.prod.js

Diff too large to display

Diff for pages-turbo...ntime.dev.js

Diff too large to display

Diff for pages-turbo...time.prod.js

Diff too large to display

Diff for pages.runtime.dev.js

Diff too large to display

Diff for pages.runtime.prod.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: ddf893f

@gaojude gaojude closed this Jul 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants