Refactor: Navigation Continuations
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.)
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
sizesis 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)
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
Going to go with a slightly different approach