next.js icon indicating copy to clipboard operation
next.js copied to clipboard

Refactor: Navigation Continuations

Open acdlite opened this issue 2 weeks ago • 2 comments

Based on:

  • #86878
  • #86367
  • #86747

This is a refactor of how App Router implements async navigations. In this context, an "async" navigation is one where the target route is not known at the time the navigation is initiated by the user.

App Router currently processes navigations and action sequentially, using async/await. However, it also overrides pending async navigations if a newer one occurs in the meantime. There are lots of escape hatches and special cases to handle this, but it's not modeled cleanly, and certain operations are still unnecessarily blocking.

Instead, I'm rewriting the reducer-based implementation to something more like a coroutine or generator function. This is an incremental rewrite so not everything will be converted all at once.

In this first PR, I introduce the concept of a "continuation navigation". This is a navigation action that occurs as a result of an earlier navigation attempt.

A continuation navigation only proceeds if the parent navigation hasn't been superseded by a newer navigation.

To track this, the App Router state has an incrementing counter called navigationId. Every new navigation increments this counter.

When a continuation navigation is processed, it compares the navigation ID of its parent (the one that spawned the continuation) with the current navigation ID. If they match, the continuation proceeds. If they do not match, it implies a newer navigation has superseded it.

The principle is that the most recent navigation initiated by the user always takes precedence.

The first reducer I've rewritten to use this new mechanism is the serverPatchReducer. In the pre-Segment Cache implementation, the serverPatchReducer was responsible for all dynamic data fetching; now with Segment Cache, it's only used in cases where the route returned during a navigation does not match the one that was prefetched.

In the new implementation, we use a continuation navigation to patch up the tree with missing data — but only if there hasn't been a newer navigation in the meantime. This removes a race condition in the old implementation.

(The serverPatchReducer mechanism is still being relied on by some of the other reducers that I have not yet rewritten, like restoreReducer. I will delete it once the remaining reducers are converted.)

acdlite avatar Dec 08 '25 03:12 acdlite

Failing test suites

Commit: e79fcec531c1f39ec08a3217b6fe1ba617efe619 | About building and testing Next.js

pnpm test-start test/e2e/app-dir/concurrent-navigations/mismatching-prefetch.test.ts (job)

  • mismatching prefetch > recovers when a navigation redirects to a different route than the one that was prefetched (DD)
Expand output

● mismatching prefetch › recovers when a navigation redirects to a different route than the one that was prefetched

Expected sequence of responses does not match:

- Expected
+ Received

  Array [
    "Dynamic page b",
-   "Dynamic page b",
  ]

NOTE: Assertions are checked in order, so if an expectation is missing, it may have actually appeared earlier in the sequence than expected. Make sure the order is correct.

  39 |       // When we click the link to navigate, the navigation will redirect to
  40 |       // a different route than the one that was prefetched.
> 41 |       await act(
     |             ^
  42 |         async () => {
  43 |           const link = await browser.elementByCss(
  44 |             'a[href="/mismatching-prefetch/dynamic-page/a?mismatch-redirect=./b"]'

  at Object.act (e2e/app-dir/concurrent-navigations/mismatching-prefetch.test.ts:41:13)

pnpm test test/integration/next-image-legacy/basic/test/index.test.ts (job)

  • Image Component Tests > production mode > Client-side Image Component Tests > should render an image tag (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should support passing through arbitrary attributes (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should modify src with the loader (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should correctly generate src even if preceding slash is included in prop (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should add a srcset based on the loader (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should add a srcset even with preceding slash in prop (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should use imageSizes when width matches, not deviceSizes from next.config.js (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should support the unoptimized attribute (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should not add a srcset if unoptimized attribute present (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should keep auto parameter if already set (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should keep width parameter if already set (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should keep fit parameter if already set (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > should only be loaded once if sizes is set (DD)
  • Image Component Tests > production mode > Client-side Image Component Tests > Client-side Errors > Should not log an error when an unregistered host is used in production (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should have loaded the first image immediately (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should not have loaded the second image immediately (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should pass through classes on a lazy loaded image (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should load the second image after scrolling down (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should not have loaded the third image after scrolling down (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should load the third image, which is unoptimized, after scrolling further down (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should load the fourth image lazily after scrolling down (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should load the fifth image eagerly, without scrolling (DD)
  • Image Component Tests > production mode > Client-side Lazy Loading Tests > should load the sixth image, which has lazyBoundary property after scrolling down (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should render an image tag (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should support passing through arbitrary attributes (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should modify src with the loader (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should correctly generate src even if preceding slash is included in prop (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a srcset based on the loader (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a srcset even with preceding slash in prop (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should use imageSizes when width matches, not deviceSizes from next.config.js (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should support the unoptimized attribute (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should not add a srcset if unoptimized attribute present (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should keep auto parameter if already set (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should keep width parameter if already set (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should keep fit parameter if already set (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a preload tag for a priority image (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a preload tag for a priority image with preceding slash (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a preload tag for a priority image, with arbitrary host (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add a preload tag for a priority image, with quality (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should not create any preload tags higher up the page than CSS preload tags (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should add data-nimg data attribute based on layout (DD)
  • Image Component Tests > production mode > SSR Image Component Tests > should not pass config to custom loader prop (DD)
Expand output

● Image Component Tests › production mode › SSR Image Component Tests › should render an image tag

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should support passing through arbitrary attributes

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should modify src with the loader

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should correctly generate src even if preceding slash is included in prop

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a srcset based on the loader

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a srcset even with preceding slash in prop

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should use imageSizes when width matches, not deviceSizes from next.config.js

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should support the unoptimized attribute

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should not add a srcset if unoptimized attribute present

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should keep auto parameter if already set

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should keep width parameter if already set

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should keep fit parameter if already set

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a preload tag for a priority image

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a preload tag for a priority image with preceding slash

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a preload tag for a priority image, with arbitrary host

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add a preload tag for a priority image, with quality

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should not create any preload tags higher up the page than CSS preload tags

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should add data-nimg data attribute based on layout

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › SSR Image Component Tests › should not pass config to custom loader prop

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

  275 |       afterAll(() => killApp(app))
  276 |       describe('SSR Image Component Tests', () => {
> 277 |         beforeAll(async () => {
      |         ^
  278 |           browser = await webdriver(appPort, '/')
  279 |         })
  280 |         afterAll(async () => {

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:277:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:276:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should render an image tag

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should support passing through arbitrary attributes

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should modify src with the loader

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should correctly generate src even if preceding slash is included in prop

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should add a srcset based on the loader

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should add a srcset even with preceding slash in prop

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should use imageSizes when width matches, not deviceSizes from next.config.js

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should support the unoptimized attribute

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should not add a srcset if unoptimized attribute present

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should keep auto parameter if already set

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should keep width parameter if already set

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should keep fit parameter if already set

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should NOT add a preload tag for a priority image

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › should only be loaded once if sizes is set

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › Client-side Errors › Should not log an error when an unregistered host is used in production

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

  336 |       })
  337 |       describe('Client-side Image Component Tests', () => {
> 338 |         beforeAll(async () => {
      |         ^
  339 |           browser = await webdriver(appPort, '/')
  340 |           await browser.waitForElementByCss('#clientlink').click()
  341 |         })

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:338:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:337:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Image Component Tests › Client-side Errors › Should not log an error when an unregistered host is used in production

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

  364 |         describe('Client-side Errors', () => {
  365 |           beforeAll(async () => {
> 366 |             await browser.eval(`(function() {
      |                           ^
  367 |           window.gotHostError = false
  368 |           const origError = console.error
  369 |           window.console.error = function () {

  at Object.eval (integration/next-image-legacy/basic/test/index.test.ts:366:27)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should have loaded the first image immediately

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should not have loaded the second image immediately

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should pass through classes on a lazy loaded image

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should load the second image after scrolling down

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should not have loaded the third image after scrolling down

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should load the third image, which is unoptimized, after scrolling further down

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should load the fourth image lazily after scrolling down

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should load the fifth image eagerly, without scrolling

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

● Image Component Tests › production mode › Client-side Lazy Loading Tests › should load the sixth image, which has lazyBoundary property after scrolling down

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

  392 |       })
  393 |       describe('Client-side Lazy Loading Tests', () => {
> 394 |         beforeAll(async () => {
      |         ^
  395 |           browser = await webdriver(appPort, '/')
  396 |           await browser.waitForElementByCss('#lazylink').click()
  397 |           await waitFor(500)

  at beforeAll (integration/next-image-legacy/basic/test/index.test.ts:394:9)
  at describe (integration/next-image-legacy/basic/test/index.test.ts:393:7)
  at integration/next-image-legacy/basic/test/index.test.ts:267:56
  at Object.describe (integration/next-image-legacy/basic/test/index.test.ts:266:1)

nextjs-bot avatar Dec 08 '25 03:12 nextjs-bot

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
buildDuration 18.8s 16.9s N/A
buildDurationCached 15.6s 12.6s N/A
nodeModulesSize 456 MB 457 MB ⚠️ +245 kB
nextStartRea..uration (ms) 679ms 678ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
4951-HASH.js gzip 5.37 kB 5.38 kB N/A
68680909-HASH.js gzip 62.3 kB 62.3 kB N/A
8034-HASH.js gzip 52.8 kB 53.4 kB ⚠️ +654 B
9564.HASH.js gzip 170 B 168 B N/A
9565-HASH.js gzip 4.46 kB 4.48 kB N/A
framework-HASH.js gzip 59.7 kB 59.7 kB N/A
main-app-HASH.js gzip 256 B 252 B N/A
main-HASH.js gzip 38.6 kB 38.5 kB N/A
webpack-HASH.js gzip 1.69 kB 1.69 kB N/A
Overall change 52.8 kB 53.4 kB ⚠️ +654 B
Legacy Client Bundles (polyfills)
vercel/next.js canary acdlite/next.js navigation-continuations 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 acdlite/next.js navigation-continuations Change
_app-HASH.js gzip 192 B 194 B N/A
_error-HASH.js gzip 183 B 182 B N/A
css-HASH.js gzip 334 B 333 B N/A
dynamic-HASH.js gzip 1.79 kB 1.81 kB N/A
edge-ssr-HASH.js gzip 254 B 255 B N/A
head-HASH.js gzip 352 B 349 B N/A
hooks-HASH.js gzip 383 B 378 B N/A
image-HASH.js gzip 580 B 581 B N/A
index-HASH.js gzip 259 B 258 B N/A
link-HASH.js gzip 2.51 kB 2.5 kB N/A
routerDirect..HASH.js gzip 317 B 319 B N/A
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 314 B 312 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 492 B 492 B
Client Build Manifests
vercel/next.js canary acdlite/next.js navigation-continuations Change
_buildManifest.js gzip 735 B 738 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary acdlite/next.js navigation-continuations Change
index.html gzip 521 B 522 B N/A
link.html gzip 538 B 538 B
withRouter.html gzip 520 B 519 B N/A
Overall change 538 B 538 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
edge-ssr.js gzip 124 kB 124 kB N/A
page.js gzip 236 kB 237 kB ⚠️ +1.23 kB
Overall change 236 kB 237 kB ⚠️ +1.23 kB
Middleware size Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
middleware-b..fest.js gzip 651 B 655 B N/A
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 32.6 kB 32.9 kB ⚠️ +325 B
edge-runtime..pack.js gzip 846 B 846 B
Overall change 33.6 kB 33.9 kB ⚠️ +325 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
app-page-exp...dev.js gzip 301 kB 301 kB ⚠️ +558 B
app-page-exp..prod.js gzip 155 kB 155 kB N/A
app-page-tur...dev.js gzip 301 kB 301 kB ⚠️ +558 B
app-page-tur..prod.js gzip 155 kB 155 kB N/A
app-page-tur...dev.js gzip 297 kB 298 kB ⚠️ +568 B
app-page-tur..prod.js gzip 153 kB 153 kB N/A
app-page.run...dev.js gzip 297 kB 298 kB ⚠️ +565 B
app-page.run..prod.js gzip 153 kB 153 kB N/A
app-route-ex...dev.js gzip 68.6 kB 68.6 kB
app-route-ex..prod.js gzip 47.5 kB 47.5 kB
app-route-tu...dev.js gzip 68.7 kB 68.7 kB
app-route-tu..prod.js gzip 47.5 kB 47.5 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.ru...dev.js gzip 68.2 kB 68.2 kB
app-route.ru..prod.js gzip 47.2 kB 47.2 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 41 kB 41 kB
pages-api-tu..prod.js gzip 31.1 kB 31.1 kB
pages-api.ru...dev.js gzip 41 kB 41 kB
pages-api.ru..prod.js gzip 31.1 kB 31.1 kB
pages-turbo....dev.js gzip 50.5 kB 50.5 kB
pages-turbo...prod.js gzip 38 kB 38 kB
pages.runtim...dev.js gzip 50.5 kB 50.5 kB
pages.runtim..prod.js gzip 38 kB 38 kB
server.runti..prod.js gzip 59.8 kB 59.8 kB
Overall change 2.04 MB 2.04 MB ⚠️ +2.25 kB
build cache Overall increase ⚠️
vercel/next.js canary acdlite/next.js navigation-continuations Change
0.pack gzip 3.1 MB 3.81 MB ⚠️ +710 kB
index.pack gzip 93.6 kB 108 kB ⚠️ +14.6 kB
Overall change 3.2 MB 3.92 MB ⚠️ +724 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 _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
       numHashes: NaN,
       bitArray: [],
     },
-    "/": ["static\u002Fchunks\u002Fpages\u002Findex-b087a17851e05d6f.js"],
+    "/": ["static\u002Fchunks\u002Fpages\u002Findex-3361ed053e34d664.js"],
     "/_error": [
-      "static\u002Fchunks\u002Fpages\u002F_error-0d6cadd1684bf608.js",
+      "static\u002Fchunks\u002Fpages\u002F_error-c7ffde23a6d1e061.js",
     ],
     "/css": [
       "static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
-      "static\u002Fchunks\u002Fpages\u002Fcss-d018beb4ee617700.js",
+      "static\u002Fchunks\u002Fpages\u002Fcss-0b6177a056485c89.js",
     ],
     "/dynamic": [
-      "static\u002Fchunks\u002Fpages\u002Fdynamic-22fa1f98925287e3.js",
+      "static\u002Fchunks\u002Fpages\u002Fdynamic-8e7954693aad6744.js",
     ],
     "/edge-ssr": [
-      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-79392016bf448b0e.js",
+      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-7515805a0793fb50.js",
     ],
-    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-7c5bbe7e16e0461c.js"],
-    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-9fbae4ac20575871.js"],
+    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-18530459356f6f47.js"],
+    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-221843a8082c5fe0.js"],
     "/image": [
-      "static\u002Fchunks\u002F9565-2e0c4004742fb14a.js",
-      "static\u002Fchunks\u002Fpages\u002Fimage-811425894781cf7d.js",
+      "static\u002Fchunks\u002F5467-5440e689c12d4e40.js",
+      "static\u002Fchunks\u002Fpages\u002Fimage-fe20cdcfe67a7d4d.js",
     ],
-    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-14068c948da9dc39.js"],
+    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-814c1a2b0c6775c5.js"],
     "/routerDirect": [
-      "static\u002Fchunks\u002Fpages\u002FrouterDirect-6d3e9dcd1348423d.js",
+      "static\u002Fchunks\u002Fpages\u002FrouterDirect-a0028e2a28aa8c85.js",
     ],
     "/script": [
-      "static\u002Fchunks\u002Fpages\u002Fscript-eda35f71f7a910ba.js",
+      "static\u002Fchunks\u002Fpages\u002Fscript-5b734e02315dd67a.js",
     ],
     "/withRouter": [
-      "static\u002Fchunks\u002Fpages\u002FwithRouter-4a6d5ec263e28451.js",
+      "static\u002Fchunks\u002Fpages\u002FwithRouter-db2aefa859481ae2.js",
     ],
     sortedPages: [
       "\u002F",
Diff for css-HASH.js
@@ -1,14 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 1361: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
-
-    /***/ 1651: /***/ (
+    /***/ 942: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -16,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/css",
         function () {
-          return __webpack_require__(3321);
+          return __webpack_require__(3023);
         },
       ]);
       if (false) {
@@ -25,7 +18,7 @@
       /***/
     },
 
-    /***/ 3321: /***/ (
+    /***/ 3023: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -39,7 +32,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1361);
+        __webpack_require__(3264);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -58,13 +51,20 @@
 
       /***/
     },
+
+    /***/ 3264: /***/ (module) => {
+      // extracted by mini-css-extract-plugin
+      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1651)
+      __webpack_exec__(942)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,177 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 617: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-      /* __next_internal_client_entry_do_not_use__  cjs */
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "LoadableContext", {
-        enumerable: true,
-        get: function () {
-          return LoadableContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(6466)
-      );
-      const LoadableContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
-
-      /***/
-    },
-
-    /***/ 620: /***/ (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, {
-        /**
-         * This function lets you dynamically import a component.
-         * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.
-         *
-         * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)
-         */ default: function () {
-          return dynamic;
-        },
-        noSSR: function () {
-          return noSSR;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _jsxruntime = __webpack_require__(7002);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(6466)
-      );
-      const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3147)
-      );
-      const isServerSide = "object" === "undefined";
-      // Normalize loader to return the module as form { default: Component } for `React.lazy`.
-      // Also for backward compatible since next/dynamic allows to resolve a component directly with loader
-      // Client component reference proxy need to be converted to a module.
-      function convertModule(mod) {
-        return {
-          default: mod?.default || mod,
-        };
-      }
-      function noSSR(LoadableInitializer, loadableOptions) {
-        // Removing webpack and modules means react-loadable won't try preloading
-        delete loadableOptions.webpack;
-        delete loadableOptions.modules;
-        // This check is necessary to prevent react-loadable from initializing on the server
-        if (!isServerSide) {
-          return LoadableInitializer(loadableOptions);
-        }
-        const Loading = loadableOptions.loading;
-        // This will only be rendered on the server side
-        return () =>
-          /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {
-            error: null,
-            isLoading: true,
-            pastDelay: false,
-            timedOut: false,
-          });
-      }
-      function dynamic(dynamicOptions, options) {
-        let loadableFn = _loadablesharedruntime.default;
-        let loadableOptions = {
-          // A loading component is not required, so we default it
-          loading: ({ error, isLoading, pastDelay }) => {
-            if (!pastDelay) return null;
-            if (false) {
-            }
-            return null;
-          },
-        };
-        // Support for direct import(), eg: dynamic(import('../hello-world'))
-        // Note that this is only kept for the edge case where someone is passing in a promise as first argument
-        // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))
-        // To make sure we don't execute the import without rendering first
-        if (dynamicOptions instanceof Promise) {
-          loadableOptions.loader = () => dynamicOptions;
-          // Support for having import as a function, eg: dynamic(() => import('../hello-world'))
-        } else if (typeof dynamicOptions === "function") {
-          loadableOptions.loader = dynamicOptions;
-          // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})
-        } else if (typeof dynamicOptions === "object") {
-          loadableOptions = {
-            ...loadableOptions,
-            ...dynamicOptions,
-          };
-        }
-        // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})
-        loadableOptions = {
-          ...loadableOptions,
-          ...options,
-        };
-        const loaderFn = loadableOptions.loader;
-        const loader = () =>
-          loaderFn != null
-            ? loaderFn().then(convertModule)
-            : Promise.resolve(convertModule(() => null));
-        // coming from build/babel/plugins/react-loadable-plugin.js
-        if (loadableOptions.loadableGenerated) {
-          loadableOptions = {
-            ...loadableOptions,
-            ...loadableOptions.loadableGenerated,
-          };
-          delete loadableOptions.loadableGenerated;
-        }
-        // support for disabling server side rendering, eg: dynamic(() => import('../hello-world'), {ssr: false}).
-        if (typeof loadableOptions.ssr === "boolean" && !loadableOptions.ssr) {
-          delete loadableOptions.webpack;
-          delete loadableOptions.modules;
-          return noSSR(loadableFn, loadableOptions);
-        }
-        return loadableFn({
-          ...loadableOptions,
-          loader: loader,
-        });
-      }
-      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=dynamic.js.map
-
-      /***/
-    },
-
-    /***/ 1173: /***/ (
+    /***/ 1151: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(620);
+      module.exports = __webpack_require__(7368);
 
       /***/
     },
 
-    /***/ 2907: /***/ (
+    /***/ 4773: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -186,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1173);
+        __webpack_require__(1151);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -195,12 +35,12 @@
       const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
         () =>
           __webpack_require__
-            .e(/* import() */ 9564)
-            .then(__webpack_require__.bind(__webpack_require__, 9564))
+            .e(/* import() */ 6022)
+            .then(__webpack_require__.bind(__webpack_require__, 6022))
             .then((mod) => mod.Hello),
         {
           loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 9564],
+            webpack: () => [/*require.resolve*/ 6022],
           },
         }
       );
@@ -227,7 +67,7 @@
       /***/
     },
 
-    /***/ 3147: /***/ (
+    /***/ 5631: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -269,7 +109,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(6466)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(617);
+      const _loadablecontextsharedruntime = __webpack_require__(6861);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -502,7 +342,167 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 4236: /***/ (
+    /***/ 6861: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      "use strict";
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "LoadableContext", {
+        enumerable: true,
+        get: function () {
+          return LoadableContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(6466)
+      );
+      const LoadableContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 7368: /***/ (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, {
+        /**
+         * This function lets you dynamically import a component.
+         * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.
+         *
+         * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)
+         */ default: function () {
+          return dynamic;
+        },
+        noSSR: function () {
+          return noSSR;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _jsxruntime = __webpack_require__(7002);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(6466)
+      );
+      const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(5631)
+      );
+      const isServerSide = "object" === "undefined";
+      // Normalize loader to return the module as form { default: Component } for `React.lazy`.
+      // Also for backward compatible since next/dynamic allows to resolve a component directly with loader
+      // Client component reference proxy need to be converted to a module.
+      function convertModule(mod) {
+        return {
+          default: mod?.default || mod,
+        };
+      }
+      function noSSR(LoadableInitializer, loadableOptions) {
+        // Removing webpack and modules means react-loadable won't try preloading
+        delete loadableOptions.webpack;
+        delete loadableOptions.modules;
+        // This check is necessary to prevent react-loadable from initializing on the server
+        if (!isServerSide) {
+          return LoadableInitializer(loadableOptions);
+        }
+        const Loading = loadableOptions.loading;
+        // This will only be rendered on the server side
+        return () =>
+          /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {
+            error: null,
+            isLoading: true,
+            pastDelay: false,
+            timedOut: false,
+          });
+      }
+      function dynamic(dynamicOptions, options) {
+        let loadableFn = _loadablesharedruntime.default;
+        let loadableOptions = {
+          // A loading component is not required, so we default it
+          loading: ({ error, isLoading, pastDelay }) => {
+            if (!pastDelay) return null;
+            if (false) {
+            }
+            return null;
+          },
+        };
+        // Support for direct import(), eg: dynamic(import('../hello-world'))
+        // Note that this is only kept for the edge case where someone is passing in a promise as first argument
+        // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))
+        // To make sure we don't execute the import without rendering first
+        if (dynamicOptions instanceof Promise) {
+          loadableOptions.loader = () => dynamicOptions;
+          // Support for having import as a function, eg: dynamic(() => import('../hello-world'))
+        } else if (typeof dynamicOptions === "function") {
+          loadableOptions.loader = dynamicOptions;
+          // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})
+        } else if (typeof dynamicOptions === "object") {
+          loadableOptions = {
+            ...loadableOptions,
+            ...dynamicOptions,
+          };
+        }
+        // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})
+        loadableOptions = {
+          ...loadableOptions,
+          ...options,
+        };
+        const loaderFn = loadableOptions.loader;
+        const loader = () =>
+          loaderFn != null
+            ? loaderFn().then(convertModule)
+            : Promise.resolve(convertModule(() => null));
+        // coming from build/babel/plugins/react-loadable-plugin.js
+        if (loadableOptions.loadableGenerated) {
+          loadableOptions = {
+            ...loadableOptions,
+            ...loadableOptions.loadableGenerated,
+          };
+          delete loadableOptions.loadableGenerated;
+        }
+        // support for disabling server side rendering, eg: dynamic(() => import('../hello-world'), {ssr: false}).
+        if (typeof loadableOptions.ssr === "boolean" && !loadableOptions.ssr) {
+          delete loadableOptions.webpack;
+          delete loadableOptions.modules;
+          return noSSR(loadableFn, loadableOptions);
+        }
+        return loadableFn({
+          ...loadableOptions,
+          loader: loader,
+        });
+      }
+      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=dynamic.js.map
+
+      /***/
+    },
+
+    /***/ 8258: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -510,7 +510,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/dynamic",
         function () {
-          return __webpack_require__(2907);
+          return __webpack_require__(4773);
         },
       ]);
       if (false) {
@@ -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__(4236)
+      __webpack_exec__(8258)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for head-HASH.js
@@ -1,24 +1,13 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [5350],
   {
-    /***/ 2366: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/head",
-        function () {
-          return __webpack_require__(8140);
-        },
-      ]);
-      if (false) {
-      }
+    /***/ 48: /***/ (module, __unused_webpack_exports, __webpack_require__) => {
+      module.exports = __webpack_require__(8141);
 
       /***/
     },
 
-    /***/ 8140: /***/ (
+    /***/ 2682: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +22,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(9386);
+        __webpack_require__(48);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -67,12 +56,19 @@
       /***/
     },
 
-    /***/ 9386: /***/ (
-      module,
+    /***/ 2956: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(1649);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/head",
+        function () {
+          return __webpack_require__(2682);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -82,7 +78,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2366)
+      __webpack_exec__(2956)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2983],
   {
-    /***/ 497: /***/ (
+    /***/ 8114: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/image",
+        function () {
+          return __webpack_require__(9180);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9180: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -18,8 +35,8 @@
 
       // EXTERNAL MODULE: ./node_modules/.pnpm/[email protected]/node_modules/react/jsx-runtime.js
       var jsx_runtime = __webpack_require__(7002);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
-      var next_image = __webpack_require__(9565);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
+      var next_image = __webpack_require__(5467);
       var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
       /* harmony default export */ const nextjs = {
         src: "/_next/static/media/nextjs.cae0b805.png",
@@ -48,30 +65,13 @@
 
       /***/
     },
-
-    /***/ 5748: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/image",
-        function () {
-          return __webpack_require__(497);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
-    /******/ __webpack_require__.O(0, [9565, 636, 6593, 8792], () =>
-      __webpack_exec__(5748)
+    /******/ __webpack_require__.O(0, [5467, 636, 6593, 8792], () =>
+      __webpack_exec__(8114)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 1182: /***/ (
+    /***/ 2156: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/link",
         function () {
-          return __webpack_require__(4610);
+          return __webpack_require__(8272);
         },
       ]);
       if (false) {
@@ -18,7 +18,220 @@
       /***/
     },
 
-    /***/ 1557: /***/ (module, exports, __webpack_require__) => {
+    /***/ 4581: /***/ (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__(6466);
+      const _requestidlecallback = __webpack_require__(7441);
+      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
+
+      /***/
+    },
+
+    /***/ 6155: /***/ (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__(6466);
+      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
+
+      /***/
+    },
+
+    /***/ 7046: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(8113);
+
+      /***/
+    },
+
+    /***/ 8113: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -45,17 +258,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(6466)
       );
-      const _resolvehref = __webpack_require__(5475);
-      const _islocalurl = __webpack_require__(6475);
-      const _formaturl = __webpack_require__(9998);
-      const _utils = __webpack_require__(3084);
-      const _addlocale = __webpack_require__(3921);
-      const _routercontextsharedruntime = __webpack_require__(7726);
-      const _useintersection = __webpack_require__(4806);
-      const _getdomainlocale = __webpack_require__(3219);
-      const _addbasepath = __webpack_require__(5498);
-      const _usemergedref = __webpack_require__(3255);
-      const _erroronce = __webpack_require__(1685);
+      const _resolvehref = __webpack_require__(2399);
+      const _islocalurl = __webpack_require__(6687);
+      const _formaturl = __webpack_require__(4802);
+      const _utils = __webpack_require__(9208);
+      const _addlocale = __webpack_require__(9845);
+      const _routercontextsharedruntime = __webpack_require__(3466);
+      const _useintersection = __webpack_require__(4581);
+      const _getdomainlocale = __webpack_require__(8319);
+      const _addbasepath = __webpack_require__(4126);
+      const _usemergedref = __webpack_require__(6155);
+      const _erroronce = __webpack_require__(8305);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -434,140 +647,7 @@
       /***/
     },
 
-    /***/ 1685: /***/ (__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
-
-      /***/
-    },
-
-    /***/ 3219: /***/ (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__(1059);
-      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
-
-      /***/
-    },
-
-    /***/ 3255: /***/ (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__(6466);
-      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
-
-      /***/
-    },
-
-    /***/ 4610: /***/ (
+    /***/ 8272: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -582,7 +662,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(9056);
+        __webpack_require__(7046);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -613,115 +693,45 @@
       /***/
     },
 
-    /***/ 4806: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8305: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "useIntersection", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return useIntersection;
+          return errorOnce;
         },
       });
-      const _react = __webpack_require__(6466);
-      const _requestidlecallback = __webpack_require__(805);
-      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;
-          }
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
+
+      /***/
+    },
+
+    /***/ 8319: /***/ (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__(6063);
+      const basePath =
+        /* unused pure expression or super */ null && (false || "");
+      function getDomainLocale(path, locale, locales, domainLocales) {
+        if (false) {
+        } else {
+          return false;
         }
-        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" ||
@@ -733,17 +743,7 @@
         });
         Object.assign(exports.default, exports);
         module.exports = exports.default;
-      } //# sourceMappingURL=use-intersection.js.map
-
-      /***/
-    },
-
-    /***/ 9056: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(1557);
+      } //# sourceMappingURL=get-domain-locale.js.map
 
       /***/
     },
@@ -753,7 +753,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1182)
+      __webpack_exec__(2156)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,13 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 15: /***/ (module, __unused_webpack_exports, __webpack_require__) => {
-      module.exports = __webpack_require__(5258);
-
-      /***/
-    },
-
-    /***/ 6853: /***/ (
+    /***/ 2895: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -22,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(15);
+        __webpack_require__(3489);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -55,7 +49,17 @@
       /***/
     },
 
-    /***/ 9264: /***/ (
+    /***/ 3489: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(3102);
+
+      /***/
+    },
+
+    /***/ 9884: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -63,7 +67,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/script",
         function () {
-          return __webpack_require__(6853);
+          return __webpack_require__(2895);
         },
       ]);
       if (false) {
@@ -77,7 +81,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9264)
+      __webpack_exec__(9884)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 1593: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(372);
-
-      /***/
-    },
-
-    /***/ 4550: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(8527);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 8527: /***/ (
+    /***/ 69: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7002);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1593);
+        __webpack_require__(2027);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
 
       /***/
     },
+
+    /***/ 2027: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(1536);
+
+      /***/
+    },
+
+    /***/ 2268: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(69);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4550)
+      __webpack_exec__(2268)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 4951-HASH.js

Diff too large to display

Diff for 8034-HASH.js
failed to diff
Diff for 9565-HASH.js

Diff too large to display

Diff for main-HASH.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Commit: e79fcec531c1f39ec08a3217b6fe1ba617efe619

nextjs-bot avatar Dec 08 '25 03:12 nextjs-bot

Going to go with a slightly different approach

acdlite avatar Dec 11 '25 21:12 acdlite