Skip to content

Conversation

@lukesandberg
Copy link
Contributor

No description provided.

@ijjk ijjk added created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js. labels Nov 6, 2025
Copy link
Contributor Author

lukesandberg commented Nov 6, 2025

Warning

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

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

@lukesandberg lukesandberg changed the title support null safe access [turbopack] Abalyze null safe access operators to trim effects Nov 6, 2025
@lukesandberg lukesandberg changed the title [turbopack] Abalyze null safe access operators to trim effects [turbopack] Analyze null safe access operators to trim effects Nov 6, 2025
@ijjk
Copy link
Member

ijjk commented Nov 6, 2025

Failing test suites

Commit: 939e722 | About building and testing Next.js

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

  • App asPath > should not have any changes in asPath after a bundle rebuild (DD)
Expand output

● App asPath › should not have any changes in asPath after a bundle rebuild

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('body') to be visible
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (integration/app-aspath/test/index.test.js:32:32)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (integration/app-aspath/test/index.test.js:32:53)

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

  • after() - invalid usages > errors at compile time when used in a client module (DD)
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 waitForRedbox(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)

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

  • Configuration > should have env variables available on the client (DD)
Expand output

● Configuration › should have env variables available on the client

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#env') to be visible
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (integration/config/test/index.test.js:55:36)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (integration/config/test/index.test.js:55:57)

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

  • Initial Refs > production mode > Has correct initial ref values (DD)
Expand output

● Initial Refs › production mode › Has correct initial ref values

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

Expected substring: "76px"
Received string:    "this component is 0px tall"

  18 |   it('Has correct initial ref values', async () => {
  19 |     const browser = await webdriver(appPort, '/')
> 20 |     expect(await browser.elementByCss('#ref-val').text()).toContain('76px')
     |                                                           ^
  21 |   })
  22 | }
  23 |

  at Object.toContain (integration/initial-ref/test/index.test.js:20:59)

pnpm test test/integration/export-dynamic-pages/test/index.test.js (turbopack)

  • Export Dynamic Pages > production mode > should hydrate with correct asPath (DD)
Expand output

● Export Dynamic Pages › production mode › should hydrate with correct asPath

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

Expected: ["/regression/jeff-is-cool"]
Received: undefined

  41 |         const browser = await webdriver(port, '/regression/jeff-is-cool')
  42 |         try {
> 43 |           expect(await browser.eval(`window.__AS_PATHS`)).toEqual([
     |                                                           ^
  44 |             '/regression/jeff-is-cool',
  45 |           ])
  46 |         } finally {

  at Object.toEqual (integration/export-dynamic-pages/test/index.test.js:43:59)

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

  • app-dir - server-component-next-dynamic-ssr-false > should error when use dynamic ssr:false in server component (DD)
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 waitForRedbox(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)

pnpm test-start-turbo test/e2e/app-dir/app-middleware/app-middleware-in-src-dir.test.ts (turbopack)

  • app dir - middleware with middleware in src dir > works without crashing when using RequestStore (DD)
Expand output

● app dir - middleware with middleware in src dir › works without crashing when using RequestStore

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

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

  • excludeDefaultMomentLocales > production mode > should load momentjs (DD)
Expand output

● excludeDefaultMomentLocales › production mode › should load momentjs

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

Expected: ["en"]
Received: null

  31 |         expect(await browser.elementByCss('h1').text()).toMatch(/current time/i)
  32 |         const locales = await browser.eval('moment.locales()')
> 33 |         expect(locales).toEqual(['en'])
     |                         ^
  34 |         expect(locales.length).toBe(1)
  35 |         await browser.close()
  36 |       })

  at Object.toEqual (integration/future/test/index.test.js:33:25)

pnpm test-dev-turbo test/development/app-dir/error-overlay/error-ignored-frames/error-ignored-frames.test.ts (turbopack)

  • error-ignored-frames > should be able to collapse pages router ignored frames (DD)
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 waitForRedbox(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)

pnpm test-start-turbo test/e2e/app-dir/app-middleware/app-middleware-without-pages-dir.test.ts (turbopack)

  • app dir - middleware without pages dir > Updates headers (DD)
Expand output

● app dir - middleware without pages dir › Updates headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

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

  • app-custom-routes > automatic implementations > implements HEAD on routes with GET already implemented (DD)
  • app-custom-routes > automatic implementations > implements OPTIONS on routes (DD)
  • app-custom-routes > basic fetch request with a response > abort via a DELETE request > aborts without error on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a DELETE request > aborts without error on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a GET request > aborts without error on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a GET request > aborts without error on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a PATCH request > aborts without error on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a PATCH request > aborts without error on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a POST request > aborts without error on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a POST request > aborts without error on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a PUT request > aborts without error on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > abort via a PUT request > aborts without error on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a DELETE request > responds correctly on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a DELETE request > responds correctly on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a GET request > responds correctly on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a GET request > responds correctly on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a PATCH request > responds correctly on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a PATCH request > responds correctly on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a POST request > responds correctly on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a POST request > responds correctly on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a PUT request > responds correctly on /basic/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > made via a PUT request > responds correctly on /basic/vercel/endpoint (DD)
  • app-custom-routes > basic fetch request with a response > request > can read query parameters (DD)
  • app-custom-routes > basic fetch request with a response > request > can read query parameters (edge) (DD)
  • app-custom-routes > basic fetch request with a response > response > supports the NextResponse.redirect() helper (DD)
  • app-custom-routes > basic fetch request with a response > response > supports the NextResponse.json() helper (DD)
  • app-custom-routes > basic fetch request with a response > route groups > routes to the correct handler (DD)
  • app-custom-routes > body > can handle handle a streaming request and streaming response (DD)
  • app-custom-routes > body > can handle handle a streaming request and streaming response (edge) (DD)
  • app-custom-routes > body > can read a JSON encoded body (DD)
  • app-custom-routes > body > can read a JSON encoded body (edge) (DD)
  • app-custom-routes > body > can read a JSON encoded body for DELETE requests (DD)
  • app-custom-routes > body > can read a JSON encoded body for OPTIONS requests (DD)
  • app-custom-routes > body > can read a streamed JSON encoded body (DD)
  • app-custom-routes > body > can read a streamed JSON encoded body (edge) (DD)
  • app-custom-routes > body > can read the text body (DD)
  • app-custom-routes > body > can read the text body (edge) (DD)
  • app-custom-routes > context > provides params to routes with dynamic parameters (DD)
  • app-custom-routes > context > provides params to routes with catch-all routes (DD)
  • app-custom-routes > context > does not provide params to routes without dynamic parameters (DD)
  • app-custom-routes > customized metadata routes > should work if conflict with metadata routes convention (DD)
  • app-custom-routes > dynamic = "force-static" > strips search, headers, and domain from request (DD)
  • app-custom-routes > edge functions > returns response using edge runtime (DD)
  • app-custom-routes > edge functions > returns a response when headers are accessed (DD)
  • app-custom-routes > error conditions > responds with 400 (Bad Request) when the requested method is not a valid HTTP method (DD)
  • app-custom-routes > error conditions > responds with 405 (Method Not Allowed) when method is not implemented (DD)
  • app-custom-routes > error conditions > responds with 500 (Internal Server Error) when the handler throws an error (DD)
  • app-custom-routes > error conditions > responds with 500 (Internal Server Error) when the handler calls NextResponse.next() (DD)
  • app-custom-routes > hooks > (await cookies()).has() > gets the correct values (DD)
  • app-custom-routes > hooks > cookies > gets the correct values (DD)
  • app-custom-routes > hooks > headers > gets the correct values (DD)
  • app-custom-routes > hooks > notFound > can respond correctly in nodejs (DD)
  • app-custom-routes > hooks > notFound > can respond correctly in edge (DD)
  • app-custom-routes > hooks > permanentRedirect > can respond correctly (DD)
  • app-custom-routes > hooks > redirect > can respond correctly (DD)
  • app-custom-routes > hooks > req.cookies > gets the correct values (DD)
  • app-custom-routes > no bundle error > should not print bundling warning about React (DD)
  • app-custom-routes > no response returned > should print an error when no response is returned (DD)
  • app-custom-routes > works with api prefix correctly > statically generates correctly with no dynamic usage (DD)
  • app-custom-routes > works with api prefix correctly > does not statically generate with dynamic usage (DD)
  • app-custom-routes > works with generateStaticParams correctly > responds correctly on /static/first/data.json (DD)
  • app-custom-routes > works with generateStaticParams correctly > responds correctly on /static/second/data.json (DD)
  • app-custom-routes > works with generateStaticParams correctly > responds correctly on /static/three/data.json (DD)
  • app-custom-routes > works with generateStaticParams correctly > revalidates correctly on /revalidate-1/first/data.json (DD)
  • app-custom-routes > works with generateStaticParams correctly > revalidates correctly on /revalidate-1/second/data.json (DD)
  • app-custom-routes > works with generateStaticParams correctly > revalidates correctly on /revalidate-1/three/data.json (DD)
Expand output

● app-custom-routes › works with api prefix correctly › statically generates correctly with no dynamic usage

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with api prefix correctly › does not statically generate with dynamic usage

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › responds correctly on /static/first/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › responds correctly on /static/second/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › responds correctly on /static/three/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › revalidates correctly on /revalidate-1/first/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › revalidates correctly on /revalidate-1/second/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › works with generateStaticParams correctly › revalidates correctly on /revalidate-1/three/data.json

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a GET request › responds correctly on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a GET request › responds correctly on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a POST request › responds correctly on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a POST request › responds correctly on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a PUT request › responds correctly on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a PUT request › responds correctly on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a DELETE request › responds correctly on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a DELETE request › responds correctly on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a PATCH request › responds correctly on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › made via a PATCH request › responds correctly on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a GET request › aborts without error on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a GET request › aborts without error on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a POST request › aborts without error on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a POST request › aborts without error on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a PUT request › aborts without error on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a PUT request › aborts without error on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a DELETE request › aborts without error on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a DELETE request › aborts without error on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a PATCH request › aborts without error on /basic/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › abort via a PATCH request › aborts without error on /basic/vercel/endpoint

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › route groups › routes to the correct handler

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › request › can read query parameters

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › request › can read query parameters (edge)

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › response › supports the NextResponse.rewrite() helper

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › response › supports the NextResponse.redirect() helper

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › basic fetch request with a response › response › supports the NextResponse.json() helper

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can handle handle a streaming request and streaming response

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can handle handle a streaming request and streaming response (edge)

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a JSON encoded body

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a JSON encoded body (edge)

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a JSON encoded body for DELETE requests

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a JSON encoded body for OPTIONS requests

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a streamed JSON encoded body

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read a streamed JSON encoded body (edge)

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read the text body

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › body › can read the text body (edge)

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › context › provides params to routes with dynamic parameters

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › context › provides params to routes with catch-all routes

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › context › does not provide params to routes without dynamic parameters

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › headers › gets the correct values

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › cookies › gets the correct values

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › req.cookies › gets the correct values

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › (await cookies()).has() › gets the correct values

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › redirect › can respond correctly

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › permanentRedirect › can respond correctly

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › notFound › can respond correctly in nodejs

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › hooks › notFound › can respond correctly in edge

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › error conditions › responds with 400 (Bad Request) when the requested method is not a valid HTTP method

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › error conditions › responds with 405 (Method Not Allowed) when method is not implemented

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › error conditions › responds with 500 (Internal Server Error) when the handler throws an error

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › error conditions › responds with 500 (Internal Server Error) when the handler calls NextResponse.next()

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › automatic implementations › implements HEAD on routes with GET already implemented

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › automatic implementations › implements OPTIONS on routes

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › edge functions › returns response using edge runtime

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › edge functions › returns a response when headers are accessed

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › dynamic = "force-static" › strips search, headers, and domain from request

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › customized metadata routes › should work if conflict with metadata routes convention

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › no response returned › should print an error when no response is returned

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-custom-routes › no bundle error › should not print bundling warning about React

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

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

  • app-dir with proxy > should filter correctly after proxy rewrite (DD)
  • app-dir with proxy > retains a link response header from the proxy (DD)
  • app-dir with proxy > should be possible to modify cookies & read them in an RSC in a single request (DD)
  • app-dir with proxy > should respect cookie options of merged proxy cookies (DD)
  • app-dir with proxy > should omit internal headers for proxy cookies (DD)
  • app-dir with proxy > should ignore x-middleware-set-cookie as a request header (DD)
  • app-dir with proxy > should be possible to read cookies that are set during the proxy handling of a server action (DD)
  • app-dir with proxy > should not incorrectly treat a Location header as a rewrite (DD)
  • app-dir with proxy > Mutate request headers for Edge Functions > Adds new headers (DD)
  • app-dir with proxy > Mutate request headers for Edge Functions > Deletes headers (DD)
  • app-dir with proxy > Mutate request headers for Edge Functions > Updates headers (DD)
  • app-dir with proxy > Mutate request headers for Serverless Functions > Adds new headers (DD)
  • app-dir with proxy > Mutate request headers for Serverless Functions > Deletes headers (DD)
  • app-dir with proxy > Mutate request headers for Serverless Functions > Updates headers (DD)
  • app-dir with proxy > Mutate request headers for next/headers > Adds new headers (DD)
  • app-dir with proxy > Mutate request headers for next/headers > Deletes headers (DD)
  • app-dir with proxy > Mutate request headers for next/headers > Updates headers (DD)
Expand output

● app-dir with proxy › should filter correctly after proxy rewrite

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Serverless Functions › Adds new headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Serverless Functions › Deletes headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Serverless Functions › Updates headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Serverless Functions › Supports draft mode

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Edge Functions › Adds new headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Edge Functions › Deletes headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Edge Functions › Updates headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for Edge Functions › Supports draft mode

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for next/headers › Adds new headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for next/headers › Deletes headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for next/headers › Updates headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › Mutate request headers for next/headers › Supports draft mode

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › retains a link response header from the proxy

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should be possible to modify cookies & read them in an RSC in a single request

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should respect cookie options of merged proxy cookies

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should omit internal headers for proxy cookies

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should ignore x-middleware-set-cookie as a request header

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should be possible to read cookies that are set during the proxy handling of a server action

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir with proxy › should not incorrectly treat a Location header as a rewrite

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

pnpm test-dev-turbo test/development/app-dir/hmr-shared-css/hmr-shared-css.test.ts (turbopack)

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

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

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('body') to be visible
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>
  -   locator resolved to hidden <body>…</body>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (development/app-dir/hmr-shared-css/hmr-shared-css.test.ts:34:21)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:451:17)
  at Object.getComputedCss (development/app-dir/hmr-shared-css/hmr-shared-css.test.ts:34:42)

pnpm test test/integration/render-error-on-top-level-error/with-get-initial-props/test/index.test.js (turbopack)

  • Top Level Error > production mode > should render error page with getInitialProps (DD)
Expand output

● Top Level Error › production mode › should render error page with getInitialProps

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

  384 |   }
  385 |
> 386 |   private wrapElement(el: ElementHandle, selector: string): ElementHandleExt {
      |                                   ^
  387 |     function getComputedCss(prop: string) {
  388 |       return page.evaluate(
  389 |         function (args) {

  at lib/browsers/playwright.ts:386:35
  at Playwright._chain (lib/browsers/playwright.ts:458:27)
  at Playwright.startChain (lib/browsers/playwright.ts:449:21)
  at Playwright.waitForElementByCss (lib/browsers/playwright.ts:385:21)
  at Object.<anonymous> (integration/render-error-on-top-level-error/with-get-initial-props/test/index.test.js:35:44)
  at Proxy._chain (lib/browsers/playwright.ts:458:27)
  at Proxy.continueChain (lib/browsers/playwright.ts:446:21)
  at Proxy.text (lib/browsers/playwright.ts:322:21)
  at Object.<anonymous> (integration/render-error-on-top-level-error/with-get-initial-props/test/index.test.js:35:76)

pnpm test-start-turbo test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts (turbopack)

  • app-dir action progressive enhancement > should support formData and redirect without JS (DD)
  • app-dir action progressive enhancement > should support actions from client without JS (DD)
  • app-dir action progressive enhancement > should support headers and cookies without JS (runtime: edge) (DD)
  • app-dir action progressive enhancement > should support headers and cookies without JS (runtime: node) (DD)
Expand output

● app-dir action progressive enhancement › should support formData and redirect without JS

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

● app-dir action progressive enhancement › should support actions from client without JS

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

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

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

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

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

pnpm test-start-turbo test/e2e/app-dir/app-middleware-proxy/app-middleware-proxy-in-src-dir.test.ts (turbopack)

  • app dir - with proxy in src dir > works without crashing when using RequestStore (DD)
Expand output

● app dir - with proxy in src dir › works without crashing when using RequestStore

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

pnpm test test/integration/i18n-support-fallback-rewrite/test/index.test.js (turbopack)

  • i18n Support Root Catch-all > production mode > should navigate to other locale page and back (DD)
  • i18n Support Root Catch-all > production mode > should preload data correctly (DD)
Expand output

● i18n Support Root Catch-all › production mode › should navigate to other locale page and back

page.waitForSelector: Target page, context or browser has been closed

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (integration/i18n-support-catchall/test/index.test.js:133:19)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:471:17)
  at Object.click (integration/i18n-support-catchall/test/index.test.js:133:54)

● i18n Support Root Catch-all › production mode › should preload data correctly

browserContext.newPage: Target page, context or browser has been closed

  266 |
  267 |     await this.initContextTracing(url, context!)
> 268 |     page = await context!.newPage()
      |                           ^
  269 |
  270 |     page.setDefaultTimeout(defaultTimeout)
  271 |     page.setDefaultNavigationTimeout(defaultTimeout)

  at Playwright.newPage (lib/browsers/playwright.ts:268:27)
  at webdriver (lib/next-webdriver.ts:156:3)
  at Object.<anonymous> (integration/i18n-support-catchall/test/index.test.js:187:23)

● Test suite failed to run

browserContext.close: Target page, context or browser has been closed

  42 | export async function quit() {
  43 |   await Promise.all(pendingTeardown.map((fn) => fn()))
> 44 |   await context?.close()
     |   ^
  45 |   await browser?.close()
  46 |   context = undefined
  47 |   browser = undefined

  at quit (lib/browsers/playwright.ts:44:3)
  at Object.<anonymous> (lib/next-webdriver.ts:45:7)

pnpm test test/integration/config-mjs/test/index.test.ts (turbopack)

  • Configuration > should have env variables available on the client (DD)
Expand output

● Configuration › should have env variables available on the client

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#env') to be visible
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>
  -   locator resolved to hidden <p id="env">hello</p>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (integration/config-mjs/test/index.test.ts:55:36)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (integration/config-mjs/test/index.test.ts:55:57)

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

  • Polyfills > production mode > should alias fetch (DD)
Expand output

● Polyfills › production mode › should alias fetch

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

Expected: "pass"
Received: "computing"

  35 |         const text = await browser.elementByCss('#test-status').text()
  36 |
> 37 |         expect(text).toBe('pass')
     |                      ^
  38 |
  39 |         await browser.close()
  40 |       })

  at Object.toBe (integration/polyfills/test/index.test.js:37:22)

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

  • next/dynamic > development mode > should render dynamic server rendered values on client mount (DD)
Expand output

● next/dynamic › development mode › should render dynamic server rendered values on client mount

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#first-render') to be visible
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>
  -   locator resolved to hidden <div id="first-render">the-server-value</div>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (integration/next-dynamic/test/index.test.js:29:32)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (integration/next-dynamic/test/index.test.js:29:62)

pnpm test test/integration/next-image-legacy/base-path/test/static.test.ts (turbopack)

  • Static Image Component Tests for basePath > development mode > Should allow an image with a static src to omit height and width (DD)
  • Static Image Component Tests for basePath > development mode > Should use immutable cache-control header for static import (DD)
Expand output

● Static Image Component Tests for basePath › development mode › Should allow an image with a static src to omit height and width

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#basic-static') to be visible
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
  -   locator resolved to 2 elements. Proceeding with the first one: <img decoding="async" id="basic-static" data-nimg="fixed" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Playwright.elementByCss [as elementById] (lib/browsers/playwright.ts:425:17)
  at Object.elementById (integration/next-image-legacy/base-path/test/static.test.ts:24:26)

● Static Image Component Tests for basePath › development mode › Should use immutable cache-control header for static import

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

Expected: "public, max-age=315360000, immutable"
Received: null

  42 |     )
  43 |     const res = await fetch(url)
> 44 |     expect(res.headers.get('cache-control')).toBe(
     |                                              ^
  45 |       'public, max-age=315360000, immutable'
  46 |     )
  47 |   })

  at Object.toBe (integration/next-image-legacy/base-path/test/static.test.ts:44:46)

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

  • ReactRefreshModule > should allow any variable names (DD)
Expand output

● ReactRefreshModule › should allow any variable names

Application is in inconsistent state: timeout.

  113 |             }
  114 |             if (status !== 'pending') {
> 115 |               throw new Error(
      |                     ^
  116 |                 `Application is in inconsistent state: ${status}.`
  117 |               )
  118 |             }

  at Object.patch (lib/development-sandbox.ts:115:21)
  at Object.<anonymous> (development/acceptance/ReactRefreshModule.test.ts:25:7)

pnpm test test/integration/image-optimizer/test/minimum-cache-ttl.test.ts (turbopack)

  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should normalize invalid status codes (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should timeout for upstream image exceeding 7 seconds (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should follow redirect from http to https when maximumRedirects > 0 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should follow redirect when dangerouslyAllowLocalIP enabled (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should return 508 after redirecting too many times (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should return home page (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should handle non-ascii characters in image url (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain icns (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain jxl (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain heic (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain jp2 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain animated gif (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain animated png (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain animated png 2 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain animated webp (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not forward cookie header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow vector svg (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow svg with application header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow svg with comma header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow svg with uppercase header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow svg with wrong header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not allow pdf format (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain ico format (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain jpg format for old Safari (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain png format for old Safari (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should downlevel webp format to jpeg for old Safari (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should downlevel avif format to jpeg for old Safari (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url is missing (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when w is missing (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is missing (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is greater than 100 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is less than 1 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is not in config (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when w is 0 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when w is less than 0 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when w is not a number (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when w is not an integer (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is not a number (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when q is not an integer (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when domain is not defined in next.config.js (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when width is not in next.config.js (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should emit blur svg when width is 8 in dev but not prod (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should emit blur svg when width is less than 8 in dev but not prod (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url and webp Firefox accept header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url and png accept header (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url with invalid accept header as png (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url with invalid accept header as gif (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url with invalid accept header as tiff (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize gif (not animated) (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize tiff (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize avif (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url and old Chrome accept header as webp (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize relative url and new Chrome accept header as avif (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize avif and maintain format (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should compress avif smaller than webp at q=100 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should compress avif smaller than webp at q=75 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should compress avif smaller than webp at q=50 (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should resize absolute url from localhost (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should automatically detect image type when content-type is octet-stream (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should use cache and stale-while-revalidate when query is the same for external image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url has file protocol (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url has ftp protocol (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url is too long (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url is protocol relative (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when internal url is not an image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should fail when url fails to load an image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should use cache and stale-while-revalidate when query is the same for internal image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should use cached image file when parameters are the same for animated gif (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should set 304 status without body when etag matches if-none-match (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should maintain bmp (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should not resize if requested width is larger than original source image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should error if the resource isn't a valid image (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should error if the image file does not exist (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > should handle concurrent requests (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > recursive url is not allowed > should fail with relative next image url (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > recursive url is not allowed > should fail with encoded relative image url (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > recursive url is not allowed > should pass with absolute next image url (DD)
  • with minimumCacheTTL of 5 sec > dev support with next.config.js > recursive url is not allowed > should fail with relative image url with assetPrefix (DD)
Expand output

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should normalize invalid status codes

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789%2Fslow.png%3Fstatus%3D399&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should timeout for upstream image exceeding 7 seconds

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789%2Fslow.png%3Fdelay%3D8000&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should follow redirect from http to https when maximumRedirects > 0

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Fimage-optimization-test.vercel.app%2Ffrog.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should follow redirect when dangerouslyAllowLocalIP enabled

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789%3Fstatus%3D301%26location%3D%252Fslow.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should return 508 after redirecting too many times

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should return home page

FetchError: request to http://localhost:45103/ failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should handle non-ascii characters in image url

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2F%C3%A4%C3%B6%C3%BC%C5%A1%C4%8D%C5%99%C3%AD.png failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain icns

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.icns failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain jxl

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.jxl failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain heic

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.heic failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain jp2

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.jp2 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain animated gif

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fanimated.gif failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain animated png

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fanimated.png failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain animated png 2

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fanimated2.png failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain animated webp

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fanimated.webp failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not forward cookie header

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fapi%2Fconditional-cookie failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow vector svg

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.svg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow svg with application header

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fapi%2Fapplication.svg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow svg with comma header

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fapi%2Fcomma.svg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow svg with uppercase header

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fapi%2Fuppercase.svg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow svg with wrong header

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Fapi%2Fwrong-header.svg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not allow pdf format

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.pdf failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain ico format

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.ico failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain jpg format for old Safari

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.jpg failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain png format for old Safari

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.png failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should downlevel webp format to jpeg for old Safari

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.webp failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should downlevel avif format to jpeg for old Safari

FetchError: request to http://localhost:45103/_next/image?w=400&q=100&url=%2Ftest.avif failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url is missing

FetchError: request to http://localhost:45103/_next/image?w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when w is missing

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is missing

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is greater than 100

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=101 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is less than 1

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=0 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is not in config

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=13 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when w is 0

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=0&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when w is less than 0

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=-100&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when w is not a number

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=foo&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when w is not an integer

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=99.9&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is not a number

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=foo failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when q is not an integer

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=99.9 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when domain is not defined in next.config.js

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Fvercel.com%2Fbutton&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when width is not in next.config.js

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=1000&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should emit blur svg when width is 8 in dev but not prod

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=8&q=70 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should emit blur svg when width is less than 8 in dev but not prod

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=3&q=70 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url and webp Firefox accept header

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url and png accept header

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url with invalid accept header as png

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url with invalid accept header as gif

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.gif&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url with invalid accept header as tiff

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.tiff&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize gif (not animated)

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.gif&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize tiff

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.tiff&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize avif

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.avif&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url and old Chrome accept header as webp

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize relative url and new Chrome accept header as avif

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize avif and maintain format

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.avif&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should compress avif smaller than webp at q=100

FetchError: request to http://localhost:45103/_next/image?url=%2Fmountains.jpg&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should compress avif smaller than webp at q=75

FetchError: request to http://localhost:45103/_next/image?url=%2Fmountains.jpg&w=400&q=75 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should compress avif smaller than webp at q=50

FetchError: request to http://localhost:45103/_next/image?url=%2Fmountains.jpg&w=400&q=50 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should resize absolute url from localhost

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A45103%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should automatically detect image type when content-type is octet-stream

FetchError: request to http://localhost:45103/png-as-octet-stream failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should use cache and stale-while-revalidate when query is the same for external image

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789%2Fslow.png%3Fdelay%3D500&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url has file protocol

FetchError: request to http://localhost:45103/_next/image?url=file%3A%2F%2Fexample.vercel.sh%3A45103%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url has ftp protocol

FetchError: request to http://localhost:45103/_next/image?url=ftp%3A%2F%2Fexample.vercel.sh%3A45103%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url is too long

FetchError: request to http://localhost:45103/_next/image?url=%2Faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url is protocol relative

FetchError: request to http://localhost:45103/_next/image?url=%2F%2Fexample.vercel.sh&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › recursive url is not allowed › should fail with relative next image url

FetchError: request to http://localhost:45103/_next/image?url=%2F_next%2Fimage%3Furl%3Dtest.pngw%3D1%26q%3D75&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › recursive url is not allowed › should fail with encoded relative image url

FetchError: request to http://localhost:45103/_next/image?url=%252F_next%252Fimage%253Furl%253Dtest.pngw%253D1%2526q%253D1&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › recursive url is not allowed › should pass with absolute next image url

FetchError: request to http://localhost:45103/_next/image?url=https%3A%2F%2Fimage-optimization-test.vercel.app%2F_next%2Fimage%3Furl%3D%252Ffrog.jpg%26w%3D1024%26q%3D75&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › recursive url is not allowed › should fail with relative image url with assetPrefix

FetchError: request to http://localhost:45103/_next/image?url=%2Fassets%2F_next%2Fimage%3Furl%3D%252Ftest.png%26w%3D128%26q%3D75&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when internal url is not an image

FetchError: request to http://localhost:45103/_next/image?url=%2Fapi%2Fno-header&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should fail when url fails to load an image

FetchError: request to http://localhost:45103/_next/image?w=400&url=http%3A%2F%2Flocalhost%3A45103%2Fnot-an-image&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should use cache and stale-while-revalidate when query is the same for internal image

FetchError: request to http://localhost:45103/_next/image?url=%2Fapi%2Fstateful%2Ftest.png&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should use cached image file when parameters are the same for animated gif

FetchError: request to http://localhost:45103/_next/image?url=%2Fanimated.gif&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should set 304 status without body when etag matches if-none-match

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.jpg&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should maintain bmp

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.bmp&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should not resize if requested width is larger than original source image

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.jpg&w=1080&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should error if the resource isn't a valid image

FetchError: request to http://localhost:45103/_next/image?url=%2Ftest.txt&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should error if the image file does not exist

FetchError: request to http://localhost:45103/_next/image?url=%2Fdoes_not_exist.jpg&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

● with minimumCacheTTL of 5 sec › dev support with next.config.js › should handle concurrent requests

FetchError: request to http://localhost:45103/_next/image?url=http%3A%2F%2Flocalhost%3A44789%2Fslow.png%3Fdelay%3D500&w=400&q=100 failed, reason: connect ECONNREFUSED 127.0.0.1:45103

  at ClientRequest.<anonymous> (../node_modules/.pnpm/node-fetch@2.6.7_encoding@0.1.13/node_modules/node-fetch/lib/index.js:1491:11)

pnpm test-dev-turbo test/development/basic/misc.test.ts (turbopack)

  • misc basic dev tests, basePath: "" > should set process.env.NODE_ENV in development (DD)
  • misc basic dev tests, basePath: "/docs" > should set process.env.NODE_ENV in development (DD)
Expand output

● misc basic dev tests, basePath: "" › should set process.env.NODE_ENV in development

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#node-env') to be visible
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (development/basic/misc.test.ts:28:37)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (development/basic/misc.test.ts:28:63)

● misc basic dev tests, basePath: "/docs" › should set process.env.NODE_ENV in development

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('#node-env') to be visible
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>
  -   locator resolved to hidden <div id="node-env">development</div>

  519 |
  520 |     return this.startChain(async () => {
> 521 |       const el = await page.waitForSelector(selector, {
      |                             ^
  522 |         timeout,
  523 |         state,
  524 |       })

  at waitForSelector (lib/browsers/playwright.ts:521:29)
  at Playwright._chain (lib/browsers/playwright.ts:651:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:632:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:520:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:405:17)
  at Object.elementByCss (development/basic/misc.test.ts:28:37)
  at Proxy._chain (lib/browsers/playwright.ts:651:23)
  at Proxy._chain (lib/browsers/playwright.ts:627:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:433:17)
  at Object.text (development/basic/misc.test.ts:28:63)

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

  • app dir - with output export - dynamic page dev > development mode > should work in dev with dynamicPage 'force-dynamic' (DD)
Expand output

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

Expected Redbox but found no visible one.

  268 |         const url = dynamicPage ? '/another/first' : '/api/json'
  269 |         const browser = await webdriver(port, url)
> 270 |         await waitForRedbox(browser)
      |         ^
  271 |         const header = await getRedboxHeader(browser)
  272 |         const source = await getRedboxSource(browser)
  273 |         if (expectedErrMsg instanceof RegExp) {

  at runTests (integration/app-dir-export/test/utils.ts:270:9)
  at integration/app-dir-export/test/dynamicpage-dev.test.ts:19:11

pnpm test-start-turbo test/e2e/app-dir/app-middleware-proxy/app-middleware-proxy-without-pages-dir.test.ts (turbopack)

  • app dir - proxy without pages dir > Updates headers (DD)
Expand output

● app dir - proxy without pages dir › Updates headers

next build failed with code/signal 1

  75 |             if (code || signal)
  76 |               reject(
> 77 |                 new Error(
     |                 ^
  78 |                   `next build failed with code/signal ${code || signal}`
  79 |                 )
  80 |               )

  at ChildProcess.<anonymous> (lib/next-modes/next-start.ts:77:17)

pnpm test test/integration/basepath-root-catch-all/test/index.test.js (turbopack)

  • production mode > should use correct data URL for root catch-all (DD)
Expand output

● production mode › should use correct data URL for root catch-all

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

Expected: "/_next/data/8oKp6dvHj9NQxK1rLd-mE/root/catch-all.json"
Received: "/root/catch-all"

  24 |     const dataUrl = await browser.elementByCss('#url').text()
  25 |     const { pathname } = url.parse(dataUrl)
> 26 |     expect(pathname).toBe(`/_next/data/${buildId}/root/catch-all.json`)
     |                      ^
  27 |   })
  28 | }
  29 |

  at Object.toBe (integration/basepath-root-catch-all/test/index.test.js:26:22)

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

  • ReactRefreshLogBox-builtins app > Module not found missing global CSS (DD)
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."

  251 |     const { browser, session } = sandbox
  252 |     if (isTurbopack) {
> 253 |       await expect(browser).toDisplayRedbox(`
      |                             ^
  254 |        {
  255 |          "description": "Module not found: Can't resolve './non-existent.css'",
  256 |          "environmentLabel": null,

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

pnpm test packages/next-codemod/transforms/__tests__/add-missing-react-import.test.js

  • add-missing-react-import > transforms correctly using "add-missing-react-import/missing-react-import-in-component" data (DD)
Expand output

● add-missing-react-import › transforms correctly using "add-missing-react-import/missing-react-import-in-component" data

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

- Expected  - 15
+ Received  + 15

- import React, { Children, isValidElement } from 'react';
-
+ import React, { Children, isValidElement } from 'react';
+ 
- function Heading(props) {
+ function Heading(props) {
-   const { component, className, children, ...rest } = props;
+   const { component, className, children, ...rest } = props;
-   return React.cloneElement(
+   return React.cloneElement(
-     component,
+     component,
-     {
+     {
-       className: [className, component.props.className || ''].join(' '),
+       className: [className, component.props.className || ''].join(' '),
-       ...rest
+       ...rest
-     },
+     },
-     children
+     children
-   );
+   );
- }
-
-
+ }
+ 
+ 
  export default Heading;

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

pnpm test-dev test/e2e/app-dir/fallback-shells/fallback-shells.test.ts

  • fallback-shells > without IO > should start and not postpone the response (DD)
Expand output

● fallback-shells › without IO › should start and not postpone the response

thrown: "Timed out waiting for the response of /without-io/world"

   8 |
   9 |   describe('without IO', () => {
> 10 |     it('should start and not postpone the response', async () => {
     |     ^
  11 |       const { browser, response } =
  12 |         await next.browserWithResponse('/without-io/world')
  13 |

  at it (e2e/app-dir/fallback-shells/fallback-shells.test.ts:10:5)
  at describe (e2e/app-dir/fallback-shells/fallback-shells.test.ts:9:3)
  at Object.describe (e2e/app-dir/fallback-shells/fallback-shells.test.ts:4:1)

pnpm test-start test/e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts

  • app dir client cache with parallel routes > prefetch={true} > should prefetch the full page (DD)
  • app dir client cache with parallel routes > prefetch={true} > should re-use the cache for the full page, only for 5 mins (DD)
Expand output

● app dir client cache with parallel routes › prefetch={true} › should prefetch the full page

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

  16 |
  17 |   describe('prefetch={true}', () => {
> 18 |     it('should prefetch the full page', async () => {
     |     ^
  19 |       let act: ReturnType<typeof createRouterAct>
  20 |       const browser = await next.browser('/', {
  21 |         beforePageLoad(page) {

  at it (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:18:5)
  at describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:17:3)
  at Object.describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:6:1)

● app dir client cache with parallel routes › prefetch={true} › should re-use the cache for the full page, only for 5 mins

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

  44 |     })
  45 |
> 46 |     it('should re-use the cache for the full page, only for 5 mins', async () => {
     |     ^
  47 |       let act: ReturnType<typeof createRouterAct>
  48 |       const browser = await next.browser('/', {
  49 |         beforePageLoad(page) {

  at it (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:46:5)
  at describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:17:3)
  at Object.describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:6:1)

@ijjk
Copy link
Member

ijjk commented Nov 6, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
buildDuration 28.5s 27.2s N/A
buildDurationCached 26.5s 21.9s N/A
nodeModulesSize 452 MB 453 MB ⚠️ +827 kB
nextStartRea..uration (ms) 765ms 842ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
436-HASH.js gzip 5.32 kB 5.32 kB N/A
4779.HASH.js gzip 169 B 169 B
9760-HASH.js gzip 54.4 kB 54.6 kB ⚠️ +192 B
c57d0559-HASH.js gzip 62.3 kB 62.1 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 253 B 256 B N/A
main-HASH.js gzip 39.8 kB 39.8 kB N/A
webpack-HASH.js gzip 1.69 kB 1.69 kB
Overall change 116 kB 116 kB ⚠️ +192 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js null_safe_access_analysis 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 null_safe_access_analysis Change
_app-HASH.js gzip 193 B 194 B N/A
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 334 B 334 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB N/A
edge-ssr-HASH.js gzip 255 B 254 B N/A
head-HASH.js gzip 350 B 351 B N/A
hooks-HASH.js gzip 384 B 384 B
image-HASH.js gzip 4.78 kB 4.77 kB N/A
index-HASH.js gzip 260 B 259 B N/A
link-HASH.js gzip 2.5 kB 2.5 kB N/A
routerDirect..HASH.js gzip 316 B 320 B N/A
script-HASH.js gzip 388 B 388 B
withRouter-HASH.js gzip 316 B 314 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.39 kB 1.39 kB
Client Build Manifests
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
_buildManifest.js gzip 718 B 720 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
index.html gzip 524 B 523 B N/A
link.html gzip 536 B 538 B N/A
withRouter.html gzip 521 B 519 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 255 kB 260 kB ⚠️ +5.19 kB
Overall change 255 kB 260 kB ⚠️ +5.19 kB
Middleware size Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
middleware-b..fest.js gzip 636 B 636 B
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 32.8 kB 33 kB ⚠️ +167 B
edge-runtime..pack.js gzip 846 B 846 B
Overall change 34.5 kB 34.6 kB ⚠️ +167 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
app-page-exp...dev.js gzip 295 kB 296 kB ⚠️ +524 B
app-page-exp..prod.js gzip 155 kB 161 kB ⚠️ +6.91 kB
app-page-tur...dev.js gzip 295 kB 295 kB ⚠️ +518 B
app-page-tur..prod.js gzip 155 kB 161 kB ⚠️ +6.9 kB
app-page-tur...dev.js gzip 292 kB 291 kB N/A
app-page-tur..prod.js gzip 153 kB 159 kB ⚠️ +6.19 kB
app-page.run...dev.js gzip 292 kB 292 kB N/A
app-page.run..prod.js gzip 153 kB 159 kB ⚠️ +6.19 kB
app-route-ex...dev.js gzip 70.7 kB 70.8 kB N/A
app-route-ex..prod.js gzip 49.4 kB 49.4 kB N/A
app-route-tu...dev.js gzip 70.7 kB 70.8 kB N/A
app-route-tu..prod.js gzip 49.5 kB 49.4 kB N/A
app-route-tu...dev.js gzip 70.4 kB 70.4 kB N/A
app-route-tu..prod.js gzip 49.3 kB 49.1 kB N/A
app-route.ru...dev.js gzip 70.4 kB 70.4 kB N/A
app-route.ru..prod.js gzip 49.2 kB 49.1 kB N/A
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 43.2 kB 43.3 kB N/A
pages-api-tu..prod.js gzip 33.1 kB 33.2 kB N/A
pages-api.ru...dev.js gzip 43.2 kB 43.3 kB N/A
pages-api.ru..prod.js gzip 33.1 kB 33.1 kB N/A
pages-turbo....dev.js gzip 52.8 kB 52.8 kB N/A
pages-turbo...prod.js gzip 40.1 kB 40.1 kB N/A
pages.runtim...dev.js gzip 52.7 kB 52.8 kB N/A
pages.runtim..prod.js gzip 40.1 kB 40 kB N/A
server.runti..prod.js gzip 78.9 kB 78.9 kB N/A
Overall change 1.21 MB 1.23 MB ⚠️ +27.2 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js null_safe_access_analysis Change
0.pack gzip 3.25 MB 3.25 MB ⚠️ +1.78 kB
index.pack gzip 95 kB 95.9 kB ⚠️ +849 B
Overall change 3.34 MB 3.35 MB ⚠️ +2.63 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js
failed to diff
Diff for dynamic-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 1033: /***/ (
+    /***/ 431: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/dynamic",
         function () {
-          return __webpack_require__(6490);
+          return __webpack_require__(8084);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 5323: /***/ (
+    /***/ 2699: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -60,7 +60,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(2223)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(9289);
+      const _loadablecontextsharedruntime = __webpack_require__(3785);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -293,73 +293,34 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 6490: /***/ (
+    /***/ 3785: /***/ (
       __unused_webpack_module,
-      __webpack_exports__,
+      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 */
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
       });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(1503);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7320);
-      /* 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() */ 4779)
-            .then(__webpack_require__.bind(__webpack_require__, 4779))
-            .then((mod) => mod.Hello),
-        {
-          loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 4779],
-          },
-        }
+      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__(2223)
       );
-      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;
-
-      /***/
-    },
-
-    /***/ 7320: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7340);
+      const LoadableContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
 
       /***/
     },
 
-    /***/ 7340: /***/ (module, exports, __webpack_require__) => {
+    /***/ 6828: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -392,7 +353,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
         __webpack_require__(2223)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5323)
+        __webpack_require__(2699)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -492,29 +453,68 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 9289: /***/ (
+    /***/ 7514: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(6828);
+
+      /***/
+    },
+
+    /***/ 8084: /***/ (
       __unused_webpack_module,
-      exports,
+      __webpack_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;
-        },
+      __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 */
       });
-      const _interop_require_default = __webpack_require__(1532);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(2223)
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(1503);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(7514);
+      /* 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() */ 9573)
+            .then(__webpack_require__.bind(__webpack_require__, 9573))
+            .then((mod) => mod.Hello),
+        {
+          loadableGenerated: {
+            webpack: () => [/*require.resolve*/ 9573],
+          },
+        }
       );
-      const LoadableContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+      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;
 
       /***/
     },
@@ -524,7 +524,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1033)
+      __webpack_exec__(431)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for edge-ssr-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [676],
   {
-    /***/ 1819: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/edge-ssr",
-        function () {
-          return __webpack_require__(7521);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7521: /***/ (
+    /***/ 983: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -37,13 +20,30 @@
 
       /***/
     },
+
+    /***/ 985: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/edge-ssr",
+        function () {
+          return __webpack_require__(983);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1819)
+      __webpack_exec__(985)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for head-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [5350],
   {
-    /***/ 619: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/head",
-        function () {
-          return __webpack_require__(9891);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7997: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(6705);
-
-      /***/
-    },
-
-    /***/ 9891: /***/ (
+    /***/ 1417: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7997);
+        __webpack_require__(5171);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +49,40 @@
 
       /***/
     },
+
+    /***/ 1937: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/head",
+        function () {
+          return __webpack_require__(1417);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 5171: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(7505);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(619)
+      __webpack_exec__(1937)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9804],
   {
-    /***/ 1679: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(4655);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 4655: /***/ (
+    /***/ 1598: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 3925: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(1598);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1679)
+      __webpack_exec__(3925)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2983],
   {
-    /***/ 797: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/image",
-        function () {
-          return __webpack_require__(5999);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 1713: /***/ (__unused_webpack_module, exports) => {
+    /***/ 881: /***/ (__unused_webpack_module, exports) => {
       "use strict";
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
@@ -58,7 +41,7 @@
       /***/
     },
 
-    /***/ 2263: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1511: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -136,7 +119,137 @@
       /***/
     },
 
-    /***/ 2728: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1744: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "default", {
+        enumerable: true,
+        get: function () {
+          return _default;
+        },
+      });
+      const _findclosestquality = __webpack_require__(7054);
+      function defaultLoader({ config, src, width, quality }) {
+        if (
+          src.startsWith("/") &&
+          src.includes("?") &&
+          config.localPatterns?.length === 1 &&
+          config.localPatterns[0].pathname === "**" &&
+          config.localPatterns[0].search === ""
+        ) {
+          throw Object.defineProperty(
+            new Error(
+              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
+                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
+            ),
+            "__NEXT_ERROR_CODE",
+            {
+              value: "E871",
+              enumerable: false,
+              configurable: true,
+            }
+          );
+        }
+        if (false) {
+        }
+        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
+        return `${config.path}?url=${encodeURIComponent(
+          src
+        )}&w=${width}&q=${q}${
+          src.startsWith("/_next/static/media/") && false ? 0 : ""
+        }`;
+      }
+      // We use this to determine if the import is the default loader
+      // or a custom loader defined by the user in next.config.js
+      defaultLoader.__next_img_default = true;
+      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
+
+      /***/
+    },
+
+    /***/ 2388: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      // ESM COMPAT FLAG
+      __webpack_require__.r(__webpack_exports__);
+
+      // EXPORTS
+      __webpack_require__.d(__webpack_exports__, {
+        __N_SSP: () => /* binding */ __N_SSP,
+        default: () => /* binding */ pages_image,
+      });
+
+      // EXTERNAL MODULE: ./node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-runtime.js
+      var jsx_runtime = __webpack_require__(1503);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/image.js
+      var next_image = __webpack_require__(3866);
+      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;
+
+      /***/
+    },
+
+    /***/ 3866: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(6888);
+
+      /***/
+    },
+
+    /***/ 4483: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/image",
+        function () {
+          return __webpack_require__(2388);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 6600: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -158,17 +271,17 @@
         __webpack_require__(9507)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(6705)
+        __webpack_require__(7505)
       );
-      const _getimgprops = __webpack_require__(3556);
-      const _imageconfig = __webpack_require__(3157);
-      const _imageconfigcontextsharedruntime = __webpack_require__(9323);
-      const _warnonce = __webpack_require__(6173);
-      const _routercontextsharedruntime = __webpack_require__(6046);
+      const _getimgprops = __webpack_require__(9588);
+      const _imageconfig = __webpack_require__(2645);
+      const _imageconfigcontextsharedruntime = __webpack_require__(5451);
+      const _warnonce = __webpack_require__(7549);
+      const _routercontextsharedruntime = __webpack_require__(5470);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3744)
+        __webpack_require__(1744)
       );
-      const _usemergedref = __webpack_require__(2263);
+      const _usemergedref = __webpack_require__(1511);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -495,7 +608,96 @@
       /***/
     },
 
-    /***/ 3556: /***/ (
+    /***/ 6888: /***/ (
+      __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__(9588);
+      const _imagecomponent = __webpack_require__(6600);
+      const _imageloader = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1744)
+      );
+      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: [32, 48, 64, 96, 128, 256, 384],
+            qualities: [75],
+            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
+
+      /***/
+    },
+
+    /***/ 7054: /***/ (__unused_webpack_module, exports) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "findClosestQuality", {
+        enumerable: true,
+        get: function () {
+          return findClosestQuality;
+        },
+      });
+      function findClosestQuality(quality, config) {
+        const q = quality || 75;
+        if (!config?.qualities?.length) {
+          return q;
+        }
+        return config.qualities.reduce(
+          (prev, cur) => (Math.abs(cur - q) < Math.abs(prev - q) ? cur : prev),
+          0
+        );
+      } //# sourceMappingURL=find-closest-quality.js.map
+
+      /***/
+    },
+
+    /***/ 9588: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -511,9 +713,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(6173);
-      const _imageblursvg = __webpack_require__(1713);
-      const _imageconfig = __webpack_require__(3157);
+      const _warnonce = __webpack_require__(7549);
+      const _imageblursvg = __webpack_require__(881);
+      const _imageconfig = __webpack_require__(2645);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -943,215 +1145,13 @@
 
       /***/
     },
-
-    /***/ 3744: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return _default;
-        },
-      });
-      const _findclosestquality = __webpack_require__(8494);
-      function defaultLoader({ config, src, width, quality }) {
-        if (
-          src.startsWith("/") &&
-          src.includes("?") &&
-          config.localPatterns?.length === 1 &&
-          config.localPatterns[0].pathname === "**" &&
-          config.localPatterns[0].search === ""
-        ) {
-          throw Object.defineProperty(
-            new Error(
-              `Image with src "${src}" is using a query string which is not configured in images.localPatterns.` +
-                `\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`
-            ),
-            "__NEXT_ERROR_CODE",
-            {
-              value: "E871",
-              enumerable: false,
-              configurable: true,
-            }
-          );
-        }
-        if (false) {
-        }
-        const q = (0, _findclosestquality.findClosestQuality)(quality, config);
-        return `${config.path}?url=${encodeURIComponent(
-          src
-        )}&w=${width}&q=${q}${
-          src.startsWith("/_next/static/media/") && false ? 0 : ""
-        }`;
-      }
-      // We use this to determine if the import is the default loader
-      // or a custom loader defined by the user in next.config.js
-      defaultLoader.__next_img_default = true;
-      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
-
-      /***/
-    },
-
-    /***/ 4292: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7896);
-
-      /***/
-    },
-
-    /***/ 5999: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      // ESM COMPAT FLAG
-      __webpack_require__.r(__webpack_exports__);
-
-      // EXPORTS
-      __webpack_require__.d(__webpack_exports__, {
-        __N_SSP: () => /* binding */ __N_SSP,
-        default: () => /* binding */ pages_image,
-      });
-
-      // EXTERNAL MODULE: ./node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-runtime.js
-      var jsx_runtime = __webpack_require__(1503);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/image.js
-      var next_image = __webpack_require__(4292);
-      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;
-
-      /***/
-    },
-
-    /***/ 7896: /***/ (
-      __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__(3556);
-      const _imagecomponent = __webpack_require__(2728);
-      const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3744)
-      );
-      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: [32, 48, 64, 96, 128, 256, 384],
-            qualities: [75],
-            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
-
-      /***/
-    },
-
-    /***/ 8494: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "findClosestQuality", {
-        enumerable: true,
-        get: function () {
-          return findClosestQuality;
-        },
-      });
-      function findClosestQuality(quality, config) {
-        const q = quality || 75;
-        if (!config?.qualities?.length) {
-          return q;
-        }
-        return config.qualities.reduce(
-          (prev, cur) => (Math.abs(cur - q) < Math.abs(prev - q) ? cur : prev),
-          0
-        );
-      } //# sourceMappingURL=find-closest-quality.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(797)
+      __webpack_exec__(4483)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,7 +1,338 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 69: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1511: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useMergedRef", {
+        enumerable: true,
+        get: function () {
+          return useMergedRef;
+        },
+      });
+      const _react = __webpack_require__(2223);
+      function useMergedRef(refA, refB) {
+        const cleanupA = (0, _react.useRef)(null);
+        const cleanupB = (0, _react.useRef)(null);
+        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+        // (because it hasn't been updated for React 19)
+        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+        return (0, _react.useCallback)(
+          (current) => {
+            if (current === null) {
+              const cleanupFnA = cleanupA.current;
+              if (cleanupFnA) {
+                cleanupA.current = null;
+                cleanupFnA();
+              }
+              const cleanupFnB = cleanupB.current;
+              if (cleanupFnB) {
+                cleanupB.current = null;
+                cleanupFnB();
+              }
+            } else {
+              if (refA) {
+                cleanupA.current = applyRef(refA, current);
+              }
+              if (refB) {
+                cleanupB.current = applyRef(refB, current);
+              }
+            }
+          },
+          [refA, refB]
+        );
+      }
+      function applyRef(refA, current) {
+        if (typeof refA === "function") {
+          const cleanup = refA(current);
+          if (typeof cleanup === "function") {
+            return cleanup;
+          } else {
+            return () => refA(null);
+          }
+        } else {
+          refA.current = current;
+          return () => {
+            refA.current = null;
+          };
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-merged-ref.js.map
+
+      /***/
+    },
+
+    /***/ 2025: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(4591);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 3267: /***/ (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__(2371);
+      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
+
+      /***/
+    },
+
+    /***/ 4591: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(1503);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(6929);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_link__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      function aLink(props) {
+        return /*#__PURE__*/ (0,
+        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+          children: [
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+              children: "A Link page!",
+            }),
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+              {
+                href: "/",
+                children: "Go to /",
+              }
+            ),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+
+      /***/
+    },
+
+    /***/ 6929: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(8885);
+
+      /***/
+    },
+
+    /***/ 7686: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useIntersection", {
+        enumerable: true,
+        get: function () {
+          return useIntersection;
+        },
+      });
+      const _react = __webpack_require__(2223);
+      const _requestidlecallback = __webpack_require__(901);
+      const hasIntersectionObserver =
+        typeof IntersectionObserver === "function";
+      const observers = new Map();
+      const idList = [];
+      function createObserver(options) {
+        const id = {
+          root: options.root || null,
+          margin: options.rootMargin || "",
+        };
+        const existing = idList.find(
+          (obj) => obj.root === id.root && obj.margin === id.margin
+        );
+        let instance;
+        if (existing) {
+          instance = observers.get(existing);
+          if (instance) {
+            return instance;
+          }
+        }
+        const elements = new Map();
+        const observer = new IntersectionObserver((entries) => {
+          entries.forEach((entry) => {
+            const callback = elements.get(entry.target);
+            const isVisible =
+              entry.isIntersecting || entry.intersectionRatio > 0;
+            if (callback && isVisible) {
+              callback(isVisible);
+            }
+          });
+        }, options);
+        instance = {
+          id,
+          observer,
+          elements,
+        };
+        idList.push(id);
+        observers.set(id, instance);
+        return instance;
+      }
+      function observe(element, callback, options) {
+        const { id, observer, elements } = createObserver(options);
+        elements.set(element, callback);
+        observer.observe(element);
+        return function unobserve() {
+          elements.delete(element);
+          observer.unobserve(element);
+          // Destroy observer when there's nothing left to watch:
+          if (elements.size === 0) {
+            observer.disconnect();
+            observers.delete(id);
+            const index = idList.findIndex(
+              (obj) => obj.root === id.root && obj.margin === id.margin
+            );
+            if (index > -1) {
+              idList.splice(index, 1);
+            }
+          }
+        };
+      }
+      function useIntersection({ rootRef, rootMargin, disabled }) {
+        const isDisabled = disabled || !hasIntersectionObserver;
+        const [visible, setVisible] = (0, _react.useState)(false);
+        const elementRef = (0, _react.useRef)(null);
+        const setElement = (0, _react.useCallback)((element) => {
+          elementRef.current = element;
+        }, []);
+        (0, _react.useEffect)(() => {
+          if (hasIntersectionObserver) {
+            if (isDisabled || visible) return;
+            const element = elementRef.current;
+            if (element && element.tagName) {
+              const unobserve = observe(
+                element,
+                (isVisible) => isVisible && setVisible(isVisible),
+                {
+                  root: rootRef?.current,
+                  rootMargin,
+                }
+              );
+              return unobserve;
+            }
+          } else {
+            if (!visible) {
+              const idleCallback = (0,
+              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+              return () =>
+                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+            }
+          }
+          // eslint-disable-next-line react-hooks/exhaustive-deps
+        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+        const resetVisible = (0, _react.useCallback)(() => {
+          setVisible(false);
+        }, []);
+        return [setElement, visible, resetVisible];
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-intersection.js.map
+
+      /***/
+    },
+
+    /***/ 8101: /***/ (__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
+
+      /***/
+    },
+
+    /***/ 8885: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -28,17 +359,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(2223)
       );
-      const _resolvehref = __webpack_require__(2275);
-      const _islocalurl = __webpack_require__(3179);
-      const _formaturl = __webpack_require__(5486);
-      const _utils = __webpack_require__(3708);
-      const _addlocale = __webpack_require__(8225);
-      const _routercontextsharedruntime = __webpack_require__(6046);
-      const _useintersection = __webpack_require__(2678);
-      const _getdomainlocale = __webpack_require__(4499);
-      const _addbasepath = __webpack_require__(7434);
-      const _usemergedref = __webpack_require__(2263);
-      const _erroronce = __webpack_require__(2197);
+      const _resolvehref = __webpack_require__(7379);
+      const _islocalurl = __webpack_require__(4843);
+      const _formaturl = __webpack_require__(9374);
+      const _utils = __webpack_require__(3116);
+      const _addlocale = __webpack_require__(8065);
+      const _routercontextsharedruntime = __webpack_require__(5470);
+      const _useintersection = __webpack_require__(7686);
+      const _getdomainlocale = __webpack_require__(3267);
+      const _addbasepath = __webpack_require__(1450);
+      const _usemergedref = __webpack_require__(1511);
+      const _erroronce = __webpack_require__(8101);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -416,344 +747,13 @@
 
       /***/
     },
-
-    /***/ 2197: /***/ (__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
-
-      /***/
-    },
-
-    /***/ 2263: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "useMergedRef", {
-        enumerable: true,
-        get: function () {
-          return useMergedRef;
-        },
-      });
-      const _react = __webpack_require__(2223);
-      function useMergedRef(refA, refB) {
-        const cleanupA = (0, _react.useRef)(null);
-        const cleanupB = (0, _react.useRef)(null);
-        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
-        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
-        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
-        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
-        // (because it hasn't been updated for React 19)
-        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
-        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
-        return (0, _react.useCallback)(
-          (current) => {
-            if (current === null) {
-              const cleanupFnA = cleanupA.current;
-              if (cleanupFnA) {
-                cleanupA.current = null;
-                cleanupFnA();
-              }
-              const cleanupFnB = cleanupB.current;
-              if (cleanupFnB) {
-                cleanupB.current = null;
-                cleanupFnB();
-              }
-            } else {
-              if (refA) {
-                cleanupA.current = applyRef(refA, current);
-              }
-              if (refB) {
-                cleanupB.current = applyRef(refB, current);
-              }
-            }
-          },
-          [refA, refB]
-        );
-      }
-      function applyRef(refA, current) {
-        if (typeof refA === "function") {
-          const cleanup = refA(current);
-          if (typeof cleanup === "function") {
-            return cleanup;
-          } else {
-            return () => refA(null);
-          }
-        } else {
-          refA.current = current;
-          return () => {
-            refA.current = null;
-          };
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-merged-ref.js.map
-
-      /***/
-    },
-
-    /***/ 2369: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(1503);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(6691);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_link__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      function aLink(props) {
-        return /*#__PURE__*/ (0,
-        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
-          children: [
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
-              children: "A Link page!",
-            }),
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
-              {
-                href: "/",
-                children: "Go to /",
-              }
-            ),
-          ],
-        });
-      }
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
-
-      /***/
-    },
-
-    /***/ 2678: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "useIntersection", {
-        enumerable: true,
-        get: function () {
-          return useIntersection;
-        },
-      });
-      const _react = __webpack_require__(2223);
-      const _requestidlecallback = __webpack_require__(4213);
-      const hasIntersectionObserver =
-        typeof IntersectionObserver === "function";
-      const observers = new Map();
-      const idList = [];
-      function createObserver(options) {
-        const id = {
-          root: options.root || null,
-          margin: options.rootMargin || "",
-        };
-        const existing = idList.find(
-          (obj) => obj.root === id.root && obj.margin === id.margin
-        );
-        let instance;
-        if (existing) {
-          instance = observers.get(existing);
-          if (instance) {
-            return instance;
-          }
-        }
-        const elements = new Map();
-        const observer = new IntersectionObserver((entries) => {
-          entries.forEach((entry) => {
-            const callback = elements.get(entry.target);
-            const isVisible =
-              entry.isIntersecting || entry.intersectionRatio > 0;
-            if (callback && isVisible) {
-              callback(isVisible);
-            }
-          });
-        }, options);
-        instance = {
-          id,
-          observer,
-          elements,
-        };
-        idList.push(id);
-        observers.set(id, instance);
-        return instance;
-      }
-      function observe(element, callback, options) {
-        const { id, observer, elements } = createObserver(options);
-        elements.set(element, callback);
-        observer.observe(element);
-        return function unobserve() {
-          elements.delete(element);
-          observer.unobserve(element);
-          // Destroy observer when there's nothing left to watch:
-          if (elements.size === 0) {
-            observer.disconnect();
-            observers.delete(id);
-            const index = idList.findIndex(
-              (obj) => obj.root === id.root && obj.margin === id.margin
-            );
-            if (index > -1) {
-              idList.splice(index, 1);
-            }
-          }
-        };
-      }
-      function useIntersection({ rootRef, rootMargin, disabled }) {
-        const isDisabled = disabled || !hasIntersectionObserver;
-        const [visible, setVisible] = (0, _react.useState)(false);
-        const elementRef = (0, _react.useRef)(null);
-        const setElement = (0, _react.useCallback)((element) => {
-          elementRef.current = element;
-        }, []);
-        (0, _react.useEffect)(() => {
-          if (hasIntersectionObserver) {
-            if (isDisabled || visible) return;
-            const element = elementRef.current;
-            if (element && element.tagName) {
-              const unobserve = observe(
-                element,
-                (isVisible) => isVisible && setVisible(isVisible),
-                {
-                  root: rootRef?.current,
-                  rootMargin,
-                }
-              );
-              return unobserve;
-            }
-          } else {
-            if (!visible) {
-              const idleCallback = (0,
-              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
-              return () =>
-                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
-            }
-          }
-          // eslint-disable-next-line react-hooks/exhaustive-deps
-        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
-        const resetVisible = (0, _react.useCallback)(() => {
-          setVisible(false);
-        }, []);
-        return [setElement, visible, resetVisible];
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-intersection.js.map
-
-      /***/
-    },
-
-    /***/ 4499: /***/ (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__(1379);
-      const basePath =
-        /* unused pure expression or super */ null && (false || "");
-      function getDomainLocale(path, locale, locales, domainLocales) {
-        if (false) {
-        } else {
-          return false;
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=get-domain-locale.js.map
-
-      /***/
-    },
-
-    /***/ 6691: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(69);
-
-      /***/
-    },
-
-    /***/ 6771: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(2369);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6771)
+      __webpack_exec__(2025)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,7 +1,34 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 97: /***/ (
+    /***/ 417: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/routerDirect",
+        function () {
+          return __webpack_require__(5491);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 1840: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(3252);
+
+      /***/
+    },
+
+    /***/ 5491: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +43,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -35,40 +62,13 @@
 
       /***/
     },
-
-    /***/ 4283: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/routerDirect",
-        function () {
-          return __webpack_require__(97);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 7798: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9300);
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4283)
+      __webpack_exec__(417)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,17 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 5964: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(2010);
-
-      /***/
-    },
-
-    /***/ 7758: /***/ (
+    /***/ 1312: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5964);
+        __webpack_require__(2398);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -59,7 +49,17 @@
       /***/
     },
 
-    /***/ 8803: /***/ (
+    /***/ 2398: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(8954);
+
+      /***/
+    },
+
+    /***/ 4305: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -67,7 +67,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/script",
         function () {
-          return __webpack_require__(7758);
+          return __webpack_require__(1312);
         },
       ]);
       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__(8803)
+      __webpack_exec__(4305)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 184: /***/ (
+    /***/ 358: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1503);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7798);
+        __webpack_require__(1840);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -35,7 +35,17 @@
       /***/
     },
 
-    /***/ 3163: /***/ (
+    /***/ 1840: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(3252);
+
+      /***/
+    },
+
+    /***/ 4041: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -43,7 +53,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/withRouter",
         function () {
-          return __webpack_require__(184);
+          return __webpack_require__(358);
         },
       ]);
       if (false) {
@@ -51,23 +61,13 @@
 
       /***/
     },
-
-    /***/ 7798: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9300);
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3163)
+      __webpack_exec__(4041)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 436-HASH.js

Diff too large to display

Diff for 9760-HASH.js
failed to diff
Diff for c57d0559-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],
   {
-    /***/ 1465: /***/ (
+    /***/ 2788: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
+
+    /***/ 5685: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7126, 23)
+        __webpack_require__.t.bind(__webpack_require__, 844, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4031, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4365, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1117, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3903, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1522, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3100, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1798, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7364, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8366, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5632, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6571, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8889, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 596, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9958, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1321, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7839, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 724, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1270, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6999, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1885, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 854)
+        __webpack_require__.bind(__webpack_require__, 4088)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7752, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9622, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1201, 23)
+        __webpack_require__.t.bind(__webpack_require__, 995, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7823, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8577, 23)
       );
 
       /***/
     },
-
-    /***/ 7854: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [9137, 9760],
-      () => (__webpack_exec__(4730), __webpack_exec__(1465))
+      [2494, 4936],
+      () => (__webpack_exec__(204), __webpack_exec__(5685))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for app-page-exp..ntime.dev.js
failed to diff
Diff for app-page-exp..time.prod.js
failed to diff
Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..time.prod.js
failed to diff
Diff for app-page-tur..ntime.dev.js
failed to diff
Diff for app-page-tur..time.prod.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for app-route.runtime.dev.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for pages-api.runtime.dev.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for pages.runtime.dev.js

Diff too large to display

Diff for pages.runtime.prod.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: 939e722

@lukesandberg lukesandberg force-pushed the null_safe_access_analysis branch from 92d1b6a to 939e722 Compare November 6, 2025 19:58
Comment on lines +1821 to +1853
OptChainBase::Member(member) => {
// Visit the object first (may be another opt chain)
member.obj.visit_with_ast_path(self, ast_path);

// Get the receiver value for the null check
let receiver_value = Box::new(self.eval_context.eval(&member.obj));

// Collect effects from the member access
let prev_effects = take(&mut self.effects);

// Use the existing helper to add member effect
self.check_member_expr_for_effects(member, ast_path);

let optional_effects = Box::new(EffectsBlock {
effects: take(&mut self.effects),
range: AstPathRange::Exact(as_parent_path(ast_path)),
});

self.effects = prev_effects;

// Add the NullSafeAccessReceiver effect
self.add_effect(Effect::NullSafeAccessReceiver {
obj: receiver_value,
ast_path: as_parent_path(ast_path),
effects: optional_effects,
});
Copy link
Contributor

Choose a reason for hiding this comment

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

Computed property expressions in optional member chains are not being visited, which means side effects from computed properties (like function calls) would be lost during analysis.

View Details
📝 Patch Details
diff --git a/turbopack/crates/turbopack-ecmascript/src/analyzer/graph.rs b/turbopack/crates/turbopack-ecmascript/src/analyzer/graph.rs
index 57cc0de40d..cbbb3fb515 100644
--- a/turbopack/crates/turbopack-ecmascript/src/analyzer/graph.rs
+++ b/turbopack/crates/turbopack-ecmascript/src/analyzer/graph.rs
@@ -1822,6 +1822,11 @@ impl VisitAstPath for Analyzer<'_> {
                 // Visit the object first (may be another opt chain)
                 member.obj.visit_with_ast_path(self, ast_path);
 
+                // Visit computed property expressions to capture any side effects
+                if let MemberProp::Computed(ComputedPropName { expr, .. }) = &member.prop {
+                    expr.visit_with_ast_path(self, ast_path);
+                }
+
                 // Get the receiver value for the null check
                 let receiver_value = Box::new(self.eval_context.eval(&member.obj));
 

Analysis

Computed property expressions in optional member chains are not being visited for side effects

What fails: Side effects from computed property expressions in optional member chains (e.g., obj?.[getKey()]) are not collected during analysis, meaning function calls and other effects within the computed property are not tracked.

How to reproduce: Create an optional chain with a computed property containing a function call:

let result = obj?.[getKey()];

The analysis should collect an effect for the getKey() call, but it does not because the computed property expression is never visited through the visitor pattern.

Expected behavior: The computed property expression should be visited to capture any side effects (like function calls), similar to how the Call case properly visits the entire callee expression. This ensures all side effects are tracked in the optional chain's NullSafeAccessReceiver effect block.

Root cause: In visit_opt_chain_expr, when handling OptChainBase::Member, the code visits only the object expression via member.obj.visit_with_ast_path() but never visits member.prop when it's a Computed variant. In contrast, the Call case correctly visits the entire callee expression, which properly handles computed property expressions through the normal visit_member_expr flow.

Fix: Added code to explicitly visit computed property expressions in the Member case, ensuring side effects are captured before effects collection:

if let MemberProp::Computed(ComputedPropName { expr, .. }) = &member.prop {
    expr.visit_with_ast_path(self, ast_path);
}

This aligns the Member case behavior with the Call case and ensures consistency with the previous default visitor behavior before the recent visit_opt_chain_expr implementation.

@lukesandberg lukesandberg changed the base branch from amp_amp_analysis to graphite-base/85840 November 6, 2025 22:54
Comment on lines +93 to +95
| ConditionalKind::And { expr: block, .. }
| ConditionalKind::Or { expr: block, .. }
| ConditionalKind::NullishCoalescing { expr: block, .. }
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
| ConditionalKind::And { expr: block, .. }
| ConditionalKind::Or { expr: block, .. }
| ConditionalKind::NullishCoalescing { expr: block, .. }

The code attempts to destructure non-existent fields in enum variants, which will cause a compilation error. Lines 93-95 try to access an expr field that doesn't exist on ConditionalKind::And, ConditionalKind::Or, and ConditionalKind::NullishCoalescing.

View Details

Analysis

Incorrect enum field destructuring in ConditionalKind::normalize()

What fails: The normalize() method in ConditionalKind impl (lines 90-117) attempts to destructure an expr field that doesn't exist on And, Or, and NullishCoalescing enum variants, causing a compilation error.

How to reproduce:

# From turbopack root
cargo check -p turbopack-ecmascript

Expected to fail with error:

error[E0026]: variant `And` does not have a field named `expr`

What was wrong vs expected:

The first match arm (lines 93-95 in original code) tried to match:

ConditionalKind::And { expr: block, .. }
| ConditionalKind::Or { expr: block, .. }
| ConditionalKind::NullishCoalescing { expr: block, .. }

But the enum variants are defined with rhs_effects field only (lines 78-82):

And { rhs_effects: Vec<Effect> },
Or { rhs_effects: Vec<Effect> },
NullishCoalescing { rhs_effects: Vec<Effect> },

Additionally, these three variants were already correctly handled in the second match arm (lines 104-106) with the correct field name rhs_effects.

Fix: Removed the three incorrect pattern arms from the first match arm, allowing them to be handled exclusively by the second match arm with the correct field destructuring.

Verification: After the fix, all 9 enum variants are correctly matched:

  • First arm: If, Else, Labeled (using then/r#else/body fields)
  • Second arm: IfElse, Ternary (using then/r#else fields)
  • Third arm: And, Or, NullishCoalescing (using rhs_effects field)
  • Fourth arm: IfElseMultiple (using then/r#else fields)

Reference: Rust pattern matching on struct fields

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

Labels

created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants