Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[after] after is not dynamic anymore #71231

Merged
merged 7 commits into from
Oct 14, 2024
Merged

Conversation

lubieowoce
Copy link
Member

@lubieowoce lubieowoce commented Oct 13, 2024

Changes

1. unstable_after() is no longer dynamic

after() can now run at build time and in ISR/revalidations.

the principle is "if it ran, then the callback runs too". i.e. if we encountered an after() call during some render task (build / request / revalidation), then the callback should run at the end of that task.

note that errors thrown inside after during a prerender will fail the build. this is, amongst other things, intended to support the next section

2. calling dynamic APIs inside unstable_after() is banned

before:

after(() => {
  const cookieStore = await cookies();
  doStuff(cookieStore)
})

after:

const cookieStore = await cookies();
after(() => {
  doStuff(cookieStore)
})

tracking dynamic things inside after is difficult (can't throw at the callsite, because we're executing after the callsite is finished, so it doesn't mesh well with dynamicIO). it's simpler if we make the user hoist the dynamic call outside of after(), because then it slots right into the existing mechanisms/docs/metal models we have for this.

Notes

one notable limitation is that tags and revalidate written inside after have no effect. this means that if we do

after(async () => {
  await fetch('...', { next: { tags: ['my-cool-tag']} })
})

and try to call revalidateTag('my-cool-tag'), nothing will happen, because the route is not associated with the tag. same applies to revalidate.

i believe this is acceptable for now, because we expect after to be mostly used to perform side effects, and thus not do a lot of {cached,tagged,revalidatable} data-fetching. it will be addressed in a follow up.

Copy link
Member Author

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

Join @lubieowoce and the rest of your teammates on Graphite Graphite

@lubieowoce lubieowoce changed the title wip: running unstable_after during build [after] after is not dynamic anymore Oct 13, 2024
@lubieowoce lubieowoce force-pushed the lubieowoce/after-is-not-dynamic branch 2 times, most recently from abf33fa to 8ff3ed5 Compare October 13, 2024 22:14
@ijjk
Copy link
Member

ijjk commented Oct 13, 2024

Failing test suites

Commit: 718c3c7

TURBOPACK=1 pnpm test-dev test/development/app-hmr/hmr.test.ts (turbopack)

  • app-dir-hmr > filesystem changes > should update server components pages when env files is changed (node)
Expand output

● app-dir-hmr › filesystem changes › should update server components pages when env files is changed (node)

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

Expected: "mac"
Received: "ipad"

  145 |       async (page) => {
  146 |         const browser = await next.browser(`/env/${page}`)
> 147 |         expect(await browser.elementByCss('p').text()).toBe('mac')
      |                                                        ^
  148 |         await next.patchFile(envFile, 'MY_DEVICE="ipad"')
  149 |
  150 |         const logs = await browser.log()

  at toBe (development/app-hmr/hmr.test.ts:147:56)

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

TURBOPACK=1 pnpm test-dev test/development/middleware-errors/index.test.ts (turbopack)

  • middleware - development errors > when there is a compilation error after boot > logs the error correctly
Expand output

● middleware - development errors › when there is a compilation error after boot › logs the error correctly

TIMED OUT: success

undefined

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

Expected substring: "Expected '{', got '}'"
Received string:    "  ▲ Next.js 15.0.0-canary.190 (turbo)
  - Local:        http://localhost:37327·
 ✓ Starting...
Creating turbopack project {
  dir: '/tmp/next-install-89ec30e92ab5f4f2db10bc39ad87daaaddf4c980b5c7d58e95f358e843bba7b1',
  testMode: true
}
 ✓ Compiled in 112ms
 ✓ Ready in 545ms
 ✓ Compiled in 2ms
 ○ Compiling middleware ...
 ✓ Compiled middleware in 613ms
 ✓ Compiled /_error in 78ms
 GET / 500 in 757ms
"

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (development/middleware-errors/index.test.ts:300:7)

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

TURBOPACK=1 pnpm test test/integration/next-image-new/default/test/static.test.ts (turbopack)

  • Static Image Component Tests > production mode > Should allow an image with a static src to omit height and width
  • Static Image Component Tests > production mode > Should use immutable cache-control header for static import
  • Static Image Component Tests > production mode > Should use immutable cache-control header even when unoptimized
  • Static Image Component Tests > production mode > should have containing followed by for priority image
  • Static Image Component Tests > production mode > Should automatically provide an image height and width
  • Static Image Component Tests > production mode > should use width and height prop to override import
  • Static Image Component Tests > production mode > should use height prop to adjust both width and height
  • Static Image Component Tests > production mode > should use width prop to adjust both width and height
  • Static Image Component Tests > production mode > should add a data URL placeholder to an image
  • Static Image Component Tests > production mode > should add a blur placeholder a statically imported jpg
  • Static Image Component Tests > production mode > should add a blur placeholder a statically imported png
  • Static Image Component Tests > production mode > should add a blur placeholder a statically imported png with fill
  • Static Image Component Tests > production mode > should add placeholder with blurDataURL and fill
  • Static Image Component Tests > production mode > should add placeholder even when blurDataURL aspect ratio does not match width/height ratio
  • Static Image Component Tests > production mode > should load direct imported image
  • Static Image Component Tests > production mode > should load staticprops imported image
Expand output

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

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

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

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › Should use immutable cache-control header even when unoptimized

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should have containing followed by for 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."

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › Should automatically provide an image height and width

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should use width and height prop to override import

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should use height prop to adjust both width and height

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should use width prop to adjust both width and height

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add a data URL placeholder to an 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."

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add a blur placeholder a statically imported jpg

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add a blur placeholder a statically imported png

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add a blur placeholder a statically imported png with fill

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add placeholder with blurDataURL and fill

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should add placeholder even when blurDataURL aspect ratio does not match width/height ratio

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

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should load direct imported 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."

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

● Static Image Component Tests › production mode › should load staticprops imported 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."

  262 |     'production mode',
  263 |     () => {
> 264 |       beforeAll(async () => {
      |       ^
  265 |         await nextBuild(appDir)
  266 |         appPort = await findPort()
  267 |         app = await nextStart(appDir, appPort)

  at beforeAll (integration/next-image-new/default/test/static.test.ts:264:7)
  at integration/next-image-new/default/test/static.test.ts:261:56
  at Object.describe (integration/next-image-new/default/test/static.test.ts:260:1)

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

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

  • app-dir action handling > fetch actions > should handle redirects to routes that provide an invalid RSC response
Expand output

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

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

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

  1251 |
  1252 |       await retry(async () => {
> 1253 |         expect(await browser.elementByCss('body').text()).toContain(
       |                                                           ^
  1254 |           'Hello from a pages route'
  1255 |         )
  1256 |         expect(await browser.url()).toBe(`${next.url}/pages-dir`)

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

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

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

  • Image Component Default Tests > development mode > should load the images
  • Image Component Default Tests > development mode > should preload priority images
  • Image Component Default Tests > development mode > should not pass through user-provided srcset (causing a flash)
  • Image Component Default Tests > development mode > should update the image on src change
  • Image Component Default Tests > development mode > should callback onLoadingComplete when image is fully loaded
  • Image Component Default Tests > development mode > should callback native onLoad with sythetic event
  • Image Component Default Tests > development mode > should callback native onError when error occurred while loading image
  • Image Component Default Tests > development mode > should callback native onError even when error before hydration
  • Image Component Default Tests > development mode > should work when using overrideSrc prop
  • Image Component Default Tests > development mode > should work with sizes and automatically use responsive srcset
  • Image Component Default Tests > development mode > should render no wrappers or sizers
  • Image Component Default Tests > development mode > should lazy load with placeholder=blur
  • Image Component Default Tests > development mode > should handle the styles prop appropriately
  • Image Component Default Tests > development mode > should warn when legacy prop layout=fill
  • Image Component Default Tests > development mode > should warn when legacy prop layout=responsive
  • Image Component Default Tests > development mode > should render picture via getImageProps
  • Image Component Default Tests > development mode > should show invalid src error
  • Image Component Default Tests > development mode > should show invalid src error when protocol-relative
  • Image Component Default Tests > development mode > should show invalid src with leading space
  • Image Component Default Tests > development mode > should show invalid src with trailing space
  • Image Component Default Tests > development mode > should show error when string src and placeholder=blur and blurDataURL is missing
  • Image Component Default Tests > development mode > should show error when invalid width prop
  • Image Component Default Tests > development mode > should show error when invalid Infinity width prop
  • Image Component Default Tests > development mode > should show error when invalid height prop
  • Image Component Default Tests > development mode > should show missing alt error
  • Image Component Default Tests > development mode > should show error when missing width prop
  • Image Component Default Tests > development mode > should show error when missing height prop
  • Image Component Default Tests > development mode > should show error when width prop on fill image
  • Image Component Default Tests > development mode > should show error when CSS position changed on fill image
  • Image Component Default Tests > development mode > should show error when static import and placeholder=blur and blurDataUrl is missing
  • Image Component Default Tests > development mode > should warn when using a very small image with placeholder=blur
  • Image Component Default Tests > development mode > should not warn when Image is child of p
  • Image Component Default Tests > development mode > should warn when priority prop is missing on LCP image
  • Image Component Default Tests > development mode > should warn at most once even after state change
  • Image Component Default Tests > development mode > should correctly ignore prose styles
  • Image Component Default Tests > development mode > should apply filter style after image loads
  • Image Component Default Tests > development mode > should emit image for next/dynamic with non ssr case
  • Image Component Default Tests > development mode > should have data url placeholder when enabled
  • Image Component Default Tests > development mode > should remove data url placeholder after image loads
  • Image Component Default Tests > development mode > should render correct objectFit when data url placeholder and fill
  • Image Component Default Tests > development mode > should have blurry placeholder when enabled
  • Image Component Default Tests > development mode > should remove blurry placeholder after image loads
  • Image Component Default Tests > development mode > should render correct objectFit when blurDataURL and fill
  • Image Component Default Tests > development mode > should be valid HTML
  • Image Component Default Tests > development mode > Fill-mode tests > should include a data-attribute on fill images
  • Image Component Default Tests > development mode > Fill-mode tests > should add position:absolute to fill images
  • Image Component Default Tests > development mode > Fill-mode tests > should add 100% width and height to fill images
  • Image Component Default Tests > development mode > Fill-mode tests > should add position styles to fill images
  • Image Component Default Tests > development mode > Fill-mode tests > should log warnings when using fill mode incorrectly
Expand output

● Image Component Default Tests › development mode › should load the images

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

Expected: true
Received: false

   98 |           `http://localhost:${appPort}/_next/image?url=%2Ftest.jpg&w=828&q=75`
   99 |         )
> 100 |       ).toBe(true)
      |         ^
  101 |     } finally {
  102 |       if (browser) {
  103 |         await browser.close()

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:100:9)

● Image Component Default Tests › development mode › should preload priority images

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

Expected: {"crossorigin": "use-credentials", "fetchpriority": "", "imagesizes": "", "imagesrcset": "/_next/image?url=%2Ftest.webp&w=640&q=75 1x, /_next/image?url=%2Ftest.webp&w=828&q=75 2x", "referrerpolicy": ""}
Received: undefined

  146 |             '/_next/image?url=%2Ftest.webp&w=640&q=75 1x, /_next/image?url=%2Ftest.webp&w=828&q=75 2x'
  147 |         )
> 148 |       ).toEqual({
      |         ^
  149 |         fetchpriority: '',
  150 |         imagesizes: '',
  151 |         imagesrcset:

  at Object.toEqual (integration/next-image-new/default/test/index.test.ts:148:9)

● Image Component Default Tests › development mode › should not pass through user-provided srcset (causing a flash)

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

Expected: 1
Received: 0

  262 |
  263 |     const els = [].slice.apply($html('img'))
> 264 |     expect(els.length).toBe(1)
      |                        ^
  265 |
  266 |     const [el] = els
  267 |

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:264:24)

● Image Component Default Tests › development mode › should update the image on src change

TIMED OUT: /test\.jpg/

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:282:7)

● Image Component Default Tests › development mode › should callback onLoadingComplete when image is fully loaded

TIMED OUT: /test(.*)jpg/

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:307:5)

● Image Component Default Tests › development mode › should callback native onLoad with sythetic event

TIMED OUT: loaded img1 with native onLoad, count 1

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:404:5)

● Image Component Default Tests › development mode › should callback native onError when error occurred while loading image

TIMED OUT: no error occurred for img1

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:494:5)

● Image Component Default Tests › development mode › should callback native onError even when error before hydration

TIMED OUT: error state

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:526:5)

● Image Component Default Tests › development mode › should work when using overrideSrc prop

TIMED OUT: /test(.*)jpg/

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:586:5)

● Image Component Default Tests › development mode › should work with sizes and automatically use responsive srcset

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

  594 |   })
  595 |
> 596 |   it('should work with sizes and automatically use responsive srcset', async () => {
      |   ^
  597 |     const browser = await webdriver(appPort, '/sizes')
  598 |     const id = 'sizes1'
  599 |     expect(await getSrc(browser, id)).toBe(

  at it (integration/next-image-new/default/test/index.test.ts:596:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should render no wrappers or sizers

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

Expected: 1
Received: null

  616 |         `document.getElementById('image-container1').children.length`
  617 |       )
> 618 |       expect(numberOfChildren).toBe(1)
      |                                ^
  619 |       const childElementType = await browser.eval(
  620 |         `document.getElementById('image-container1').children[0].nodeName`
  621 |       )

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:618:32)

● Image Component Default Tests › development mode › should lazy load with placeholder=blur

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

  679 |   })
  680 |
> 681 |   it('should lazy load with placeholder=blur', async () => {
      |   ^
  682 |     const browser = await webdriver(appPort, '/placeholder-blur')
  683 |
  684 |     // blur1

  at it (integration/next-image-new/default/test/index.test.ts:681:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should handle the styles prop appropriately

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

  773 |   })
  774 |
> 775 |   it('should handle the styles prop appropriately', async () => {
      |   ^
  776 |     const browser = await webdriver(appPort, '/style-prop')
  777 |
  778 |     expect(await browser.elementById('with-styles').getAttribute('style')).toBe(

  at it (integration/next-image-new/default/test/index.test.ts:775:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should warn when legacy prop layout=fill

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

  787 |   })
  788 |
> 789 |   it('should warn when legacy prop layout=fill', async () => {
      |   ^
  790 |     let browser = await webdriver(appPort, '/legacy-layout-fill')
  791 |     const img = await browser.elementById('img')
  792 |     expect(img).toBeDefined()

  at it (integration/next-image-new/default/test/index.test.ts:789:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should warn when legacy prop layout=responsive

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

  819 |   })
  820 |
> 821 |   it('should warn when legacy prop layout=responsive', async () => {
      |   ^
  822 |     let browser = await webdriver(appPort, '/legacy-layout-responsive')
  823 |     const img = await browser.elementById('img')
  824 |     expect(img).toBeDefined()

  at it (integration/next-image-new/default/test/index.test.ts:821:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should render picture via getImageProps

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

  845 |   })
  846 |
> 847 |   it('should render picture via getImageProps', async () => {
      |   ^
  848 |     const browser = await webdriver(appPort, '/picture')
  849 |     // Wait for image to load:
  850 |     await check(async () => {

  at it (integration/next-image-new/default/test/index.test.ts:847:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

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

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

Expected substring: "Invalid src prop (https://google.com/test.png) on `next/image`, hostname \"google.com\" is not configured under images in your `next.config.js`"
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  906 |
  907 |       await assertHasRedbox(browser)
> 908 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  909 |         'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`'
  910 |       )
  911 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:908:46)

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

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

Expected substring: "Failed to parse src \"//assets.example.com/img.jpg\" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)"
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  915 |
  916 |       await assertHasRedbox(browser)
> 917 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  918 |         'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)'
  919 |       )
  920 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:917:46)

● Image Component Default Tests › development mode › should show invalid src with leading space

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

Expected substring: "Image with src \" /test.jpg\" cannot start with a space or control character."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  923 |       const browser = await webdriver(appPort, '/invalid-src-leading-space')
  924 |       await assertHasRedbox(browser)
> 925 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  926 |         'Image with src " /test.jpg" cannot start with a space or control character.'
  927 |       )
  928 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:925:46)

● Image Component Default Tests › development mode › should show invalid src with trailing space

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

Expected substring: "Image with src \"/test.png \" cannot end with a space or control character."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  931 |       const browser = await webdriver(appPort, '/invalid-src-trailing-space')
  932 |       await assertHasRedbox(browser)
> 933 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  934 |         'Image with src "/test.png " cannot end with a space or control character.'
  935 |       )
  936 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:933:46)

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

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

Expected substring: "Image with src \"/test.png\" has \"placeholder='blur'\" property but is missing the \"blurDataURL\" property."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  940 |
  941 |       await assertHasRedbox(browser)
> 942 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  943 |         `Image with src "/test.png" has "placeholder='blur'" property but is missing the "blurDataURL" property.`
  944 |       )
  945 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:942:46)

● Image Component Default Tests › development mode › should show error when invalid width prop

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

Expected substring: "Image with src \"/test.jpg\" has invalid \"width\" property. Expected a numeric value in pixels but received \"100%\"."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  949 |
  950 |       await assertHasRedbox(browser)
> 951 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  952 |         `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "100%".`
  953 |       )
  954 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:951:46)

● Image Component Default Tests › development mode › should show error when invalid Infinity width prop

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

Expected substring: "Image with src \"/test.jpg\" has invalid \"width\" property. Expected a numeric value in pixels but received \"Infinity\"."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  958 |
  959 |       await assertHasRedbox(browser)
> 960 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  961 |         `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "Infinity".`
  962 |       )
  963 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:960:46)

● Image Component Default Tests › development mode › should show error when invalid height prop

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

Expected substring: "Image with src \"/test.jpg\" has invalid \"height\" property. Expected a numeric value in pixels but received \"50vh\"."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  967 |
  968 |       await assertHasRedbox(browser)
> 969 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  970 |         `Image with src "/test.jpg" has invalid "height" property. Expected a numeric value in pixels but received "50vh".`
  971 |       )
  972 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:969:46)

● Image Component Default Tests › development mode › should show missing alt error

Expected no Redbox but found one
header: 1 of 1 error
Next.js (15.0.0-canary.190)
Server Error

Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api

This error happened while generating the page. Any console logs will be displayed in the terminal window.
description: Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api
source: null

  975 |       const browser = await webdriver(appPort, '/missing-alt')
  976 |
> 977 |       await assertNoRedbox(browser)
      |       ^
  978 |
  979 |       await check(async () => {
  980 |         return (await browser.log()).map((log) => log.message).join('\n')

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

● Image Component Default Tests › development mode › should show error when missing width prop

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

Expected substring: "Image with src \"/test.jpg\" is missing required \"width\" property."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  986 |
  987 |       await assertHasRedbox(browser)
> 988 |       expect(await getRedboxHeader(browser)).toContain(
      |                                              ^
  989 |         `Image with src "/test.jpg" is missing required "width" property.`
  990 |       )
  991 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:988:46)

● Image Component Default Tests › development mode › should show error when missing height prop

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

Expected substring: "Image with src \"/test.jpg\" is missing required \"height\" property."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

   995 |
   996 |       await assertHasRedbox(browser)
>  997 |       expect(await getRedboxHeader(browser)).toContain(
       |                                              ^
   998 |         `Image with src "/test.jpg" is missing required "height" property.`
   999 |       )
  1000 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:997:46)

● Image Component Default Tests › development mode › should show error when width prop on fill image

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

Expected substring: "Image with src \"/wide.png\" has both \"width\" and \"fill\" properties."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  1004 |
  1005 |       await assertHasRedbox(browser)
> 1006 |       expect(await getRedboxHeader(browser)).toContain(
       |                                              ^
  1007 |         `Image with src "/wide.png" has both "width" and "fill" properties.`
  1008 |       )
  1009 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:1006:46)

● Image Component Default Tests › development mode › should show error when CSS position changed on fill image

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

Expected substring: "Image with src \"/wide.png\" has both \"fill\" and \"style.position\" properties. Images with \"fill\" always use position absolute - it cannot be modified."
Received string:    "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  1013 |
  1014 |       await assertHasRedbox(browser)
> 1015 |       expect(await getRedboxHeader(browser)).toContain(
       |                                              ^
  1016 |         `Image with src "/wide.png" has both "fill" and "style.position" properties. Images with "fill" always use position absolute - it cannot be modified.`
  1017 |       )
  1018 |     })

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:1015:46)

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

expect(received).toMatch(expected)

Expected pattern: /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/
Received string:  "1 of 1 error
Next.js (15.0.0-canary.190)
Server Error·
Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run \"next start\" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api·
This error happened while generating the page. Any console logs will be displayed in the terminal window."

  1025 |
  1026 |       await assertHasRedbox(browser)
> 1027 |       expect(await getRedboxHeader(browser)).toMatch(
       |                                              ^
  1028 |         /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/
  1029 |       )
  1030 |     })

  at Object.toMatch (integration/next-image-new/default/test/index.test.ts:1027:46)

● Image Component Default Tests › development mode › should warn when using a very small image with placeholder=blur

Expected no Redbox but found one
header: 1 of 1 error
Next.js (15.0.0-canary.190)
Server Error

Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api

This error happened while generating the page. Any console logs will be displayed in the terminal window.
description: Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api
source: null

  1036 |         .map((log) => log.message)
  1037 |         .join('\n')
> 1038 |       await assertNoRedbox(browser)
       |       ^
  1039 |       expect(warnings).toMatch(
  1040 |         /Image with src (.*)jpg(.*) is smaller than 40x40. Consider removing(.*)/gm
  1041 |       )

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

● Image Component Default Tests › development mode › should not warn when Image is child of p

Expected no Redbox but found one
header: 1 of 1 error
Next.js (15.0.0-canary.190)
Server Error

Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api

This error happened while generating the page. Any console logs will be displayed in the terminal window.
description: Error: Image Optimization using the default loader is not compatible with `{ output: 'export' }`.
  Possible solutions:
    - Remove `{ output: 'export' }` and run "next start" to run server mode including the Image Optimization API.
    - Configure `{ images: { unoptimized: true } }` in `next.config.js` to disable the Image Optimization API.
  Read more: https://nextjs.org/docs/messages/export-image-api
source: null

  1048 |         .map((log) => log.message)
  1049 |         .join('\n')
> 1050 |       await assertNoRedbox(browser)
       |       ^
  1051 |       expect(warnings).not.toMatch(
  1052 |         /Expected server HTML to contain a matching/gm
  1053 |       )

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

● Image Component Default Tests › development mode › should warn when priority prop is missing on LCP image

TIMED OUT: done

undefined

Error: Image not ready

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1061:9)

● Image Component Default Tests › development mode › should warn at most once even after state change

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

Expected: "Count: 2"
Received: null

  1148 |         `document.querySelector("button").textContent`
  1149 |       )
> 1150 |       expect(count).toBe('Count: 2')
       |                     ^
  1151 |       await check(async () => {
  1152 |         const result = await browser.eval(
  1153 |           'document.getElementById("w").naturalWidth'

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:1150:21)

● Image Component Default Tests › development mode › should correctly ignore prose styles

TIMED OUT: /result-correct/

undefined

Error: Image not ready

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1221:7)

● Image Component Default Tests › development mode › should apply filter style after image loads

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

  1283 |   })
  1284 |
> 1285 |   it('should apply filter style after image loads', async () => {
       |   ^
  1286 |     const browser = await webdriver(appPort, '/style-filter')
  1287 |     await check(() => getSrc(browser, 'img-plain'), /^\/_next\/image/)
  1288 |     await check(() => getSrc(browser, 'img-blur'), /^\/_next\/image/)

  at it (integration/next-image-new/default/test/index.test.ts:1285:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › should emit image for next/dynamic with non ssr case

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

  1316 |   })
  1317 |
> 1318 |   it('should emit image for next/dynamic with non ssr case', async () => {
       |   ^
  1319 |     let browser = await webdriver(appPort, '/dynamic-static-img')
  1320 |     const img = await browser.elementById('dynamic-loaded-static-jpg')
  1321 |     const src = await img.getAttribute('src')

  at it (integration/next-image-new/default/test/index.test.ts:1318:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › Fill-mode tests › should include a data-attribute on fill images

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

  1329 |       browser = await webdriver(appPort, '/fill')
  1330 |     })
> 1331 |     it('should include a data-attribute on fill images', async () => {
       |     ^
  1332 |       expect(
  1333 |         await browser.elementById('fill-image-1').getAttribute('data-nimg')
  1334 |       ).toBe('fill')

  at it (integration/next-image-new/default/test/index.test.ts:1331:5)
  at describe (integration/next-image-new/default/test/index.test.ts:1326:3)
  at runTests (integration/next-image-new/default/test/index.test.ts:1606:7)
  at integration/next-image-new/default/test/index.test.ts:1595:58
  at Object.describe (integration/next-image-new/default/test/index.test.ts:1594:1)

● Image Component Default Tests › development mode › Fill-mode tests › should add position:absolute to fill images

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

Expected: "absolute"
Received: null

  1335 |     })
  1336 |     it('should add position:absolute to fill images', async () => {
> 1337 |       expect(await getComputedStyle(browser, 'fill-image-1', 'position')).toBe(
       |                                                                           ^
  1338 |         'absolute'
  1339 |       )
  1340 |     })

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:1337:75)

● Image Component Default Tests › development mode › Fill-mode tests › should add 100% width and height to fill images

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

Expected: "100%"
Received: null

  1344 |           `document.getElementById("fill-image-1").style.height`
  1345 |         )
> 1346 |       ).toBe('100%')
       |         ^
  1347 |       expect(
  1348 |         await browser.eval(
  1349 |           `document.getElementById("fill-image-1").style.width`

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:1346:9)

● Image Component Default Tests › development mode › Fill-mode tests › should add position styles to fill images

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

Expected: "position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent"
Received: null

  1356 |           `document.getElementById("fill-image-1").getAttribute('style')`
  1357 |         )
> 1358 |       ).toBe(
       |         ^
  1359 |         'position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent'
  1360 |       )
  1361 |     })

  at Object.toBe (integration/next-image-new/default/test/index.test.ts:1358:9)

● Image Component Default Tests › development mode › Fill-mode tests › should log warnings when using fill mode incorrectly

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

Expected substring: "Image with src \"/wide.png\" has \"fill\" and parent element with invalid \"position\". Provided \"static\" should be one of absolute,fixed,relative."
Received string:    "Failed to load resource: the server responded with a status of 500 (Internal Server Error)
%cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
[HMR] connected
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
connected to ws at ws://localhost:45285/_next/webpack-hmr
Next.js page already hydrated
received ws message {\"action\":\"sync\",\"hash\":\"3c0242be3982173a\",\"errors\":[],\"warnings\":[],\"versionInfo\":{\"staleness\":\"fresh\",\"installed\":\"15.0.0-canary.190\"},\"debug\":{}}
received ws message {\"action\":\"appIsrManifest\",\"data\":{}}
Failed to load resource: the server responded with a status of 500 (Internal Server Error)"

  1377 |           .map((log) => log.message)
  1378 |           .join('\n')
> 1379 |         expect(warnings).toContain(
       |                          ^
  1380 |           'Image with src "/wide.png" has "fill" and parent element with invalid "position". Provided "static" should be one of absolute,fixed,relative.'
  1381 |         )
  1382 |         expect(warnings).toContain(

  at Object.toContain (integration/next-image-new/default/test/index.test.ts:1379:26)

● Image Component Default Tests › development mode › should have data url placeholder when enabled

TypeError: Cannot read properties of undefined (reading 'attribs')

  1443 |     $html('noscript > img').attr('id', 'unused')
  1444 |
> 1445 |     expect($html('#data-url-placeholder-raw')[0].attribs.style).toContain(
       |                                                 ^
  1446 |       `color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciPgogICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjIwJSIgLz4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyMiIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iNzAlIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIGZpbGw9IiMzMzMiIC8+CiAgPHJlY3QgaWQ9InIiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJ1cmwoI2cpIiAvPgogIDxhbmltYXRlIHhsaW5rOmhyZWY9IiNyIiBhdHRyaWJ1dGVOYW1lPSJ4IiBmcm9tPSItMjAwIiB0bz0iMjAwIiBkdXI9IjFzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgIC8+Cjwvc3ZnPg==")`
  1447 |     )
  1448 |

  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1445:49)

● Image Component Default Tests › development mode › should remove data url placeholder after image loads

TIMED OUT: none

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1456:5)

● Image Component Default Tests › development mode › should render correct objectFit when data url placeholder and fill

TypeError: Cannot read properties of undefined (reading 'attribs')

  1490 |     const $ = cheerio.load(html)
  1491 |
> 1492 |     expect($('#data-url-placeholder-fit-cover')[0].attribs.style).toBe(
       |                                                   ^
  1493 |       `position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;object-fit:cover;color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciPgogICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjIwJSIgLz4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyMiIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iNzAlIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIGZpbGw9IiMzMzMiIC8+CiAgPHJlY3QgaWQ9InIiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJ1cmwoI2cpIiAvPgogIDxhbmltYXRlIHhsaW5rOmhyZWY9IiNyIiBhdHRyaWJ1dGVOYW1lPSJ4IiBmcm9tPSItMjAwIiB0bz0iMjAwIiBkdXI9IjFzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgIC8+Cjwvc3ZnPg==")`
  1494 |     )
  1495 |

  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1492:51)

● Image Component Default Tests › development mode › should have blurry placeholder when enabled

TypeError: Cannot read properties of undefined (reading 'attribs')

  1509 |     $html('noscript > img').attr('id', 'unused')
  1510 |
> 1511 |     expect($html('#blurry-placeholder-raw')[0].attribs.style).toContain(
       |                                               ^
  1512 |       `color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 400'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='none' style='filter: url(%23b);' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8P4nhDwAGuAKPn6cicwAAAABJRU5ErkJggg=='/%3E%3C/svg%3E")`
  1513 |     )
  1514 |

  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1511:47)

● Image Component Default Tests › development mode › should remove blurry placeholder after image loads

TIMED OUT: none

null

undefined

  718 |
  719 |   if (hardError) {
> 720 |     throw new Error('TIMED OUT: ' + regex + '\n\n' + content + '\n\n' + lastErr)
      |           ^
  721 |   }
  722 |   return false
  723 | }

  at check (lib/next-test-utils.ts:720:11)
  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1522:5)

● Image Component Default Tests › development mode › should render correct objectFit when blurDataURL and fill

TypeError: Cannot read properties of undefined (reading 'attribs')

  1556 |     const $ = cheerio.load(html)
  1557 |
> 1558 |     expect($('#fit-cover')[0].attribs.style).toBe(
       |                              ^
  1559 |       `position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;object-fit:cover;color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' %3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='xMidYMid slice' style='filter: url(%23b);' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAAAAABd+vKJAAAANklEQVR42mNg4GRwdWBgZ2BgUGI4dYhBmYFBgiHy308PBlEGKYbr//9fYJBlYDBYv3nzGkUGANGMDBq2MCnBAAAAAElFTkSuQmCC'/%3E%3C/svg%3E")`
  1560 |     )
  1561 |

  at Object.<anonymous> (integration/next-image-new/default/test/index.test.ts:1558:30)

● Image Component Default Tests › development mode › should be valid HTML

expect(received).toBeTruthy()

Received: false

  1574 |       browser = await webdriver(appPort, '/valid-html-w3c')
  1575 |       await waitFor(1000)
> 1576 |       expect(await browser.hasElementByCssSelector('img')).toBeTruthy()
       |                                                            ^
  1577 |       const url = await browser.url()
  1578 |       const result = (await validateHTML({
  1579 |         url,

  at Object.toBeTruthy (integration/next-image-new/default/test/index.test.ts:1576:60)

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

@ijjk
Copy link
Member

ijjk commented Oct 13, 2024

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
buildDuration 19.2s 17.2s N/A
buildDurationCached 16.3s 14s N/A
nodeModulesSize 371 MB 371 MB ⚠️ +75.9 kB
nextStartRea..uration (ms) 448ms 456ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
307bebc6-HASH.js gzip 52.6 kB 52.6 kB N/A
3620-HASH.js gzip 43.7 kB 43.7 kB N/A
801.HASH.js gzip 168 B 169 B N/A
8962-HASH.js gzip 5.26 kB 5.26 kB N/A
framework-HASH.js gzip 57.4 kB 57.4 kB N/A
main-app-HASH.js gzip 232 B 229 B N/A
main-HASH.js gzip 32.8 kB 32.8 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
_app-HASH.js gzip 192 B 192 B
_error-HASH.js gzip 193 B 192 B N/A
amp-HASH.js gzip 509 B 509 B
css-HASH.js gzip 341 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 266 B 266 B
head-HASH.js gzip 365 B 364 B N/A
hooks-HASH.js gzip 392 B 391 B N/A
image-HASH.js gzip 4.41 kB 4.41 kB N/A
index-HASH.js gzip 267 B 268 B N/A
link-HASH.js gzip 2.78 kB 2.78 kB N/A
routerDirect..HASH.js gzip 327 B 327 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 324 B 322 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.64 kB 3.64 kB
Client Build Manifests
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
_buildManifest.js gzip 748 B 750 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
index.html gzip 521 B 523 B N/A
link.html gzip 536 B 537 B N/A
withRouter.html gzip 518 B 519 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
edge-ssr.js gzip 129 kB 130 kB N/A
page.js gzip 188 kB 188 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
middleware-b..fest.js gzip 671 B 670 B N/A
middleware-r..fest.js gzip 154 B 156 B N/A
middleware.js gzip 30.7 kB 30.7 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
973-experime...dev.js gzip 322 B 322 B
973.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 314 kB 314 kB N/A
app-page-exp..prod.js gzip 120 kB 120 kB N/A
app-page-tur..prod.js gzip 134 kB 134 kB N/A
app-page-tur..prod.js gzip 128 kB 128 kB N/A
app-page.run...dev.js gzip 304 kB 304 kB N/A
app-page.run..prod.js gzip 116 kB 116 kB N/A
app-route-ex...dev.js gzip 35 kB 35 kB N/A
app-route-ex..prod.js gzip 23.6 kB 23.7 kB N/A
app-route-tu..prod.js gzip 23.7 kB 23.7 kB N/A
app-route-tu..prod.js gzip 23.4 kB 23.5 kB N/A
app-route.ru...dev.js gzip 36.6 kB 36.6 kB N/A
app-route.ru..prod.js gzip 23.4 kB 23.5 kB N/A
pages-api-tu..prod.js gzip 9.61 kB 9.61 kB
pages-api.ru...dev.js gzip 11.4 kB 11.4 kB
pages-api.ru..prod.js gzip 9.61 kB 9.61 kB
pages-turbo...prod.js gzip 20.9 kB 20.9 kB
pages.runtim...dev.js gzip 26.5 kB 26.5 kB
pages.runtim..prod.js gzip 20.9 kB 20.9 kB
server.runti..prod.js gzip 60.1 kB 60.1 kB N/A
Overall change 99.7 kB 99.7 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js lubieowoce/after-is-not-dynamic Change
0.pack gzip 1.84 MB 1.84 MB N/A
index.pack gzip 142 kB 143 kB ⚠️ +667 B
Overall change 142 kB 143 kB ⚠️ +667 B
Diff details
Diff for page.js
@@ -15,7 +15,7 @@
       /***/
     },
 
-    /***/ 298: /***/ (
+    /***/ 7430: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -30,7 +30,7 @@
         default: () => /* binding */ nHandler,
       });
 
-      // NAMESPACE OBJECT: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsxszj4c%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&flyingShuttle=false&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
+      // NAMESPACE OBJECT: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsxszj4c%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&flyingShuttle=false&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
       var page_next_edge_ssr_entry_namespaceObject = {};
       __webpack_require__.r(page_next_edge_ssr_entry_namespaceObject);
       __webpack_require__.d(page_next_edge_ssr_entry_namespaceObject, {
@@ -82,35 +82,35 @@
         workUnitAsyncStorage: () => entry_base /* workUnitAsyncStorage */.Sz,
       });
 
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/web/globals.js
-      var globals = __webpack_require__(6622);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/web/adapter.js + 3 modules
-      var adapter = __webpack_require__(3395);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/build/webpack/loaders/next-edge-ssr-loader/render.js + 85 modules
-      var render = __webpack_require__(2406);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/lib/incremental-cache/index.js + 3 modules
-      var incremental_cache = __webpack_require__(1232);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/app-render/app-render.js + 62 modules
-      var app_render = __webpack_require__(6741);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/route-modules/app-page/module.compiled.js
-      var module_compiled = __webpack_require__(2198);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/route-kind.js
-      var route_kind = __webpack_require__(2873);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/client/components/error-boundary.js
-      var error_boundary = __webpack_require__(2267);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/app-render/entry-base.js + 29 modules
-      var entry_base = __webpack_require__(4940); // CONCATENATED MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsxszj4c%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&flyingShuttle=false&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/web/globals.js
+      var globals = __webpack_require__(4081);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/web/adapter.js + 3 modules
+      var adapter = __webpack_require__(8106);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/build/webpack/loaders/next-edge-ssr-loader/render.js + 85 modules
+      var render = __webpack_require__(8870);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/lib/incremental-cache/index.js + 3 modules
+      var incremental_cache = __webpack_require__(2699);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/app-render/app-render.js + 62 modules
+      var app_render = __webpack_require__(5506);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/route-modules/app-page/module.compiled.js
+      var module_compiled = __webpack_require__(6518);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/route-kind.js
+      var route_kind = __webpack_require__(2429);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/client/components/error-boundary.js
+      var error_boundary = __webpack_require__(5322);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/app-render/entry-base.js + 29 modules
+      var entry_base = __webpack_require__(9345); // CONCATENATED MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapp-edge-ssr%2Fpage&page=%2Fapp-edge-ssr%2Fpage&pagePath=private-next-app-dir%2Fapp-edge-ssr%2Fpage.js&appDir=%2Ftmp%2Fnext-statsxszj4c%2Fstats-app%2Fapp&appPaths=%2Fapp-edge-ssr%2Fpage&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&basePath=&assetPrefix=&nextConfigOutput=&flyingShuttle=false&preferredRegion=&middlewareConfig=e30%3D!./app/app-edge-ssr/page.js?__next_edge_ssr_entry__
       const module0 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 3336)
+          __webpack_require__.bind(__webpack_require__, 2968)
         );
       const module1 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 5535)
+          __webpack_require__.bind(__webpack_require__, 5837)
         );
       const page2 = () =>
         Promise.resolve(/* import() eager */).then(
-          __webpack_require__.bind(__webpack_require__, 7988)
+          __webpack_require__.bind(__webpack_require__, 2566)
         );
 
       // We inject the tree and pages here so that we can use them in the route
@@ -173,12 +173,12 @@
       });
 
       //# sourceMappingURL=app-page.js.map
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/lib/page-types.js
-      var page_types = __webpack_require__(7223);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/app-render/encryption-utils.js
-      var encryption_utils = __webpack_require__(821);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/esm/server/app-render/action-utils.js
-      var action_utils = __webpack_require__(3960); // CONCATENATED MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/dist/build/webpack/loaders/next-edge-ssr-loader/index.js?{"absolute500Path":"","absoluteAppPath":"next/dist/pages/_app","absoluteDocumentPath":"next/dist/pages/_document","absoluteErrorPath":"next/dist/pages/_error","absolutePagePath":"private-next-app-dir/app-edge-ssr/page.js","dev":false,"isServerComponent":true,"page":"/app-edge-ssr/page","stringifiedConfig":"eyJlbnYiOnt9LCJlc2xpbnQiOnsiaWdub3JlRHVyaW5nQnVpbGRzIjpmYWxzZX0sInR5cGVzY3JpcHQiOnsiaWdub3JlQnVpbGRFcnJvcnMiOmZhbHNlLCJ0c2NvbmZpZ1BhdGgiOiJ0c2NvbmZpZy5qc29uIn0sImRpc3REaXIiOiIubmV4dCIsImNsZWFuRGlzdERpciI6dHJ1ZSwiYXNzZXRQcmVmaXgiOiIiLCJjYWNoZU1heE1lbW9yeVNpemUiOjUyNDI4ODAwLCJjb25maWdPcmlnaW4iOiJuZXh0LmNvbmZpZy5qcyIsInVzZUZpbGVTeXN0ZW1QdWJsaWNSb3V0ZXMiOnRydWUsImdlbmVyYXRlRXRhZ3MiOnRydWUsInBhZ2VFeHRlbnNpb25zIjpbInRzeCIsInRzIiwianN4IiwianMiXSwicG93ZXJlZEJ5SGVhZGVyIjp0cnVlLCJjb21wcmVzcyI6dHJ1ZSwiaW1hZ2VzIjp7ImRldmljZVNpemVzIjpbNjQwLDc1MCw4MjgsMTA4MCwxMjAwLDE5MjAsMjA0OCwzODQwXSwiaW1hZ2VTaXplcyI6WzE2LDMyLDQ4LDY0LDk2LDEyOCwyNTYsMzg0XSwicGF0aCI6Ii9fbmV4dC9pbWFnZSIsImxvYWRlciI6ImRlZmF1bHQiLCJsb2FkZXJGaWxlIjoiIiwiZG9tYWlucyI6W10sImRpc2FibGVTdGF0aWNJbWFnZXMiOmZhbHNlLCJtaW5pbXVtQ2FjaGVUVEwiOjYwLCJmb3JtYXRzIjpbImltYWdlL3dlYnAiXSwiZGFuZ2Vyb3VzbHlBbGxvd1NWRyI6ZmFsc2UsImNvbnRlbnRTZWN1cml0eVBvbGljeSI6InNjcmlwdC1zcmMgJ25vbmUnOyBmcmFtZS1zcmMgJ25vbmUnOyBzYW5kYm94OyIsImNvbnRlbnREaXNwb3NpdGlvblR5cGUiOiJhdHRhY2htZW50IiwicmVtb3RlUGF0dGVybnMiOltdLCJ1bm9wdGltaXplZCI6ZmFsc2V9LCJkZXZJbmRpY2F0b3JzIjp7ImFwcElzclN0YXR1cyI6dHJ1ZSwiYnVpbGRBY3Rpdml0eSI6dHJ1ZSwiYnVpbGRBY3Rpdml0eVBvc2l0aW9uIjoiYm90dG9tLXJpZ2h0In0sIm9uRGVtYW5kRW50cmllcyI6eyJtYXhJbmFjdGl2ZUFnZSI6NjAwMDAsInBhZ2VzQnVmZmVyTGVuZ3RoIjo1fSwiYW1wIjp7ImNhbm9uaWNhbEJhc2UiOiIifSwiYmFzZVBhdGgiOiIiLCJzYXNzT3B0aW9ucyI6e30sInRyYWlsaW5nU2xhc2giOmZhbHNlLCJpMThuIjpudWxsLCJwcm9kdWN0aW9uQnJvd3NlclNvdXJjZU1hcHMiOmZhbHNlLCJleGNsdWRlRGVmYXVsdE1vbWVudExvY2FsZXMiOnRydWUsInNlcnZlclJ1bnRpbWVDb25maWciOnt9LCJwdWJsaWNSdW50aW1lQ29uZmlnIjp7fSwicmVhY3RQcm9kdWN0aW9uUHJvZmlsaW5nIjpmYWxzZSwicmVhY3RTdHJpY3RNb2RlIjpudWxsLCJyZWFjdE1heEhlYWRlcnNMZW5ndGgiOjYwMDAsImh0dHBBZ2VudE9wdGlvbnMiOnsia2VlcEFsaXZlIjp0cnVlfSwibG9nZ2luZyI6e30sImV4cGlyZVRpbWUiOjMxNTM2MDAwLCJzdGF0aWNQYWdlR2VuZXJhdGlvblRpbWVvdXQiOjYwLCJtb2R1bGFyaXplSW1wb3J0cyI6eyJAbXVpL2ljb25zLW1hdGVyaWFsIjp7InRyYW5zZm9ybSI6IkBtdWkvaWNvbnMtbWF0ZXJpYWwve3ttZW1iZXJ9fSJ9LCJsb2Rhc2giOnsidHJhbnNmb3JtIjoibG9kYXNoL3t7bWVtYmVyfX0ifX0sIm91dHB1dEZpbGVUcmFjaW5nUm9vdCI6Ii90bXAvbmV4dC1zdGF0c3hzemo0Yy9zdGF0cy1hcHAiLCJleHBlcmltZW50YWwiOnsibXVsdGlab25lRHJhZnRNb2RlIjpmYWxzZSwiYXBwTmF2RmFpbEhhbmRsaW5nIjpmYWxzZSwicHJlcmVuZGVyRWFybHlFeGl0Ijp0cnVlLCJzZXJ2ZXJNaW5pZmljYXRpb24iOnRydWUsInNlcnZlclNvdXJjZU1hcHMiOmZhbHNlLCJsaW5rTm9Ub3VjaFN0YXJ0IjpmYWxzZSwiY2FzZVNlbnNpdGl2ZVJvdXRlcyI6ZmFsc2UsInByZWxvYWRFbnRyaWVzT25TdGFydCI6dHJ1ZSwiY2xpZW50Um91dGVyRmlsdGVyIjp0cnVlLCJjbGllbnRSb3V0ZXJGaWx0ZXJSZWRpcmVjdHMiOmZhbHNlLCJmZXRjaENhY2hlS2V5UHJlZml4IjoiIiwibWlkZGxld2FyZVByZWZldGNoIjoiZmxleGlibGUiLCJvcHRpbWlzdGljQ2xpZW50Q2FjaGUiOnRydWUsIm1hbnVhbENsaWVudEJhc2VQYXRoIjpmYWxzZSwiY3B1cyI6MTksIm1lbW9yeUJhc2VkV29ya2Vyc0NvdW50IjpmYWxzZSwiaXNyRmx1c2hUb0Rpc2siOnRydWUsIndvcmtlclRocmVhZHMiOmZhbHNlLCJvcHRpbWl6ZUNzcyI6ZmFsc2UsIm5leHRTY3JpcHRXb3JrZXJzIjpmYWxzZSwic2Nyb2xsUmVzdG9yYXRpb24iOmZhbHNlLCJleHRlcm5hbERpciI6ZmFsc2UsImRpc2FibGVPcHRpbWl6ZWRMb2FkaW5nIjpmYWxzZSwiZ3ppcFNpemUiOnRydWUsImNyYUNvbXBhdCI6ZmFsc2UsImVzbUV4dGVybmFscyI6dHJ1ZSwiZnVsbHlTcGVjaWZpZWQiOmZhbHNlLCJzd2NUcmFjZVByb2ZpbGluZyI6ZmFsc2UsImZvcmNlU3djVHJhbnNmb3JtcyI6ZmFsc2UsImxhcmdlUGFnZURhdGFCeXRlcyI6MTI4MDAwLCJ0dXJibyI6eyJyb290IjoiL3RtcC9uZXh0LXN0YXRzeHN6ajRjL3N0YXRzLWFwcCJ9LCJ0eXBlZFJvdXRlcyI6ZmFsc2UsInR5cGVkRW52IjpmYWxzZSwicGFyYWxsZWxTZXJ2ZXJDb21waWxlcyI6ZmFsc2UsInBhcmFsbGVsU2VydmVyQnVpbGRUcmFjZXMiOmZhbHNlLCJwcHIiOmZhbHNlLCJwcHJGYWxsYmFja3MiOmZhbHNlLCJ3ZWJwYWNrTWVtb3J5T3B0aW1pemF0aW9ucyI6ZmFsc2UsIm9wdGltaXplU2VydmVyUmVhY3QiOnRydWUsInVzZUVhcmx5SW1wb3J0IjpmYWxzZSwic3RhbGVUaW1lcyI6eyJkeW5hbWljIjowLCJzdGF0aWMiOjMwMH0sImFmdGVyIjpmYWxzZSwic2VydmVyQ29tcG9uZW50c0htckNhY2hlIjp0cnVlLCJzdGF0aWNHZW5lcmF0aW9uTWF4Q29uY3VycmVuY3kiOjgsInN0YXRpY0dlbmVyYXRpb25NaW5QYWdlc1BlcldvcmtlciI6MjUsImR5bmFtaWNJTyI6ZmFsc2UsIm9wdGltaXplUGFja2FnZUltcG9ydHMiOlsibHVjaWRlLXJlYWN0IiwiZGF0ZS1mbnMiLCJsb2Rhc2gtZXMiLCJyYW1kYSIsImFudGQiLCJyZWFjdC1ib290c3RyYXAiLCJhaG9va3MiLCJAYW50LWRlc2lnbi9pY29ucyIsIkBoZWFkbGVzc3VpL3JlYWN0IiwiQGhlYWRsZXNzdWktZmxvYXQvcmVhY3QiLCJAaGVyb2ljb25zL3JlYWN0LzIwL3NvbGlkIiwiQGhlcm9pY29ucy9yZWFjdC8yNC9zb2xpZCIsIkBoZXJvaWNvbnMvcmVhY3QvMjQvb3V0bGluZSIsIkB2aXN4L3Zpc3giLCJAdHJlbW9yL3JlYWN0IiwicnhqcyIsIkBtdWkvbWF0ZXJpYWwiLCJAbXVpL2ljb25zLW1hdGVyaWFsIiwicmVjaGFydHMiLCJyZWFjdC11c2UiLCJlZmZlY3QiLCJAZWZmZWN0L3NjaGVtYSIsIkBlZmZlY3QvcGxhdGZvcm0iLCJAZWZmZWN0L3BsYXRmb3JtLW5vZGUiLCJAZWZmZWN0L3BsYXRmb3JtLWJyb3dzZXIiLCJAZWZmZWN0L3BsYXRmb3JtLWJ1biIsIkBlZmZlY3Qvc3FsIiwiQGVmZmVjdC9zcWwtbXNzcWwiLCJAZWZmZWN0L3NxbC1teXNxbDIiLCJAZWZmZWN0L3NxbC1wZyIsIkBlZmZlY3Qvc3FsLXNxdWxpdGUtbm9kZSIsIkBlZmZlY3Qvc3FsLXNxdWxpdGUtYnVuIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS13YXNtIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1yZWFjdC1uYXRpdmUiLCJAZWZmZWN0L3JwYyIsIkBlZmZlY3QvcnBjLWh0dHAiLCJAZWZmZWN0L3R5cGVjbGFzcyIsIkBlZmZlY3QvZXhwZXJpbWVudGFsIiwiQGVmZmVjdC9vcGVudGVsZW1ldHJ5IiwiQG1hdGVyaWFsLXVpL2NvcmUiLCJAbWF0ZXJpYWwtdWkvaWNvbnMiLCJAdGFibGVyL2ljb25zLXJlYWN0IiwibXVpLWNvcmUiLCJyZWFjdC1pY29ucy9haSIsInJlYWN0LWljb25zL2JpIiwicmVhY3QtaWNvbnMvYnMiLCJyZWFjdC1pY29ucy9jZyIsInJlYWN0LWljb25zL2NpIiwicmVhY3QtaWNvbnMvZGkiLCJyZWFjdC1pY29ucy9mYSIsInJlYWN0LWljb25zL2ZhNiIsInJlYWN0LWljb25zL2ZjIiwicmVhY3QtaWNvbnMvZmkiLCJyZWFjdC1pY29ucy9naSIsInJlYWN0LWljb25zL2dvIiwicmVhY3QtaWNvbnMvZ3IiLCJyZWFjdC1pY29ucy9oaSIsInJlYWN0LWljb25zL2hpMiIsInJlYWN0LWljb25zL2ltIiwicmVhY3QtaWNvbnMvaW8iLCJyZWFjdC1pY29ucy9pbzUiLCJyZWFjdC1pY29ucy9saWEiLCJyZWFjdC1pY29ucy9saWIiLCJyZWFjdC1pY29ucy9sdSIsInJlYWN0LWljb25zL21kIiwicmVhY3QtaWNvbnMvcGkiLCJyZWFjdC1pY29ucy9yaSIsInJlYWN0LWljb25zL3J4IiwicmVhY3QtaWNvbnMvc2kiLCJyZWFjdC1pY29ucy9zbCIsInJlYWN0LWljb25zL3RiIiwicmVhY3QtaWNvbnMvdGZpIiwicmVhY3QtaWNvbnMvdGkiLCJyZWFjdC1pY29ucy92c2MiLCJyZWFjdC1pY29ucy93aSJdfSwiYnVuZGxlUGFnZXNSb3V0ZXJEZXBlbmRlbmNpZXMiOmZhbHNlLCJjb25maWdGaWxlIjoiL3RtcC9uZXh0LXN0YXRzeHN6ajRjL3N0YXRzLWFwcC9uZXh0LmNvbmZpZy5qcyIsImNvbmZpZ0ZpbGVOYW1lIjoibmV4dC5jb25maWcuanMifQ==","pagesType":"app","appDirLoader":"bmV4dC1hcHAtbG9hZGVyP25hbWU9YXBwJTJGYXBwLWVkZ2Utc3NyJTJGcGFnZSZwYWdlPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcHAtZWRnZS1zc3IlMkZwYWdlLmpzJmFwcERpcj0lMkZ0bXAlMkZuZXh0LXN0YXRzeHN6ajRjJTJGc3RhdHMtYXBwJTJGYXBwJmFwcFBhdGhzPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JmZseWluZ1NodXR0bGU9ZmFsc2UmcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCE=","sriEnabled":false,"middlewareConfig":"e30="}!
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/lib/page-types.js
+      var page_types = __webpack_require__(8665);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/app-render/encryption-utils.js
+      var encryption_utils = __webpack_require__(4446);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/esm/server/app-render/action-utils.js
+      var action_utils = __webpack_require__(8177); // CONCATENATED MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/dist/build/webpack/loaders/next-edge-ssr-loader/index.js?{"absolute500Path":"","absoluteAppPath":"next/dist/pages/_app","absoluteDocumentPath":"next/dist/pages/_document","absoluteErrorPath":"next/dist/pages/_error","absolutePagePath":"private-next-app-dir/app-edge-ssr/page.js","dev":false,"isServerComponent":true,"page":"/app-edge-ssr/page","stringifiedConfig":"eyJlbnYiOnt9LCJlc2xpbnQiOnsiaWdub3JlRHVyaW5nQnVpbGRzIjpmYWxzZX0sInR5cGVzY3JpcHQiOnsiaWdub3JlQnVpbGRFcnJvcnMiOmZhbHNlLCJ0c2NvbmZpZ1BhdGgiOiJ0c2NvbmZpZy5qc29uIn0sImRpc3REaXIiOiIubmV4dCIsImNsZWFuRGlzdERpciI6dHJ1ZSwiYXNzZXRQcmVmaXgiOiIiLCJjYWNoZU1heE1lbW9yeVNpemUiOjUyNDI4ODAwLCJjb25maWdPcmlnaW4iOiJuZXh0LmNvbmZpZy5qcyIsInVzZUZpbGVTeXN0ZW1QdWJsaWNSb3V0ZXMiOnRydWUsImdlbmVyYXRlRXRhZ3MiOnRydWUsInBhZ2VFeHRlbnNpb25zIjpbInRzeCIsInRzIiwianN4IiwianMiXSwicG93ZXJlZEJ5SGVhZGVyIjp0cnVlLCJjb21wcmVzcyI6dHJ1ZSwiaW1hZ2VzIjp7ImRldmljZVNpemVzIjpbNjQwLDc1MCw4MjgsMTA4MCwxMjAwLDE5MjAsMjA0OCwzODQwXSwiaW1hZ2VTaXplcyI6WzE2LDMyLDQ4LDY0LDk2LDEyOCwyNTYsMzg0XSwicGF0aCI6Ii9fbmV4dC9pbWFnZSIsImxvYWRlciI6ImRlZmF1bHQiLCJsb2FkZXJGaWxlIjoiIiwiZG9tYWlucyI6W10sImRpc2FibGVTdGF0aWNJbWFnZXMiOmZhbHNlLCJtaW5pbXVtQ2FjaGVUVEwiOjYwLCJmb3JtYXRzIjpbImltYWdlL3dlYnAiXSwiZGFuZ2Vyb3VzbHlBbGxvd1NWRyI6ZmFsc2UsImNvbnRlbnRTZWN1cml0eVBvbGljeSI6InNjcmlwdC1zcmMgJ25vbmUnOyBmcmFtZS1zcmMgJ25vbmUnOyBzYW5kYm94OyIsImNvbnRlbnREaXNwb3NpdGlvblR5cGUiOiJhdHRhY2htZW50IiwicmVtb3RlUGF0dGVybnMiOltdLCJ1bm9wdGltaXplZCI6ZmFsc2V9LCJkZXZJbmRpY2F0b3JzIjp7ImFwcElzclN0YXR1cyI6dHJ1ZSwiYnVpbGRBY3Rpdml0eSI6dHJ1ZSwiYnVpbGRBY3Rpdml0eVBvc2l0aW9uIjoiYm90dG9tLXJpZ2h0In0sIm9uRGVtYW5kRW50cmllcyI6eyJtYXhJbmFjdGl2ZUFnZSI6NjAwMDAsInBhZ2VzQnVmZmVyTGVuZ3RoIjo1fSwiYW1wIjp7ImNhbm9uaWNhbEJhc2UiOiIifSwiYmFzZVBhdGgiOiIiLCJzYXNzT3B0aW9ucyI6e30sInRyYWlsaW5nU2xhc2giOmZhbHNlLCJpMThuIjpudWxsLCJwcm9kdWN0aW9uQnJvd3NlclNvdXJjZU1hcHMiOmZhbHNlLCJleGNsdWRlRGVmYXVsdE1vbWVudExvY2FsZXMiOnRydWUsInNlcnZlclJ1bnRpbWVDb25maWciOnt9LCJwdWJsaWNSdW50aW1lQ29uZmlnIjp7fSwicmVhY3RQcm9kdWN0aW9uUHJvZmlsaW5nIjpmYWxzZSwicmVhY3RTdHJpY3RNb2RlIjpudWxsLCJyZWFjdE1heEhlYWRlcnNMZW5ndGgiOjYwMDAsImh0dHBBZ2VudE9wdGlvbnMiOnsia2VlcEFsaXZlIjp0cnVlfSwibG9nZ2luZyI6e30sImV4cGlyZVRpbWUiOjMxNTM2MDAwLCJzdGF0aWNQYWdlR2VuZXJhdGlvblRpbWVvdXQiOjYwLCJtb2R1bGFyaXplSW1wb3J0cyI6eyJAbXVpL2ljb25zLW1hdGVyaWFsIjp7InRyYW5zZm9ybSI6IkBtdWkvaWNvbnMtbWF0ZXJpYWwve3ttZW1iZXJ9fSJ9LCJsb2Rhc2giOnsidHJhbnNmb3JtIjoibG9kYXNoL3t7bWVtYmVyfX0ifX0sIm91dHB1dEZpbGVUcmFjaW5nUm9vdCI6Ii90bXAvbmV4dC1zdGF0c3hzemo0Yy9zdGF0cy1hcHAiLCJleHBlcmltZW50YWwiOnsibXVsdGlab25lRHJhZnRNb2RlIjpmYWxzZSwiYXBwTmF2RmFpbEhhbmRsaW5nIjpmYWxzZSwicHJlcmVuZGVyRWFybHlFeGl0Ijp0cnVlLCJzZXJ2ZXJNaW5pZmljYXRpb24iOnRydWUsInNlcnZlclNvdXJjZU1hcHMiOmZhbHNlLCJsaW5rTm9Ub3VjaFN0YXJ0IjpmYWxzZSwiY2FzZVNlbnNpdGl2ZVJvdXRlcyI6ZmFsc2UsInByZWxvYWRFbnRyaWVzT25TdGFydCI6dHJ1ZSwiY2xpZW50Um91dGVyRmlsdGVyIjp0cnVlLCJjbGllbnRSb3V0ZXJGaWx0ZXJSZWRpcmVjdHMiOmZhbHNlLCJmZXRjaENhY2hlS2V5UHJlZml4IjoiIiwibWlkZGxld2FyZVByZWZldGNoIjoiZmxleGlibGUiLCJvcHRpbWlzdGljQ2xpZW50Q2FjaGUiOnRydWUsIm1hbnVhbENsaWVudEJhc2VQYXRoIjpmYWxzZSwiY3B1cyI6MTksIm1lbW9yeUJhc2VkV29ya2Vyc0NvdW50IjpmYWxzZSwiaXNyRmx1c2hUb0Rpc2siOnRydWUsIndvcmtlclRocmVhZHMiOmZhbHNlLCJvcHRpbWl6ZUNzcyI6ZmFsc2UsIm5leHRTY3JpcHRXb3JrZXJzIjpmYWxzZSwic2Nyb2xsUmVzdG9yYXRpb24iOmZhbHNlLCJleHRlcm5hbERpciI6ZmFsc2UsImRpc2FibGVPcHRpbWl6ZWRMb2FkaW5nIjpmYWxzZSwiZ3ppcFNpemUiOnRydWUsImNyYUNvbXBhdCI6ZmFsc2UsImVzbUV4dGVybmFscyI6dHJ1ZSwiZnVsbHlTcGVjaWZpZWQiOmZhbHNlLCJzd2NUcmFjZVByb2ZpbGluZyI6ZmFsc2UsImZvcmNlU3djVHJhbnNmb3JtcyI6ZmFsc2UsImxhcmdlUGFnZURhdGFCeXRlcyI6MTI4MDAwLCJ0dXJibyI6eyJyb290IjoiL3RtcC9uZXh0LXN0YXRzeHN6ajRjL3N0YXRzLWFwcCJ9LCJ0eXBlZFJvdXRlcyI6ZmFsc2UsInR5cGVkRW52IjpmYWxzZSwicGFyYWxsZWxTZXJ2ZXJDb21waWxlcyI6ZmFsc2UsInBhcmFsbGVsU2VydmVyQnVpbGRUcmFjZXMiOmZhbHNlLCJwcHIiOmZhbHNlLCJwcHJGYWxsYmFja3MiOmZhbHNlLCJ3ZWJwYWNrTWVtb3J5T3B0aW1pemF0aW9ucyI6ZmFsc2UsIm9wdGltaXplU2VydmVyUmVhY3QiOnRydWUsInVzZUVhcmx5SW1wb3J0IjpmYWxzZSwic3RhbGVUaW1lcyI6eyJkeW5hbWljIjowLCJzdGF0aWMiOjMwMH0sImFmdGVyIjpmYWxzZSwic2VydmVyQ29tcG9uZW50c0htckNhY2hlIjp0cnVlLCJzdGF0aWNHZW5lcmF0aW9uTWF4Q29uY3VycmVuY3kiOjgsInN0YXRpY0dlbmVyYXRpb25NaW5QYWdlc1BlcldvcmtlciI6MjUsImR5bmFtaWNJTyI6ZmFsc2UsIm9wdGltaXplUGFja2FnZUltcG9ydHMiOlsibHVjaWRlLXJlYWN0IiwiZGF0ZS1mbnMiLCJsb2Rhc2gtZXMiLCJyYW1kYSIsImFudGQiLCJyZWFjdC1ib290c3RyYXAiLCJhaG9va3MiLCJAYW50LWRlc2lnbi9pY29ucyIsIkBoZWFkbGVzc3VpL3JlYWN0IiwiQGhlYWRsZXNzdWktZmxvYXQvcmVhY3QiLCJAaGVyb2ljb25zL3JlYWN0LzIwL3NvbGlkIiwiQGhlcm9pY29ucy9yZWFjdC8yNC9zb2xpZCIsIkBoZXJvaWNvbnMvcmVhY3QvMjQvb3V0bGluZSIsIkB2aXN4L3Zpc3giLCJAdHJlbW9yL3JlYWN0IiwicnhqcyIsIkBtdWkvbWF0ZXJpYWwiLCJAbXVpL2ljb25zLW1hdGVyaWFsIiwicmVjaGFydHMiLCJyZWFjdC11c2UiLCJlZmZlY3QiLCJAZWZmZWN0L3NjaGVtYSIsIkBlZmZlY3QvcGxhdGZvcm0iLCJAZWZmZWN0L3BsYXRmb3JtLW5vZGUiLCJAZWZmZWN0L3BsYXRmb3JtLWJyb3dzZXIiLCJAZWZmZWN0L3BsYXRmb3JtLWJ1biIsIkBlZmZlY3Qvc3FsIiwiQGVmZmVjdC9zcWwtbXNzcWwiLCJAZWZmZWN0L3NxbC1teXNxbDIiLCJAZWZmZWN0L3NxbC1wZyIsIkBlZmZlY3Qvc3FsLXNxdWxpdGUtbm9kZSIsIkBlZmZlY3Qvc3FsLXNxdWxpdGUtYnVuIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS13YXNtIiwiQGVmZmVjdC9zcWwtc3F1bGl0ZS1yZWFjdC1uYXRpdmUiLCJAZWZmZWN0L3JwYyIsIkBlZmZlY3QvcnBjLWh0dHAiLCJAZWZmZWN0L3R5cGVjbGFzcyIsIkBlZmZlY3QvZXhwZXJpbWVudGFsIiwiQGVmZmVjdC9vcGVudGVsZW1ldHJ5IiwiQG1hdGVyaWFsLXVpL2NvcmUiLCJAbWF0ZXJpYWwtdWkvaWNvbnMiLCJAdGFibGVyL2ljb25zLXJlYWN0IiwibXVpLWNvcmUiLCJyZWFjdC1pY29ucy9haSIsInJlYWN0LWljb25zL2JpIiwicmVhY3QtaWNvbnMvYnMiLCJyZWFjdC1pY29ucy9jZyIsInJlYWN0LWljb25zL2NpIiwicmVhY3QtaWNvbnMvZGkiLCJyZWFjdC1pY29ucy9mYSIsInJlYWN0LWljb25zL2ZhNiIsInJlYWN0LWljb25zL2ZjIiwicmVhY3QtaWNvbnMvZmkiLCJyZWFjdC1pY29ucy9naSIsInJlYWN0LWljb25zL2dvIiwicmVhY3QtaWNvbnMvZ3IiLCJyZWFjdC1pY29ucy9oaSIsInJlYWN0LWljb25zL2hpMiIsInJlYWN0LWljb25zL2ltIiwicmVhY3QtaWNvbnMvaW8iLCJyZWFjdC1pY29ucy9pbzUiLCJyZWFjdC1pY29ucy9saWEiLCJyZWFjdC1pY29ucy9saWIiLCJyZWFjdC1pY29ucy9sdSIsInJlYWN0LWljb25zL21kIiwicmVhY3QtaWNvbnMvcGkiLCJyZWFjdC1pY29ucy9yaSIsInJlYWN0LWljb25zL3J4IiwicmVhY3QtaWNvbnMvc2kiLCJyZWFjdC1pY29ucy9zbCIsInJlYWN0LWljb25zL3RiIiwicmVhY3QtaWNvbnMvdGZpIiwicmVhY3QtaWNvbnMvdGkiLCJyZWFjdC1pY29ucy92c2MiLCJyZWFjdC1pY29ucy93aSJdfSwiYnVuZGxlUGFnZXNSb3V0ZXJEZXBlbmRlbmNpZXMiOmZhbHNlLCJjb25maWdGaWxlIjoiL3RtcC9uZXh0LXN0YXRzeHN6ajRjL3N0YXRzLWFwcC9uZXh0LmNvbmZpZy5qcyIsImNvbmZpZ0ZpbGVOYW1lIjoibmV4dC5jb25maWcuanMifQ==","pagesType":"app","appDirLoader":"bmV4dC1hcHAtbG9hZGVyP25hbWU9YXBwJTJGYXBwLWVkZ2Utc3NyJTJGcGFnZSZwYWdlPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcHAtZWRnZS1zc3IlMkZwYWdlLmpzJmFwcERpcj0lMkZ0bXAlMkZuZXh0LXN0YXRzeHN6ajRjJTJGc3RhdHMtYXBwJTJGYXBwJmFwcFBhdGhzPSUyRmFwcC1lZGdlLXNzciUyRnBhZ2UmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JmZseWluZ1NodXR0bGU9ZmFsc2UmcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCE=","sriEnabled":false,"middlewareConfig":"e30="}!
       var _self___RSC_MANIFEST;
 
       const incrementalCacheHandler = null;
@@ -443,56 +443,56 @@
       /***/
     },
 
-    /***/ 7028: /***/ (
+    /***/ 4470: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 7063)
+        __webpack_require__.bind(__webpack_require__, 7765)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 2422)
+        __webpack_require__.bind(__webpack_require__, 1514)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 2610)
+        __webpack_require__.bind(__webpack_require__, 2991)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 648)
+        __webpack_require__.bind(__webpack_require__, 2495)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 9941)
+        __webpack_require__.bind(__webpack_require__, 2418)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 9060)
+        __webpack_require__.bind(__webpack_require__, 2304)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 3109)
+        __webpack_require__.bind(__webpack_require__, 1211)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 3747)
+        __webpack_require__.bind(__webpack_require__, 7431)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 6789)
+        __webpack_require__.bind(__webpack_require__, 3042)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 3277)
+        __webpack_require__.bind(__webpack_require__, 2615)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 8254)
+        __webpack_require__.bind(__webpack_require__, 4217)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 6972)
+        __webpack_require__.bind(__webpack_require__, 1847)
       );
 
       /***/
     },
 
-    /***/ 1942: /***/ () => {
+    /***/ 3446: /***/ () => {
       /***/
     },
 
-    /***/ 7988: /***/ (
+    /***/ 2566: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -512,7 +512,7 @@
       /***/
     },
 
-    /***/ 3336: /***/ (
+    /***/ 2968: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -524,7 +524,7 @@
         /* harmony export */
       });
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(4021);
+        __webpack_require__(3003);
 
       function RootLayout({ children }) {
         return /*#__PURE__*/ (0,
@@ -543,7 +543,7 @@
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
-    /******/ __webpack_require__.O(0, [268, 924], () => __webpack_exec__(298));
+    /******/ __webpack_require__.O(0, [188, 976], () => __webpack_exec__(7430));
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ (_ENTRIES = typeof _ENTRIES === "undefined" ? {} : _ENTRIES)[
       "middleware_app/app-edge-ssr/page"
Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for image-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [8358],
   {
-    /***/ 6441: /***/ (
+    /***/ 7486: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/image",
         function () {
-          return __webpack_require__(2563);
+          return __webpack_require__(5412);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 6730: /***/ (module, exports, __webpack_require__) => {
+    /***/ 9569: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -40,17 +40,17 @@
         __webpack_require__(38)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(8624)
+        __webpack_require__(7269)
       );
-      const _getimgprops = __webpack_require__(2990);
-      const _imageconfig = __webpack_require__(876);
-      const _imageconfigcontextsharedruntime = __webpack_require__(2767);
-      const _warnonce = __webpack_require__(5064);
-      const _routercontextsharedruntime = __webpack_require__(3948);
+      const _getimgprops = __webpack_require__(6985);
+      const _imageconfig = __webpack_require__(8151);
+      const _imageconfigcontextsharedruntime = __webpack_require__(8836);
+      const _warnonce = __webpack_require__(9138);
+      const _routercontextsharedruntime = __webpack_require__(4654);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5825)
+        __webpack_require__(2946)
       );
-      const _usemergedref = __webpack_require__(6956);
+      const _usemergedref = __webpack_require__(5658);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -371,7 +371,7 @@
       /***/
     },
 
-    /***/ 6956: /***/ (module, exports, __webpack_require__) => {
+    /***/ 5658: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -432,7 +432,7 @@
       /***/
     },
 
-    /***/ 2990: /***/ (
+    /***/ 6985: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -448,9 +448,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(5064);
-      const _imageblursvg = __webpack_require__(2243);
-      const _imageconfig = __webpack_require__(876);
+      const _warnonce = __webpack_require__(9138);
+      const _imageblursvg = __webpack_require__(4901);
+      const _imageconfig = __webpack_require__(8151);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -823,7 +823,7 @@
       /***/
     },
 
-    /***/ 2243: /***/ (__unused_webpack_module, exports) => {
+    /***/ 4901: /***/ (__unused_webpack_module, exports) => {
       "use strict";
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
@@ -878,7 +878,7 @@
       /***/
     },
 
-    /***/ 2470: /***/ (
+    /***/ 5731: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -905,10 +905,10 @@
         },
       });
       const _interop_require_default = __webpack_require__(9608);
-      const _getimgprops = __webpack_require__(2990);
-      const _imagecomponent = __webpack_require__(6730);
+      const _getimgprops = __webpack_require__(6985);
+      const _imagecomponent = __webpack_require__(9569);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5825)
+        __webpack_require__(2946)
       );
       function getImageProps(imgProps) {
         const { props } = (0, _getimgprops.getImgProps)(imgProps, {
@@ -940,7 +940,7 @@
       /***/
     },
 
-    /***/ 5825: /***/ (__unused_webpack_module, exports) => {
+    /***/ 2946: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -975,7 +975,7 @@
       /***/
     },
 
-    /***/ 2563: /***/ (
+    /***/ 5412: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -992,8 +992,8 @@
 
       // EXTERNAL MODULE: ./node_modules/.pnpm/[email protected]/node_modules/react/jsx-runtime.js
       var jsx_runtime = __webpack_require__(7125);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_a5fwrzcgiqxq7kbo7kpyzjc5ji/node_modules/next/image.js
-      var next_image = __webpack_require__(9983);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.0.0-rc-cd22717c-20241013_re_zq6nvqen5pqfmm5xeouxrlc4aq/node_modules/next/image.js
+      var next_image = __webpack_require__(9231);
       var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // CONCATENATED MODULE: ./pages/nextjs.png
       /* harmony default export */ const nextjs = {
         src: "/_next/static/media/nextjs.cae0b805.png",
@@ -1023,12 +1023,12 @@
       /***/
     },
 
-    /***/ 9983: /***/ (
+    /***/ 9231: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(2470);
+      module.exports = __webpack_require__(5731);
 
       /***/
     },
@@ -1038,7 +1038,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [2888, 9774, 179], () =>
-      __webpack_exec__(6441)
+      __webpack_exec__(7486)
     );
     /******/ 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([
   [4644],
   {
-    /***/ 6707: /***/ (
+    /***/ 9202: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/link",
         function () {
-          return __webpack_require__(940);
+          return __webpack_require__(2971);
         },
       ]);
       if (false) {
@@ -18,7 +18,7 @@
       /***/
     },
 
-    /***/ 2387: /***/ (module, exports) => {
+    /***/ 8382: /***/ (module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -96,7 +96,7 @@
       /***/
     },
 
-    /***/ 3025: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1205: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -108,7 +108,7 @@
           return getDomainLocale;
         },
       });
-      const _normalizetrailingslash = __webpack_require__(5747);
+      const _normalizetrailingslash = __webpack_require__(3250);
       const basePath =
         /* unused pure expression or super */ null && (false || "");
       function getDomainLocale(path, locale, locales, domainLocales) {
@@ -132,7 +132,7 @@
       /***/
     },
 
-    /***/ 2051: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3836: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -149,18 +149,18 @@
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(1299)
       );
-      const _resolvehref = __webpack_require__(3994);
-      const _islocalurl = __webpack_require__(9486);
-      const _formaturl = __webpack_require__(3261);
-      const _utils = __webpack_require__(2625);
-      const _addlocale = __webpack_require__(4546);
-      const _routercontextsharedruntime = __webpack_require__(3948);
-      const _approutercontextsharedruntime = __webpack_require__(9855);
-      const _useintersection = __webpack_require__(2280);
-      const _getdomainlocale = __webpack_require__(3025);
-      const _addbasepath = __webpack_require__(5594);
-      const _routerreducertypes = __webpack_require__(2387);
-      const _usemergedref = __webpack_require__(6956);
+      const _resolvehref = __webpack_require__(8216);
+      const _islocalurl = __webpack_require__(1998);
+      const _formaturl = __webpack_require__(6261);
+      const _utils = __webpack_require__(5528);
+      const _addlocale = __webpack_require__(3774);
+      const _routercontextsharedruntime = __webpack_require__(4654);
+      const _approutercontextsharedruntime = __webpack_require__(92);
+      const _useintersection = __webpack_require__(4930);
+      const _getdomainlocale = __webpack_require__(1205);
+      const _addbasepath = __webpack_require__(7254);
+      const _routerreducertypes = __webpack_require__(8382);
+      const _usemergedref = __webpack_require__(5658);
       const prefetched = new Set();
       function prefetch(router, href, as, options, appOptions, isAppRouter) {
         if (false) {
@@ -588,7 +588,7 @@
       /***/
     },
 
-    /***/ 2280: /***/ (module, exports, __webpack_require__) => {
+    /***/ 4930: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -601,7 +601,7 @@
         },
       });
       const _react = __webpack_require__(1299);
-      const _requestidlecallback = __webpack_require__(8162);
+      const _requestidlecallback = __webpack_require__(7242);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -714,7 +714,7 @@
       /***/
     },
 
-    /***/ 6956: /***/ (module, exports, __webpack_require__) => {
+    /***/ 5658: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -775,7 +775,7 @@
       /***/
     },
 
-    /***/ 940: /***/ (
+    /***/ 2971: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -790,7 +790,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(7125);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(20);
+        __webpack_require__(2778);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -821,8 +821,12 @@
       /***/
     },
 
-    /***/ 20: /***/ (module, __unused_webpack_exports, __webpack_require__) => {
-      module.exports = __webpack_require__(2051);
+    /***/ 2778: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(3836);
 
       /***/
     },
@@ -832,7 +836,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [2888, 9774, 179], () =>
-      __webpack_exec__(6707)
+      __webpack_exec__(9202)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 3620-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

Diff too large to display

Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Diff for app-page.runtime.prod.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for app-route.runtime.dev.js

Diff too large to display

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

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: 718c3c7

@lubieowoce lubieowoce force-pushed the lubieowoce/after-is-not-dynamic branch 7 times, most recently from f3bdd38 to 4b5ed19 Compare October 14, 2024 03:47
@lubieowoce
Copy link
Member Author

lubieowoce commented Oct 14, 2024

there's a couple TODOs here, mostly related to error messages and error reporting. but it's important to push out the updated unstable_after API in RC2, so i'd leave those tweaks for a follow up before 15 GA.

@lubieowoce lubieowoce marked this pull request as ready for review October 14, 2024 06:23
@lubieowoce lubieowoce force-pushed the lubieowoce/after-is-not-dynamic branch from 5464098 to 7f23b47 Compare October 14, 2024 06:32
@@ -84,10 +87,12 @@ export class AfterContext {
await callback()
} catch (err) {
// TODO(after): this is fine for now, but will need better intergration with our error reporting.
// TODO(after): should we log this if we have a onTaskError callback?
Copy link
Member

Choose a reason for hiding this comment

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

We can log here first and pass it to the onRequestError later, then users can catch both error logging interminal and the instance through that callback.

Not blocking in this PR.

Copy link
Member Author

Choose a reason for hiding this comment

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

yeah, but it gets a bit annoying during prerendering -- in that case we log it once here, and then throw the error up in the prenderer, so in effect it gets logged twice. see also here: https://github.com/vercel/next.js/blob/lubieowoce/after-is-not-dynamic/packages/next/src/export/routes/app-page.ts#L86-L87

agreed that it's not a blocker, just something to improve before GA

@lubieowoce lubieowoce force-pushed the lubieowoce/after-is-not-dynamic branch from 7f23b47 to 81f1163 Compare October 14, 2024 11:47
@lubieowoce lubieowoce enabled auto-merge (squash) October 14, 2024 12:12
@lubieowoce lubieowoce merged commit 701b11c into canary Oct 14, 2024
103 of 108 checks passed
@lubieowoce lubieowoce deleted the lubieowoce/after-is-not-dynamic branch October 14, 2024 12:56
lubieowoce added a commit that referenced this pull request Oct 15, 2024
Updates `unstable_after` docs to match changes from
#71231

---------

Co-authored-by: Delba de Oliveira <[email protected]>
lubieowoce added a commit that referenced this pull request Oct 16, 2024
In #71231 we've added `onAfterTaskError`, which is intended for handling
errors that happened within `unstable_after` (currently only used to
fail the build if anything is thrown during prerendering). It was being
called correctly for the callback form, `unstable_after(() => { ... })`,
but we missed the fact that `unstable_after(promise)` is also valid, and
weren't calling it for rejected promises.

(Apparently we also weren't printing any kind of error message for
those, and it's been that way since the start. my bad.)

This PR unifies the error handling for callbacks and promises.
devjiwonchoi pushed a commit that referenced this pull request Oct 21, 2024
In #71231 we've added `onAfterTaskError`, which is intended for handling
errors that happened within `unstable_after` (currently only used to
fail the build if anything is thrown during prerendering). It was being
called correctly for the callback form, `unstable_after(() => { ... })`,
but we missed the fact that `unstable_after(promise)` is also valid, and
weren't calling it for rejected promises.

(Apparently we also weren't printing any kind of error message for
those, and it's been that way since the start. my bad.)

This PR unifies the error handling for callbacks and promises.
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Oct 29, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants