Skip to content

Serve static metadata files as static files not as route files #82030

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

Draft
wants to merge 20 commits into
base: canary
Choose a base branch
from

Conversation

devjiwonchoi
Copy link
Member

No description provided.

- i think it should eventually go into static dir, and add /_next/static/metadata when is metadata file request. or even easier, just separate dir?
- the copying file logic seems ok to me.
- should add more tests for dynamic, route group, etc.

next:

look into resolve-route to ensure the request matches whatever path inside the distDir and to the actual file
Copy link
Member Author

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

@@ -241,6 +242,7 @@ export async function createPagesMapping({
const isAppRoute = pagesType === 'app'
const pages: MappedPages = {}
const promises = pagePaths.map<Promise<void>>(async (pagePath) => {
console.log({ pagePath })
Copy link

@vercel vercel bot Jul 24, 2025

Choose a reason for hiding this comment

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

Debug console.log statement left in production code that should be removed.

View Details

Analysis

A debug console.log({ pagePath }) statement has been added to the build process code. This will log every page path during the build process, which is not appropriate for production code as it creates unnecessary console output and can clutter build logs.

This appears to be leftover debugging code that was accidentally committed. Console statements in core Next.js build processes should be removed unless they serve a specific user-facing purpose (like error reporting or important build information).


Recommendation

Remove the console.log statement:

const promises = pagePaths.map<Promise<void>>(async (pagePath) => {
  // Remove this line:
  // console.log({ pagePath })
  
  // Do not process .d.ts files as routes
  if (pagePath.endsWith('.d.ts') && pageExtensions.includes('ts')) {
    return
  }
  // ... rest of the function
})

👍 or 👎 to improve Vade.

@@ -253,10 +253,13 @@ export function getResolveRoutes(
async function checkTrue() {
const pathname = parsedUrl.pathname || '/'

console.log('checkTrue init', { pathname })
Copy link

@vercel vercel bot Jul 24, 2025

Choose a reason for hiding this comment

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

Debug console.log statement left in production code that should be removed.

View Details

Analysis

A debug console.log('checkTrue init', { pathname }) statement has been added to the route resolution logic. This will log every pathname during request processing, which is inappropriate for production code as it will create excessive logging during normal operation.

Console statements in core routing logic can significantly impact performance and create noise in production logs. This appears to be debugging code that should be removed.


Recommendation

Remove the console.log statement:

async function checkTrue() {
  const pathname = parsedUrl.pathname || '/'

  // Remove this line:
  // console.log('checkTrue init', { pathname })

  if (checkLocaleApi(pathname)) {
    return
  }
  // ... rest of the function
}

👍 or 👎 to improve Vade.

@@ -267,6 +269,11 @@ export async function createPagesMapping({

let route = pagesType === 'app' ? normalizeMetadataRoute(pageKey) : pageKey

if (route.endsWith('/__static_file__')) {
console.log('entries', { route, normalizedPath })
Copy link

@vercel vercel bot Jul 24, 2025

Choose a reason for hiding this comment

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

Debug console.log statement left in production code that should be removed.

View Details

Analysis

A debug console.log('entries', { route, normalizedPath }) statement has been added inside the route processing logic. This will log information every time a route ending with /__static_file__ is processed during build, which is inappropriate for production code.

This appears to be debugging code used during development of the static metadata files feature that was accidentally left in the codebase. Such console statements should be removed from production code paths.


Recommendation

Remove the console.log statement:

if (route.endsWith('/__static_file__')) {
  // Remove this line:
  // console.log('entries', { route, normalizedPath })
  return
}

👍 or 👎 to improve Vade.

@@ -440,6 +440,7 @@ export async function setupFsCheck(opts: {
},

async getItem(itemPath: string): Promise<FsOutput | null> {
console.log('getItem', { itemPath })
Copy link

Choose a reason for hiding this comment

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

Debug console.log statement left in production code that should be removed.

View Details

Analysis

A debug console.log('getItem', { itemPath }) statement has been added to the filesystem checker's getItem method. This method is called frequently during route resolution and will create excessive logging in production.

The getItem method is a core part of the filesystem routing logic and is invoked for every route lookup. Adding console logging here will significantly impact both performance and log readability in production environments.


Recommendation

Remove the console.log statement:

async getItem(itemPath: string): Promise<FsOutput | null> {
  // Remove this line:
  // console.log('getItem', { itemPath })
  
  const originalItemPath = itemPath
  const itemKey = originalItemPath
  // ... rest of the method
}

👍 or 👎 to improve Vade.

if (checkLocaleApi(pathname)) {
return
}
if (!invokedOutputs?.has(pathname)) {
console.log('invokedOutputs', { pathname })
Copy link

@vercel vercel bot Jul 24, 2025

Choose a reason for hiding this comment

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

Debug console.log statement left in production code that should be removed.

View Details

Analysis

A debug console.log('invokedOutputs', { pathname }) statement has been added to the route resolution logic. This will log pathname information during request processing in production, which is inappropriate.

This console statement appears inside critical routing logic and will be executed frequently during normal application operation, potentially impacting performance and creating excessive log noise.


Recommendation

Remove the console.log statement:

if (!invokedOutputs?.has(pathname)) {
  // Remove this line:
  // console.log('invokedOutputs', { pathname })
  
  const output = await fsChecker.getItem(pathname)
  // ... rest of the logic
}

👍 or 👎 to improve Vade.

@@ -688,6 +689,8 @@ export async function setupFsCheck(opts: {
itemPath: curItemPath,
}

console.log({ curItemPath })
Copy link

@vercel vercel bot Jul 24, 2025

Choose a reason for hiding this comment

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

Optional chaining is used incorrectly with .catch() which will cause a runtime error since the ensureFn call returns a Promise, not an optional value.

View Details

Analysis

The code attempts to use optional chaining (?.) on the result of await ensureFn(...)?.catch(), but this is incorrect syntax. The ensureFn call returns a Promise, and await resolves that Promise. You cannot use optional chaining on the result of an await expression followed by .catch().

The intended behavior appears to be to catch any errors from the ensureFn call and treat them as "ENSURE_FAILED", but the current syntax will cause a compilation error or runtime error.

The original code used a proper try-catch block to handle this scenario, which was the correct approach. The refactored version attempts to be more concise but introduces a syntax error.


Recommendation

Revert to the original try-catch approach or fix the Promise handling. Either:

Option 1 (recommended - revert to original):

if (ensureFn) {
  try {
    await ensureFn({
      type,
      itemPath: isAppFile ? normalizeMetadataRoute(curItemPath) : curItemPath,
    })
  } catch (error) {
    continue
  }
}

Option 2 (fix the Promise handling):

if (
  ensureFn &&
  (await ensureFn({
    type,
    itemPath: isAppFile ? normalizeMetadataRoute(curItemPath) : curItemPath,
  }).catch(() => 'ENSURE_FAILED')) === 'ENSURE_FAILED'
) {
  continue
}

👍 or 👎 to improve Vade.

@ijjk
Copy link
Member

ijjk commented Jul 24, 2025

Failing test suites

Commit: aed726c

pnpm test-dev test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-root-route.test.ts

  • metadata-files-static-output-root-route > should not generate routes for metadata files
  • metadata-files-static-output-root-route > should serve static files when requested to its route
Expand output

● metadata-files-static-output-root-route › should not generate routes for metadata files

ENOENT: no such file or directory, open '/tmp/next-install-359e0fc59eef6fc6e2f46d68ac9090e4aaf8ca62bbcee8339e5f273225eb767c/.next/app-path-routes-manifest.json'

● metadata-files-static-output-root-route › should serve static files when requested to its route

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

- Expected  - 19
+ Received  +  7

  Object {
-   "favicon": 0,
-   "manifest": "{
-   \"name\": \"My Next.js Application\",
-   \"short_name\": \"Next.js App\",
-   \"description\": \"An application built with Next.js\",
-   \"start_url\": \"/\"
- }
- ",
-   "robots": "User-Agent: *
- Allow: /
- Disallow: /private/
-
- Sitemap: https://nextjs.org/sitemap.xml",
-   "sitemap": "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">
-   <url>
-     <loc>https://nextjs.org</loc>
-     <lastmod>2025-01-01T00:00:00.000Z</lastmod>
-   </url>
- </urlset>",
+   "favicon": -1,
+   "manifest": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/webpack.js?v=1753706351903\"/><script src=\"/_next/static/chunks/main-app.js?v=1753706351903\" async=\"\"></script><script src=\"/_next/static/chunks/app-pages-internals.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><title>404: This page could not be found.</title><script src=\"/_next/static/chunks/polyfills.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$?--><template id=\"B:0\"></template><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$?--><template id=\"B:1\"></template><!--/$--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/webpack.js?v=1753706351903\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"4:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"SegmentViewNode\\\"]\\n6:\\\"$Sreact.fragment\\\"\\n14:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n16:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n2a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"OutletBoundary\\\"]\\n31:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/async-metadata.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n3a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"ViewportBoundary\\\"]\\n40:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e69053\"])</script><script>self.__next_f.push([1,\"1ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"MetadataBoundary\\\"]\\n45:\\\"$Sreact.suspense\\\"\\n49:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/builtin/global-error.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n:N1753706351907.3179\\n2:{\\\"name\\\":\\\"Preloads\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"preloadCallbacks\\\":[]}}\\n3:[]\\n5:[]\\n9:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nc:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nd:{}\\ne:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\nb:{\\\"children\\\":[\\\"$\\\",\\\"$Lc\\\",null,\\\"$d\\\",null,\\\"$e\\\",1]}\\nf:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\na:{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$6\\\",null,\\\"$b\\\",null,\\\"$f\\\",0],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":\\\"$Y\\\"}\\n10:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n8:{\\\"name\\\":\\\"RootLayout\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"children\\\":[\\\"$\\\",\\\"$L9\\\",null,\\\"$a\\\",null,\\\"$10\\\",1],\\\"params\\\":\\\"$Y\\\"}}\\n11:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",9,87,8,1,false]]\\n12:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",11,94,8,1,false]]\\n13:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0\"])</script><script>self.__next_f.push([1,\",true]]\\n15:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n17:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n18:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n19:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1a:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1b:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1c:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1e:{\\\"name\\\":\\\"NotFound\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"params\\\":\\\"$@1f\\\",\\\"searchParams\\\":\\\"$@20\\\"}}\\n21:{\\\"name\\\":\\\"HTTPAccessErrorFallback\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$1e\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"status\\\":404,\\\"message\\\":\\\"This page could not be found.\\\"}}\\n22:[]\\n23:[]\\n24:[]\\n25:[]\\n26:[]\\n27:[]\\n28:[]\\n29:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n2d:\\\"$E(async function getViewportReady() {\\\\n        await viewport();\\\\n        return undefined;\\\\n    })\\\"\\n2c:{\\\"name\\\":\\\"__next_outlet_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"ready\\\":\\\"$2d\\\"}}\\n2f:{\\\"name\\\":\\\"StreamingMetadataOutletImpl\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{}}\\n30:[]\\n33:[]\\n35:{\\\"name\\\":\\\"NonIndex\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"pagePath\\\":\\\"/_not-found\\\",\\\"statusCode\\\":404,\\\"isPossibleServerAction\\\":false}}\\n36:[]\\n38:{\\\"name\\\":\\\"ViewportTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n39:[]\\n3c:{\\\"name\\\":\\\"__next_viewport_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$38\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3e:{\\\"name\\\":\\\"MetadataTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3f:[]\\n42:{\\\"name\\\":\\\"__next_metadata_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$3e\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n43:[]\\n44:[]\\n47:{\\\"name\\\":\\\"MetadataResolver\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$42\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n4a:[]\\n1f:\\n20:\\n4b:[]\\n4c:[]\\n1:D\\\"$2\\\"\\n1:null\\n7:D\\\"$8\\\"\\n7:[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L14\\\",null,{\\\"pa\"])</script><script>self.__next_f.push([1,\"rallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$15\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",[\\\"$\\\",\\\"$L4\\\",null,{\\\"type\\\":\\\"boundary:global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\"},null,\\\"$17\\\",1]]},null,\\\"$13\\\",1]},\\\"$8\\\",\\\"$12\\\",1]},\\\"$8\\\",\\\"$11\\\",1]\\n1d:D\\\"$1e\\\"\\n1d:D\\\"$21\\\"\\n\"])</script><script>self.__next_f.push([1,\"1d:[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"},\\\"$21\\\",\\\"$22\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}},\\\"$21\\\",\\\"$25\\\",1],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404},\\\"$21\\\",\\\"$26\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"},\\\"$21\\\",\\\"$28\\\",1]},\\\"$21\\\",\\\"$27\\\",1]]},\\\"$21\\\",\\\"$24\\\",1]},\\\"$21\\\",\\\"$23\\\",1]]\\n\"])</script><script>self.__next_f.push([1,\"2b:D\\\"$2c\\\"\\n2e:D\\\"$2f\\\"\\n2e:[\\\"$\\\",\\\"$L31\\\",null,{\\\"promise\\\":\\\"$@32\\\"},\\\"$2f\\\",\\\"$30\\\",1]\\n34:D\\\"$35\\\"\\n34:[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"},null,\\\"$36\\\",1]\\n37:D\\\"$38\\\"\\n3b:D\\\"$3c\\\"\\n37:[[\\\"$\\\",\\\"$L3a\\\",null,{\\\"children\\\":\\\"$L3b\\\"},\\\"$38\\\",\\\"$39\\\",1],null]\\n3d:D\\\"$3e\\\"\\n41:D\\\"$42\\\"\\n46:D\\\"$47\\\"\\n41:[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$45\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$L46\\\"},\\\"$42\\\",\\\"$44\\\",1]},\\\"$42\\\",\\\"$43\\\",1]\\n3d:[\\\"$\\\",\\\"$L40\\\",null,{\\\"children\\\":\\\"$41\\\"},\\\"$3e\\\",\\\"$3f\\\",1]\\n48:[]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":\\\"$1\\\",\\\"b\\\":\\\"development\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"manifest.json\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$L4\\\",\\\"layout\\\",{\\\"type\\\":\\\"layout\\\",\\\"pagePath\\\":\\\"layout.tsx\\\",\\\"children\\\":[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,\\\"$7\\\"]},null,\\\"$5\\\",1]},null,\\\"$3\\\",0],{\\\"children\\\":[\\\"/_not-found\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L14\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$1a\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\"]},null,\\\"$19\\\",1]]},null,\\\"$18\\\",0],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"$L4\\\",\\\"c-page\\\",{\\\"type\\\":\\\"page\\\",\\\"pagePath\\\":\\\"__next_builtin__not-found.js\\\",\\\"children\\\":\\\"$1d\\\"},null,\\\"$1c\\\",1],null,[\\\"$\\\",\\\"$L2a\\\",null,{\\\"children\\\":[\\\"$L2b\\\",\\\"$2e\\\"]},null,\\\"$29\\\",1]]},null,\\\"$1b\\\",0],{},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$6\\\",\\\"h\\\",{\\\"children\\\":[\\\"$34\\\",\\\"$37\\\",\\\"$3d\\\"]},null,\\\"$33\\\",0],false]],\\\"m\\\":\\\"$W48\\\",\\\"G\\\":[\\\"$49\\\",[\\\"$\\\",\\\"$L4\\\",\\\"ge-svn\\\",{\\\"type\\\":\\\"global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\",\\\"children\\\":[]},null,\\\"$4a\\\",0]],\\\"s\\\":false,\\\"S\\\":false}\\n\"])</script><script>self.__next_f.push([1,\"3b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"},\\\"$2c\\\",\\\"$4b\\\",0],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"},\\\"$2c\\\",\\\"$4c\\\",0]]\\n2b:null\\n\"])</script><script>self.__next_f.push([1,\"50:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/lib/metadata/generate/icon-mark.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"IconMark\\\"]\\n4d:[]\\n4e:[[\\\"Array.map\\\",\\\"\\\",0,0,0,0,false]]\\n4f:[]\\n32:{\\\"metadata\\\":[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"manifest\\\",\\\"href\\\":\\\"/manifest.json\\\",\\\"crossOrigin\\\":\\\"$undefined\\\"},\\\"$2f\\\",\\\"$4d\\\",0],[\\\"$\\\",\\\"link\\\",\\\"1\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico\\\",\\\"type\\\":\\\"image/x-icon\\\",\\\"sizes\\\":\\\"16x16\\\"},\\\"$2f\\\",\\\"$4e\\\",0],[\\\"$\\\",\\\"$L50\\\",\\\"2\\\",{},\\\"$2f\\\",\\\"$4f\\\",0]],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n46:\\\"$32:metadata\\\"\\n\"])</script><link rel=\"manifest\" href=\"/manifest.json\"/><link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" sizes=\"16x16\"/><script >document.querySelectorAll('body link[rel=\"icon\"], body link[rel=\"apple-touch-icon\"]').forEach(el => document.head.appendChild(el))</script><div hidden id=\"S:1\"></div><script>$RB=[];$RV=function(b){$RT=performance.now();for(var a=0;a<b.length;a+=2){var c=b[a],e=b[a+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&g._reactRetry()}}b.length=0};
+ $RC=function(b,a){if(a=document.getElementById(a))(b=document.getElementById(b))?(b.previousSibling.data=\"$~\",$RB.push(b,a),2===$RB.length&&(b=\"number\"!==typeof $RT?0:$RT,a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:b+300-a))):a.parentNode.removeChild(a)};$RC(\"B:1\",\"S:1\")</script><div hidden id=\"S:0\"></div><script>$RC(\"B:0\",\"S:0\")</script></body></html>",
+   "robots": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/webpack.js?v=1753706351903\"/><script src=\"/_next/static/chunks/main-app.js?v=1753706351903\" async=\"\"></script><script src=\"/_next/static/chunks/app-pages-internals.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><title>404: This page could not be found.</title><script src=\"/_next/static/chunks/polyfills.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$?--><template id=\"B:0\"></template><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$?--><template id=\"B:1\"></template><!--/$--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/webpack.js?v=1753706351903\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"4:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"SegmentViewNode\\\"]\\n6:\\\"$Sreact.fragment\\\"\\n14:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n16:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n2a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"OutletBoundary\\\"]\\n31:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/async-metadata.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n3a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"ViewportBoundary\\\"]\\n40:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e69053\"])</script><script>self.__next_f.push([1,\"1ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"MetadataBoundary\\\"]\\n45:\\\"$Sreact.suspense\\\"\\n49:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/builtin/global-error.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n:N1753706351907.401\\n2:{\\\"name\\\":\\\"Preloads\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"preloadCallbacks\\\":[]}}\\n3:[]\\n5:[]\\n9:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nc:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nd:{}\\ne:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\nb:{\\\"children\\\":[\\\"$\\\",\\\"$Lc\\\",null,\\\"$d\\\",null,\\\"$e\\\",1]}\\nf:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\na:{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$6\\\",null,\\\"$b\\\",null,\\\"$f\\\",0],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":\\\"$Y\\\"}\\n10:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n8:{\\\"name\\\":\\\"RootLayout\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"children\\\":[\\\"$\\\",\\\"$L9\\\",null,\\\"$a\\\",null,\\\"$10\\\",1],\\\"params\\\":\\\"$Y\\\"}}\\n11:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",9,87,8,1,false]]\\n12:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",11,94,8,1,false]]\\n13:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,\"])</script><script>self.__next_f.push([1,\"true]]\\n15:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n17:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n18:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n19:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1a:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1b:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1c:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1e:{\\\"name\\\":\\\"NotFound\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"params\\\":\\\"$@1f\\\",\\\"searchParams\\\":\\\"$@20\\\"}}\\n21:{\\\"name\\\":\\\"HTTPAccessErrorFallback\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$1e\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"status\\\":404,\\\"message\\\":\\\"This page could not be found.\\\"}}\\n22:[]\\n23:[]\\n24:[]\\n25:[]\\n26:[]\\n27:[]\\n28:[]\\n29:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n2d:\\\"$E(async function getViewportReady() {\\\\n        await viewport();\\\\n        return undefined;\\\\n    })\\\"\\n2c:{\\\"name\\\":\\\"__next_outlet_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"ready\\\":\\\"$2d\\\"}}\\n2f:{\\\"name\\\":\\\"StreamingMetadataOutletImpl\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{}}\\n30:[]\\n33:[]\\n35:{\\\"name\\\":\\\"NonIndex\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"pagePath\\\":\\\"/_not-found\\\",\\\"statusCode\\\":404,\\\"isPossibleServerAction\\\":false}}\\n36:[]\\n38:{\\\"name\\\":\\\"ViewportTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n39:[]\\n3c:{\\\"name\\\":\\\"__next_viewport_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$38\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3e:{\\\"name\\\":\\\"MetadataTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3f:[]\\n42:{\\\"name\\\":\\\"__next_metadata_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$3e\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n43:[]\\n44:[]\\n47:{\\\"name\\\":\\\"MetadataResolver\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$42\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n4a:[]\\n1f:\\n20:\\n4b:[]\\n4c:[]\\n1:D\\\"$2\\\"\\n1:null\\n7:D\\\"$8\\\"\\n7:[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L14\\\",null,{\\\"par\"])</script><script>self.__next_f.push([1,\"allelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$15\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",[\\\"$\\\",\\\"$L4\\\",null,{\\\"type\\\":\\\"boundary:global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\"},null,\\\"$17\\\",1]]},null,\\\"$13\\\",1]},\\\"$8\\\",\\\"$12\\\",1]},\\\"$8\\\",\\\"$11\\\",1]\\n1d:D\\\"$1e\\\"\\n1d:D\\\"$21\\\"\\n\"])</script><script>self.__next_f.push([1,\"1d:[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"},\\\"$21\\\",\\\"$22\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}},\\\"$21\\\",\\\"$25\\\",1],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404},\\\"$21\\\",\\\"$26\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"},\\\"$21\\\",\\\"$28\\\",1]},\\\"$21\\\",\\\"$27\\\",1]]},\\\"$21\\\",\\\"$24\\\",1]},\\\"$21\\\",\\\"$23\\\",1]]\\n\"])</script><script>self.__next_f.push([1,\"2b:D\\\"$2c\\\"\\n2e:D\\\"$2f\\\"\\n2e:[\\\"$\\\",\\\"$L31\\\",null,{\\\"promise\\\":\\\"$@32\\\"},\\\"$2f\\\",\\\"$30\\\",1]\\n34:D\\\"$35\\\"\\n34:[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"},null,\\\"$36\\\",1]\\n37:D\\\"$38\\\"\\n3b:D\\\"$3c\\\"\\n37:[[\\\"$\\\",\\\"$L3a\\\",null,{\\\"children\\\":\\\"$L3b\\\"},\\\"$38\\\",\\\"$39\\\",1],null]\\n3d:D\\\"$3e\\\"\\n41:D\\\"$42\\\"\\n46:D\\\"$47\\\"\\n41:[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$45\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$L46\\\"},\\\"$42\\\",\\\"$44\\\",1]},\\\"$42\\\",\\\"$43\\\",1]\\n3d:[\\\"$\\\",\\\"$L40\\\",null,{\\\"children\\\":\\\"$41\\\"},\\\"$3e\\\",\\\"$3f\\\",1]\\n48:[]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":\\\"$1\\\",\\\"b\\\":\\\"development\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"robots.txt\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$L4\\\",\\\"layout\\\",{\\\"type\\\":\\\"layout\\\",\\\"pagePath\\\":\\\"layout.tsx\\\",\\\"children\\\":[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,\\\"$7\\\"]},null,\\\"$5\\\",1]},null,\\\"$3\\\",0],{\\\"children\\\":[\\\"/_not-found\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L14\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$1a\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\"]},null,\\\"$19\\\",1]]},null,\\\"$18\\\",0],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"$L4\\\",\\\"c-page\\\",{\\\"type\\\":\\\"page\\\",\\\"pagePath\\\":\\\"__next_builtin__not-found.js\\\",\\\"children\\\":\\\"$1d\\\"},null,\\\"$1c\\\",1],null,[\\\"$\\\",\\\"$L2a\\\",null,{\\\"children\\\":[\\\"$L2b\\\",\\\"$2e\\\"]},null,\\\"$29\\\",1]]},null,\\\"$1b\\\",0],{},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$6\\\",\\\"h\\\",{\\\"children\\\":[\\\"$34\\\",\\\"$37\\\",\\\"$3d\\\"]},null,\\\"$33\\\",0],false]],\\\"m\\\":\\\"$W48\\\",\\\"G\\\":[\\\"$49\\\",[\\\"$\\\",\\\"$L4\\\",\\\"ge-svn\\\",{\\\"type\\\":\\\"global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\",\\\"children\\\":[]},null,\\\"$4a\\\",0]],\\\"s\\\":false,\\\"S\\\":false}\\n\"])</script><script>self.__next_f.push([1,\"3b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"},\\\"$2c\\\",\\\"$4b\\\",0],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"},\\\"$2c\\\",\\\"$4c\\\",0]]\\n2b:null\\n\"])</script><script>self.__next_f.push([1,\"50:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/lib/metadata/generate/icon-mark.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"IconMark\\\"]\\n4d:[]\\n4e:[[\\\"Array.map\\\",\\\"\\\",0,0,0,0,false]]\\n4f:[]\\n32:{\\\"metadata\\\":[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"manifest\\\",\\\"href\\\":\\\"/manifest.json\\\",\\\"crossOrigin\\\":\\\"$undefined\\\"},\\\"$2f\\\",\\\"$4d\\\",0],[\\\"$\\\",\\\"link\\\",\\\"1\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico\\\",\\\"type\\\":\\\"image/x-icon\\\",\\\"sizes\\\":\\\"16x16\\\"},\\\"$2f\\\",\\\"$4e\\\",0],[\\\"$\\\",\\\"$L50\\\",\\\"2\\\",{},\\\"$2f\\\",\\\"$4f\\\",0]],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n46:\\\"$32:metadata\\\"\\n\"])</script><link rel=\"manifest\" href=\"/manifest.json\"/><link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" sizes=\"16x16\"/><script >document.querySelectorAll('body link[rel=\"icon\"], body link[rel=\"apple-touch-icon\"]').forEach(el => document.head.appendChild(el))</script><div hidden id=\"S:1\"></div><script>$RB=[];$RV=function(b){$RT=performance.now();for(var a=0;a<b.length;a+=2){var c=b[a],e=b[a+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&g._reactRetry()}}b.length=0};
+ $RC=function(b,a){if(a=document.getElementById(a))(b=document.getElementById(b))?(b.previousSibling.data=\"$~\",$RB.push(b,a),2===$RB.length&&(b=\"number\"!==typeof $RT?0:$RT,a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:b+300-a))):a.parentNode.removeChild(a)};$RC(\"B:1\",\"S:1\")</script><div hidden id=\"S:0\"></div><script>$RC(\"B:0\",\"S:0\")</script></body></html>",
+   "sitemap": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/webpack.js?v=1753706351904\"/><script src=\"/_next/static/chunks/main-app.js?v=1753706351904\" async=\"\"></script><script src=\"/_next/static/chunks/app-pages-internals.js\" async=\"\"></script><meta name=\"robots\" content=\"noindex\"/><title>404: This page could not be found.</title><script src=\"/_next/static/chunks/polyfills.js\" noModule=\"\"></script></head><body><div hidden=\"\"><!--$?--><template id=\"B:0\"></template><!--/$--></div><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px\">404</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:49px;margin:0\">This page could not be found.</h2></div></div></div><!--$?--><template id=\"B:1\"></template><!--/$--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src=\"/_next/static/chunks/webpack.js?v=1753706351904\" id=\"_R_\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"4:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"SegmentViewNode\\\"]\\n6:\\\"$Sreact.fragment\\\"\\n14:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n16:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n2a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"OutletBoundary\\\"]\\n31:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/async-metadata.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"AsyncMetadataOutlet\\\"]\\n3a:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"ViewportBoundary\\\"]\\n40:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e69053\"])</script><script>self.__next_f.push([1,\"1ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/metadata/metadata-boundary.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"MetadataBoundary\\\"]\\n45:\\\"$Sreact.suspense\\\"\\n49:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/builtin/global-error.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\n:N1753706351907.4268\\n2:{\\\"name\\\":\\\"Preloads\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"preloadCallbacks\\\":[]}}\\n3:[]\\n5:[]\\n9:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/layout-router.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nc:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/client/components/render-from-template-context.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"\\\"]\\nd:{}\\ne:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\nb:{\\\"children\\\":[\\\"$\\\",\\\"$Lc\\\",null,\\\"$d\\\",null,\\\"$e\\\",1]}\\nf:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\na:{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$6\\\",null,\\\"$b\\\",null,\\\"$f\\\",0],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":\\\"$Y\\\"}\\n10:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n8:{\\\"name\\\":\\\"RootLayout\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"children\\\":[\\\"$\\\",\\\"$L9\\\",null,\\\"$a\\\",null,\\\"$10\\\",1],\\\"params\\\":\\\"$Y\\\"}}\\n11:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",9,87,8,1,false]]\\n12:[[\\\"RootLayout\\\",\\\"webpack-internal:///(rsc)/./app/layout.tsx\\\",11,94,8,1,false]]\\n13:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0\"])</script><script>self.__next_f.push([1,\",true]]\\n15:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n17:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n18:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n19:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1a:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1b:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1c:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n1e:{\\\"name\\\":\\\"NotFound\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"params\\\":\\\"$@1f\\\",\\\"searchParams\\\":\\\"$@20\\\"}}\\n21:{\\\"name\\\":\\\"HTTPAccessErrorFallback\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$1e\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"status\\\":404,\\\"message\\\":\\\"This page could not be found.\\\"}}\\n22:[]\\n23:[]\\n24:[]\\n25:[]\\n26:[]\\n27:[]\\n28:[]\\n29:[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]]\\n2d:\\\"$E(async function getViewportReady() {\\\\n        await viewport();\\\\n        return undefined;\\\\n    })\\\"\\n2c:{\\\"name\\\":\\\"__next_outlet_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{\\\"ready\\\":\\\"$2d\\\"}}\\n2f:{\\\"name\\\":\\\"StreamingMetadataOutletImpl\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true],[\\\"Function.all\\\",\\\"\\\",0,0,0,0,true]],\\\"props\\\":{}}\\n30:[]\\n33:[]\\n35:{\\\"name\\\":\\\"NonIndex\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{\\\"pagePath\\\":\\\"/_not-found\\\",\\\"statusCode\\\":404,\\\"isPossibleServerAction\\\":false}}\\n36:[]\\n38:{\\\"name\\\":\\\"ViewportTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n39:[]\\n3c:{\\\"name\\\":\\\"__next_viewport_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$38\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3e:{\\\"name\\\":\\\"MetadataTree\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n3f:[]\\n42:{\\\"name\\\":\\\"__next_metadata_boundary__\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$3e\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n43:[]\\n44:[]\\n47:{\\\"name\\\":\\\"MetadataResolver\\\",\\\"key\\\":null,\\\"env\\\":\\\"Server\\\",\\\"owner\\\":\\\"$42\\\",\\\"stack\\\":[],\\\"props\\\":{}}\\n4a:[]\\n1f:\\n20:\\n4b:[]\\n4c:[]\\n1:D\\\"$2\\\"\\n1:null\\n7:D\\\"$8\\\"\\n7:[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L14\\\",null,{\\\"pa\"])</script><script>self.__next_f.push([1,\"rallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$15\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",[\\\"$\\\",\\\"$L4\\\",null,{\\\"type\\\":\\\"boundary:global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\"},null,\\\"$17\\\",1]]},null,\\\"$13\\\",1]},\\\"$8\\\",\\\"$12\\\",1]},\\\"$8\\\",\\\"$11\\\",1]\\n1d:D\\\"$1e\\\"\\n1d:D\\\"$21\\\"\\n\"])</script><script>self.__next_f.push([1,\"1d:[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"},\\\"$21\\\",\\\"$22\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}},\\\"$21\\\",\\\"$25\\\",1],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404},\\\"$21\\\",\\\"$26\\\",1],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"},\\\"$21\\\",\\\"$28\\\",1]},\\\"$21\\\",\\\"$27\\\",1]]},\\\"$21\\\",\\\"$24\\\",1]},\\\"$21\\\",\\\"$23\\\",1]]\\n\"])</script><script>self.__next_f.push([1,\"2b:D\\\"$2c\\\"\\n2e:D\\\"$2f\\\"\\n2e:[\\\"$\\\",\\\"$L31\\\",null,{\\\"promise\\\":\\\"$@32\\\"},\\\"$2f\\\",\\\"$30\\\",1]\\n34:D\\\"$35\\\"\\n34:[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"robots\\\",\\\"content\\\":\\\"noindex\\\"},null,\\\"$36\\\",1]\\n37:D\\\"$38\\\"\\n3b:D\\\"$3c\\\"\\n37:[[\\\"$\\\",\\\"$L3a\\\",null,{\\\"children\\\":\\\"$L3b\\\"},\\\"$38\\\",\\\"$39\\\",1],null]\\n3d:D\\\"$3e\\\"\\n41:D\\\"$42\\\"\\n46:D\\\"$47\\\"\\n41:[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$45\\\",null,{\\\"fallback\\\":null,\\\"children\\\":\\\"$L46\\\"},\\\"$42\\\",\\\"$44\\\",1]},\\\"$42\\\",\\\"$43\\\",1]\\n3d:[\\\"$\\\",\\\"$L40\\\",null,{\\\"children\\\":\\\"$41\\\"},\\\"$3e\\\",\\\"$3f\\\",1]\\n48:[]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":\\\"$1\\\",\\\"b\\\":\\\"development\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"sitemap.xml\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"/_not-found\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$L4\\\",\\\"layout\\\",{\\\"type\\\":\\\"layout\\\",\\\"pagePath\\\":\\\"layout.tsx\\\",\\\"children\\\":[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,\\\"$7\\\"]},null,\\\"$5\\\",1]},null,\\\"$3\\\",0],{\\\"children\\\":[\\\"/_not-found\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L14\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L16\\\",null,{},null,\\\"$1a\\\",1],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\",\\\"segmentViewBoundaries\\\":[\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\",\\\"$undefined\\\"]},null,\\\"$19\\\",1]]},null,\\\"$18\\\",0],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$6\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"$L4\\\",\\\"c-page\\\",{\\\"type\\\":\\\"page\\\",\\\"pagePath\\\":\\\"__next_builtin__not-found.js\\\",\\\"children\\\":\\\"$1d\\\"},null,\\\"$1c\\\",1],null,[\\\"$\\\",\\\"$L2a\\\",null,{\\\"children\\\":[\\\"$L2b\\\",\\\"$2e\\\"]},null,\\\"$29\\\",1]]},null,\\\"$1b\\\",0],{},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$6\\\",\\\"h\\\",{\\\"children\\\":[\\\"$34\\\",\\\"$37\\\",\\\"$3d\\\"]},null,\\\"$33\\\",0],false]],\\\"m\\\":\\\"$W48\\\",\\\"G\\\":[\\\"$49\\\",[\\\"$\\\",\\\"$L4\\\",\\\"ge-svn\\\",{\\\"type\\\":\\\"global-error\\\",\\\"pagePath\\\":\\\"__next_builtin__global-error.js\\\",\\\"children\\\":[]},null,\\\"$4a\\\",0]],\\\"s\\\":false,\\\"S\\\":false}\\n\"])</script><script>self.__next_f.push([1,\"3b:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"},\\\"$2c\\\",\\\"$4b\\\",0],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"},\\\"$2c\\\",\\\"$4c\\\",0]]\\n2b:null\\n\"])</script><script>self.__next_f.push([1,\"50:I[\\\"(app-pages-browser)/./node_modules/.pnpm/next@file+..+next-repo-7c41d826612d266dad8053589a36e31e85ede07130b289dd1a55582e690531ea+packa_5oqxeqd2zwcdkaz6jhktdnfbji/node_modules/next/dist/lib/metadata/generate/icon-mark.js\\\",[\\\"app-pages-internals\\\",\\\"static/chunks/app-pages-internals.js\\\"],\\\"IconMark\\\"]\\n4d:[]\\n4e:[[\\\"Array.map\\\",\\\"\\\",0,0,0,0,false]]\\n4f:[]\\n32:{\\\"metadata\\\":[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"manifest\\\",\\\"href\\\":\\\"/manifest.json\\\",\\\"crossOrigin\\\":\\\"$undefined\\\"},\\\"$2f\\\",\\\"$4d\\\",0],[\\\"$\\\",\\\"link\\\",\\\"1\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico\\\",\\\"type\\\":\\\"image/x-icon\\\",\\\"sizes\\\":\\\"16x16\\\"},\\\"$2f\\\",\\\"$4e\\\",0],[\\\"$\\\",\\\"$L50\\\",\\\"2\\\",{},\\\"$2f\\\",\\\"$4f\\\",0]],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n46:\\\"$32:metadata\\\"\\n\"])</script><link rel=\"manifest\" href=\"/manifest.json\"/><link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" sizes=\"16x16\"/><script >document.querySelectorAll('body link[rel=\"icon\"], body link[rel=\"apple-touch-icon\"]').forEach(el => document.head.appendChild(el))</script><div hidden id=\"S:1\"></div><script>$RB=[];$RV=function(b){$RT=performance.now();for(var a=0;a<b.length;a+=2){var c=b[a],e=b[a+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if(\"/$\"===d||\"/&\"===d)if(0===h)break;else h--;else\"$\"!==d&&\"$?\"!==d&&\"$~\"!==d&&\"$!\"!==d&&\"&\"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data=\"$\";g._reactRetry&&g._reactRetry()}}b.length=0};
+ $RC=function(b,a){if(a=document.getElementById(a))(b=document.getElementById(b))?(b.previousSibling.data=\"$~\",$RB.push(b,a),2===$RB.length&&(b=\"number\"!==typeof $RT?0:$RT,a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:b+300-a))):a.parentNode.removeChild(a)};$RC(\"B:1\",\"S:1\")</script><div hidden id=\"S:0\"></div><script>$RC(\"B:0\",\"S:0\")</script></body></html>",
  }

  86 |       robots: await robotsRes.text(),
  87 |       sitemap: await sitemapRes.text(),
> 88 |     }).toEqual({
     |        ^
  89 |       favicon: 0, // Buffer comparison returns 0 for equal
  90 |       manifest: actualManifest,
  91 |       robots: actualRobots,

  at Object.toEqual (e2e/app-dir/metadata-files-static-output/metadata-files-static-output-root-route.test.ts:88:8)

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

pnpm test-dev test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-parallel-route.test.ts

  • metadata-files-static-output-parallel-route > should serve static files when requested to its route for parallel slot page
Expand output

● metadata-files-static-output-parallel-route › should serve static files when requested to its route for parallel slot page

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

- Expected  - 4
+ Received  + 4

  Object {
-   "appleIcon": 0,
-   "icon": 0,
-   "opengraphImage": 0,
-   "twitterImage": 0,
+   "appleIcon": 1,
+   "icon": 1,
+   "opengraphImage": 1,
+   "twitterImage": 1,
  }

  140 |       ),
  141 |       // sitemap: await sitemapRes.text(),
> 142 |     }).toEqual({
      |        ^
  143 |       // Buffer comparison returns 0 for equal
  144 |       appleIcon: 0,
  145 |       icon: 0,

  at Object.toEqual (e2e/app-dir/metadata-files-static-output/metadata-files-static-output-parallel-route.test.ts:142:8)

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

pnpm test-dev test/e2e/app-dir/no-duplicate-headers-next-config/no-duplicate-headers-next-config.test.ts

  • no-duplicate-headers-next-config > should prioritise headers in next config for static assets
Expand output

● no-duplicate-headers-next-config › should prioritise headers in next config for static assets

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

Expected: 200
Received: 404

   8 |   it('should prioritise headers in next config for static assets', async () => {
   9 |     const res = await next.fetch('favicon.ico')
> 10 |     expect(res.status).toBe(200)
     |                        ^
  11 |     expect(res.headers.get('cache-control')).toBe('max-age=1234')
  12 |   })
  13 | })

  at Object.toBe (e2e/app-dir/no-duplicate-headers-next-config/no-duplicate-headers-next-config.test.ts:10:24)

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

pnpm test-dev test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-intercepting-route.test.ts

  • metadata-files-static-output-intercepting-route > should have correct link tags for intercepting page
Expand output

● metadata-files-static-output-intercepting-route › should have correct link tags for intercepting page

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `metadata-files-static-output-intercepting-route should have correct link tags for intercepting page 1`

- Snapshot  - 0
+ Received  + 5

@@ -4,10 +4,15 @@
        "href": "/favicon.ico",
        "rel": "icon",
        "type": "image/x-icon",
      },
      {
+       "href": "/intercept-me",
+       "rel": "expect",
+       "type": "",
+     },
+     {
        "href": "/intercepting/(..)intercept-me/apple-icon.png",
        "rel": "apple-touch-icon",
        "type": "image/png",
      },
      {

  16 |     )
  17 |
> 18 |     expect(await getMetadataHeadTags(browser)).toMatchInlineSnapshot(`
     |                                                ^
  19 |      {
  20 |        "links": [
  21 |          {

  at Object.toMatchInlineSnapshot (e2e/app-dir/metadata-files-static-output/metadata-files-static-output-intercepting-route.test.ts:18:48)

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

pnpm test-dev test/e2e/app-dir/metadata-json-manifest/index.test.ts

  • app-dir metadata-json-manifest > should support metadata.json manifest
Expand output

● app-dir metadata-json-manifest › should support metadata.json manifest

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

Expected: 200
Received: 404

  13 |   it('should support metadata.json manifest', async () => {
  14 |     const response = await next.fetch('/manifest.json')
> 15 |     expect(response.status).toBe(200)
     |                             ^
  16 |     const json = await response.json()
  17 |     expect(json).toEqual({
  18 |       name: 'My Next.js Application',

  at Object.toBe (e2e/app-dir/metadata-json-manifest/index.test.ts:15:29)

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

pnpm test-dev-rspack test/development/app-dir/source-mapping/source-mapping.test.ts(rspack)

  • source-mapping > should show an error when client functions are called from server components
Expand output

● source-mapping › should show an error when client functions are called from server components

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `source-mapping should show an error when client functions are called from server components 1`

- Snapshot  - 0
+ Received  + 1

@@ -4,8 +4,9 @@
    "label": "Runtime Error",
    "source": "app/server-client/page.js (5:12) @ Component
  > 5 |   useClient()
      |            ^",
    "stack": [
+     "eval about:/Server/webpack-internal:///(rsc)/app/server-client/client.js (10:20)",
      "Component app/server-client/page.js (5:12)",
    ],
  }

  173 |     const browser = await next.browser('/server-client')
  174 |
> 175 |     await expect(browser).toDisplayRedbox(`
      |                           ^
  176 |      {
  177 |        "description": "Attempted to call useClient() from the server but useClient is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.",
  178 |        "environmentLabel": "${isCacheComponentsEnabled ? 'Prerender' : 'Server'}",

  at Object.toDisplayRedbox (development/app-dir/source-mapping/source-mapping.test.ts:175:27)

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

pnpm test-start-turbo test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-dynamic-route.test.ts (turbopack)

  • metadata-files-static-output-dynamic-route > dynamic catch-all page > should have correct link tags for dynamic catch-all page
  • metadata-files-static-output-dynamic-route > dynamic catch-all page > should serve static files when requested to its route for dynamic catch-all page
  • metadata-files-static-output-dynamic-route > dynamic optional catch-all page > should have correct link tags for dynamic optional catch-all page
  • metadata-files-static-output-dynamic-route > dynamic optional catch-all page > should serve static files when requested to its route for dynamic optional catch-all page
  • metadata-files-static-output-dynamic-route > dynamic page > should have correct link tags for dynamic page
  • metadata-files-static-output-dynamic-route > dynamic page > should serve static files when requested to its route for dynamic page
Expand output

● metadata-files-static-output-dynamic-route › dynamic page › should have correct link tags for dynamic page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-dynamic-route › dynamic page › should serve static files when requested to its route for dynamic page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-dynamic-route › dynamic catch-all page › should have correct link tags for dynamic catch-all page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-dynamic-route › dynamic catch-all page › should serve static files when requested to its route for dynamic catch-all page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-dynamic-route › dynamic optional catch-all page › should have correct link tags for dynamic optional catch-all page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-dynamic-route › dynamic optional catch-all page › should serve static files when requested to its route for dynamic optional catch-all page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

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

pnpm test-start test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-group-route.test.ts

  • metadata-files-static-output-group-route > should have correct link tags for group page
  • metadata-files-static-output-group-route > should serve static files when requested to its route for group page
Expand output

● metadata-files-static-output-group-route › should have correct link tags for group page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

● metadata-files-static-output-group-route › should serve static files when requested to its route for group page

next build failed with code/signal 1

  107 |             if (code || signal)
  108 |               reject(
> 109 |                 new Error(
      |                 ^
  110 |                   `next build failed with code/signal ${code || signal}`
  111 |                 )
  112 |               )

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

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/e2e/app-dir/no-duplicate-headers-middleware/no-duplicate-headers-middleware.test.ts (PPR)

  • no-duplicate-headers-next-config > should prioritise headers in middleware for static assets
Expand output

● no-duplicate-headers-next-config › should prioritise headers in middleware for static assets

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

Expected: 200
Received: 404

   8 |   it('should prioritise headers in middleware for static assets', async () => {
   9 |     const res = await next.fetch('favicon.ico')
> 10 |     expect(res.status).toBe(200)
     |                        ^
  11 |     expect(res.headers.get('cache-control')).toBe('max-age=1234')
  12 |   })
  13 | })

  at Object.toBe (e2e/app-dir/no-duplicate-headers-middleware/no-duplicate-headers-middleware.test.ts:10:24)

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

pnpm test test/integration/app-dir-export/test/trailing-slash-start.test.ts

  • app dir - with output export - trailing slash prod > production mode > should work in prod with trailingSlash 'false'
  • app dir - with output export - trailing slash prod > production mode > should work in prod with trailingSlash 'true'
Expand output

● app dir - with output export - trailing slash prod › production mode › should work in prod with trailingSlash 'false'

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

- Expected  - 2
+ Received  + 2

@@ -1,8 +1,10 @@
  Array [
    "404.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another.html",
    "another.txt",
    "another/first.html",
@@ -11,12 +13,10 @@
    "another/second.txt",
    "api/json",
    "api/txt",
    "client.html",
    "client.txt",
-   "favicon.ico",
    "image-import.html",
    "image-import.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
  256 |         } else {
> 257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
      |                                    ^
  258 |         }
  259 |         const html404 = await fs.readFile(join(exportDir, '404.html'), 'utf8')
  260 |         expect(html404).toContain('<h1>My custom not found page</h1>')

  at toEqual (integration/app-dir-export/test/utils.ts:257:36)
  at integration/app-dir-export/test/trailing-slash-start.test.ts:10:11

● app dir - with output export - trailing slash prod › production mode › should work in prod with trailingSlash 'true'

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/trailing-slash-start.test.ts:10:11

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

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

  • app dir - with output export (next dev / next build) > production mode > should correctly emit exported assets to config.distDir
Expand output

● app dir - with output export (next dev / next build) › production mode › should correctly emit exported assets to config.distDir

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

- Expected  - 2
+ Received  + 2

@@ -1,10 +1,12 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/favicon\.[0-9a-f]+\.ico/,
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_clientMiddlewareManifest.json",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
@@ -14,12 +16,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  81 |         try {
  82 |           await nextBuild(appDir)
> 83 |           expect(await getFiles(outputDir)).toEqual(
     |                                             ^
  84 |             expectedWhenTrailingSlashTrue
  85 |           )
  86 |         } finally {

  at Object.toEqual (integration/app-dir-export/test/config.test.ts:83:45)

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/metadata-files-static-output/metadata-files-static-output-static-route.test.ts (PPR)

  • metadata-files-static-output-static-route > should have correct link tags for static page
Expand output

● metadata-files-static-output-static-route › should have correct link tags for static page

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `metadata-files-static-output-static-route should have correct link tags for static page 1`

- Snapshot  - 0
+ Received  + 5

@@ -9,10 +9,15 @@
        "href": "/manifest.json",
        "rel": "manifest",
        "type": "",
      },
      {
+       "href": "/static",
+       "rel": "expect",
+       "type": "",
+     },
+     {
        "href": "/static/apple-icon.png",
        "rel": "apple-touch-icon",
        "type": "image/png",
      },
      {

  10 |     const browser = await next.browser('/static')
  11 |
> 12 |     expect(await getMetadataHeadTags(browser)).toMatchInlineSnapshot(`
     |                                                ^
  13 |      {
  14 |        "links": [
  15 |          {

  at Object.toMatchInlineSnapshot (e2e/app-dir/metadata-files-static-output/metadata-files-static-output-static-route.test.ts:12:48)

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

pnpm test-dev-rspack test/e2e/app-dir/cache-components/cache-components.console.test.ts(rspack)

  • cache-components > dims console calls during prospective rendering
Expand output

● cache-components › dims console calls during prospective rendering

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `cache-components dims console calls during prospective rendering 1`

- Snapshot  - 0
+ Received  + 6

@@ -35,5 +35,11 @@
      |                 ^
    6 |   console.assert(
    7 |     false,
    8 |     '/console: This is an assert message with a %s',
  Assertion failed: /console: This is an assert message with a template
+ getItem { itemPath: '/_next/static/chunks/webpack.js' }
+ getItem { itemPath: '/_next/static/chunks/main-app.js' }
+ getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
+ { curItemPath: '/chunks/webpack.js' }
+ { curItemPath: '/chunks/main-app.js' }
+ { curItemPath: '/chunks/app-pages-internals.js' }

  29 |       )[1]
  30 |
> 31 |       expect(cliOutputFromPage).toMatchInlineSnapshot(`
     |                                 ^
  32 |        "/console: template(one: one, two: two)
  33 |        /console: This is a console page
  34 |        /console: not a template { foo: 'just-some-object' }

  at Object.toMatchInlineSnapshot (e2e/app-dir/cache-components/cache-components.console.test.ts:31:33)

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

pnpm test test/integration/app-dir-export/test/dynamicpage-prod.test.ts

  • app dir - with output export - dynamic api route prod > production mode > should work in prod with dynamicPage undefined
  • app dir - with output export - dynamic api route prod > production mode > should work in prod with dynamicPage 'error'
  • app dir - with output export - dynamic api route prod > production mode > should work in prod with dynamicPage 'force-static'
Expand output

● app dir - with output export - dynamic api route prod › production mode › should work in prod with dynamicPage undefined

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/dynamicpage-prod.test.ts:19:11

● app dir - with output export - dynamic api route prod › production mode › should work in prod with dynamicPage 'error'

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/dynamicpage-prod.test.ts:19:11

● app dir - with output export - dynamic api route prod › production mode › should work in prod with dynamicPage 'force-static'

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/dynamicpage-prod.test.ts:19:11

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

pnpm test-start-turbo test/e2e/app-dir/metadata-dynamic-routes/index.test.ts (turbopack)

  • app dir - metadata dynamic routes > social image routes > should support params as argument in dynamic routes
Expand output

● app dir - metadata dynamic routes › social image routes › should support params as argument in dynamic routes

TypeError: unsupported file type: undefined (file: undefined)

  317 |       const bufferSmall = await (await next.fetch(smallOgUrl.pathname)).buffer()
  318 |
> 319 |       const sizeBig = imageSize(bufferBig)
      |                                ^
  320 |       const sizeSmall = imageSize(bufferSmall)
  321 |       expect([sizeBig.width, sizeBig.height]).toEqual([1200, 630])
  322 |       expect([sizeSmall.width, sizeSmall.height]).toEqual([600, 315])

  at lookup (../node_modules/.pnpm/[email protected]/node_modules/image-size/dist/index.js:42:11)
  at imageSize (../node_modules/.pnpm/[email protected]/node_modules/image-size/dist/index.js:98:16)
  at Object.<anonymous> (e2e/app-dir/metadata-dynamic-routes/index.test.ts:319:32)

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

__NEXT_EXPERIMENTAL_PPR=true pnpm test-start test/e2e/app-dir/metadata/metadata.test.ts (PPR)

  • app dir - metadata > static optimization > should build static files into static route
  • app dir - metadata > static routes > should have /favicon.ico as route
  • app dir - metadata > static routes > should have icons as route
  • app dir - metadata > static routes > should support root dir robots.txt
  • app dir - metadata > static routes > should build favicon.ico as a custom route
Expand output

● app dir - metadata › static routes › should have /favicon.ico as route

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

Expected: "public, max-age=0, must-revalidate"
Received: "public, max-age=31536000, immutable"

  676 |       expect(res.status).toBe(200)
  677 |       expect(res.headers.get('content-type')).toBe('image/x-icon')
> 678 |       expect(res.headers.get('cache-control')).toBe(
      |                                                ^
  679 |         'public, max-age=0, must-revalidate'
  680 |       )
  681 |     })

  at Object.toBe (e2e/app-dir/metadata/metadata.test.ts:678:48)

● app dir - metadata › static routes › should have icons as route

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

Expected: "public, immutable, no-transform, max-age=31536000"
Received: "public, max-age=31536000, immutable"

  689 |       expect(resAppleIcon.status).toBe(200)
  690 |       expect(resAppleIcon.headers.get('content-type')).toBe('image/png')
> 691 |       expect(resAppleIcon.headers.get('cache-control')).toBe(
      |                                                         ^
  692 |         isNextDev
  693 |           ? 'no-cache, no-store'
  694 |           : 'public, immutable, no-transform, max-age=31536000'

  at Object.toBe (e2e/app-dir/metadata/metadata.test.ts:691:57)

● app dir - metadata › static routes › should support root dir robots.txt

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

Expected: "text/plain"
Received: "text/plain; charset=UTF-8"

  705 |     it('should support root dir robots.txt', async () => {
  706 |       const res = await next.fetch('/robots.txt')
> 707 |       expect(res.headers.get('content-type')).toBe('text/plain')
      |                                               ^
  708 |       expect(await res.text()).toContain('User-Agent: *\nDisallow:')
  709 |       const invalidRobotsResponse = await next.fetch('/title/robots.txt')
  710 |       expect(invalidRobotsResponse.status).toBe(404)

  at Object.toBe (e2e/app-dir/metadata/metadata.test.ts:707:47)

● app dir - metadata › static routes › should build favicon.ico as a custom route

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

Expected: "app/robots.txt/route.js"
Received: undefined

  743 |           await next.readFile('.next/server/app-paths-manifest.json')
  744 |         )
> 745 |         expect(appPathsManifest['/robots.txt/route']).toBe(
      |                                                       ^
  746 |           'app/robots.txt/route.js'
  747 |         )
  748 |         expect(appPathsManifest['/sitemap.xml/route']).toBe(

  at Object.toBe (e2e/app-dir/metadata/metadata.test.ts:745:55)

● app dir - metadata › static optimization › should build static files into static route

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

Expected: true
Received: false

  760 |             '.next/server/app/opengraph/static/opengraph-image.png.meta'
  761 |           )
> 762 |         ).toBe(true)
      |           ^
  763 |         expect(
  764 |           await next.hasFile(
  765 |             '.next/server/app/opengraph/static/opengraph-image.png.body'

  at Object.toBe (e2e/app-dir/metadata/metadata.test.ts:762:11)

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

pnpm test-start test/production/app-dir/metadata-img-too-large/twitter-image/index.test.ts

  • app-dir - metadata-img-too-large twitter-image > should throw when twitter-image file size exceeds 5MB
Expand output

● app-dir - metadata-img-too-large twitter-image › should throw when twitter-image file size exceeds 5MB

expect(received).toMatch(expected)

Expected pattern: /Error: File size for Twitter image ".*\/app\/twitter-image\.png" exceeds 5MB/
Received string:  "   ▲ Next.js 15.4.2-canary.18
   - Experiments (use with caution):
     ✓ ppr (enabled by `__NEXT_EXPERIMENTAL_CACHE_COMPONENTS`)
     ✓ cacheComponents (enabled by `__NEXT_EXPERIMENTAL_CACHE_COMPONENTS`)
     ✓ clientSegmentCache (enabled by `__NEXT_EXPERIMENTAL_PPR`)
     ✓ enablePrerenderSourceMaps (enabled by `experimental.cacheComponents`)·
{
  appDir: '/tmp/next-install-489a0ef1dd66898f2065d8306237c460eb0e039d8e5776ce7aca2155fb1208a4/app',
  pagesType: 'app',
  pagePaths: [ '/page.tsx', '/twitter-image.png' ],
  distDir: '/tmp/next-install-489a0ef1dd66898f2065d8306237c460eb0e039d8e5776ce7aca2155fb1208a4/.next',
  pageExtensions: [ 'tsx', 'ts', 'jsx', 'js' ]
}
   Creating an optimized production build ...
 ✓ Compiled successfully in 2000ms
   Linting and checking validity of types ...·
   We detected TypeScript in your project and created a tsconfig.json file for you.
   Collecting page data ...
   Generating static pages (0/4) ...
 ⚠ metadataBase property in metadata export is not set for resolving social open graph or twitter images, using \"http://localhost:0\". See https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadatabase
   Generating static pages (1/4)··
   Generating static pages (2/4)··
   Generating static pages (3/4)··
 ✓ Generating static pages (4/4)
   Finalizing page optimization ...
   Collecting build traces ...·
Route (app)                                 Size  First Load JS
┌ ○ /                                      124 B         124 kB
└ ○ /_not-found                            995 B         124 kB
+ First Load JS shared by all             123 kB
  ├ chunks/677-80f3fd0915fffca2.js       55.7 kB
  ├ chunks/fd2a45d1-ef0417b1df0a988f.js    66 kB
  └ other shared chunks (total)          1.81 kB··
○  (Static)  prerendered as static content·
"

  19 |       : /Error: File size for Twitter image ".*\/app\/twitter-image\.png" exceeds 5MB/
  20 |
> 21 |     expect(next.cliOutput).toMatch(regex)
     |                            ^
  22 |   })
  23 | })
  24 |

  at Object.toMatch (production/app-dir/metadata-img-too-large/twitter-image/index.test.ts:21:28)

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

pnpm test-start-turbo test/e2e/conflicting-app-page-error/index.test.ts (turbopack)

  • Conflict between app file and pages file > should print error for conflicting app/page
Expand output

● Conflict between app file and pages file › should print error for conflicting app/page

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

Expected substring: not "/non-conflict"
Received string:        "   ▲ Next.js 15.4.2-canary.18 (Turbopack)

{
  appDir: '/tmp/next-install-314cd887799f6e032a4e078d0e968d6bb26495d10fc41e76f0ea765facd85691/app',
  pagesType: 'app',
  pagePaths: [ '/another/page.js', '/non-conflict/page.js', '/page.js' ],
  distDir: '/tmp/next-install-314cd887799f6e032a4e078d0e968d6bb26495d10fc41e76f0ea765facd85691/.next',
  pageExtensions: [ 'tsx', 'ts', 'jsx', 'js' ]
}
   Creating an optimized production build ...
 ✓ Finished writing to disk in 7ms

> Build error occurred
[Error: Turbopack build failed with 2 errors:
./
App Router and Pages Router both match path: /
Next.js does not support having both App Router and Pages Router routes matching the same path. Please remove one of the conflicting routes.


./
App Router and Pages Router both match path: /another
Next.js does not support having both App Router and Pages Router routes matching the same path. Please remove one of the conflicting routes.

]
"

  44 |
  45 |       expect(cliOutput).not.toContain('/non-conflict-pages')
> 46 |       expect(cliOutput).not.toContain('/non-conflict')
     |                             ^
  47 |     })
  48 |   }
  49 |

  at Object.toContain (e2e/conflicting-app-page-error/index.test.ts:46:29)

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

pnpm test-start test/production/app-dir/metadata-img-too-large/opengraph-image/index.test.ts

  • app-dir - metadata-img-too-large opengraph-image > should throw when opengraph-image file size exceeds 8MB
Expand output

● app-dir - metadata-img-too-large opengraph-image › should throw when opengraph-image file size exceeds 8MB

expect(received).toMatch(expected)

Expected pattern: /Error: File size for Open Graph image ".*\/app\/opengraph-image\.png" exceeds 8MB/
Received string:  "   ▲ Next.js 15.4.2-canary.18
   - Experiments (use with caution):
     ✓ ppr (enabled by `__NEXT_EXPERIMENTAL_CACHE_COMPONENTS`)
     ✓ cacheComponents (enabled by `__NEXT_EXPERIMENTAL_CACHE_COMPONENTS`)
     ✓ clientSegmentCache (enabled by `__NEXT_EXPERIMENTAL_PPR`)
     ✓ enablePrerenderSourceMaps (enabled by `experimental.cacheComponents`)·
{
  appDir: '/tmp/next-install-c5c0dbe4f05eb62819ea084289699c65019509e27661aa0d4794ff64afea321f/app',
  pagesType: 'app',
  pagePaths: [ '/opengraph-image.png', '/page.tsx' ],
  distDir: '/tmp/next-install-c5c0dbe4f05eb62819ea084289699c65019509e27661aa0d4794ff64afea321f/.next',
  pageExtensions: [ 'tsx', 'ts', 'jsx', 'js' ]
}
   Creating an optimized production build ...
 ✓ Compiled successfully in 2000ms
   Linting and checking validity of types ...·
   We detected TypeScript in your project and created a tsconfig.json file for you.
   Collecting page data ...
   Generating static pages (0/4) ...
 ⚠ metadataBase property in metadata export is not set for resolving social open graph or twitter images, using \"http://localhost:0\". See https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadatabase
   Generating static pages (1/4)··
   Generating static pages (2/4)··
   Generating static pages (3/4)··
 ✓ Generating static pages (4/4)
   Finalizing page optimization ...
   Collecting build traces ...·
Route (app)                                 Size  First Load JS
┌ ○ /                                      125 B         123 kB
└ ○ /_not-found                            995 B         124 kB
+ First Load JS shared by all             123 kB
  ├ chunks/481-2b6981e40f191250.js       55.1 kB
  ├ chunks/e48dbc6d-f8e28bc18a756d90.js    66 kB
  └ other shared chunks (total)          1.81 kB··
○  (Static)  prerendered as static content·
"

  19 |       : /Error: File size for Open Graph image ".*\/app\/opengraph-image\.png" exceeds 8MB/
  20 |
> 21 |     expect(next.cliOutput).toMatch(regex)
     |                            ^
  22 |   })
  23 | })
  24 |

  at Object.toMatch (production/app-dir/metadata-img-too-large/opengraph-image/index.test.ts:21:28)

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

pnpm test test/integration/app-dir-export/test/dynamicapiroute-prod.test.ts

  • app dir - with output export - dynamic api route prod > production mode > should work in prod with dynamicApiRoute 'error'
  • app dir - with output export - dynamic api route prod > production mode > should work in prod with dynamicApiRoute 'force-static'
Expand output

● app dir - with output export - dynamic api route prod › production mode › should work in prod with dynamicApiRoute 'error'

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/dynamicapiroute-prod.test.ts:23:11

● app dir - with output export - dynamic api route prod › production mode › should work in prod with dynamicApiRoute 'force-static'

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

- Expected  - 2
+ Received  + 2

@@ -1,9 +1,11 @@
  Array [
    "404.html",
    "404/index.html",
    StringMatching /_next\/static\/media\/test\.[0-9a-f]+\.png/,
+   "_next/static/metadata/favicon.ico",
+   "_next/static/metadata/robots.txt",
    "_next/static/test-build-id/_buildManifest.js",
    "_next/static/test-build-id/_ssgManifest.js",
    "another/first/index.html",
    "another/first/index.txt",
    "another/index.html",
@@ -12,12 +14,10 @@
    "another/second/index.txt",
    "api/json",
    "api/txt",
    "client/index.html",
    "client/index.txt",
-   "favicon.ico",
    "image-import/index.html",
    "image-import/index.txt",
    "index.html",
    "index.txt",
-   "robots.txt",
  ]

  253 |       if (!isDev) {
  254 |         if (trailingSlash) {
> 255 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashTrue)
      |                                    ^
  256 |         } else {
  257 |           expect(await getFiles()).toEqual(expectedWhenTrailingSlashFalse)
  258 |         }

  at toEqual (integration/app-dir-export/test/utils.ts:255:36)
  at integration/app-dir-export/test/dynamicapiroute-prod.test.ts:23:11

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

pnpm test-start test/e2e/app-dir/dynamic-data/dynamic-data.test.ts

  • dynamic-data with dynamic = "error" > error when the build when dynamic = "error" and dynamic data is read
Expand output

● dynamic-data with dynamic = "error" › error when the build when dynamic = "error" and dynamic data is read

expect(received).toMatch(expected)

Expected substring: "Error: Route /connection with `dynamic = \"error\"` couldn't be rendered statically because it used `connection`"
Received string:    "   ▲ Next.js 15.4.2-canary.18
   - Experiments (use with caution):
     ⨯ prerenderEarlyExit·
{
  appDir: '/tmp/next-install-fc902d9b3fcb050efdd72a73b64804fd2c92f08f64d582d72df109bcb9800e92/app',
  pagesType: 'app',
  pagePaths: [
    '/connection/page.js',
    '/cookies/page.js',
    '/headers/page.js',
    '/routes/form-data/error/route.js',
    '/routes/next-url/error/route.js',
    '/search/page.js'
  ],
  distDir: '/tmp/next-install-fc902d9b3fcb050efdd72a73b64804fd2c92f08f64d582d72df109bcb9800e92/.next',
  pageExtensions: [ 'tsx', 'ts', 'jsx', 'js' ]
}
   Creating an optimized production build ...
 ✓ Compiled successfully in 5.0s
   Linting and checking validity of types ...
   Collecting page data ...
   Generating static pages (0/9) ...
Error occurred prerendering page \"/routes/form-data/error\". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Route /routes/form-data/error with `dynamic = \"error\"` couldn't be rendered statically because it used `request.formData`.
Error occurred prerendering page \"/routes/next-url/error\". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Route /routes/next-url/error with `dynamic = \"error\"` couldn't be rendered statically because it used `nextUrl.toString`.
Error occurred prerendering page \"/search\". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Route /search with `dynamic = \"error\"` couldn't be rendered statically because it used `await searchParams`, `searchParams.then`, or similar. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering
Error occurred prerendering page \"/cookies\". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Route /cookies with `dynamic = \"error\"` couldn't be rendered statically because it used `cookies`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering
Error occurred prerendering page \"/headers\". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Route /headers with `dynamic = \"error\"` couldn't be rendered statically because it used `headers`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering
   Generating static pages (2/9)···
> Export encountered errors on following paths:
	/connection/page: /connection
	/cookies/page: /cookies
	/headers/page: /headers
	/routes/form-data/error/route: /routes/form-data/error
	/routes/next-url/error/route: /routes/next-url/error
	/search/page: /search
"

  262 |         'Error: Route /cookies with `dynamic = "error"` couldn\'t be rendered statically because it used `cookies`'
  263 |       )
> 264 |       expect(next.cliOutput).toMatch(
      |                              ^
  265 |         'Error: Route /connection with `dynamic = "error"` couldn\'t be rendered statically because it used `connection`'
  266 |       )
  267 |       expect(next.cliOutput).toMatch(

  at Object.toMatch (e2e/app-dir/dynamic-data/dynamic-data.test.ts:264:30)

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

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

  • app-dir - logging > with default logging > should not contain metadata internal segments for dynamic metadata routes
  • app-dir - logging > with fetches default logging > should exclude Middleware invoked and _rsc requests
  • app-dir - logging > with fetches default logging > should not log _rsc query for client navigation RSC request
  • app-dir - logging > with fetches default logging > should not contain metadata internal segments for dynamic metadata routes
  • app-dir - logging > with fetches verbose logging > should exclude Middleware invoked and _rsc requests
  • app-dir - logging > with fetches verbose logging > should not log _rsc query for client navigation RSC request
  • app-dir - logging > with fetches verbose logging > should not contain metadata internal segments for dynamic metadata routes
  • app-dir - logging > with verbose logging for edge runtime > should exclude Middleware invoked and _rsc requests
  • app-dir - logging > with verbose logging for edge runtime > should not log _rsc query for client navigation RSC request
  • app-dir - logging > with verbose logging for edge runtime > should not contain metadata internal segments for dynamic metadata routes
Expand output

● app-dir - logging › with fetches verbose logging › should exclude Middleware invoked and _rsc requests

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/link' }
{ curItemPath: '/link' }
 ✓ Compiled /link in 135ms (608 modules)
 GET /link 200 in 195ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/link/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/link/page.js' }
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
getItem {
  itemPath: '/_next/static/webpack/ae646564b6cc570a.webpack.hot-update.json'
}
{ curItemPath: '/webpack/ae646564b6cc570a.webpack.hot-update.json' }
getItem {
  itemPath: '/_next/static/webpack/webpack.ae646564b6cc570a.hot-update.js'
}
{ curItemPath: '/webpack/webpack.ae646564b6cc570a.hot-update.js' }
 ✓ Compiled /_not-found in 325ms (613 modules)
 GET /foo 404 in 364ms
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
 GET /foo 404 in 48ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
"

  234 |           await browser.waitForElementByCss('h2')
  235 |           const logs = stripAnsi(next.cliOutput.slice(outputIndex))
> 236 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  237 |           expect(logs).not.toContain('?_rsc')
  238 |         })
  239 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:236:28)

● app-dir - logging › with fetches verbose logging › should not log _rsc query for client navigation RSC request

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/' }
{ curItemPath: '/' }
 GET / 200 in 41ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
getItem { itemPath: '/headers' }
{ curItemPath: '/headers' }
 ✓ Compiled /headers in 403ms (620 modules)
getItem {
  itemPath: '/_next/static/webpack/d2c97a48832d7318.webpack.hot-update.json'
}
{ curItemPath: '/webpack/d2c97a48832d7318.webpack.hot-update.json' }
 GET /headers 200 in 505ms
getItem {
  itemPath: '/_next/static/webpack/webpack.d2c97a48832d7318.hot-update.js'
}
{ curItemPath: '/webpack/webpack.d2c97a48832d7318.hot-update.js' }
"

  248 |           expect(logs).toContain('GET /')
  249 |           expect(logs).toContain('GET /headers')
> 250 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  251 |           expect(logs).not.toContain('?_rsc')
  252 |         })
  253 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:250:28)

● app-dir - logging › with fetches verbose logging › should not contain metadata internal segments for dynamic metadata routes

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

Expected substring: "/dynamic/[slug]/icon"
Received string:    "getItem { itemPath: '/dynamic/big/icon' }
getItem { itemPath: '/_next/static/metadata/dynamic/big/icon' }
 GET / 200 in 1102ms
 ✓ Compiled /_not-found in 149ms (591 modules)
 GET /dynamic/big/icon 404 in 278ms
"

  345 |         await retry(() => {
  346 |           const output = stripAnsi(next.cliOutput.slice(logLength))
> 347 |           expect(output).toContain('/dynamic/[slug]/icon')
      |                          ^
  348 |           expect(output).not.toContain('/(group)')
  349 |           expect(output).not.toContain('[__metadata_id__]')
  350 |           expect(output).not.toContain('/route')

  at toContain (e2e/app-dir/logging/fetch-logging.test.ts:347:26)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:345:9)

● app-dir - logging › with fetches default logging › should exclude Middleware invoked and _rsc requests

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/link' }
{ curItemPath: '/link' }
 ✓ Compiled /link in 146ms (608 modules)
 GET /link 200 in 212ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/link/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/link/page.js' }
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
getItem {
  itemPath: '/_next/static/webpack/ae646564b6cc570a.webpack.hot-update.json'
}
{ curItemPath: '/webpack/ae646564b6cc570a.webpack.hot-update.json' }
getItem {
  itemPath: '/_next/static/webpack/webpack.ae646564b6cc570a.hot-update.js'
}
{ curItemPath: '/webpack/webpack.ae646564b6cc570a.hot-update.js' }
 ✓ Compiled /_not-found in 306ms (613 modules)
 GET /foo 404 in 347ms
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
 GET /foo 404 in 67ms
"

  234 |           await browser.waitForElementByCss('h2')
  235 |           const logs = stripAnsi(next.cliOutput.slice(outputIndex))
> 236 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  237 |           expect(logs).not.toContain('?_rsc')
  238 |         })
  239 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:236:28)

● app-dir - logging › with fetches default logging › should not log _rsc query for client navigation RSC request

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/' }
{ curItemPath: '/' }
 GET / 200 in 38ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
getItem { itemPath: '/headers' }
{ curItemPath: '/headers' }
 ✓ Compiled /headers in 404ms (620 modules)
getItem {
  itemPath: '/_next/static/webpack/d2c97a48832d7318.webpack.hot-update.json'
}
{ curItemPath: '/webpack/d2c97a48832d7318.webpack.hot-update.json' }
 GET /headers 200 in 502ms
getItem {
  itemPath: '/_next/static/webpack/webpack.d2c97a48832d7318.hot-update.js'
}
{ curItemPath: '/webpack/webpack.d2c97a48832d7318.hot-update.js' }
"

  248 |           expect(logs).toContain('GET /')
  249 |           expect(logs).toContain('GET /headers')
> 250 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  251 |           expect(logs).not.toContain('?_rsc')
  252 |         })
  253 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:250:28)

● app-dir - logging › with fetches default logging › should not contain metadata internal segments for dynamic metadata routes

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

Expected substring: "/dynamic/[slug]/icon"
Received string:    "getItem { itemPath: '/dynamic/big/icon' }
getItem { itemPath: '/_next/static/metadata/dynamic/big/icon' }
 GET / 200 in 841ms
 ✓ Compiled /_not-found in 95ms (591 modules)
 GET /dynamic/big/icon 404 in 204ms
"

  345 |         await retry(() => {
  346 |           const output = stripAnsi(next.cliOutput.slice(logLength))
> 347 |           expect(output).toContain('/dynamic/[slug]/icon')
      |                          ^
  348 |           expect(output).not.toContain('/(group)')
  349 |           expect(output).not.toContain('[__metadata_id__]')
  350 |           expect(output).not.toContain('/route')

  at toContain (e2e/app-dir/logging/fetch-logging.test.ts:347:26)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:345:9)

● app-dir - logging › with verbose logging for edge runtime › should exclude Middleware invoked and _rsc requests

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/link' }
{ curItemPath: '/link' }
 ✓ Compiled /link in 200ms (881 modules)
 GET /link 200 in 437ms
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app/link/page.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app/link/page.js' }
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
getItem {
  itemPath: '/_next/static/webpack/47f934a9be05c8dd.webpack.hot-update.json'
}
{ curItemPath: '/webpack/47f934a9be05c8dd.webpack.hot-update.json' }
getItem {
  itemPath: '/_next/static/webpack/webpack.47f934a9be05c8dd.hot-update.js'
}
{ curItemPath: '/webpack/webpack.47f934a9be05c8dd.hot-update.js' }
 ○ Compiling /_not-found ...
 ✓ Compiled /_not-found in 669ms (591 modules)
getItem {
  itemPath: '/_next/static/webpack/8b1f4d045fa7c216.webpack.hot-update.json'
}
{ curItemPath: '/webpack/8b1f4d045fa7c216.webpack.hot-update.json' }
 GET /foo 404 in 813ms
getItem { itemPath: '/foo' }
getItem { itemPath: '/foo' }
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
 GET /foo 404 in 133ms
"

  234 |           await browser.waitForElementByCss('h2')
  235 |           const logs = stripAnsi(next.cliOutput.slice(outputIndex))
> 236 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  237 |           expect(logs).not.toContain('?_rsc')
  238 |         })
  239 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:236:28)

● app-dir - logging › with verbose logging for edge runtime › should not log _rsc query for client navigation RSC request

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

Expected substring: not "/_next/static"
Received string:        "getItem { itemPath: '/' }
{ curItemPath: '/' }
 GET / 200 in 272ms
getItem { itemPath: '/_next/static/chunks/webpack.js' }
getItem { itemPath: '/_next/static/chunks/main-app.js' }
getItem { itemPath: '/_next/static/chunks/app-pages-internals.js' }
getItem { itemPath: '/_next/static/chunks/app/page.js' }
{ curItemPath: '/chunks/webpack.js' }
{ curItemPath: '/chunks/main-app.js' }
{ curItemPath: '/chunks/app-pages-internals.js' }
{ curItemPath: '/chunks/app/page.js' }
getItem { itemPath: '/headers' }
{ curItemPath: '/headers' }
 ○ Compiling /headers ...
 ✓ Compiled /headers in 658ms (893 modules)
 GET /headers 200 in 867ms
getItem {
  itemPath: '/_next/static/webpack/f015d4e82a3bde86.webpack.hot-update.json'
}
{ curItemPath: '/webpack/f015d4e82a3bde86.webpack.hot-update.json' }
getItem {
  itemPath: '/_next/static/webpack/app-pages-internals.f015d4e82a3bde86.hot-update.js'
}
getItem {
  itemPath: '/_next/static/webpack/webpack.f015d4e82a3bde86.hot-update.js'
}
{
  curItemPath: '/webpack/app-pages-internals.f015d4e82a3bde86.hot-update.js'
}
{ curItemPath: '/webpack/webpack.f015d4e82a3bde86.hot-update.js' }
"

  248 |           expect(logs).toContain('GET /')
  249 |           expect(logs).toContain('GET /headers')
> 250 |           expect(logs).not.toContain('/_next/static')
      |                            ^
  251 |           expect(logs).not.toContain('?_rsc')
  252 |         })
  253 |

  at Object.toContain (e2e/app-dir/logging/fetch-logging.test.ts:250:28)

● app-dir - logging › with verbose logging for edge runtime › should not contain metadata internal segments for dynamic metadata routes

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

Expected substring: "/dynamic/[slug]/icon"
Received string:    " GET / 200 in 1061ms
getItem { itemPath: '/dynamic/big/icon' }
getItem { itemPath: '/_next/static/metadata/dynamic/big/icon' }
 ○ Compiling /_not-found ...
 ✓ Compiled /_not-found in 645ms (590 modules)
 GET /dynamic/big/icon 404 in 910ms
"

  345 |         await retry(() => {
  346 |           const output = stripAnsi(next.cliOutput.slice(logLength))
> 347 |           expect(output).toContain('/dynamic/[slug]/icon')
      |                          ^
  348 |           expect(output).not.toContain('/(group)')
  349 |           expect(output).not.toContain('[__metadata_id__]')
  350 |           expect(output).not.toContain('/route')

  at toContain (e2e/app-dir/logging/fetch-logging.test.ts:347:26)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:345:9)

● app-dir - logging › with default logging › should not contain metadata internal segments for dynamic metadata routes

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

Expected substring: "/dynamic/[slug]/icon"
Received string:    " GET / 200 in 526ms
getItem { itemPath: '/dynamic/big/icon' }
getItem { itemPath: '/_next/static/metadata/dynamic/big/icon' }
 ✓ Compiled /_not-found in 455ms (591 modules)
 GET /dynamic/big/icon 404 in 664ms
"

  345 |         await retry(() => {
  346 |           const output = stripAnsi(next.cliOutput.slice(logLength))
> 347 |           expect(output).toContain('/dynamic/[slug]/icon')
      |                          ^
  348 |           expect(output).not.toContain('/(group)')
  349 |           expect(output).not.toContain('[__metadata_id__]')
  350 |           expect(output).not.toContain('/route')

  at toContain (e2e/app-dir/logging/fetch-logging.test.ts:347:26)
  at fn (lib/next-test-utils.ts:811:20)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:345:9)

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

@ijjk
Copy link
Member

ijjk commented Jul 24, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
buildDuration 20.4s 21s ⚠️ +659ms
buildDurationCached 16.1s 14.4s N/A
nodeModulesSize 443 MB 443 MB N/A
nextStartRea..uration (ms) 422ms 431ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
194b18f3-HASH.js gzip 54.1 kB 54.1 kB N/A
2192.HASH.js gzip 169 B 169 B
4719-HASH.js gzip 5.3 kB 5.27 kB N/A
6236-HASH.js gzip 44.2 kB 44.6 kB ⚠️ +456 B
framework-HASH.js gzip 57.4 kB 57.4 kB N/A
main-app-HASH.js gzip 253 B 256 B N/A
main-HASH.js gzip 36 kB 36.1 kB ⚠️ +113 B
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 80.3 kB 80.9 kB ⚠️ +569 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files 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 jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 182 B 182 B
amp-HASH.js gzip 501 B 500 B N/A
css-HASH.js gzip 335 B 333 B N/A
dynamic-HASH.js gzip 1.83 kB 1.83 kB N/A
edge-ssr-HASH.js gzip 256 B 255 B N/A
head-HASH.js gzip 350 B 351 B N/A
hooks-HASH.js gzip 382 B 382 B
image-HASH.js gzip 4.68 kB 4.66 kB N/A
index-HASH.js gzip 259 B 259 B
link-HASH.js gzip 2.52 kB 2.52 kB N/A
routerDirect..HASH.js gzip 319 B 316 B N/A
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 316 B 315 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.51 kB 1.51 kB
Client Build Manifests
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
_buildManifest.js gzip 752 B 752 B
Overall change 752 B 752 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
index.html gzip 523 B 524 B N/A
link.html gzip 537 B 539 B N/A
withRouter.html gzip 520 B 521 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
edge-ssr.js gzip 121 kB 120 kB N/A
page.js gzip 222 kB 215 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
middleware-b..fest.js gzip 678 B 674 B N/A
middleware-r..fest.js gzip 155 B 157 B N/A
middleware.js gzip 32.3 kB 32.2 kB N/A
edge-runtime..pack.js gzip 853 B 853 B
Overall change 853 B 853 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
app-page-exp...dev.js gzip 280 kB 279 kB N/A
app-page-exp..prod.js gzip 154 kB 154 kB N/A
app-page-tur...dev.js gzip 280 kB 279 kB N/A
app-page-tur..prod.js gzip 154 kB 154 kB N/A
app-page-tur...dev.js gzip 268 kB 264 kB N/A
app-page-tur..prod.js gzip 148 kB 148 kB N/A
app-page.run...dev.js gzip 268 kB 264 kB N/A
app-page.run..prod.js gzip 148 kB 148 kB N/A
app-route-ex...dev.js gzip 69.1 kB 69 kB N/A
app-route-ex..prod.js gzip 48.6 kB 48.5 kB N/A
app-route-tu...dev.js gzip 69.1 kB 69 kB N/A
app-route-tu..prod.js gzip 48.6 kB 48.5 kB N/A
app-route-tu...dev.js gzip 68.5 kB 68.4 kB N/A
app-route-tu..prod.js gzip 48.2 kB 48.1 kB N/A
app-route.ru...dev.js gzip 68.4 kB 68.4 kB N/A
app-route.ru..prod.js gzip 48.2 kB 48.1 kB N/A
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 42.3 kB 42.2 kB N/A
pages-api-tu..prod.js gzip 32.5 kB 32.4 kB N/A
pages-api.ru...dev.js gzip 42.2 kB 42.1 kB N/A
pages-api.ru..prod.js gzip 32.5 kB 32.4 kB N/A
pages-turbo....dev.js gzip 52.3 kB 52.1 kB N/A
pages-turbo...prod.js gzip 39.9 kB 39.8 kB N/A
pages.runtim...dev.js gzip 52.4 kB 52.3 kB N/A
pages.runtim..prod.js gzip 40 kB 39.9 kB N/A
server.runti..prod.js gzip 59.5 kB 64.1 kB ⚠️ +4.59 kB
Overall change 60.8 kB 65.4 kB ⚠️ +4.59 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js jiwon/07-22-serve_static_metadata_files_as_static_files_not_as_route_files Change
0.pack gzip 2.8 MB 3.91 MB ⚠️ +1.11 MB
index.pack gzip 91.8 kB 90.5 kB N/A
Overall change 2.8 MB 3.91 MB ⚠️ +1.11 MB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js
failed to diff
Diff for css-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 1586: /***/ (
+    /***/ 2628: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/css",
         function () {
-          return __webpack_require__(4362);
+          return __webpack_require__(8707);
         },
       ]);
       if (false) {
@@ -18,14 +18,7 @@
       /***/
     },
 
-    /***/ 4350: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
-
-    /***/ 4362: /***/ (
+    /***/ 8707: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -39,7 +32,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4350);
+        __webpack_require__(9080);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -58,13 +51,20 @@
 
       /***/
     },
+
+    /***/ 9080: /***/ (module) => {
+      // extracted by mini-css-extract-plugin
+      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1586)
+      __webpack_exec__(2628)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,17 +1,117 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 283: /***/ (
+    /***/ 2001: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(5640);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(9553);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+        () =>
+          __webpack_require__
+            .e(/* import() */ 8042)
+            .then(__webpack_require__.bind(__webpack_require__, 8042))
+            .then((mod) => mod.Hello),
+        {
+          loadableGenerated: {
+            webpack: () => [/*require.resolve*/ 8042],
+          },
+        }
+      );
+      const Page = () =>
+        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+          {
+            children: [
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+                children: "testing next/dynamic size",
+              }),
+              /*#__PURE__*/ (0,
+              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+                DynamicHello,
+                {}
+              ),
+            ],
+          }
+        );
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+
+      /***/
+    },
+
+    /***/ 2976: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(2001);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7807: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      "use strict";
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "LoadableContext", {
+        enumerable: true,
+        get: function () {
+          return LoadableContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(148)
+      );
+      const LoadableContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 9553: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(6990);
+      module.exports = __webpack_require__(9986);
 
       /***/
     },
 
-    /***/ 505: /***/ (
+    /***/ 9829: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -53,7 +153,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(148)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(6179);
+      const _loadablecontextsharedruntime = __webpack_require__(7807);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -288,90 +388,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 5703: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(5640);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(283);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_dynamic__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
-        () =>
-          __webpack_require__
-            .e(/* import() */ 2192)
-            .then(__webpack_require__.bind(__webpack_require__, 2192))
-            .then((mod) => mod.Hello),
-        {
-          loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 2192],
-          },
-        }
-      );
-      const Page = () =>
-        /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
-          react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
-          {
-            children: [
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
-                children: "testing next/dynamic size",
-              }),
-              /*#__PURE__*/ (0,
-              react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-                DynamicHello,
-                {}
-              ),
-            ],
-          }
-        );
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
-
-      /***/
-    },
-
-    /***/ 6179: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-      /* __next_internal_client_entry_do_not_use__  cjs */
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "LoadableContext", {
-        enumerable: true,
-        get: function () {
-          return LoadableContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(148)
-      );
-      const LoadableContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
-
-      /***/
-    },
-
-    /***/ 6990: /***/ (module, exports, __webpack_require__) => {
+    /***/ 9986: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -404,7 +421,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
         __webpack_require__(148)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(505)
+        __webpack_require__(9829)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -504,30 +521,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 
       /***/
     },
-
-    /***/ 9254: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(5703);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9254)
+      __webpack_exec__(2976)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9804],
   {
-    /***/ 1664: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(6130);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 6130: /***/ (
+    /***/ 4756: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 5426: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(4756);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1664)
+      __webpack_exec__(5426)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2983],
   {
-    /***/ 2198: /***/ (
+    /***/ 264: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -9,7 +9,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/image",
         function () {
-          return __webpack_require__(3444);
+          return __webpack_require__(3594);
         },
       ]);
       if (false) {
@@ -18,7 +18,190 @@
       /***/
     },
 
-    /***/ 2514: /***/ (
+    /***/ 1206: /***/ (__unused_webpack_module, exports) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "default", {
+        enumerable: true,
+        get: function () {
+          return _default;
+        },
+      });
+      const DEFAULT_Q = 75;
+      function defaultLoader(param) {
+        let { config, src, width, quality } = param;
+        var _config_qualities;
+        if (false) {
+        }
+        const q =
+          quality ||
+          ((_config_qualities = config.qualities) == null
+            ? void 0
+            : _config_qualities.reduce((prev, cur) =>
+                Math.abs(cur - DEFAULT_Q) < Math.abs(prev - DEFAULT_Q)
+                  ? cur
+                  : prev
+              )) ||
+          DEFAULT_Q;
+        return (
+          config.path +
+          "?url=" +
+          encodeURIComponent(src) +
+          "&w=" +
+          width +
+          "&q=" +
+          q +
+          (src.startsWith("/_next/static/media/") && false ? 0 : "")
+        );
+      }
+      // We use this to determine if the import is the default loader
+      // or a custom loader defined by the user in next.config.js
+      defaultLoader.__next_img_default = true;
+      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
+
+      /***/
+    },
+
+    /***/ 1765: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useMergedRef", {
+        enumerable: true,
+        get: function () {
+          return useMergedRef;
+        },
+      });
+      const _react = __webpack_require__(148);
+      function useMergedRef(refA, refB) {
+        const cleanupA = (0, _react.useRef)(null);
+        const cleanupB = (0, _react.useRef)(null);
+        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+        // But this can cause us to leak a cleanup-ref into user code (e.g. via `<Link legacyBehavior>`),
+        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+        // (because it hasn't been updated for React 19)
+        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+        return (0, _react.useCallback)(
+          (current) => {
+            if (current === null) {
+              const cleanupFnA = cleanupA.current;
+              if (cleanupFnA) {
+                cleanupA.current = null;
+                cleanupFnA();
+              }
+              const cleanupFnB = cleanupB.current;
+              if (cleanupFnB) {
+                cleanupB.current = null;
+                cleanupFnB();
+              }
+            } else {
+              if (refA) {
+                cleanupA.current = applyRef(refA, current);
+              }
+              if (refB) {
+                cleanupB.current = applyRef(refB, current);
+              }
+            }
+          },
+          [refA, refB]
+        );
+      }
+      function applyRef(refA, current) {
+        if (typeof refA === "function") {
+          const cleanup = refA(current);
+          if (typeof cleanup === "function") {
+            return cleanup;
+          } else {
+            return () => refA(null);
+          }
+        } else {
+          refA.current = current;
+          return () => {
+            refA.current = null;
+          };
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-merged-ref.js.map
+
+      /***/
+    },
+
+    /***/ 3353: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5526);
+
+      /***/
+    },
+
+    /***/ 3594: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      // ESM COMPAT FLAG
+      __webpack_require__.r(__webpack_exports__);
+
+      // EXPORTS
+      __webpack_require__.d(__webpack_exports__, {
+        __N_SSP: () => /* binding */ __N_SSP,
+        default: () => /* binding */ pages_image,
+      });
+
+      // EXTERNAL MODULE: ./node_modules/.pnpm/[email protected]/node_modules/react/jsx-runtime.js
+      var jsx_runtime = __webpack_require__(5640);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
+      var next_image = __webpack_require__(3353);
+      var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
+      /* harmony default export */ const nextjs = {
+        src: "/_next/static/media/nextjs.cae0b805.png",
+        height: 1347,
+        width: 1626,
+        blurDataURL:
+          "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAMAAAACh/xsAAAAD1BMVEX////x8fH6+vrb29vo6Oh8o70bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAH0lEQVR4nGNgwARMjIyMjCAGCzMzMwsTRISJCcRABwAEcAAkLCQfgAAAAABJRU5ErkJggg==",
+        blurWidth: 8,
+        blurHeight: 7,
+      }; // ./pages/image.js
+      function ImagePage(props) {
+        return /*#__PURE__*/ (0, jsx_runtime.jsxs)(jsx_runtime.Fragment, {
+          children: [
+            /*#__PURE__*/ (0, jsx_runtime.jsx)("h1", {
+              children: "next/image example",
+            }),
+            /*#__PURE__*/ (0, jsx_runtime.jsx)(image_default(), {
+              src: nextjs,
+              placeholder: "blur",
+            }),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const pages_image = ImagePage;
+
+      /***/
+    },
+
+    /***/ 3854: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -34,9 +217,9 @@
           return getImgProps;
         },
       });
-      const _warnonce = __webpack_require__(5127);
-      const _imageblursvg = __webpack_require__(4287);
-      const _imageconfig = __webpack_require__(2795);
+      const _warnonce = __webpack_require__(3603);
+      const _imageblursvg = __webpack_require__(7835);
+      const _imageconfig = __webpack_require__(6799);
       const VALID_LOADING_VALUES =
         /* unused pure expression or super */ null && [
           "lazy",
@@ -463,55 +646,69 @@
       /***/
     },
 
-    /***/ 3444: /***/ (
+    /***/ 5526: /***/ (
       __unused_webpack_module,
-      __webpack_exports__,
+      exports,
       __webpack_require__
     ) => {
       "use strict";
-      // ESM COMPAT FLAG
-      __webpack_require__.r(__webpack_exports__);
 
-      // EXPORTS
-      __webpack_require__.d(__webpack_exports__, {
-        __N_SSP: () => /* binding */ __N_SSP,
-        default: () => /* binding */ pages_image,
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
       });
-
-      // EXTERNAL MODULE: ./node_modules/.pnpm/[email protected]/node_modules/react/jsx-runtime.js
-      var jsx_runtime = __webpack_require__(5640);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
-      var next_image = __webpack_require__(6359);
-      var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
-      /* harmony default export */ const nextjs = {
-        src: "/_next/static/media/nextjs.cae0b805.png",
-        height: 1347,
-        width: 1626,
-        blurDataURL:
-          "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAMAAAACh/xsAAAAD1BMVEX////x8fH6+vrb29vo6Oh8o70bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAH0lEQVR4nGNgwARMjIyMjCAGCzMzMwsTRISJCcRABwAEcAAkLCQfgAAAAABJRU5ErkJggg==",
-        blurWidth: 8,
-        blurHeight: 7,
-      }; // ./pages/image.js
-      function ImagePage(props) {
-        return /*#__PURE__*/ (0, jsx_runtime.jsxs)(jsx_runtime.Fragment, {
-          children: [
-            /*#__PURE__*/ (0, jsx_runtime.jsx)("h1", {
-              children: "next/image example",
-            }),
-            /*#__PURE__*/ (0, jsx_runtime.jsx)(image_default(), {
-              src: nextjs,
-              placeholder: "blur",
-            }),
-          ],
+      0 && 0;
+      function _export(target, all) {
+        for (var name in all)
+          Object.defineProperty(target, name, {
+            enumerable: true,
+            get: all[name],
+          });
+      }
+      _export(exports, {
+        default: function () {
+          return _default;
+        },
+        getImageProps: function () {
+          return getImageProps;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _getimgprops = __webpack_require__(3854);
+      const _imagecomponent = __webpack_require__(8350);
+      const _imageloader = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(1206)
+      );
+      function getImageProps(imgProps) {
+        const { props } = (0, _getimgprops.getImgProps)(imgProps, {
+          defaultLoader: _imageloader.default,
+          // This is replaced by webpack define plugin
+          imgConf: {
+            deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+            imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
+            path: "/_next/image",
+            loader: "default",
+            dangerouslyAllowSVG: false,
+            unoptimized: false,
+          },
         });
+        // Normally we don't care about undefined props because we pass to JSX,
+        // but this exported function could be used by the end user for anything
+        // so we delete undefined props to clean it up a little.
+        for (const [key, value] of Object.entries(props)) {
+          if (value === undefined) {
+            delete props[key];
+          }
+        }
+        return {
+          props,
+        };
       }
-      var __N_SSP = true;
-      /* harmony default export */ const pages_image = ImagePage;
+      const _default = _imagecomponent.Image; //# sourceMappingURL=image-external.js.map
 
       /***/
     },
 
-    /***/ 4287: /***/ (__unused_webpack_module, exports) => {
+    /***/ 7835: /***/ (__unused_webpack_module, exports) => {
       "use strict";
       /**
        * A shared function, used on both client and server, to generate a SVG blur placeholder.
@@ -566,85 +763,7 @@
       /***/
     },
 
-    /***/ 4985: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "useMergedRef", {
-        enumerable: true,
-        get: function () {
-          return useMergedRef;
-        },
-      });
-      const _react = __webpack_require__(148);
-      function useMergedRef(refA, refB) {
-        const cleanupA = (0, _react.useRef)(null);
-        const cleanupB = (0, _react.useRef)(null);
-        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
-        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
-        // But this can cause us to leak a cleanup-ref into user code (e.g. via `<Link legacyBehavior>`),
-        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
-        // (because it hasn't been updated for React 19)
-        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
-        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
-        return (0, _react.useCallback)(
-          (current) => {
-            if (current === null) {
-              const cleanupFnA = cleanupA.current;
-              if (cleanupFnA) {
-                cleanupA.current = null;
-                cleanupFnA();
-              }
-              const cleanupFnB = cleanupB.current;
-              if (cleanupFnB) {
-                cleanupB.current = null;
-                cleanupFnB();
-              }
-            } else {
-              if (refA) {
-                cleanupA.current = applyRef(refA, current);
-              }
-              if (refB) {
-                cleanupB.current = applyRef(refB, current);
-              }
-            }
-          },
-          [refA, refB]
-        );
-      }
-      function applyRef(refA, current) {
-        if (typeof refA === "function") {
-          const cleanup = refA(current);
-          if (typeof cleanup === "function") {
-            return cleanup;
-          } else {
-            return () => refA(null);
-          }
-        } else {
-          refA.current = current;
-          return () => {
-            refA.current = null;
-          };
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-merged-ref.js.map
-
-      /***/
-    },
-
-    /***/ 5898: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8350: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -666,17 +785,17 @@
         __webpack_require__(7897)
       );
       const _head = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5207)
+        __webpack_require__(8843)
       );
-      const _getimgprops = __webpack_require__(2514);
-      const _imageconfig = __webpack_require__(2795);
-      const _imageconfigcontextsharedruntime = __webpack_require__(2349);
-      const _warnonce = __webpack_require__(5127);
-      const _routercontextsharedruntime = __webpack_require__(3556);
+      const _getimgprops = __webpack_require__(3854);
+      const _imageconfig = __webpack_require__(6799);
+      const _imageconfigcontextsharedruntime = __webpack_require__(3905);
+      const _warnonce = __webpack_require__(3603);
+      const _routercontextsharedruntime = __webpack_require__(6712);
       const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5970)
+        __webpack_require__(1206)
       );
-      const _usemergedref = __webpack_require__(4985);
+      const _usemergedref = __webpack_require__(1765);
       // This is replaced by webpack define plugin
       const configEnv = {
         deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -1001,132 +1120,13 @@
 
       /***/
     },
-
-    /***/ 5970: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "default", {
-        enumerable: true,
-        get: function () {
-          return _default;
-        },
-      });
-      const DEFAULT_Q = 75;
-      function defaultLoader(param) {
-        let { config, src, width, quality } = param;
-        var _config_qualities;
-        if (false) {
-        }
-        const q =
-          quality ||
-          ((_config_qualities = config.qualities) == null
-            ? void 0
-            : _config_qualities.reduce((prev, cur) =>
-                Math.abs(cur - DEFAULT_Q) < Math.abs(prev - DEFAULT_Q)
-                  ? cur
-                  : prev
-              )) ||
-          DEFAULT_Q;
-        return (
-          config.path +
-          "?url=" +
-          encodeURIComponent(src) +
-          "&w=" +
-          width +
-          "&q=" +
-          q +
-          (src.startsWith("/_next/static/media/") && false ? 0 : "")
-        );
-      }
-      // We use this to determine if the import is the default loader
-      // or a custom loader defined by the user in next.config.js
-      defaultLoader.__next_img_default = true;
-      const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
-
-      /***/
-    },
-
-    /***/ 6359: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(8986);
-
-      /***/
-    },
-
-    /***/ 8986: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      0 && 0;
-      function _export(target, all) {
-        for (var name in all)
-          Object.defineProperty(target, name, {
-            enumerable: true,
-            get: all[name],
-          });
-      }
-      _export(exports, {
-        default: function () {
-          return _default;
-        },
-        getImageProps: function () {
-          return getImageProps;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _getimgprops = __webpack_require__(2514);
-      const _imagecomponent = __webpack_require__(5898);
-      const _imageloader = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(5970)
-      );
-      function getImageProps(imgProps) {
-        const { props } = (0, _getimgprops.getImgProps)(imgProps, {
-          defaultLoader: _imageloader.default,
-          // This is replaced by webpack define plugin
-          imgConf: {
-            deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
-            imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
-            path: "/_next/image",
-            loader: "default",
-            dangerouslyAllowSVG: false,
-            unoptimized: false,
-          },
-        });
-        // Normally we don't care about undefined props because we pass to JSX,
-        // but this exported function could be used by the end user for anything
-        // so we delete undefined props to clean it up a little.
-        for (const [key, value] of Object.entries(props)) {
-          if (value === undefined) {
-            delete props[key];
-          }
-        }
-        return {
-          props,
-        };
-      }
-      const _default = _imagecomponent.Image; //# sourceMappingURL=image-external.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2198)
+      __webpack_exec__(264)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for index-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 9418: /***/ (
+    /***/ 8230: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(8696);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 8696: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -19,30 +36,13 @@
 
       /***/
     },
-
-    /***/ 9532: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(9418);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9532)
+      __webpack_exec__(8230)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,125 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 1854: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(5640);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(8770);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_link__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      function aLink(props) {
-        return /*#__PURE__*/ (0,
-        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
-          children: [
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
-              children: "A Link page!",
-            }),
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
-              {
-                href: "/",
-                children: "Go to /",
-              }
-            ),
-          ],
-        });
-      }
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
-
-      /***/
-    },
-
-    /***/ 3199: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
-        },
-      });
-      let errorOnce = (_) => {};
-      if (false) {
-      } //# sourceMappingURL=error-once.js.map
-
-      /***/
-    },
-
-    /***/ 3568: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(1854);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 3857: /***/ (module, exports, __webpack_require__) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "getDomainLocale", {
-        enumerable: true,
-        get: function () {
-          return getDomainLocale;
-        },
-      });
-      const _normalizetrailingslash = __webpack_require__(4869);
-      const basePath =
-        /* unused pure expression or super */ null && (false || "");
-      function getDomainLocale(path, locale, locales, domainLocales) {
-        if (false) {
-        } else {
-          return false;
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=get-domain-locale.js.map
-
-      /***/
-    },
-
-    /***/ 3947: /***/ (module, exports, __webpack_require__) => {
+    /***/ 591: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -146,17 +28,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(148)
       );
-      const _resolvehref = __webpack_require__(3161);
-      const _islocalurl = __webpack_require__(2309);
-      const _formaturl = __webpack_require__(3768);
-      const _utils = __webpack_require__(5554);
-      const _addlocale = __webpack_require__(7591);
-      const _routercontextsharedruntime = __webpack_require__(3556);
-      const _useintersection = __webpack_require__(5624);
-      const _getdomainlocale = __webpack_require__(3857);
-      const _addbasepath = __webpack_require__(4356);
-      const _usemergedref = __webpack_require__(4985);
-      const _erroronce = __webpack_require__(3199);
+      const _resolvehref = __webpack_require__(5837);
+      const _islocalurl = __webpack_require__(5953);
+      const _formaturl = __webpack_require__(6212);
+      const _utils = __webpack_require__(6950);
+      const _addlocale = __webpack_require__(6467);
+      const _routercontextsharedruntime = __webpack_require__(6712);
+      const _useintersection = __webpack_require__(9692);
+      const _getdomainlocale = __webpack_require__(6850);
+      const _addbasepath = __webpack_require__(4928);
+      const _usemergedref = __webpack_require__(1765);
+      const _erroronce = __webpack_require__(8659);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -545,7 +427,17 @@
       /***/
     },
 
-    /***/ 4985: /***/ (module, exports, __webpack_require__) => {
+    /***/ 1148: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(591);
+
+      /***/
+    },
+
+    /***/ 1765: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -623,7 +515,125 @@
       /***/
     },
 
-    /***/ 5624: /***/ (module, exports, __webpack_require__) => {
+    /***/ 5436: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(5640);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(1148);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_link__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      function aLink(props) {
+        return /*#__PURE__*/ (0,
+        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+          children: [
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+              children: "A Link page!",
+            }),
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+              {
+                href: "/",
+                children: "Go to /",
+              }
+            ),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+
+      /***/
+    },
+
+    /***/ 6850: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "getDomainLocale", {
+        enumerable: true,
+        get: function () {
+          return getDomainLocale;
+        },
+      });
+      const _normalizetrailingslash = __webpack_require__(6457);
+      const basePath =
+        /* unused pure expression or super */ null && (false || "");
+      function getDomainLocale(path, locale, locales, domainLocales) {
+        if (false) {
+        } else {
+          return false;
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=get-domain-locale.js.map
+
+      /***/
+    },
+
+    /***/ 8659: /***/ (__unused_webpack_module, exports) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "errorOnce", {
+        enumerable: true,
+        get: function () {
+          return errorOnce;
+        },
+      });
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
+
+      /***/
+    },
+
+    /***/ 9666: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(5436);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9692: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -636,7 +646,7 @@
         },
       });
       const _react = __webpack_require__(148);
-      const _requestidlecallback = __webpack_require__(3543);
+      const _requestidlecallback = __webpack_require__(315);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -748,23 +758,13 @@
 
       /***/
     },
-
-    /***/ 8770: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(3947);
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3568)
+      __webpack_exec__(9666)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,7 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 3618: /***/ (
+    /***/ 76: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -16,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4631);
+        __webpack_require__(9413);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -36,17 +36,7 @@
       /***/
     },
 
-    /***/ 4631: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7086);
-
-      /***/
-    },
-
-    /***/ 7824: /***/ (
+    /***/ 1810: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -54,7 +44,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/routerDirect",
         function () {
-          return __webpack_require__(3618);
+          return __webpack_require__(76);
         },
       ]);
       if (false) {
@@ -62,13 +52,23 @@
 
       /***/
     },
+
+    /***/ 9413: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5282);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(7824)
+      __webpack_exec__(1810)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,24 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 1984: /***/ (
-      __unused_webpack_module,
+    /***/ 2227: /***/ (
+      module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(5769);
-        },
-      ]);
-      if (false) {
-      }
+      module.exports = __webpack_require__(5984);
 
       /***/
     },
 
-    /***/ 5769: /***/ (
+    /***/ 3043: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(8293);
+        __webpack_require__(2227);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -66,12 +59,19 @@
       /***/
     },
 
-    /***/ 8293: /***/ (
-      module,
+    /***/ 3642: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(900);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(3043);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -81,7 +81,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1984)
+      __webpack_exec__(3642)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 4631: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(7086);
-
-      /***/
-    },
-
-    /***/ 9216: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(9803);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 9803: /***/ (
+    /***/ 1089: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(5640);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4631);
+        __webpack_require__(9413);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
 
       /***/
     },
+
+    /***/ 3962: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(1089);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9413: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(5282);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9216)
+      __webpack_exec__(3962)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 4719-HASH.js

Diff too large to display

Diff for 6236-HASH.js

Diff too large to display

Diff for main-HASH.js

Diff too large to display

Diff for main-app-HASH.js
@@ -1,64 +1,64 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4977],
   {
-    /***/ 3505: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
-
-    /***/ 8948: /***/ (
+    /***/ 32: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8790, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5356, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7537, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1099, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7382, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4304, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9442, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3152, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2439, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7601, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5083, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2553, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8103, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1925, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5625, 23)
+        __webpack_require__.t.bind(__webpack_require__, 959, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4247, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9389, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 5602, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8628, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2193, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5439, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5223)
+        __webpack_require__.bind(__webpack_require__, 8685)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 227, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3077, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6734, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7812, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4120, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5774, 23)
       );
 
       /***/
     },
+
+    /***/ 3579: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [1305, 6236],
-      () => (__webpack_exec__(9679), __webpack_exec__(8948))
+      [9910, 4860],
+      () => (__webpack_exec__(1389), __webpack_exec__(32))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for app-page-exp..ntime.dev.js
failed to diff
Diff for app-page-exp..time.prod.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for app-route.runtime.dev.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for pages-api.runtime.dev.js

Diff too large to display

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

Diff too large to display

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

Diff too large to display

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

Diff too large to display

Diff for pages.runtime.dev.js

Diff too large to display

Diff for pages.runtime.prod.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: aed726c

todo:

- check up with dynamic files
- isMetadataStaticFile should be enhanced
- normalizeMetadataRoute should be 100% sure w/ extensions are static
since im on-call, leaving as wip

TODO:
- setup-dev-bundler copy metadata files initially while files processed
- "hmr", if file changed and is metadata, copy that,
- might need old vs new schema check to know which files to delete
- overall, need copy & delete mechanism during dev server
- then, look for output: export mode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants