Skip to content

Conversation

@xusd320
Copy link
Contributor

@xusd320 xusd320 commented Nov 18, 2025

No description provided.

@ijjk ijjk added Turbopack Related to Turbopack with Next.js. type: next labels Nov 18, 2025
@xusd320 xusd320 marked this pull request as draft November 18, 2025 17:35
@xusd320 xusd320 changed the title [WIP] refactor(turbopack-node): support execution by napi and worker_threads refactor(turbopack-node): support execution by napi and worker_threads Nov 18, 2025
channel
.send(data)
.await
.with_context(|| format!("failed to recv message in worker {task_id}"))?;
Copy link
Contributor

Choose a reason for hiding this comment

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

The error message in send_task_response is misleading - it says "failed to recv message" but the function is actually sending a message, not receiving one.

View Details
📝 Patch Details
diff --git a/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs b/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
index 22be69b3a1..f8635cb079 100644
--- a/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
+++ b/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
@@ -41,7 +41,7 @@ pub async fn recv_worker_request(pool_id: String) -> napi::Result<()> {
     Ok(channel
         .send(())
         .await
-        .context("failed to recv worker request")?)
+        .context("failed to notify worker")?)
 }
 
 #[napi]
@@ -95,6 +95,6 @@ pub async fn send_task_response(task_id: String, data: Vec<u8>) -> napi::Result<
     channel
         .send(data)
         .await
-        .with_context(|| format!("failed to recv message in worker {task_id}"))?;
+        .with_context(|| format!("failed to send task response for {task_id}"))?;
     Ok(())
 }

Analysis

Misleading error messages in send operations

What fails: Two functions have error messages that incorrectly say "failed to recv message" when they are actually performing send operations:

  • send_task_response() at line 98 calls channel.send(data) but error says "failed to recv message in worker {task_id}"
  • recv_worker_request() at line 31 calls channel.send(()) but error says "failed to recv worker request"

How to reproduce: When either send operation fails:

  1. send_task_response(task_id, data) - send fails, receives confusing error message about receiving
  2. recv_worker_request(pool_id) - send fails, receives confusing error message about receiving

Result: Error messages are factually incorrect, saying "recv" for send operations. This is confusing during debugging.

Expected: Error messages should accurately describe the operation:

  • send_task_response() should say "failed to send task response" (now says "failed to send task response for {task_id}")
  • recv_worker_request() should say "failed to notify worker" or similar (now says "failed to notify worker")

File: turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs

@ijjk
Copy link
Member

ijjk commented Nov 18, 2025

Failing test suites

Commit: b9b8fc1 | About building and testing Next.js

pnpm test test/integration/app-types/app-types.test.ts (turbopack) (job)

  • app type checking - production mode > should report link errors (DD)
  • app type checking - production mode > should generate route types correctly and report router API errors (DD)
  • app type checking - production mode > should generate route types correctly and report form errors (DD)
  • app type checking - production mode > should generate route types correctly and report redirect errors (DD)
Expand output

● app type checking - production mode › should report link errors

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

  10 | describe('app type checking - production mode', () => {
  11 |   let stderr, errors
> 12 |   beforeAll(async () => {
     |   ^
  13 |     stderr = (await nextBuild(appDir, [], { stderr: true })).stderr
  14 |
  15 |     errors = stderr.match(

  at beforeAll (integration/app-types/app-types.test.ts:12:3)
  at Object.describe (integration/app-types/app-types.test.ts:10:1)

● app type checking - production mode › should generate route types correctly and report router API errors

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

  10 | describe('app type checking - production mode', () => {
  11 |   let stderr, errors
> 12 |   beforeAll(async () => {
     |   ^
  13 |     stderr = (await nextBuild(appDir, [], { stderr: true })).stderr
  14 |
  15 |     errors = stderr.match(

  at beforeAll (integration/app-types/app-types.test.ts:12:3)
  at Object.describe (integration/app-types/app-types.test.ts:10:1)

● app type checking - production mode › should generate route types correctly and report form errors

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

  10 | describe('app type checking - production mode', () => {
  11 |   let stderr, errors
> 12 |   beforeAll(async () => {
     |   ^
  13 |     stderr = (await nextBuild(appDir, [], { stderr: true })).stderr
  14 |
  15 |     errors = stderr.match(

  at beforeAll (integration/app-types/app-types.test.ts:12:3)
  at Object.describe (integration/app-types/app-types.test.ts:10:1)

● app type checking - production mode › should generate route types correctly and report redirect errors

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

  10 | describe('app type checking - production mode', () => {
  11 |   let stderr, errors
> 12 |   beforeAll(async () => {
     |   ^
  13 |     stderr = (await nextBuild(appDir, [], { stderr: true })).stderr
  14 |
  15 |     errors = stderr.match(

  at beforeAll (integration/app-types/app-types.test.ts:12:3)
  at Object.describe (integration/app-types/app-types.test.ts:10:1)

pnpm test test/integration/next-dynamic-css-asset-prefix/test/index.test.ts (turbopack) (job)

  • next/dynamic with assetPrefix > production mode > should load a Pages Router page correctly (DD)
  • next/dynamic with assetPrefix > production mode > should load a App Router page correctly (DD)
Expand output

● next/dynamic with assetPrefix › production mode › should load a Pages Router page correctly

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

  112 |     'production mode',
  113 |     () => {
> 114 |       beforeAll(async () => {
      |       ^
  115 |         cdnPort = await findPort()
  116 |         // lightweight http proxy
  117 |         cdn = createServer((clientReq, clientRes) => {

  at beforeAll (integration/next-dynamic-css-asset-prefix/test/index.test.ts:114:7)
  at integration/next-dynamic-css-asset-prefix/test/index.test.ts:111:56
  at Object.describe (integration/next-dynamic-css-asset-prefix/test/index.test.ts:53:1)

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

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

  112 |     'production mode',
  113 |     () => {
> 114 |       beforeAll(async () => {
      |       ^
  115 |         cdnPort = await findPort()
  116 |         // lightweight http proxy
  117 |         cdn = createServer((clientReq, clientRes) => {

  at beforeAll (integration/next-dynamic-css-asset-prefix/test/index.test.ts:114:7)
  at integration/next-dynamic-css-asset-prefix/test/index.test.ts:111:56
  at Object.describe (integration/next-dynamic-css-asset-prefix/test/index.test.ts:53:1)

pnpm test test/integration/next-dynamic-css/test/index.test.ts (turbopack) (job)

  • next/dynamic > production mode > should load a Pages Router page correctly (DD)
  • next/dynamic > production mode > should load a App Router page correctly (DD)
Expand output

● next/dynamic › production mode › should load a Pages Router page correctly

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

  61 |     'production mode',
  62 |     () => {
> 63 |       beforeAll(async () => {
     |       ^
  64 |         await nextBuild(appDir)
  65 |         appPort = await findPort()
  66 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-dynamic-css/test/index.test.ts:63:7)
  at integration/next-dynamic-css/test/index.test.ts:60:56
  at Object.describe (integration/next-dynamic-css/test/index.test.ts:47:1)

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

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

  61 |     'production mode',
  62 |     () => {
> 63 |       beforeAll(async () => {
     |       ^
  64 |         await nextBuild(appDir)
  65 |         appPort = await findPort()
  66 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-dynamic-css/test/index.test.ts:63:7)
  at integration/next-dynamic-css/test/index.test.ts:60:56
  at Object.describe (integration/next-dynamic-css/test/index.test.ts:47:1)

pnpm test-dev-turbo test/development/acceptance-app/app-hmr-changes.test.ts (turbopack) (job)

  • Error overlay - RSC build errors > Skipped in webpack > should handle successive HMR changes with errors correctly (DD)
Expand output

● Error overlay - RSC build errors › Skipped in webpack › should handle successive HMR changes with errors correctly

page.goto: Timeout 60000ms exceeded.
Call log:
  - navigating to "http://localhost:34185/2020/develop-preview-test", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at createSandbox (lib/development-sandbox.ts:53:21)
  at Object.<anonymous> (development/acceptance-app/app-hmr-changes.test.ts:30:31)

● Test suite failed to run

You must use `using` to create a sandbox, i.e., `await using sandbox = await createSandbox(`

  184 |     setImmediate(() => {
  185 |       if (!unwrappedByTypeScriptUsingKeyword) {
> 186 |         throw new Error(
      |               ^
  187 |           'You must use `using` to create a sandbox, i.e., `await using sandbox = await createSandbox(`'
  188 |         )
  189 |       }

  at Immediate.<anonymous> (lib/development-sandbox.ts:186:15)

pnpm test-start-turbo test/e2e/app-dir/app-css/index.test.ts (turbopack) (job)

  • app dir - css > css support > chunks > should bundle css resources into chunks (DD)
  • app dir - css > css support > client components > should support css modules inside client page (DD)
  • app dir - css > css support > client components > should support css modules inside client components (DD)
  • app dir - css > css support > client layouts > should support css modules inside client layouts (DD)
  • app dir - css > css support > client layouts > should support global css inside client layouts (DD)
  • app dir - css > css support > client pages > should support css modules inside client pages (DD)
  • app dir - css > css support > client pages > should support global css inside client pages (DD)
  • app dir - css > css support > css ordering > should have inner layers take precedence over outer layers (DD)
  • app dir - css > css support > page extensions > should include css imported in MDX pages (DD)
  • app dir - css > css support > server layouts > should support css modules inside server layouts (DD)
  • app dir - css > css support > server layouts > should support external css imports (DD)
  • app dir - css > css support > server pages > should support global css inside server pages (DD)
  • app dir - css > css support > server pages > should support css modules inside server pages (DD)
  • app dir - css > css support > server pages > should not contain pages css in app dir page (DD)
  • app dir - css > css support > server pages > should support css modules shared between server pages (DD)
  • app dir - css > css support > special entries > should include css imported in loading.js (DD)
  • app dir - css > css support > special entries > should include css imported in client template.js (DD)
  • app dir - css > css support > special entries > should include css imported in server template.js (DD)
  • app dir - css > css support > special entries > should include css imported in client not-found.js (DD)
  • app dir - css > css support > special entries > should include css imported in server not-found.js (DD)
  • app dir - css > css support > special entries > should include root layout css for root not-found.js (DD)
  • app dir - css > css support > special entries > should include css imported in root not-found.js (DD)
  • app dir - css > css support > special entries > should include css imported in error.js (DD)
  • app dir - css > pages dir > should include css modules and global css after page transition (DD)
  • app dir - css > sass support > client layouts > should support global sass/scss inside client layouts (DD)
  • app dir - css > sass support > client layouts > should support sass/scss modules inside client layouts (DD)
  • app dir - css > sass support > client pages > should support global sass/scss inside client pages (DD)
  • app dir - css > sass support > client pages > should support sass/scss modules inside client pages (DD)
  • app dir - css > sass support > server layouts > should support global sass/scss inside server layouts (DD)
  • app dir - css > sass support > server layouts > should support sass/scss modules inside server layouts (DD)
  • app dir - css > sass support > server pages > should support global sass/scss inside server pages (DD)
  • app dir - css > sass support > server pages > should support sass/scss modules inside server pages (DD)
Expand output

● app dir - css › css support › server layouts › should support global css inside server layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server layouts › should support css modules inside server layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server layouts › should support external css imports

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server pages › should support global css inside server pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server pages › should support css modules inside server pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server pages › should not contain pages css in app dir page

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › server pages › should support css modules shared between server pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client layouts › should support css modules inside client layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client layouts › should support global css inside client layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client pages › should support css modules inside client pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client pages › should support global css inside client pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client components › should support css modules inside client page

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › client components › should support css modules inside client components

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › special entries › should include css imported in loading.js

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

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

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

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

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

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

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

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

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › special entries › should include root layout css for root not-found.js

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

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

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › special entries › should include css imported in error.js

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › page extensions › should include css imported in MDX pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › chunks › should bundle css resources into chunks

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › css support › css ordering › should have inner layers take precedence over outer layers

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › server layouts › should support global sass/scss inside server layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › server layouts › should support sass/scss modules inside server layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › server pages › should support global sass/scss inside server pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › server pages › should support sass/scss modules inside server pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › client layouts › should support global sass/scss inside client layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › client layouts › should support sass/scss modules inside client layouts

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › client pages › should support global sass/scss inside client pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › sass support › client pages › should support sass/scss modules inside client pages

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● app dir - css › pages dir › should include css modules and global css after page transition

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/app-css/index.test.ts:5:53
  at Object.describe (e2e/app-dir/app-css/index.test.ts:4:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

pnpm test-dev-turbo test/development/sass-error/index.test.ts (turbopack) (job)

  • app dir - css > sass support > error handling > should use original source points for sass errors (DD)
Expand output

● app dir - css › sass support › error handling › should use original source points for sass errors

page.goto: Timeout 60000ms exceeded.
Call log:
  - navigating to "http://localhost:33267/sass-error", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at Object.<anonymous> (development/sass-error/index.test.ts:22:27)

pnpm test test/integration/telemetry/test/index.test.ts (turbopack) (job)

  • Telemetry CLI > production mode > cli session: babel tooling config (DD)
  • Telemetry CLI > production mode > cli session: custom babel config (plugin) (DD)
  • Telemetry CLI > production mode > cli session: package.json custom babel config (plugin) (DD)
  • Telemetry CLI > production mode > cli session: custom babel config (preset) (DD)
  • Telemetry CLI > production mode > cli session: next config with webpack (DD)
  • Telemetry CLI > production mode > detect static 404 correctly for next build (DD)
  • Telemetry CLI > production mode > detect page counts correctly for next build (DD)
Expand output

● Telemetry CLI › production mode › cli session: babel tooling config

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

  188 |       })
  189 |
> 190 |       it('cli session: babel tooling config', async () => {
      |       ^
  191 |         await fs.rename(
  192 |           path.join(appDir, '.babelrc.default'),
  193 |           path.join(appDir, '.babelrc')

  at it (integration/telemetry/test/index.test.ts:190:7)
  at integration/telemetry/test/index.test.ts:98:56
  at Object.describe (integration/telemetry/test/index.test.ts:13:1)

● Telemetry CLI › production mode › cli session: custom babel config (plugin)

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

  231 |
  232 |         const event = /NEXT_CLI_SESSION_STARTED[\s\S]+?{([\s\S]+?)}/
> 233 |           .exec(stderr)
      |                 ^
  234 |           .pop()
  235 |
  236 |         expect(event).toMatch(/"hasNextConfig": false/)

  at Object.stderr (integration/telemetry/test/index.test.ts:233:17)

● Telemetry CLI › production mode › cli session: package.json custom babel config (plugin)

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

  257 |
  258 |         const event = /NEXT_CLI_SESSION_STARTED[\s\S]+?{([\s\S]+?)}/
> 259 |           .exec(stderr)
      |                 ^
  260 |           .pop()
  261 |
  262 |         expect(event).toMatch(/"hasNextConfig": false/)

  at Object.stderr (integration/telemetry/test/index.test.ts:259:17)

● Telemetry CLI › production mode › cli session: custom babel config (preset)

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

  283 |
  284 |         const event = /NEXT_CLI_SESSION_STARTED[\s\S]+?{([\s\S]+?)}/
> 285 |           .exec(stderr)
      |                 ^
  286 |           .pop()
  287 |
  288 |         expect(event).toMatch(/"hasNextConfig": false/)

  at Object.stderr (integration/telemetry/test/index.test.ts:285:17)

● Telemetry CLI › production mode › cli session: next config with webpack

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

  309 |
  310 |         const event = /NEXT_CLI_SESSION_STARTED[\s\S]+?{([\s\S]+?)}/
> 311 |           .exec(stderr)
      |                 ^
  312 |           .pop()
  313 |
  314 |         expect(event).toMatch(/"hasNextConfig": true/)

  at Object.stderr (integration/telemetry/test/index.test.ts:311:17)

● Telemetry CLI › production mode › detect static 404 correctly for next build

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

  342 |
  343 |         const event1 = /NEXT_BUILD_OPTIMIZED[\s\S]+?{([\s\S]+?)}/
> 344 |           .exec(stderr)
      |                 ^
  345 |           .pop()
  346 |         expect(event1).toMatch(/hasStatic404.*?true/)
  347 |       })

  at Object.stderr (integration/telemetry/test/index.test.ts:344:17)

● Telemetry CLI › production mode › detect page counts correctly for next build

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

  354 |
  355 |         const event1 = /NEXT_BUILD_OPTIMIZED[\s\S]+?{([\s\S]+?)}/
> 356 |           .exec(stderr)
      |                 ^
  357 |           .pop()
  358 |         expect(event1).toMatch(/"staticPropsPageCount": 2/)
  359 |         expect(event1).toMatch(/"serverPropsPageCount": 2/)

  at Object.stderr (integration/telemetry/test/index.test.ts:356:17)

pnpm test-dev-turbo test/e2e/app-dir/css-modules-rsc-postcss/css-modules-rsc-postcss.test.ts (turbopack) (job)

  • css-modules-rsc-postcss > should compile successfully and apply the correct styles (DD)
Expand output

● css-modules-rsc-postcss › should compile successfully and apply the correct styles

page.goto: Timeout 60000ms exceeded.
Call log:
  - navigating to "http://localhost:41289/", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at Object.<anonymous> (e2e/app-dir/css-modules-rsc-postcss/css-modules-rsc-postcss.test.ts:13:21)

pnpm test-dev-turbo test/e2e/app-dir/scss/scss-mixins/scss-mixins.test.ts (turbopack) (job)

  • Scss Mixins > should work using browser (DD)
Expand output

● Scss Mixins › should work using browser

page.goto: Timeout 60000ms exceeded.
Call log:
  - navigating to "http://localhost:42647/", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at Object.<anonymous> (e2e/app-dir/scss/scss-mixins/scss-mixins.test.ts:13:21)

pnpm test-start-turbo test/e2e/app-dir/no-double-tailwind-execution/no-double-tailwind-execution.test.ts (turbopack) (job)

  • no-double-tailwind-execution > should run tailwind only once initially and per change (DD)
Expand output

● no-double-tailwind-execution › should run tailwind only once initially and per change

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/no-double-tailwind-execution/no-double-tailwind-execution.test.ts:5:53
  at Object.describe (e2e/app-dir/no-double-tailwind-execution/no-double-tailwind-execution.test.ts:4:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

pnpm test-dev-turbo test/development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts (turbopack) (job)

  • turbopack-loader-file-dependencies > should update when the dependency file changes (DD)
Expand output

● turbopack-loader-file-dependencies › should update when the dependency file changes

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

   7 |   })
   8 |
>  9 |   it('should update when the dependency file changes', async () => {
     |   ^
  10 |     const $ = await next.render$('/')
  11 |     const initialText = await $('p').text()
  12 |     expect(initialText).toBeTruthy()

  at it (development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts:9:3)
  at Object.describe (development/app-dir/turbopack-loader-file-dependencies/turbopack-loader-file-dependencies.test.ts:4:1)

pnpm test test/integration/typescript/test/index.test.ts (turbopack) (job)

  • TypeScript Features > default behavior > should render the page (DD)
  • TypeScript Features > default behavior > should not fail to render when an inactive page has an error (DD)
Expand output

● TypeScript Features › default behavior › should render the page

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

  39 |     afterAll(() => killApp(app))
  40 |
> 41 |     it('should render the page', async () => {
     |     ^
  42 |       const $ = await get$('/hello')
  43 |       expect($('body').text()).toMatch(/Hello World/)
  44 |       expect($('body').text()).toMatch(/1000000000000/)

  at it (integration/typescript/test/index.test.ts:41:5)
  at describe (integration/typescript/test/index.test.ts:30:3)
  at Object.describe (integration/typescript/test/index.test.ts:29:1)

● TypeScript Features › default behavior › should not fail to render when an inactive page has an error

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

   98 |     })
   99 |
> 100 |     it('should not fail to render when an inactive page has an error', async () => {
      |     ^
  101 |       await killApp(app)
  102 |       let evilFile = join(appDir, 'pages', 'evil.tsx')
  103 |       try {

  at it (integration/typescript/test/index.test.ts:100:5)
  at describe (integration/typescript/test/index.test.ts:30:3)
  at Object.describe (integration/typescript/test/index.test.ts:29:1)

pnpm test-start-turbo test/e2e/app-dir/mdx-no-mdx-components/mdx.test.ts (turbopack) (job)

  • mdx > app directory > should work in initial html (DD)
  • mdx > app directory > should work using browser (DD)
  • mdx > app directory > should allow importing client components (DD)
  • mdx > pages directory > should work in initial html (DD)
Expand output

● mdx › app directory › should work in initial html

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:4:33
  at Object.describe (e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:3:1)

● mdx › app directory › should work using browser

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:4:33
  at Object.describe (e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:3:1)

● mdx › app directory › should allow importing client components

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:4:33
  at Object.describe (e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:3:1)

● mdx › pages directory › should work in initial html

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:4:33
  at Object.describe (e2e/app-dir/mdx-no-mdx-components/mdx.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

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

  • ReactRefreshRegression app > custom loader mdx should have Fast Refresh enabled (DD)
Expand output

● ReactRefreshRegression app › custom loader mdx should have Fast Refresh enabled

page.goto: net::ERR_ABORTED; maybe frame was detached?
Call log:
  - navigating to "http://localhost:40739/", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at createSandbox (lib/development-sandbox.ts:53:21)
  at Object.<anonymous> (development/acceptance-app/ReactRefreshRegression.test.ts:358:27)

● Test suite failed to run

You must use `using` to create a sandbox, i.e., `await using sandbox = await createSandbox(`

  184 |     setImmediate(() => {
  185 |       if (!unwrappedByTypeScriptUsingKeyword) {
> 186 |         throw new Error(
      |               ^
  187 |           'You must use `using` to create a sandbox, i.e., `await using sandbox = await createSandbox(`'
  188 |         )
  189 |       }

  at Immediate.<anonymous> (lib/development-sandbox.ts:186:15)

● 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-start-turbo test/e2e/app-dir/mdx/mdx.test.ts (turbopack) (job)

  • mdx with-mdx-rs > app directory > should work in initial html (DD)
  • mdx with-mdx-rs > app directory > should work using browser (DD)
  • mdx with-mdx-rs > app directory > should work in initial html with mdx import (DD)
  • mdx with-mdx-rs > app directory > should work using browser with mdx import (DD)
  • mdx with-mdx-rs > app directory > should allow overriding components (DD)
  • mdx with-mdx-rs > app directory > should allow importing client components (DD)
  • mdx with-mdx-rs > app directory > should work with next/image (DD)
  • mdx with-mdx-rs > pages directory > should work in initial html (DD)
  • mdx with-mdx-rs > pages directory > should work using browser (DD)
  • mdx with-mdx-rs > pages directory > should work in initial html with mdx import (DD)
  • mdx with-mdx-rs > pages directory > should work using browser with mdx import (DD)
  • mdx with-mdx-rs > pages directory > should allow overriding components (DD)
  • mdx without-mdx-rs > app directory > should work in initial html (DD)
  • mdx without-mdx-rs > app directory > should work using browser (DD)
  • mdx without-mdx-rs > app directory > should work in initial html with mdx import (DD)
  • mdx without-mdx-rs > app directory > should work using browser with mdx import (DD)
  • mdx without-mdx-rs > app directory > should allow overriding components (DD)
  • mdx without-mdx-rs > app directory > should allow importing client components (DD)
  • mdx without-mdx-rs > app directory > should work with next/image (DD)
  • mdx without-mdx-rs > app directory > should run recma plugins (DD)
  • mdx without-mdx-rs > app directory > should run rehype plugins (DD)
  • mdx without-mdx-rs > app directory > should run remark plugins (DD)
  • mdx without-mdx-rs > pages directory > should work in initial html (DD)
  • mdx without-mdx-rs > pages directory > should work using browser (DD)
  • mdx without-mdx-rs > pages directory > should work in initial html with mdx import (DD)
  • mdx without-mdx-rs > pages directory > should work using browser with mdx import (DD)
  • mdx without-mdx-rs > pages directory > should allow overriding components (DD)
Expand output

● mdx with-mdx-rs › app directory › should work in initial html

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should work using browser

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should work in initial html with mdx import

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should work using browser with mdx import

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should allow overriding components

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should allow importing client components

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › app directory › should work with next/image

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › pages directory › should work in initial html

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › pages directory › should work using browser

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › pages directory › should work in initial html with mdx import

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › pages directory › should work using browser with mdx import

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx with-mdx-rs › pages directory › should allow overriding components

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/mdx/mdx.test.ts:5:35
  at Object.describe (e2e/app-dir/mdx/mdx.test.ts:4:3)

● mdx without-mdx-rs › app directory › should work in initial html

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should work using browser

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should work in initial html with mdx import

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should work using browser with mdx import

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should allow overriding components

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should allow importing client components

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should work with next/image

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should run recma plugins

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should run rehype plugins

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › app directory › should run remark plugins

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › pages directory › should work in initial html

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › pages directory › should work using browser

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › pages directory › should work in initial html with mdx import

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › pages directory › should work using browser with mdx import

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

● mdx without-mdx-rs › pages directory › should allow overriding components

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

pnpm test-start-turbo test/e2e/app-dir/scss/basic-module/basic-module.test.ts (turbopack) (job)

  • Basic SCSS Module Support ({"sass": "1.54.0"}) > should render the module (DD)
  • Basic SCSS Module Support ({"sass-embedded": "1.75.0"}) > should render the module (DD)
Expand output

● Basic SCSS Module Support ({"sass": "1.54.0"}) › should render the module

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/scss/basic-module/basic-module.test.ts:19:35
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/app-dir/scss/basic-module/basic-module.test.ts:16:2)

● Basic SCSS Module Support ({"sass-embedded": "1.75.0"}) › should render the module

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

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

  • modularizeImports > should work (DD)
  • modularizeImports > should work with MDX (DD)
Expand output

● modularizeImports › should work

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/modularizeimports/modularizeimports.test.ts:4:33
  at Object.describe (e2e/app-dir/modularizeimports/modularizeimports.test.ts:3:1)

● modularizeImports › should work with MDX

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/modularizeimports/modularizeimports.test.ts:4:33
  at Object.describe (e2e/app-dir/modularizeimports/modularizeimports.test.ts:3:1)

● Test suite failed to run

next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished

  134 |     if (nextInstance) {
  135 |       await nextInstance.destroy()
> 136 |       throw new Error(
      |             ^
  137 |         `next instance not destroyed before exiting, make sure to call .destroy() after the tests after finished`
  138 |       )
  139 |     }

  at Object.<anonymous> (lib/e2e-utils/index.ts:136:13)

pnpm test-dev-turbo test/e2e/app-dir/scss/invalid-global-with-app/invalid-global-with-app.test.ts (turbopack) (job)

  • Invalid Global CSS with Custom App > should show a build error (DD)
Expand output

● Invalid Global CSS with Custom App › should show a build error

page.goto: Timeout 60000ms exceeded.
Call log:
  - navigating to "http://localhost:44033/", waiting until "load"

  343 |     await opts?.beforePageLoad?.(page)
  344 |
> 345 |     await page.goto(url, { waitUntil: opts?.waitUntil ?? 'load' })
      |                ^
  346 |   }
  347 |
  348 |   back(options?: Parameters<Page['goBack']>[0]) {

  at Playwright.goto (lib/browsers/playwright.ts:345:16)
  at webdriver (lib/next-webdriver.ts:156:3)
  at Object.<anonymous> (e2e/app-dir/scss/invalid-global-with-app/invalid-global-with-app.test.ts:34:23)

pnpm test test/integration/telemetry/test/config.test.ts (turbopack) (job)

  • config telemetry > production mode > emits telemetry for enabled React Compiler (DD)
  • config telemetry > production mode > emits telemetry for configured React Compiler options (DD)
  • config telemetry > production mode > emits telemetry for filesystem cache in build mode (DD)
  • config telemetry > production mode > emits telemetry for isolatedDevBuild enabled by default (DD)
  • config telemetry > production mode > emits telemetry for isolatedDevBuild disabled (DD)
Expand output

● config telemetry › production mode › emits telemetry for enabled React Compiler

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

  546 |       })
  547 |
> 548 |       it('emits telemetry for enabled React Compiler', async () => {
      |       ^
  549 |         await fs.rename(
  550 |           path.join(appDir, 'next.config.reactCompiler-base'),
  551 |           path.join(appDir, 'next.config.js')

  at it (integration/telemetry/test/config.test.ts:548:7)
  at integration/telemetry/test/config.test.ts:15:56
  at Object.describe (integration/telemetry/test/config.test.ts:14:1)

● config telemetry › production mode › emits telemetry for configured React Compiler options

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

  591 |           stderr = app.stderr
  592 |           const event = /NEXT_CLI_SESSION_STARTED[\s\S]+?{([\s\S]+?)}/
> 593 |             .exec(stderr)
      |                   ^
  594 |             .pop()
  595 |
  596 |           expect(event).toMatch(/"reactCompiler": true/)

  at Object.stderr (integration/telemetry/test/config.test.ts:593:19)

● config telemetry › production mode › emits telemetry for filesystem cache in build mode

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

Expected value: {"featureName": "turbopackFileSystemCache", "invocationCount": 1}
Received array: []

  672 |               'NEXT_BUILD_FEATURE_USAGE'
  673 |             )
> 674 |             expect(featureUsageEvents).toContainEqual({
      |                                        ^
  675 |               featureName: 'turbopackFileSystemCache',
  676 |               invocationCount: 1,
  677 |             })

  at Object.toContainEqual (integration/telemetry/test/config.test.ts:674:40)

● config telemetry › production mode › emits telemetry for isolatedDevBuild enabled by default

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

Expected value: {"featureName": "experimental/isolatedDevBuild", "invocationCount": 1}
Received array: []

  743 |             'NEXT_BUILD_FEATURE_USAGE'
  744 |           )
> 745 |           expect(featureUsageEvents).toContainEqual({
      |                                      ^
  746 |             featureName: 'experimental/isolatedDevBuild',
  747 |             invocationCount: 1,
  748 |           })

  at Object.toContainEqual (integration/telemetry/test/config.test.ts:745:38)

● config telemetry › production mode › emits telemetry for isolatedDevBuild disabled

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

Expected value: {"featureName": "experimental/isolatedDevBuild", "invocationCount": 0}
Received array: []

  771 |             'NEXT_BUILD_FEATURE_USAGE'
  772 |           )
> 773 |           expect(featureUsageEvents).toContainEqual({
      |                                      ^
  774 |             featureName: 'experimental/isolatedDevBuild',
  775 |             invocationCount: 0,
  776 |           })

  at Object.toContainEqual (integration/telemetry/test/config.test.ts:773:38)

pnpm test-start-turbo test/e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts (turbopack) (job)

  • Basic Module Prepend Data Support ({"sass": "1.54.0"}) > should render the module (DD)
  • Basic Module Prepend Data Support ({"sass-embedded": "1.75.0"}) > should render the module (DD)
Expand output

● Basic Module Prepend Data Support ({"sass": "1.54.0"}) › should render the module

thrown: "Exceeded timeout of 120000 ms for a hook.
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."

  255 |   let next: NextInstance | undefined
  256 |   if (!skipped) {
> 257 |     beforeAll(async () => {
      |     ^
  258 |       next = await createNext(options)
  259 |     })
  260 |     afterAll(async () => {

  at beforeAll (lib/e2e-utils/index.ts:257:5)
  at e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts:26:35
      at Array.forEach (<anonymous>)
  at Object.<anonymous> (e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts:23:2)

● Basic Module Prepend Data Support ({"sass-embedded": "1.75.0"}) › should render the module

createNext called without destroying previous instance

  160 |   try {
  161 |     if (nextInstance) {
> 162 |       throw new Error(`createNext called without destroying previous instance`)
      |             ^
  163 |     }
  164 |
  165 |     setupTracing()

  at createNext (lib/e2e-utils/index.ts:162:13)
  at Object.createNext (lib/e2e-utils/index.ts:258:20)

pnpm test test/integration/create-next-app/templates/pages.test.ts (turbopack) (job)

  • create-next-app --no-app (Pages Router) > should create TailwindCSS project with --tailwind flag (DD)
  • create-next-app --no-app (Pages Router) > should create an empty TailwindCSS project with --empty flag (DD)
Expand output

● create-next-app --no-app (Pages Router) › should create TailwindCSS project with --tailwind flag

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

  129 |   })
  130 |
> 131 |   it('should create TailwindCSS project with --tailwind flag', async () => {
      |   ^
  132 |     await useTempDir(async (cwd) => {
  133 |       const projectName = 'pages-tw'
  134 |       const { exitCode } = await run(

  at it (integration/create-next-app/templates/pages.test.ts:131:3)
  at Object.describe (integration/create-next-app/templates/pages.test.ts:10:1)

● create-next-app --no-app (Pages Router) › should create an empty TailwindCSS project with --empty flag

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

  208 |   })
  209 |
> 210 |   it('should create an empty TailwindCSS project with --empty flag', async () => {
      |   ^
  211 |     await useTempDir(async (cwd) => {
  212 |       const projectName = 'pages-tw-empty'
  213 |       const { exitCode } = await run(

  at it (integration/create-next-app/templates/pages.test.ts:210:3)
  at Object.describe (integration/create-next-app/templates/pages.test.ts:10:1)

pnpm test test/integration/plugin-mdx-rs/test/index.test.ts (turbopack) (job)

  • MDX-rs Configuration > MDX-rs Plugin support > should render an MDX page correctly (DD)
  • MDX-rs Configuration > MDX-rs Plugin support > should render an MDX page with component correctly (DD)
  • MDX-rs Configuration > MDX-rs Plugin support > should render an MDX page with globally provided components (from mdx-components.js) correctly (DD)
  • MDX-rs Configuration > MDX-rs Plugin support with mdx transform options > should render an MDX page correctly (DD)
Expand output

● MDX-rs Configuration › MDX-rs Plugin support › should render an MDX page correctly

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

  23 |       await killApp(app)
  24 |     })
> 25 |     it('should render an MDX page correctly', async () => {
     |     ^
  26 |       expect(await renderViaHTTP(appPort, '/')).toMatch(/Hello MDX/)
  27 |     })
  28 |

  at it (integration/plugin-mdx-rs/test/index.test.ts:25:5)
  at describe (integration/plugin-mdx-rs/test/index.test.ts:17:3)
  at Object.describe (integration/plugin-mdx-rs/test/index.test.ts:16:1)

● MDX-rs Configuration › MDX-rs Plugin support › should render an MDX page with component correctly

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

  27 |     })
  28 |
> 29 |     it('should render an MDX page with component correctly', async () => {
     |     ^
  30 |       expect(await renderViaHTTP(appPort, '/button')).toMatch(/Look, a button!/)
  31 |     })
  32 |

  at it (integration/plugin-mdx-rs/test/index.test.ts:29:5)
  at describe (integration/plugin-mdx-rs/test/index.test.ts:17:3)
  at Object.describe (integration/plugin-mdx-rs/test/index.test.ts:16:1)

● MDX-rs Configuration › MDX-rs Plugin support › should render an MDX page with globally provided components (from mdx-components.js) correctly

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

  31 |     })
  32 |
> 33 |     it('should render an MDX page with globally provided components (from `mdx-components.js`) correctly', async () => {
     |     ^
  34 |       expect(await renderViaHTTP(appPort, '/provider')).toMatch(
  35 |         /Marker was rendered!/
  36 |       )

  at it (integration/plugin-mdx-rs/test/index.test.ts:33:5)
  at describe (integration/plugin-mdx-rs/test/index.test.ts:17:3)
  at Object.describe (integration/plugin-mdx-rs/test/index.test.ts:16:1)

● MDX-rs Configuration › MDX-rs Plugin support with mdx transform options › should render an MDX page correctly

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

  65 |     })
  66 |
> 67 |     it('should render an MDX page correctly', async () => {
     |     ^
  68 |       expect(await renderViaHTTP(appPort, '/gfm')).toMatch(
  69 |         /<table>\n<thead>\n<tr>\n<th>foo/
  70 |       )

  at it (integration/plugin-mdx-rs/test/index.test.ts:67:5)
  at describe (integration/plugin-mdx-rs/test/index.test.ts:40:3)
  at Object.describe (integration/plugin-mdx-rs/test/index.test.ts:16:1)

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

  • segment cache (search params) > when fetching without PPR (e.g. prefetch="unstable_forceStale"), includes the search params in the cache key (DD)
Expand output

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

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

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

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

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

  • app dir - prefetching > should show layout eagerly when prefetched with loading one level down (DD)
  • app dir - prefetching > should immediately render the loading state for a dynamic segment when fetched from higher up in the tree (DD)
Expand output

● app dir - prefetching › should show layout eagerly when prefetched with loading one level down

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

  26 |   })
  27 |
> 28 |   it('should show layout eagerly when prefetched with loading one level down', async () => {
     |   ^
  29 |     let act: ReturnType<typeof createRouterAct>
  30 |     const timeController = createTimeController()
  31 |     const browser = await next.browser('/', {

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

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

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

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

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

pnpm test-start test/e2e/app-dir/segment-cache/staleness/segment-cache-stale-time.test.ts (job)

  • segment cache (staleness) > expires runtime prefetches when their stale time has elapsed (DD)
Expand output

● segment cache (staleness) › expires runtime prefetches when their stale time has elapsed

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

  80 |   })
  81 |
> 82 |   it('expires runtime prefetches when their stale time has elapsed', async () => {
     |   ^
  83 |     let page: Playwright.Page
  84 |     const browser = await next.browser('/', {
  85 |       beforePageLoad(p: Playwright.Page) {

  at it (e2e/app-dir/segment-cache/staleness/segment-cache-stale-time.test.ts:82:3)
  at Object.describe (e2e/app-dir/segment-cache/staleness/segment-cache-stale-time.test.ts:5:1)

pnpm test-dev test/e2e/app-dir/actions/app-action.test.ts (job)

  • app-dir action handling > should work with interception routes (DD)
  • app-dir action handling > fetch actions > should handle redirects to routes that provide an invalid RSC response (DD)
Expand output

● app-dir action handling › fetch actions › should handle redirects to routes that provide an invalid RSC response

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

Expected substring: "Hello from a pages route"
Received string:    "0.46096093148762995
Client
Server
Client and Server
0
+1+1 (Slow)-1*2
redirect to a pages route
submit
test"

  1310 |
  1311 |       await retry(async () => {
> 1312 |         expect(await browser.elementByCss('body').text()).toContain(
       |                                                           ^
  1313 |           'Hello from a pages route'
  1314 |         )
  1315 |         expect(await browser.url()).toBe(`${next.url}/pages-dir`)

  at toContain (e2e/app-dir/actions/app-action.test.ts:1312:59)
  at retry (lib/next-test-utils.ts:797:14)
  at Object.<anonymous> (e2e/app-dir/actions/app-action.test.ts:1311:7)

● app-dir action handling › should work with interception routes

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

Expected substring: "interception-routes/test"
Received string:    "http://localhost:38557/interception-routes"

  1585 |     await retry(async () => {
  1586 |       // verify the URL is correct
> 1587 |       expect(await browser.url()).toContain('interception-routes/test')
       |                                   ^
  1588 |       // the intercepted text should appear
  1589 |       expect(await browser.elementById('modal-data').text()).toContain(
  1590 |         'in "modal"'

  at toContain (e2e/app-dir/actions/app-action.test.ts:1587:35)
  at retry (lib/next-test-utils.ts:797:14)
  at Object.<anonymous> (e2e/app-dir/actions/app-action.test.ts:1585:5)

@ijjk
Copy link
Member

ijjk commented Nov 18, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
buildDuration 18.1s 16.2s N/A
buildDurationCached 14.9s 12s N/A
nodeModulesSize 455 MB 455 MB ⚠️ +2.18 kB
nextStartRea..uration (ms) 699ms 703ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi 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 52.4 kB 52.6 kB ⚠️ +219 B
c57d0559-HASH.js gzip 62.3 kB 62.3 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB
main-app-HASH.js gzip 252 B 257 B N/A
main-HASH.js gzip 38.3 kB 38.3 kB N/A
webpack-HASH.js gzip 1.69 kB 1.69 kB
Overall change 114 kB 114 kB ⚠️ +219 B
Legacy Client Bundles (polyfills)
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi 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 utooland/next.js refactor/turbopack-node-napi 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 utooland/next.js refactor/turbopack-node-napi Change
_buildManifest.js gzip 718 B 720 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
index.html gzip 524 B 522 B N/A
link.html gzip 538 B 536 B N/A
withRouter.html gzip 521 B 518 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
edge-ssr.js gzip 126 kB 126 kB N/A
page.js gzip 233 kB 233 kB ⚠️ +897 B
Overall change 233 kB 233 kB ⚠️ +897 B
Middleware size Overall increase ⚠️
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
middleware-b..fest.js gzip 636 B 638 B N/A
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 32.7 kB 33 kB ⚠️ +345 B
edge-runtime..pack.js gzip 846 B 846 B
Overall change 33.7 kB 34 kB ⚠️ +345 B
Next Runtimes
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
app-page-exp...dev.js gzip 296 kB 296 kB
app-page-exp..prod.js gzip 153 kB 153 kB
app-page-tur...dev.js gzip 296 kB 296 kB
app-page-tur..prod.js gzip 153 kB 153 kB
app-page-tur...dev.js gzip 293 kB 293 kB N/A
app-page-tur..prod.js gzip 151 kB 151 kB
app-page.run...dev.js gzip 293 kB 293 kB N/A
app-page.run..prod.js gzip 151 kB 151 kB
app-route-ex...dev.js gzip 68.3 kB 68.3 kB
app-route-ex..prod.js gzip 47.2 kB 47.2 kB
app-route-tu...dev.js gzip 68.3 kB 68.3 kB
app-route-tu..prod.js gzip 47.2 kB 47.2 kB
app-route-tu...dev.js gzip 68 kB 68 kB
app-route-tu..prod.js gzip 47 kB 47 kB
app-route.ru...dev.js gzip 68 kB 68 kB
app-route.ru..prod.js gzip 47 kB 47 kB
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 40.9 kB 40.9 kB
pages-api-tu..prod.js gzip 31 kB 31 kB
pages-api.ru...dev.js gzip 40.8 kB 40.8 kB
pages-api.ru..prod.js gzip 30.9 kB 30.9 kB
pages-turbo....dev.js gzip 50.3 kB 50.3 kB
pages-turbo...prod.js gzip 37.8 kB 37.8 kB
pages.runtim...dev.js gzip 50.3 kB 50.3 kB
pages.runtim..prod.js gzip 37.8 kB 37.8 kB
server.runti..prod.js gzip 60.5 kB 60.5 kB
Overall change 2.04 MB 2.04 MB
build cache Overall increase ⚠️
vercel/next.js canary utooland/next.js refactor/turbopack-node-napi Change
0.pack gzip 3.07 MB 3.07 MB ⚠️ +2.58 kB
index.pack gzip 93.7 kB 94.9 kB ⚠️ +1.18 kB
Overall change 3.16 MB 3.16 MB ⚠️ +3.77 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for 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/[email protected]/node_modules/react/jsx-runtime.js
+      var jsx_runtime = __webpack_require__(1503);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/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/[email protected]/node_modules/react/jsx-runtime.js
-      var jsx_runtime = __webpack_require__(1503);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/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 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],
   {
-    /***/ 2078: /***/ (
+    /***/ 2788: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
+
+    /***/ 6370: /***/ (
       __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__(2078))
+      [2494, 4936],
+      () => (__webpack_exec__(204), __webpack_exec__(6370))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Commit: b9b8fc1

@xusd320 xusd320 force-pushed the refactor/turbopack-node-napi branch from 0500b3b to b9b8fc1 Compare November 19, 2025 02:38
Comment on lines +4 to +7
use crate::worker_pool::operation::{
EVALUATION_REQUEST_CHANNAL, MessageChannel, POOL_CREATION_CHANNEL, POOL_REQUEST_CHANNEL,
TASK_ROUTERD_CHANNEL, WORKER_REQUEST_CHANNAL, WORKER_ROUTED_CHANNEL,
};
Copy link
Contributor

Choose a reason for hiding this comment

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

The notify_worker_ack function is using the wrong channel and is missing a critical import. It should send a worker ID to the WORKER_ACK_CHANNAL keyed by task_id, but instead it's trying to send a unit value to POOL_CREATION_CHANNEL keyed by pool_id.

View Details
📝 Patch Details
diff --git a/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs b/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
index 22be69b3a1..e0af59ff69 100644
--- a/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
+++ b/turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs
@@ -3,7 +3,7 @@ use napi_derive::napi;
 
 use crate::worker_pool::operation::{
     EVALUATION_REQUEST_CHANNAL, MessageChannel, POOL_CREATION_CHANNEL, POOL_REQUEST_CHANNEL,
-    TASK_ROUTERD_CHANNEL, WORKER_REQUEST_CHANNAL, WORKER_ROUTED_CHANNEL,
+    TASK_ROUTERD_CHANNEL, WORKER_ACK_CHANNAL, WORKER_REQUEST_CHANNAL, WORKER_ROUTED_CHANNEL,
 };
 
 #[napi]
@@ -45,18 +45,18 @@ pub async fn recv_worker_request(pool_id: String) -> napi::Result<()> {
 }
 
 #[napi]
-pub async fn notify_worker_ack(pool_id: String) -> napi::Result<()> {
-    let channel = if let Some(channel) = POOL_CREATION_CHANNEL.get(&pool_id) {
+pub async fn notify_worker_ack(task_id: String, worker_id: u32) -> napi::Result<()> {
+    let channel = if let Some(channel) = WORKER_ACK_CHANNAL.get(&task_id) {
         channel
     } else {
         return Err(napi::Error::from_reason(format!(
-            "evaluation ack channel for {pool_id} not found"
+            "worker ack channel for {task_id} not found"
         )));
     };
     Ok(channel
-        .send(())
+        .send(worker_id)
         .await
-        .context("failed to notify evaluation ack")?)
+        .context("failed to notify worker ack")?)
 }
 
 #[napi]

Analysis

Critical bug in notify_worker_ack function breaks worker pool communication protocol

What fails: The notify_worker_ack() function in turbopack/crates/turbopack-node/src/worker_pool/worker_thread.rs uses the wrong channel, wrong parameters, and sends the wrong type, preventing worker allocation from completing.

How to reproduce: When WorkerThreadPool::operation() calls connect_to_worker(pool_id, task_id), it waits indefinitely on WORKER_ACK_CHANNAL[task_id] for a u32 worker ID. The JavaScript side calls notify_worker_ack() to send this response, but the function is broken:

  1. It tries to send to POOL_CREATION_CHANNEL.get(&pool_id) instead of WORKER_ACK_CHANNAL.get(&task_id)
  2. It sends unit type () instead of u32 (worker_id)
  3. It takes wrong parameters: pool_id instead of task_id and worker_id
  4. WORKER_ACK_CHANNAL is not imported

Result: The worker pool initialization hangs indefinitely because connect_to_worker() never receives the expected u32 worker ID on the correct channel.

Expected behavior: notify_worker_ack(task_id, worker_id) should send the u32 worker_id to WORKER_ACK_CHANNAL[task_id] so that connect_to_worker() receives the correct worker ID and completes.

Fix applied:

  1. Added WORKER_ACK_CHANNAL to imports (line 6)
  2. Changed function signature to pub async fn notify_worker_ack(task_id: String, worker_id: u32) (line 48)
  3. Changed to use WORKER_ACK_CHANNAL.get(&task_id) (line 49)
  4. Changed to send worker_id instead of () (line 57)
  5. Updated error messages for clarity

The protocol is defined in operation.rs where connect_to_worker() (lines 70-78) sends a request on WORKER_REQUEST_CHANNAL[pool_id] and then awaits a u32 response on WORKER_ACK_CHANNAL[task_id].

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

Labels

Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants