Skip to content

[devtools] panel ui issues tab #80539

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

Draft
wants to merge 3 commits into
base: jiwon/06-16-_devtools_port_runtime_error_handling_to_hook
Choose a base branch
from

Conversation

devjiwonchoi
Copy link
Member

@devjiwonchoi devjiwonchoi commented Jun 14, 2025

Closes NEXT-4531

@devjiwonchoi devjiwonchoi changed the base branch from jiwon/06-14-_devtools_panel_ui_settings_tab to graphite-base/80539 June 15, 2025 16:28
@devjiwonchoi devjiwonchoi force-pushed the graphite-base/80539 branch from 7d42ecb to af1b940 Compare June 15, 2025 16:28
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 1948d4f to 53a501a Compare June 15, 2025 16:28
@devjiwonchoi devjiwonchoi changed the base branch from graphite-base/80539 to jiwon/06-15-_devtools_fork_call_stack June 15, 2025 16:29
@ijjk
Copy link
Member

ijjk commented Jun 15, 2025

Failing test suites

Commit: 73925ee

pnpm test test/integration/catches-missing-getStaticProps/test/index.test.js (turbopack)

  • Catches Missing getStaticProps > development mode > should catch it in development mode
Expand output

● Catches Missing getStaticProps › development mode › should catch it in development mode

expect(received).toMatch(expected)

Expected pattern: /getStaticPaths was added without a getStaticProps in/
Received string:  "Internal Server Error"

  23 |         await killApp(app)
  24 |
> 25 |         expect(html).toMatch(errorRegex)
     |                      ^
  26 |       })
  27 |     }
  28 |   )

  at Object.toMatch (integration/catches-missing-getStaticProps/test/index.test.js:25:22)

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

pnpm test test/integration/404-page-custom-error/test/index.test.js (turbopack)

  • Default 404 Page with custom _error > development mode > should render error correctly
Expand output

● Default 404 Page with custom _error › development mode › should render error correctly

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

Expected substring: "oops"
Received string:    "Internal Server Error"

  30 |   it('should render error correctly', async () => {
  31 |     const text = await renderViaHTTP(appPort, '/err')
> 32 |     expect(text).toContain(isDev ? 'oops' : 'Internal Server Error')
     |                  ^
  33 |   })
  34 |
  35 |   it('should render index page normal', async () => {

  at Object.toContain (integration/404-page-custom-error/test/index.test.js:32:18)

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

pnpm test test/integration/conflicting-public-file-page/test/index.test.js

  • Errors on conflict between public file and page file > development mode > Throws error during development
Expand output

● Errors on conflict between public file and page file › development mode › Throws error during development

expect(received).toMatch(expected)

Expected pattern: /A conflicting public file and page file was found for path/
Received string:  "Internal Server Error"

  34 |         for (const conflict of conflicts) {
  35 |           const html = await renderViaHTTP(appPort, conflict)
> 36 |           expect(html).toMatch(regex)
     |                        ^
  37 |         }
  38 |
  39 |         expect(output).toMatch(regex)

  at Object.toMatch (integration/conflicting-public-file-page/test/index.test.js:36:24)

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

pnpm test-dev-turbo test/development/app-dir/build-error-logs/build-error-logs.test.ts (turbopack)

  • build-error-logs > should only log error a single time
Expand output

● build-error-logs › should only log error a single time

expect(received).toHaveLength(expected)

Expected length: 1
Received length: 2
Received array:  ["Module not found: Can't resolve '@/lib/data'", "Module not found: Can't resolve '@/lib/data'"]

  18 |
  19 |     if (isTurbopack) {
> 20 |       expect(moduleNotFoundLogs).toHaveLength(1)
     |                                  ^
  21 |     } else {
  22 |       // FIXME: next with webpack still logs the same error too many times
  23 |       expect(moduleNotFoundLogs).toHaveLength(3)

  at Object.toHaveLength (development/app-dir/build-error-logs/build-error-logs.test.ts:20:34)

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

pnpm test test/integration/404-page-ssg/test/index.test.js (turbopack)

  • 404 Page Support SSG > development mode > should render error correctly
Expand output

● 404 Page Support SSG › development mode › should render error correctly

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

Expected substring: "oops"
Received string:    "Internal Server Error"

  32 |   it('should render error correctly', async () => {
  33 |     const text = await renderViaHTTP(appPort, '/err')
> 34 |     expect(text).toContain(isDev ? 'oops' : 'Internal Server Error')
     |                  ^
  35 |   })
  36 |
  37 |   it('should not show an error in the logs for 404 SSG', async () => {

  at Object.toContain (integration/404-page-ssg/test/index.test.js:34:18)

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

pnpm test-dev-turbo test/development/next-font/font-loader-in-document-error.test.ts (turbopack)

  • font-loader-in-document-error > next/font inside _document
Expand output

● font-loader-in-document-error › next/font inside _document

Expected Redbox but found no visible one.

  19 |   test('next/font inside _document', async () => {
  20 |     const browser = await webdriver(next.url, '/')
> 21 |     await assertHasRedbox(browser)
     |     ^
  22 |     if (process.env.IS_TURBOPACK_TEST) {
  23 |       // TODO: Turbopack doesn't include pages/
  24 |       expect(await getRedboxSource(browser)).toMatchInlineSnapshot(`

  at Object.<anonymous> (development/next-font/font-loader-in-document-error.test.ts:21:5)

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

pnpm test test/integration/custom-error/test/index.test.js (turbopack)

  • Custom _error > development mode 1 > should not warn with /_error and /404 when rendering error first
Expand output

● Custom _error › development mode 1 › should not warn with /_error and /404 when rendering error first

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

Expected substring: "Unexpected eof"
Received string:    "Internal Server Error"

  42 |           // retry because the page might not be built yet
  43 |           const html = await renderViaHTTP(appPort, '/404')
> 44 |           expect(html).toContain('Unexpected eof')
     |                        ^
  45 |           expect(stderr).not.toMatch(customErrNo404Match)
  46 |         })
  47 |       } finally {

  at toContain (integration/custom-error/test/index.test.js:44:24)
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/custom-error/test/index.test.js:41:9)

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

pnpm test test/integration/next-image-new/export-config/test/index.test.ts (turbopack)

  • next/image with output export config > development mode > should error
Expand output

● next/image with output export config › development mode › should error

Expected Redbox but found no visible one.

  36 |         const msg =
  37 |           "Image Optimization using the default loader is not compatible with `{ output: 'export' }`."
> 38 |         await assertHasRedbox(browser)
     |         ^
  39 |         expect(await getRedboxHeader(browser)).toContain(msg)
  40 |         expect(stderr).toContain(msg)
  41 |       })

  at Object.<anonymous> (integration/next-image-new/export-config/test/index.test.ts:38:9)

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

pnpm test test/integration/no-override-next-props/test/index.test.js (turbopack)

  • Dynamic require > should show error when a Next prop is returned in _app.getInitialProps
Expand output

● Dynamic require › should show error when a Next prop is returned in _app.getInitialProps

expect(received).toMatch(expected)

Expected pattern: /\/cant-override-next-props/
Received string:  "Internal Server Error"

  16 |   it('should show error when a Next prop is returned in _app.getInitialProps', async () => {
  17 |     const html = await renderViaHTTP(appPort, '/')
> 18 |     expect(html).toMatch(/\/cant-override-next-props/)
     |                  ^
  19 |   })
  20 | })
  21 |

  at Object.toMatch (integration/no-override-next-props/test/index.test.js:18:18)

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

pnpm test-dev-turbo test/development/acceptance/ReactRefreshLogBox-builtins.test.ts (turbopack)

  • ReactRefreshLogBox > Module not found (missing global CSS)
Expand output

● ReactRefreshLogBox › Module not found (missing global CSS)

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox Module not found (missing global CSS) 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Module not found: Can't resolve './non-existent.css'",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./pages/_app.js (1:1)
- Module not found: Can't resolve './non-existent.css'
- > 1 | import './non-existent.css'
-     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  197 |
  198 |     if (isTurbopack) {
> 199 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  200 |        {
  201 |          "description": "Module not found: Can't resolve './non-existent.css'",
  202 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance/ReactRefreshLogBox-builtins.test.ts:199:29)

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 Redbox but found no visible one.

  30 |     })
  31 |
> 32 |     await assertHasRedbox(browser)
     |     ^
  33 |
  34 |     await next.patchFile('app/comp.client.js', clientComponentSource)
  35 |

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

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

pnpm test-dev test/e2e/app-dir/dedupe-rsc-error-log/dedupe-rsc-error-log.test.ts

  • dedupe-rsc-error-log > should only log SSR error once for edge runtime
Expand output

● dedupe-rsc-error-log › should only log SSR error once for edge runtime

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

Expected: 2
Received: 1

   6 |   await retry(() => {
   7 |     const parts = next.cliOutput.split(search)
>  8 |     expect(parts.length).toBe(2)
     |                          ^
   9 |   })
  10 | }
  11 |

  at toBe (e2e/app-dir/dedupe-rsc-error-log/dedupe-rsc-error-log.test.ts:8:26)
  at fn (lib/next-test-utils.ts:811:20)
  at expectContainOnce (e2e/app-dir/dedupe-rsc-error-log/dedupe-rsc-error-log.test.ts:6:3)
  at Object.<anonymous> (e2e/app-dir/dedupe-rsc-error-log/dedupe-rsc-error-log.test.ts:36:5)

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

pnpm test-dev test/development/app-dir/error-overlay/error-ignored-frames/error-ignored-frames.test.ts

  • error-ignored-frames > should be able to collapse pages router ignored frames
Expand output

● error-ignored-frames › should be able to collapse pages router ignored frames

Expected Redbox but found no visible one.

  76 |   it('should be able to collapse pages router ignored frames', async () => {
  77 |     const browser = await next.browser('/pages')
> 78 |     await assertHasRedbox(browser)
     |     ^
  79 |
  80 |     const defaultStack = await getStackFramesContent(browser)
  81 |     expect(defaultStack).toMatchInlineSnapshot(

  at Object.<anonymous> (development/app-dir/error-overlay/error-ignored-frames/error-ignored-frames.test.ts:78:5)

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

pnpm test-dev-turbo test/development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts (turbopack)

  • Dynamic IO Dev Errors > should clear segment errors after correcting them
Expand output

● Dynamic IO Dev Errors › should clear segment errors after correcting them

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Dynamic IO Dev Errors should clear segment errors after correcting them 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Ecmascript file had an error",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./app/page.tsx (1:14)
- Ecmascript file had an error
- > 1 | export const revalidate = 10
-     |              ^^^^^^^^^^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  137 |     const { browser, session } = sandbox
  138 |     if (isTurbopack) {
> 139 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  140 |          {
  141 |            "description": "Ecmascript file had an error",
  142 |            "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts:139:29)

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

pnpm test-dev test/development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts

  • app-dir - server-component-next-dynamic-ssr-false > should error when use dynamic ssr:false in server component
Expand output

● app-dir - server-component-next-dynamic-ssr-false › should error when use dynamic ssr:false in server component

Expected Redbox but found no visible one.

  13 |   it('should error when use dynamic ssr:false in server component', async () => {
  14 |     const browser = await next.browser('/')
> 15 |     await assertHasRedbox(browser)
     |     ^
  16 |     const redbox = {
  17 |       description: await getRedboxDescription(browser),
  18 |       source: await getRedboxSource(browser),

  at Object.<anonymous> (development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts:15:5)

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

pnpm test-dev test/development/basic/hmr/full-reload-no-base-path-no-asset-prefix.test.ts

  • HMR - Full Reload, nextConfig: {"basePath":"","assetPrefix":""} > should warn about full reload in cli output - runtime-error
Expand output

● HMR - Full Reload, nextConfig: {"basePath":"","assetPrefix":""} › should warn about full reload in cli output - runtime-error

expect(received).toMatch(expected)

Matcher error: received value must be a string

Received has value: null

  61 |
  62 |     await retry(async () => {
> 63 |       expect(await getRedboxHeader(browser)).toMatch(/whoops is not defined/)
     |                                              ^
  64 |     })
  65 |     expect(next.cliOutput.slice(start)).not.toContain(cliWarning)
  66 |

  at toMatch (development/basic/hmr/run-full-reload-hmr-test.util.ts:63:46)
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (development/basic/hmr/run-full-reload-hmr-test.util.ts:62:5)

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/e2e/app-dir/dynamic-css/index.test.ts (PPR)

  • app dir - dynamic css > should only apply corresponding css for page loaded in edge runtime
Expand output

● app dir - dynamic css › should only apply corresponding css for page loaded in edge runtime

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

Expected: "rgb(255, 0, 0)"
Received: null

  46 |           `window.getComputedStyle(document.querySelector('.text')).color`
  47 |         )
> 48 |       ).toBe('rgb(255, 0, 0)')
     |         ^
  49 |       // Default border width, which is not effected by bar.css that is not loaded in /ssr
  50 |       expect(
  51 |         await browser.eval(

  at toBe (e2e/app-dir/dynamic-css/index.test.ts:48:9)
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (e2e/app-dir/dynamic-css/index.test.ts:43:5)

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

pnpm test-dev test/development/acceptance-app/ReactRefreshLogBox-builtins.test.ts

  • ReactRefreshLogBox-builtins app > Module not found missing global CSS
Expand output

● ReactRefreshLogBox-builtins app › Module not found missing global CSS

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ReactRefreshLogBox-builtins app Module not found missing global CSS 1`

- Snapshot  - 10
+ Received  +  1

- {
-   "description": "Module not found: Can't resolve './non-existent.css'",
-   "environmentLabel": null,
-   "label": "Build Error",
-   "source": "./app/page.js (2:1)
- Module not found: Can't resolve './non-existent.css'
- > 2 | import './non-existent.css'
-     | ^",
-   "stack": [],
- }
+ "Expected Redbox but found no visible one."

  201 |       `)
  202 |     } else {
> 203 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  204 |        {
  205 |          "description": "Module not found: Can't resolve './non-existent.css'",
  206 |          "environmentLabel": null,

  at Object.toDisplayRedbox (development/acceptance-app/ReactRefreshLogBox-builtins.test.ts:203:29)

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/development/app-dir/next-after-app-invalid-usage/index.test.ts (PPR)

  • after() - invalid usages > errors at compile time when used in a client module
Expand output

● after() - invalid usages › errors at compile time when used in a client module

Expected Redbox but found no visible one.

  26 |     const session = await next.browser('/invalid-in-client')
  27 |
> 28 |     await assertHasRedbox(session)
     |     ^
  29 |     expect(await getRedboxSource(session)).toMatch(
  30 |       /You're importing a component that needs "?after"?\. That only works in a Server Component but one of its parents is marked with "use client", so it's a Client Component\./
  31 |     )

  at Object.<anonymous> (development/app-dir/next-after-app-invalid-usage/index.test.ts:28:5)

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

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

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

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

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for gsp page correctly 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "missingVar is not defined",
-   "environmentLabel": null,
-   "label": "Runtime ReferenceError",
-   "source": "pages/gsp.js (6:3) @ getStaticProps
- > 6 |   missingVar;return {
-     |   ^",
-   "stack": [
-     "getStaticProps pages/gsp.js (6:3)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  87 |       )
  88 |
> 89 |       await expect(browser).toDisplayRedbox(`
     |                             ^
  90 |         {
  91 |           "description": "missingVar is not defined",
  92 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.js:89:29)

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

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for gssp page correctly 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "missingVar is not defined",
-   "environmentLabel": null,
-   "label": "Runtime ReferenceError",
-   "source": "pages/gssp.js (6:3) @ getServerSideProps
- > 6 |   missingVar;return {
-     |   ^",
-   "stack": [
-     "getServerSideProps pages/gssp.js (6:3)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  137 |       )
  138 |
> 139 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  140 |         {
  141 |           "description": "missingVar is not defined",
  142 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.js:139:29)

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

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for dynamic gssp page correctly 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "missingVar is not defined",
-   "environmentLabel": null,
-   "label": "Runtime ReferenceError",
-   "source": "pages/blog/[slug].js (6:3) @ getServerSideProps
- > 6 |   missingVar;return {
-     |   ^",
-   "stack": [
-     "getServerSideProps pages/blog/[slug].js (6:3)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  187 |       )
  188 |
> 189 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  190 |         {
  191 |           "description": "missingVar is not defined",
  192 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.js:189:29)

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

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for api route correctly 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "missingVar is not defined",
-   "environmentLabel": null,
-   "label": "Runtime ReferenceError",
-   "source": "pages/api/hello.js (2:3) @ handler
- > 2 |   missingVar;res.status(200).json({ hello: 'world' })
-     |   ^",
-   "stack": [
-     "handler pages/api/hello.js (2:3)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  247 |       }
  248 |
> 249 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  250 |         {
  251 |           "description": "missingVar is not defined",
  252 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.js:249:29)

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

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `server-side dev errors should show server-side error for dynamic api route correctly 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "missingVar is not defined",
-   "environmentLabel": null,
-   "label": "Runtime ReferenceError",
-   "source": "pages/api/blog/[slug].js (2:3) @ handler
- > 2 |   missingVar;res.status(200).json({ slug: req.query.slug })
-     |   ^",
-   "stack": [
-     "handler pages/api/blog/[slug].js (2:3)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  321 |       }
  322 |
> 323 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  324 |         {
  325 |           "description": "missingVar is not defined",
  326 |           "environmentLabel": null,

  at Object.toDisplayRedbox (integration/server-side-dev-errors/test/index.test.js:323:29)

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

pnpm test test/integration/next-image-new/invalid-image-import/test/index.test.ts

  • Missing Import Image Tests > development mode > should show error
Expand output

● Missing Import Image Tests › development mode › should show error

Expected Redbox but found no visible one.

  23 |     if (isDev) {
  24 |       const browser = await webdriver(appPort, '/')
> 25 |       await assertHasRedbox(browser)
     |       ^
  26 |       const description = await getRedboxDescription(browser)
  27 |       if (process.env.IS_TURBOPACK_TEST) {
  28 |         expect(description).toMatchInlineSnapshot(`"Processing image failed"`)

  at Object.<anonymous> (integration/next-image-new/invalid-image-import/test/index.test.ts:25:7)

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

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

  • app-dir action progressive enhancement > should support headers and cookies without JS (runtime: edge)
Expand output

● app-dir action progressive enhancement › should support headers and cookies without JS (runtime: edge)

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

  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 elementById (e2e/app-dir/actions/app-action-progressive-enhancement.test.ts:63: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:425:17)
  at click (e2e/app-dir/actions/app-action-progressive-enhancement.test.ts:63:48)

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

pnpm test test/integration/api-support/test/index.test.js

  • API routes > dev support > should throw Internal Server Error
  • API routes > dev support > should throw Internal Server Error (async)
Expand output

● API routes › dev support › should throw Internal Server Error

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

Expected substring: "User error"
Received string:    "Internal Server Error"

  137 |
  138 |     if (dev) {
> 139 |       expect(text).toContain('User error')
      |                    ^
  140 |     } else {
  141 |       expect(text).toBe('Internal Server Error')
  142 |     }

  at Object.toContain (integration/api-support/test/index.test.js:139:20)

● API routes › dev support › should throw Internal Server Error (async)

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

Expected substring: "User error"
Received string:    "Internal Server Error"

  149 |
  150 |     if (dev) {
> 151 |       expect(text).toContain('User error')
      |                    ^
  152 |     } else {
  153 |       expect(text).toBe('Internal Server Error')
  154 |     }

  at Object.toContain (integration/api-support/test/index.test.js:151:20)

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/e2e/app-dir/app-root-params/use-cache.test.ts (PPR)

  • app-root-params - cache - at runtime > should error when using rootParams within a "use cache" - dev
  • app-root-params - cache - at runtime > should error when using rootParams within unstable_cache - dev
Expand output

● app-root-params - cache - at runtime › should error when using rootParams within a "use cache" - dev

Expected Redbox but found no visible one.

  23 |       )
  24 |       const { session } = sandbox
> 25 |       await session.assertHasRedbox()
     |       ^
  26 |       if (isPPREnabled) {
  27 |         // When PPR is enabled we verify that we have at least one root param value from generateStaticParams
  28 |         // Which this test does not define so we get a different error which preempts the root params error

  at Object.<anonymous> (e2e/app-dir/app-root-params/use-cache.test.ts:25:7)

● app-root-params - cache - at runtime › should error when using rootParams within unstable_cache - dev

Expected Redbox but found no visible one.

  44 |       )
  45 |       const { session } = sandbox
> 46 |       await session.assertHasRedbox()
     |       ^
  47 |       if (isPPREnabled) {
  48 |         // When PPR is enabled we verify that we have at least one root param value from generateStaticParams
  49 |         // Which this test does not define so we get a different error which preempts the root params error

  at Object.<anonymous> (e2e/app-dir/app-root-params/use-cache.test.ts:46:7)

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

pnpm test test/integration/invalid-revalidate-values/test/index.test.js (turbopack)

  • Invalid revalidate values > should show error for string revalidate value
  • Invalid revalidate values > should show error for null revalidate value
  • Invalid revalidate values > should show error for float revalidate value
Expand output

● Invalid revalidate values › should show error for string revalidate value

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

  61 |   })
  62 |
> 63 |   it('should show error for string revalidate value', async () => {
     |   ^
  64 |     pageFile.replace('revalidate: 1', 'revalidate: "1"')
  65 |
  66 |     try {

  at it (integration/invalid-revalidate-values/test/index.test.js:63:3)
  at Object.describe (integration/invalid-revalidate-values/test/index.test.js:20:1)

● Invalid revalidate values › should show error for null revalidate value

Failed to replace content.

Pattern: revalidate: 1

Content: export default function Page() {
  return (
    <>
      <p>a-ok</p>
    </>
  )
}

export const getStaticProps = () => {
  return {
    props: {
      hello: 'world',
    },
    revalidate: "1",
  }
}

  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 Object.replace (integration/invalid-revalidate-values/test/index.test.js:77:14)

● Invalid revalidate values › should show error for float revalidate value

Failed to replace content.

Pattern: revalidate: 1

Content: export default function Page() {
  return (
    <>
      <p>a-ok</p>
    </>
  )
}

export const getStaticProps = () => {
  return {
    props: {
      hello: 'world',
    },
    revalidate: "1",
  }
}

  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 Object.replace (integration/invalid-revalidate-values/test/index.test.js:90:14)

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

pnpm test test/integration/prerender/test/index.test.js (turbopack)

  • SSG Prerender > development mode getStaticPaths > should not cache getStaticPaths errors
Expand output

● SSG Prerender › development mode getStaticPaths › should not cache getStaticPaths errors

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

  49 |     })
  50 |
> 51 |     it('should not cache getStaticPaths errors', async () => {
     |     ^
  52 |       const errMsg = /The `fallback` key must be returned from getStaticPaths/
  53 |       await check(() => renderViaHTTP(appPort, '/blog/post-1'), /post-1/)
  54 |

  at it (integration/prerender/test/index.test.js:51:5)
  at describe (integration/prerender/test/index.test.js:18:3)
  at Object.describe (integration/prerender/test/index.test.js:17:1)

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

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

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

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

Expected Redbox but found no visible one.

  178 |         const url = dynamicPage ? '/another/first' : '/api/json'
  179 |         const browser = await webdriver(port, url)
> 180 |         await assertHasRedbox(browser)
      |         ^
  181 |         const header = await getRedboxHeader(browser)
  182 |         const source = await getRedboxSource(browser)
  183 |         if (expectedErrMsg instanceof RegExp) {

  at runTests (integration/app-dir-export/test/utils.ts:180:9)
  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-dynamic'

Expected Redbox but found no visible one.

  178 |         const url = dynamicPage ? '/another/first' : '/api/json'
  179 |         const browser = await webdriver(port, url)
> 180 |         await assertHasRedbox(browser)
      |         ^
  181 |         const header = await getRedboxHeader(browser)
  182 |         const source = await getRedboxSource(browser)
  183 |         if (expectedErrMsg instanceof RegExp) {

  at runTests (integration/app-dir-export/test/utils.ts:180:9)
  at integration/app-dir-export/test/dynamicapiroute-dev.test.ts:23:11

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/development/app-dir/server-navigation-error/server-navigation-error.test.ts (PPR)

  • server-navigation-error > middleware > should error on navigation API redirect
  • server-navigation-error > middleware > should error on navigation API not-found
  • server-navigation-error > pages router > should error on navigation API redirect
  • server-navigation-error > pages router > should error on navigation API notFound
Expand output

● server-navigation-error › pages router › should error on navigation API redirect

expect(received).toMatchInlineSnapshot(snapshot)

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

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "Next.js navigation API is not allowed to be used in Pages Router.",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "pages/pages/redirect.tsx (4:11) @ Page
- > 4 |   redirect('/')
-     |           ^",
-   "stack": [
-     "Page pages/pages/redirect.tsx (4:11)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  25 |         `)
  26 |       } else {
> 27 |         await expect(browser).toDisplayRedbox(`
     |                               ^
  28 |          {
  29 |            "description": "Next.js navigation API is not allowed to be used in Pages Router.",
  30 |            "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/server-navigation-error/server-navigation-error.test.ts:27:31)

● server-navigation-error › pages router › should error on navigation API notFound

expect(received).toMatchInlineSnapshot(snapshot)

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

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "Next.js navigation API is not allowed to be used in Pages Router.",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "pages/pages/not-found.tsx (4:11) @ Page
- > 4 |   notFound()
-     |           ^",
-   "stack": [
-     "Page pages/pages/not-found.tsx (4:11)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  59 |         `)
  60 |       } else {
> 61 |         await expect(browser).toDisplayRedbox(`
     |                               ^
  62 |          {
  63 |            "description": "Next.js navigation API is not allowed to be used in Pages Router.",
  64 |            "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/server-navigation-error/server-navigation-error.test.ts:61:31)

● server-navigation-error › middleware › should error on navigation API redirect

expect(received).toMatchInlineSnapshot(snapshot)

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

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "Next.js navigation API is not allowed to be used in Middleware.",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "middleware.ts (8:13) @ middleware
- >  8 |     redirect('/')
-      |             ^",
-   "stack": [
-     "middleware middleware.ts (8:13)",
-   ],
- }
+ "Expected Redbox but found no visible one."

   98 |         `)
   99 |       } else {
> 100 |         await expect(browser).toDisplayRedbox(`
      |                               ^
  101 |          {
  102 |            "description": "Next.js navigation API is not allowed to be used in Middleware.",
  103 |            "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/server-navigation-error/server-navigation-error.test.ts:100:31)

● server-navigation-error › middleware › should error on navigation API not-found

expect(received).toMatchInlineSnapshot(snapshot)

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

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "Next.js navigation API is not allowed to be used in Middleware.",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "middleware.ts (6:13) @ middleware
- > 6 |     notFound()
-     |             ^",
-   "stack": [
-     "middleware middleware.ts (6:13)",
-   ],
- }
+ "Expected Redbox but found no visible one."

  133 |         `)
  134 |       } else {
> 135 |         await expect(browser).toDisplayRedbox(`
      |                               ^
  136 |          {
  137 |            "description": "Next.js navigation API is not allowed to be used in Middleware.",
  138 |            "environmentLabel": null,

  at Object.toDisplayRedbox (development/app-dir/server-navigation-error/server-navigation-error.test.ts:135:31)

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

pnpm test test/integration/404-page/test/index.test.js

  • 404 Page Support > development mode > should render _error for a 500 error still
Expand output

● 404 Page Support › development mode › should render _error for a 500 error still

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

Expected substring: "oops"
Received string:    "Internal Server Error"

  52 |     const html = await renderViaHTTP(appPort, '/err')
  53 |     expect(html).not.toContain('custom 404 page')
> 54 |     expect(html).toContain(mode === 'dev' ? 'oops' : 'Internal Server Error')
     |                  ^
  55 |   })
  56 |
  57 |   if (mode !== 'dev') {

  at Object.toContain (integration/404-page/test/index.test.js:54:18)

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

pnpm test-dev test/e2e/app-dir/app-edge/app-edge.test.ts

  • app-dir edge SSR > should handle edge only routes
  • app-dir edge SSR > should retrieve cookies in a server component in the edge runtime
  • app-dir edge SSR > should treat process as object without polyfill in edge runtime
  • app-dir edge SSR > should handle /index routes correctly
  • app-dir edge SSR > should resolve client component without error
  • app-dir edge SSR > should handle edge rsc hmr
Expand output

● app-dir edge SSR › should handle edge only routes

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

Expected substring: "<p>Edge!</p>"
Received string:    "Internal Server Error"

  14 |   it('should handle edge only routes', async () => {
  15 |     const appHtml = await next.render('/edge/basic')
> 16 |     expect(appHtml).toContain('<p>Edge!</p>')
     |                     ^
  17 |
  18 |     const pageHtml = await next.render('/pages-edge')
  19 |     expect(pageHtml).toContain('<p>pages-edge-ssr</p>')

  at Object.toContain (e2e/app-dir/app-edge/app-edge.test.ts:16:21)

● app-dir edge SSR › should retrieve cookies in a server component in the edge runtime

expect(received).toInclude(expected)

Expected string to include:
  "Hello"
Received:
  "Internal Server Error"

  22 |   it('should retrieve cookies in a server component in the edge runtime', async () => {
  23 |     const res = await next.fetch('/edge-apis/cookies')
> 24 |     expect(await res.text()).toInclude('Hello')
     |                              ^
  25 |   })
  26 |
  27 |   it('should treat process as object without polyfill in edge runtime', async () => {

  at Object.toInclude (e2e/app-dir/app-edge/app-edge.test.ts:24:30)

● app-dir edge SSR › should treat process as object without polyfill in edge runtime

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

Expected substring: "object"
Received string:    ""

  27 |   it('should treat process as object without polyfill in edge runtime', async () => {
  28 |     const $ = await next.render$('/edge-apis/process')
> 29 |     expect(await $('#process').text()).toContain('object')
     |                                        ^
  30 |   })
  31 |
  32 |   it('should handle /index routes correctly', async () => {

  at Object.toContain (e2e/app-dir/app-edge/app-edge.test.ts:29:40)

● app-dir edge SSR › should handle /index routes correctly

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

Expected substring: "the /index route"
Received string:    "Internal Server Error"

  32 |   it('should handle /index routes correctly', async () => {
  33 |     const appHtml = await next.render('/index')
> 34 |     expect(appHtml).toContain('the /index route')
     |                     ^
  35 |   })
  36 |
  37 |   if ((globalThis as any).isNextDev) {

  at Object.toContain (e2e/app-dir/app-edge/app-edge.test.ts:34:21)

● app-dir edge SSR › should resolve client component without error

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

Expected substring: "My Button"
Received string:    "Internal Server Error"

  78 |       })
  79 |       const html = await next.render('/with-client')
> 80 |       expect(html).toContain('My Button')
     |                    ^
  81 |       expect(logs).toEqual([])
  82 |     })
  83 |

  at Object.toContain (e2e/app-dir/app-edge/app-edge.test.ts:80:20)

● app-dir edge SSR › should handle edge rsc hmr

TIMED OUT: /edge-hmr/

Internal Server Error

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-edge/app-edge.test.ts:91:7)

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

pnpm test test/integration/edge-runtime-module-errors/test/module-imports.test.js (turbopack)

  • Edge runtime code with imports > Edge API dynamically importing 3rd party module > throws not-found module error in dev at runtime and highlights the faulty line
  • Edge runtime code with imports > Edge API importing unused 3rd party module > throws not-found module error in dev at runtime and highlights the faulty line
  • Edge runtime code with imports > Edge API statically importing node.js module > throws unsupported module error in dev at runtime and highlights the faulty line
  • Edge runtime code with imports > Middleware dynamically importing 3rd party module > throws not-found module error in dev at runtime and highlights the faulty line
  • Edge runtime code with imports > Middleware importing unused 3rd party module > throws not-found module error in dev at runtime and highlights the faulty line
  • Edge runtime code with imports > Middleware statically importing node.js module > throws unsupported module error in dev at runtime and highlights the faulty line
Expand output

● Edge runtime code with imports › Edge API statically importing node.js module › throws unsupported module error in dev at runtime and highlights the faulty line

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

Expected substring: "The edge runtime does not support Node.js 'fs' module"
Received string:    "Internal Server Error"

  61 |
  62 |   const moduleNotSupportedMessage = getUnsupportedModule(moduleName)
> 63 |   expect(responseText).toContain(escapeLF(moduleNotSupportedMessage))
     |                        ^
  64 |
  65 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
  66 |   expect(responseText).not.toContain(escapeLF(moduleNotFoundMessage))

  at toContain (integration/edge-runtime-module-errors/test/utils.js:63:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:92:40
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:88:7)

● Edge runtime code with imports › Middleware statically importing node.js module › throws unsupported module error in dev at runtime and highlights the faulty line

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

Expected substring: "The edge runtime does not support Node.js 'fs' module"
Received string:    "Internal Server Error"

  61 |
  62 |   const moduleNotSupportedMessage = getUnsupportedModule(moduleName)
> 63 |   expect(responseText).toContain(escapeLF(moduleNotSupportedMessage))
     |                        ^
  64 |
  65 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
  66 |   expect(responseText).not.toContain(escapeLF(moduleNotFoundMessage))

  at toContain (integration/edge-runtime-module-errors/test/utils.js:63:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:92:40
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:88:7)

● Edge runtime code with imports › Edge API dynamically importing 3rd party module › throws not-found module error in dev at runtime and highlights the faulty line

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

Expected substring: "Module not found: Can't resolve 'not-exist'"
Received string:    "Internal Server Error"

  94 |
  95 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
> 96 |   expect(responseText).toContain(escapeLF(moduleNotFoundMessage))
     |                        ^
  97 | }
  98 |
  99 | export function expectNoError(moduleName) {

  at toContain (integration/edge-runtime-module-errors/test/utils.js:96:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:158:37
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:153:7)

● Edge runtime code with imports › Middleware dynamically importing 3rd party module › throws not-found module error in dev at runtime and highlights the faulty line

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

Expected substring: "Module not found: Can't resolve 'not-exist'"
Received string:    "Internal Server Error"

  94 |
  95 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
> 96 |   expect(responseText).toContain(escapeLF(moduleNotFoundMessage))
     |                        ^
  97 | }
  98 |
  99 | export function expectNoError(moduleName) {

  at toContain (integration/edge-runtime-module-errors/test/utils.js:96:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:158:37
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:153:7)

● Edge runtime code with imports › Edge API importing unused 3rd party module › throws not-found module error in dev at runtime and highlights the faulty line

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

Expected substring: "Module not found: Can't resolve 'not-exist'"
Received string:    "Internal Server Error"

  94 |
  95 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
> 96 |   expect(responseText).toContain(escapeLF(moduleNotFoundMessage))
     |                        ^
  97 | }
  98 |
  99 | export function expectNoError(moduleName) {

  at toContain (integration/edge-runtime-module-errors/test/utils.js:96:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:223:37
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:218:7)

● Edge runtime code with imports › Middleware importing unused 3rd party module › throws not-found module error in dev at runtime and highlights the faulty line

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

Expected substring: "Module not found: Can't resolve 'not-exist'"
Received string:    "Internal Server Error"

  94 |
  95 |   const moduleNotFoundMessage = getModuleNotFound(moduleName)
> 96 |   expect(responseText).toContain(escapeLF(moduleNotFoundMessage))
     |                        ^
  97 | }
  98 |
  99 | export function expectNoError(moduleName) {

  at toContain (integration/edge-runtime-module-errors/test/utils.js:96:24)
  at integration/edge-runtime-module-errors/test/module-imports.test.js:223:37
  at retry (lib/next-test-utils.ts:811:14)
  at Object.<anonymous> (integration/edge-runtime-module-errors/test/module-imports.test.js:218:7)

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

pnpm test test/integration/next-image-legacy/default/test/index.test.ts

  • Image Component Tests > development mode > should show invalid src error
  • Image Component Tests > development mode > should show invalid src error when protocol-relative
  • Image Component Tests > development mode > should show error when string src and placeholder=blur and blurDataURL is missing
  • Image Component Tests > development mode > should show error when not numeric string width or height
  • Image Component Tests > development mode > should show error when static import and placeholder=blur and blurDataUrl is missing
Expand output

● Image Component Tests › development mode › should show invalid src error

Expected Redbox but found no visible one.

  825 |       const browser = await webdriver(appPort, '/invalid-src')
  826 |
> 827 |       await assertHasRedbox(browser)
      |       ^
  828 |       expect(await getRedboxHeader(browser)).toContain(
  829 |         'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`'
  830 |       )

  at Object.<anonymous> (integration/next-image-legacy/default/test/index.test.ts:827:7)

● Image Component Tests › development mode › should show invalid src error when protocol-relative

Expected Redbox but found no visible one.

  834 |       const browser = await webdriver(appPort, '/invalid-src-proto-relative')
  835 |
> 836 |       await assertHasRedbox(browser)
      |       ^
  837 |       expect(await getRedboxHeader(browser)).toContain(
  838 |         'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)'
  839 |       )

  at Object.<anonymous> (integration/next-image-legacy/default/test/index.test.ts:836:7)

● Image Component Tests › development mode › should show error when string src and placeholder=blur and blurDataURL is missing

Expected Redbox but found no visible one.

  843 |       const browser = await webdriver(appPort, '/invalid-placeholder-blur')
  844 |
> 845 |       await assertHasRedbox(browser)
      |       ^
  846 |       expect(await getRedboxHeader(browser)).toContain(
  847 |         `Image with src "/test.png" has "placeholder='blur'" property but is missing the "blurDataURL" property.`
  848 |       )

  at Object.<anonymous> (integration/next-image-legacy/default/test/index.test.ts:845:7)

● Image Component Tests › development mode › should show error when not numeric string width or height

Expected Redbox but found no visible one.

  852 |       const browser = await webdriver(appPort, '/invalid-width-or-height')
  853 |
> 854 |       await assertHasRedbox(browser)
      |       ^
  855 |       expect(await getRedboxHeader(browser)).toContain(
  856 |         `Image with src "/test.jpg" has invalid "width" or "height" property. These should be numeric values.`
  857 |       )

  at Object.<anonymous> (integration/next-image-legacy/default/test/index.test.ts:854:7)

● Image Component Tests › development mode › should show error when static import and placeholder=blur and blurDataUrl is missing

Expected Redbox but found no visible one.

  864 |       )
  865 |
> 866 |       await assertHasRedbox(browser)
      |       ^
  867 |       expect(await getRedboxHeader(browser)).toMatch(
  868 |         /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/
  869 |       )

  at Object.<anonymous> (integration/next-image-legacy/default/test/index.test.ts:866:7)

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

@ijjk
Copy link
Member

ijjk commented Jun 15, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
buildDuration 18.2s 16.5s N/A
buildDurationCached 15.7s 13.4s N/A
nodeModulesSize 433 MB 434 MB ⚠️ +217 kB
nextStartRea..uration (ms) 393ms 396ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab 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 kB ⚠️ +555 B
framework-HASH.js gzip 57.4 kB 57.4 kB N/A
main-app-HASH.js gzip 252 B 255 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.6 kB 45.1 kB ⚠️ +555 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab 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 jiwon/06-15-_devtools_panel_ui_issues_tab 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 jiwon/06-15-_devtools_panel_ui_issues_tab Change
_buildManifest.js gzip 752 B 752 B
Overall change 752 B 752 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
index.html gzip 530 B 529 B N/A
link.html gzip 543 B 542 B N/A
withRouter.html gzip 525 B 525 B
Overall change 525 B 525 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
edge-ssr.js gzip 140 kB 139 kB N/A
page.js gzip 233 kB 227 kB N/A
Overall change 0 B 0 B
Middleware size Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
middleware-b..fest.js gzip 675 B 672 B N/A
middleware-r..fest.js gzip 155 B 157 B N/A
middleware.js gzip 32.2 kB 32.5 kB ⚠️ +310 B
edge-runtime..pack.js gzip 853 B 853 B
Overall change 33.1 kB 33.4 kB ⚠️ +310 B
Next Runtimes
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
app-page-exp...dev.js gzip 275 kB 275 kB N/A
app-page-exp..prod.js gzip 158 kB 158 kB
app-page-tur...dev.js gzip 275 kB 275 kB
app-page-tur..prod.js gzip 158 kB 158 kB
app-page-tur...dev.js gzip 267 kB 267 kB
app-page-tur..prod.js gzip 154 kB 154 kB
app-page.run...dev.js gzip 267 kB 267 kB N/A
app-page.run..prod.js gzip 154 kB 154 kB
app-route-ex...dev.js gzip 69.9 kB 69.9 kB
app-route-ex..prod.js gzip 48.1 kB 48.1 kB
app-route-tu...dev.js gzip 69.9 kB 69.9 kB
app-route-tu..prod.js gzip 48.1 kB 48.1 kB
app-route-tu...dev.js gzip 69.3 kB 69.3 kB
app-route-tu..prod.js gzip 47.8 kB 47.8 kB
app-route.ru...dev.js gzip 69.2 kB 69.2 kB
app-route.ru..prod.js gzip 47.8 kB 47.8 kB
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 43.6 kB 43.6 kB
pages-api-tu..prod.js gzip 32.6 kB 32.6 kB
pages-api.ru...dev.js gzip 43.6 kB 43.6 kB
pages-api.ru..prod.js gzip 32.6 kB 32.6 kB
pages-turbo....dev.js gzip 53.4 kB 53.4 kB
pages-turbo...prod.js gzip 39.7 kB 39.7 kB
pages.runtim...dev.js gzip 53.6 kB 53.6 kB
pages.runtim..prod.js gzip 39.8 kB 39.8 kB
server.runti..prod.js gzip 64.3 kB 64.3 kB
Overall change 2.04 MB 2.04 MB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/06-15-_devtools_panel_ui_issues_tab Change
0.pack gzip 3.91 MB 3.9 MB N/A
index.pack gzip 91.1 kB 91.3 kB ⚠️ +189 B
Overall change 91.1 kB 91.3 kB ⚠️ +189 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

Diff too large to display

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/[email protected]/node_modules/react/jsx-runtime.js
+      var jsx_runtime = __webpack_require__(5640);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/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/[email protected]/node_modules/react/jsx-runtime.js
-      var jsx_runtime = __webpack_require__(5640);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/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) */
-      /***/
-    },
-
-    /***/ 5415: /***/ (
+    /***/ 35: /***/ (
       __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__(5415))
+      [9910, 4860],
+      () => (__webpack_exec__(1389), __webpack_exec__(35))
     );
     /******/ 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-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page.runtime.dev.js
failed to diff
Commit: 9628cc1

@devjiwonchoi devjiwonchoi changed the base branch from jiwon/06-15-_devtools_fork_call_stack to graphite-base/80539 June 16, 2025 10:50
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 53a501a to 73925ee Compare June 16, 2025 10:50
@devjiwonchoi devjiwonchoi changed the base branch from graphite-base/80539 to jiwon/06-16-_devtools_port_runtime_error_handling_to_hook June 16, 2025 10:50
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 73925ee to 1fef8ff Compare June 17, 2025 13:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from 3aec5c6 to 6ff1c93 Compare June 17, 2025 13:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 1fef8ff to 21be5e4 Compare June 17, 2025 14:00
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 2c2fec6 to bf33e84 Compare June 19, 2025 11:48
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from 2adaf63 to faca891 Compare June 19, 2025 11:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from bf33e84 to d2e609e Compare June 19, 2025 11:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from faca891 to 56be75a Compare June 19, 2025 11:57
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch 2 times, most recently from 086d610 to 363739f Compare June 19, 2025 12:07
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch 2 times, most recently from 7ac517f to 528e32c Compare June 19, 2025 12:13
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 363739f to 259e75e Compare June 19, 2025 12:13
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from 528e32c to dbb7649 Compare June 19, 2025 12:25
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch 2 times, most recently from 9b6f985 to 5e3169e Compare June 19, 2025 12:35
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch 2 times, most recently from 2b313f2 to b156949 Compare June 19, 2025 12:38
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch 2 times, most recently from 361e106 to c57207c Compare June 19, 2025 12:46
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch 2 times, most recently from 2209821 to a3da59b Compare June 19, 2025 12:52
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch 2 times, most recently from 5da6c4b to 74e02e4 Compare June 19, 2025 12:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from a3da59b to b639634 Compare June 19, 2025 12:56
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 74e02e4 to 9628cc1 Compare June 19, 2025 13:18
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch 2 times, most recently from 7be0061 to 7808ab0 Compare June 19, 2025 13:39
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 9628cc1 to 1666e40 Compare June 19, 2025 13:39
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-16-_devtools_port_runtime_error_handling_to_hook branch from 7808ab0 to 72896e5 Compare June 19, 2025 13:49
@devjiwonchoi devjiwonchoi force-pushed the jiwon/06-15-_devtools_panel_ui_issues_tab branch from 1666e40 to 0c61ce5 Compare June 19, 2025 13:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants