Skip to content

perf(dev): optimize dev server boot time with lazy loading - #87938

Closed
feedthejim wants to merge 1 commit into
canaryfrom
perf-dev-lazy-loading
Closed

feedthejim wants to merge 1 commit into
canaryfrom
perf-dev-lazy-loading

Conversation

@feedthejim

@feedthejim feedthejim commented Dec 30, 2025 •

Copy link
Copy Markdown
Contributor

No description provided.

@feedthejim
feedthejim changed the base branch from canary to graphite-base/87938 December 30, 2025 13:58
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from 0a17994 to b0b99e5 Compare December 30, 2025 13:58
@feedthejim
feedthejim changed the base branch from graphite-base/87938 to perf-dev-scripts December 30, 2025 13:58
@nextjs-bot

nextjs-bot commented Dec 30, 2025 •

Copy link
Copy Markdown
Contributor

Failing test suites

Commit: 2928690 | About building and testing Next.js

pnpm test packages/next-codemod/transforms/__tests__/app-dir-runtime-config-experimental-edge.test.js (job)

  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/async-function" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/const-export" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/default-export" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/export-as-alias" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/export-specifier" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/import-conflict" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/multiple-references" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/named-export" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-basic" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-commonjs" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-function-arrow" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-function-async" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-function" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/next-config-wrapped" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-direct-export" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-in-config" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-multi-declarator" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-multiple-exports" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-only-config" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-separate-export-mixed" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/runtime-separate-export" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/scope-conflict" data (DD)
  • middleware-to-proxy > transforms correctly using "middleware-to-proxy/type-imports" data (DD)
Expand output

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/async-function" data

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

- Expected  - 9
+ Received  + 9

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export async function proxy(request: NextRequest) {
+ export async function proxy(request: NextRequest) {
-   const response = await fetch('/api/auth')
+   const response = await fetch('/api/auth')
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/const-export" data

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

- Expected  - 10
+ Received  + 10

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- const proxy = (request: NextRequest) => {
+ const proxy = (request: NextRequest) => {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export { proxy }
-
+ export { proxy }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/default-export" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export default function proxy(request: NextRequest) {
+ export default function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/export-as-alias" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse } from 'next/server'
-
+ import { NextResponse } from 'next/server'
+ 
- const proxy = 'existing proxy variable'
-
+ const proxy = 'existing proxy variable'
+ 
- function _proxy1() {
+ function _proxy1() {
-   return NextResponse.next()
+   return NextResponse.next()
- }
-
+ }
+ 
  export { _proxy1 as randomName }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/export-specifier" data

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

- Expected  - 10
+ Received  + 10

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- function proxy(request: NextRequest) {
+ function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- const config = {
+ const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
- }
-
+ }
+ 
  export { proxy, config }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/import-conflict" data

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

- Expected  - 7
+ Received  + 7

- import { NextResponse } from 'next/server'
+ import { NextResponse } from 'next/server'
- // @ts-expect-error: test fixture
+ // @ts-expect-error: test fixture
- import { proxy } from 'some-library'
-
+ import { proxy } from 'some-library'
+ 
- export function _proxy1() {
+ export function _proxy1() {
-   return NextResponse.next()
+   return NextResponse.next()
- }
+ }
  export { _proxy1 as proxy };

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/multiple-references" data

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

- Expected  - 10
+ Received  + 10

- import { NextRequest } from 'next/server'
-
+ import { NextRequest } from 'next/server'
+ 
- const proxy = 'existing proxy variable'
-
+ const proxy = 'existing proxy variable'
+ 
- export function _proxy1(request: NextRequest) {
+ export function _proxy1(request: NextRequest) {
-   return _proxy1(request); // self-reference
+   return _proxy1(request); // self-reference
- }
-
+ }
+ 
- const handler = _proxy1
+ const handler = _proxy1
- export { handler }
+ export { handler }
  export { _proxy1 as proxy };

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/named-export" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-basic" data

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

- Expected  - 11
+ Received  + 11

- import type { NextConfig } from 'next'
-
+ import type { NextConfig } from 'next'
+ 
- const nextConfig: NextConfig = {
+ const nextConfig: NextConfig = {
-   experimental: {
+   experimental: {
-     proxyPrefetch: 'strict',
+     proxyPrefetch: 'strict',
-     proxyClientMaxBodySize: '10mb',
+     proxyClientMaxBodySize: '10mb',
-     externalProxyRewritesResolve: true,
+     externalProxyRewritesResolve: true,
-   },
+   },
-   skipProxyUrlNormalize: true,
+   skipProxyUrlNormalize: true,
- }
-
+ }
+ 
  export default nextConfig

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-commonjs" data

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

- Expected  - 10
+ Received  + 10

- /** @type {import('next').NextConfig} */
+ /** @type {import('next').NextConfig} */
- const nextConfig = {
+ const nextConfig = {
-   experimental: {
+   experimental: {
-     proxyPrefetch: 'flexible',
+     proxyPrefetch: 'flexible',
-     proxyClientMaxBodySize: '8mb',
+     proxyClientMaxBodySize: '8mb',
-     externalProxyRewritesResolve: false,
+     externalProxyRewritesResolve: false,
-   },
+   },
-   skipProxyUrlNormalize: false,
+   skipProxyUrlNormalize: false,
- }
-
+ }
+ 
  module.exports = nextConfig

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-function-arrow" data

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

- Expected  - 11
+ Received  + 11

- import type { NextConfig } from 'next'
-
+ import type { NextConfig } from 'next'
+ 
- const nextConfig = (): NextConfig => ({
+ const nextConfig = (): NextConfig => ({
-   experimental: {
+   experimental: {
-     proxyPrefetch: 'strict',
+     proxyPrefetch: 'strict',
-     proxyClientMaxBodySize: '5mb',
+     proxyClientMaxBodySize: '5mb',
-     externalProxyRewritesResolve: true,
+     externalProxyRewritesResolve: true,
-   },
+   },
-   skipProxyUrlNormalize: true,
+   skipProxyUrlNormalize: true,
- })
-
+ })
+ 
  export default nextConfig

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-function-async" data

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

- Expected  - 13
+ Received  + 13

- import type { NextConfig } from 'next'
-
+ import type { NextConfig } from 'next'
+ 
- async function nextConfig(): Promise<NextConfig> {
+ async function nextConfig(): Promise<NextConfig> {
-   return {
+   return {
-     experimental: {
+     experimental: {
-       proxyPrefetch: 'flexible',
+       proxyPrefetch: 'flexible',
-       proxyClientMaxBodySize: 5 * 1024 * 1024,
+       proxyClientMaxBodySize: 5 * 1024 * 1024,
-       externalProxyRewritesResolve: false,
+       externalProxyRewritesResolve: false,
-     },
+     },
-     skipProxyUrlNormalize: false,
+     skipProxyUrlNormalize: false,
-   };
+   };
- }
-
+ }
+ 
  export default nextConfig

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-function" data

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

- Expected  - 13
+ Received  + 13

- import type { NextConfig } from 'next'
-
+ import type { NextConfig } from 'next'
+ 
- function nextConfig(): NextConfig {
+ function nextConfig(): NextConfig {
-   return {
+   return {
-     experimental: {
+     experimental: {
-       proxyPrefetch: 'flexible',
+       proxyPrefetch: 'flexible',
-       proxyClientMaxBodySize: 5 * 1024 * 1024,
+       proxyClientMaxBodySize: 5 * 1024 * 1024,
-       externalProxyRewritesResolve: false,
+       externalProxyRewritesResolve: false,
-     },
+     },
-     skipProxyUrlNormalize: false,
+     skipProxyUrlNormalize: false,
-   };
+   };
- }
-
+ }
+ 
  export default nextConfig

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/next-config-wrapped" data

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

- Expected  - 14
+ Received  + 14

- import type { NextConfig } from 'next'
+ import type { NextConfig } from 'next'
- import fooWrapper from 'foo-wrapper'
+ import fooWrapper from 'foo-wrapper'
- import barWrapper from 'bar-wrapper'
+ import barWrapper from 'bar-wrapper'
- import bazWrapper from 'baz-wrapper'
-
+ import bazWrapper from 'baz-wrapper'
+ 
- const nextConfig: NextConfig = {
+ const nextConfig: NextConfig = {
-   experimental: {
+   experimental: {
-     proxyPrefetch: 'flexible',
+     proxyPrefetch: 'flexible',
-     proxyClientMaxBodySize: '8mb',
+     proxyClientMaxBodySize: '8mb',
-     externalProxyRewritesResolve: false,
+     externalProxyRewritesResolve: false,
-   },
+   },
-   skipProxyUrlNormalize: false,
+   skipProxyUrlNormalize: false,
- }
-
+ }
+ 
  export default fooWrapper(barWrapper(bazWrapper(nextConfig)))

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-direct-export" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*',
+   matcher: '/about/:path*',
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-in-config" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*'
+   matcher: '/about/:path*'
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-multi-declarator" data

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

- Expected  - 7
+ Received  + 7

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- const config = { matcher: '/test/*' };
+ const config = { matcher: '/test/*' };
  export { config };

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-multiple-exports" data

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

- Expected  - 8
+ Received  + 8

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- export const config = {
+ export const config = {
-   matcher: '/about/:path*'
+   matcher: '/about/:path*'
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-only-config" data

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

- Expected  - 4
+ Received  + 4

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-separate-export-mixed" data

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

- Expected  - 10
+ Received  + 10

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
- }
-
+ }
+ 
- const config = {
+ const config = {
-   matcher: '/api/:path*',
+   matcher: '/api/:path*',
- }
-
+ }
+ 
  export { config };

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/runtime-separate-export" data

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

- Expected  - 4
+ Received  + 4

- import { NextResponse, NextRequest } from 'next/server'
-
+ import { NextResponse, NextRequest } from 'next/server'
+ 
- export function proxy(request: NextRequest) {
+ export function proxy(request: NextRequest) {
-   return NextResponse.redirect(new URL('/home', request.url))
+   return NextResponse.redirect(new URL('/home', request.url))
  }

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/scope-conflict" data

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

- Expected  - 7
+ Received  + 7

- import { NextResponse } from 'next/server'
-
+ import { NextResponse } from 'next/server'
+ 
- const proxy = 'existing proxy variable'
-
+ const proxy = 'existing proxy variable'
+ 
- export function _proxy1() {
+ export function _proxy1() {
-   return NextResponse.next()
+   return NextResponse.next()
- }
+ }
  export { _proxy1 as proxy };

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

● middleware-to-proxy › transforms correctly using "middleware-to-proxy/type-imports" data

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

- Expected  - 17
+ Received  + 17

- import { NextRequest, NextResponse, NextProxy, ProxyConfig } from 'next/server'
+ import { NextRequest, NextResponse, NextProxy, ProxyConfig } from 'next/server'
- import type { NextProxy as MiddlewareType } from 'next/server'
-
+ import type { NextProxy as MiddlewareType } from 'next/server'
+ 
- export function proxy(request: NextRequest): NextProxy {
+ export function proxy(request: NextRequest): NextProxy {
-   return NextResponse.next()
+   return NextResponse.next()
- }
-
+ }
+ 
- export const config: ProxyConfig = {
+ export const config: ProxyConfig = {
-   matcher: '/api/:path*'
+   matcher: '/api/:path*'
- }
-
+ }
+ 
- // Type usage in function parameter
+ // Type usage in function parameter
- function createMiddleware(): NextProxy {
+ function createMiddleware(): NextProxy {
-   return (request: NextRequest) => NextResponse.next()
+   return (request: NextRequest) => NextResponse.next()
- }
-
+ }
+ 
- // Type alias using the imported type
+ // Type alias using the imported type
  type MyMiddleware = MiddlewareType

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at runTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:98:3)
  at Object.<anonymous> (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:115:7)

pnpm test packages/next-codemod/transforms/__tests__/add-missing-react-import.test.js (job)

  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-01 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-02 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-03 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-04 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-05 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-06 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-07 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-08 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-10 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-11 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-12 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-13 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-14 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-15 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-16 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-17 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-18 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-19 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-21 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-22 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-23 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-24 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-25 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-01 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-02 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/custom-routes-access-api-prop-01 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-01 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-02 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-03 (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/origin-name-01-util (DD)
  • next-async-request-api - dynamic-apis > transforms correctly next-async-request-api-dynamic-apis/origin-name-02-util (DD)
Expand output

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-01

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

- Expected  - 9
+ Received  + 9

- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- export async function MyComponent() {
+ export async function MyComponent() {
-   const name = (await cookies()).get('name')
+   const name = (await cookies()).get('name')
-   callback(name)
+   callback(name)
- }
-
+ }
+ 
- function callback(name: any) {
+ function callback(name: any) {
-   console.log(name)
+   console.log(name)
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-02

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

- Expected  - 4
+ Received  + 4

- import { draftMode } from 'next/headers'
-
+ import { draftMode } from 'next/headers'
+ 
- export async function MyComponent() {
+ export async function MyComponent() {
-   (await draftMode()).enable()
+   (await draftMode()).enable()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-03

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

- Expected  - 5
+ Received  + 5

- // If it's sync default export, convert to async and await the function call
+ // If it's sync default export, convert to async and await the function call
- import { draftMode } from 'next/headers'
-
+ import { draftMode } from 'next/headers'
+ 
- export default async function MyComponent() {
+ export default async function MyComponent() {
-   (await draftMode()).enable()
+   (await draftMode()).enable()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-04

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

- Expected  - 8
+ Received  + 8

- import { draftMode } from 'next/headers'
-
+ import { draftMode } from 'next/headers'
+ 
- export default async function MyComponent() {
+ export default async function MyComponent() {
-   (await draftMode()).enable()
+   (await draftMode()).enable()
- }
-
+ }
+ 
- export async function MyComponent2() {
+ export async function MyComponent2() {
-   (await draftMode()).enable()
+   (await draftMode()).enable()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-05

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

- Expected  - 9
+ Received  + 9

- import { use } from "react";
+ import { use } from "react";
- import { draftMode, type UnsafeUnwrappedDraftMode } from 'next/headers';
-
+ import { draftMode, type UnsafeUnwrappedDraftMode } from 'next/headers';
+ 
- export function MyComponent2() {
+ export function MyComponent2() {
-   (draftMode() as unknown as UnsafeUnwrappedDraftMode).enable()
+   (draftMode() as unknown as UnsafeUnwrappedDraftMode).enable()
- }
-
+ }
+ 
- export function useDraftModeEnabled() {
+ export function useDraftModeEnabled() {
-   use(draftMode()).enable()
+   use(draftMode()).enable()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-06

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

- Expected  - 5
+ Received  + 5

- import React from 'react'
+ import React from 'react'
- import { draftMode } from 'next/headers'
-
+ import { draftMode } from 'next/headers'
+ 
- export default async function Page() {
+ export default async function Page() {
-   return <button disabled={(await draftMode()).isEnabled}>Enable Draft Mode</button>;
+   return <button disabled={(await draftMode()).isEnabled}>Enable Draft Mode</button>;
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-07

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

- Expected  - 5
+ Received  + 5

- // Already imported the type
+ // Already imported the type
- import { draftMode, type UnsafeUnwrappedDraftMode } from 'next/headers'
-
+ import { draftMode, type UnsafeUnwrappedDraftMode } from 'next/headers'
+ 
- export function MyComponent2() {
+ export function MyComponent2() {
-   (draftMode() as unknown as UnsafeUnwrappedDraftMode).enable()
+   (draftMode() as unknown as UnsafeUnwrappedDraftMode).enable()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-08

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

- Expected  - 4
+ Received  + 4

- import { headers } from 'next/headers'
-
+ import { headers } from 'next/headers'
+ 
- export async function GET(): Promise<Response> {
+ export async function GET(): Promise<Response> {
-   await headers()
+   await headers()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-10

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

- Expected  - 12
+ Received  + 12

- import { headers, type UnsafeUnwrappedHeaders } from 'next/headers';
-
+ import { headers, type UnsafeUnwrappedHeaders } from 'next/headers';
+ 
- export function MyComp() {
+ export function MyComp() {
-   return (headers() as unknown as UnsafeUnwrappedHeaders);
+   return (headers() as unknown as UnsafeUnwrappedHeaders);
- }
-
+ }
+ 
- export function MyComp2() {
+ export function MyComp2() {
-   return (headers() as unknown as UnsafeUnwrappedHeaders);
+   return (headers() as unknown as UnsafeUnwrappedHeaders);
- }
-
+ }
+ 
- export function MyComp3() {
+ export function MyComp3() {
-   return (headers() as unknown as UnsafeUnwrappedHeaders);
+   return (headers() as unknown as UnsafeUnwrappedHeaders);
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-11

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

- Expected  - 8
+ Received  + 8

- import { headers, type UnsafeUnwrappedHeaders } from 'next/headers';
-
+ import { headers, type UnsafeUnwrappedHeaders } from 'next/headers';
+ 
- export function MyComp() {
+ export function MyComp() {
-   void (headers() as unknown as UnsafeUnwrappedHeaders)
+   void (headers() as unknown as UnsafeUnwrappedHeaders)
- }
-
+ }
+ 
- export function generateContentfulMetadata() {
+ export function generateContentfulMetadata() {
-   void (headers() as unknown as UnsafeUnwrappedHeaders)
+   void (headers() as unknown as UnsafeUnwrappedHeaders)
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-12

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

- Expected  - 4
+ Received  + 4

- import { cookies } from "next/headers";
-
+ import { cookies } from "next/headers";
+ 
- async function MyComponent() {
+ async function MyComponent() {
-   callSomething(await cookies());
+   callSomething(await cookies());
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-13

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

- Expected  - 4
+ Received  + 4

- import { headers } from "next/headers";
-
+ import { headers } from "next/headers";
+ 
- async function MyComponent() {
+ async function MyComponent() {
-   callSomething(await headers());
+   callSomething(await headers());
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-14

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

- Expected  - 4
+ Received  + 4

- import { cookies } from "next/headers";
-
+ import { cookies } from "next/headers";
+ 
- export default async function Page() {
+ export default async function Page() {
-   callSomething(await cookies());
+   callSomething(await cookies());
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-15

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

- Expected  - 7
+ Received  + 7

- import { cookies } from "next/headers";
-
+ import { cookies } from "next/headers";
+ 
- async function MyComponent() {
+ async function MyComponent() {
-   function asyncFunction() {
+   function asyncFunction() {
-     callSomething(/* @next-codemod-error Manually await this call and refactor the function to be async */
+     callSomething(/* @next-codemod-error Manually await this call and refactor the function to be async */
-     cookies());
+     cookies());
-   }
+   }
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-16

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

- Expected  - 5
+ Received  + 5

- import { cookies } from "next/headers";
-
+ import { cookies } from "next/headers";
+ 
- function MyComponent() {
+ function MyComponent() {
-   callSomething(/* @next-codemod-error Manually await this call and refactor the function to be async */
+   callSomething(/* @next-codemod-error Manually await this call and refactor the function to be async */
-   cookies());
+   cookies());
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-17

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

- Expected  - 4
+ Received  + 4

- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- export const myFun = async (): Promise<any> => {
+ export const myFun = async (): Promise<any> => {
-   const name = (await cookies()).get('name')
+   const name = (await cookies()).get('name')
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-18

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

- Expected  - 16
+ Received  + 16

- import {
+ import {
-   cookies as myCookies,
+   cookies as myCookies,
-   headers as myHeaders,
+   headers as myHeaders,
-   draftMode as myDraftMode,
+   draftMode as myDraftMode,
- } from 'next/headers'
-
+ } from 'next/headers'
+ 
- export const myFun = async (): Promise<any> => {
+ export const myFun = async (): Promise<any> => {
-   const name = (await myCookies()).get('name')
+   const name = (await myCookies()).get('name')
- }
-
+ }
+ 
- export const myFun2 = async (): Promise<any> => {
+ export const myFun2 = async (): Promise<any> => {
-   await myHeaders()
+   await myHeaders()
- }
-
+ }
+ 
- export const myFun3 = async (): Promise<any> => {
+ export const myFun3 = async (): Promise<any> => {
-   await myDraftMode()
+   await myDraftMode()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-19

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

- Expected  - 12
+ Received  + 12

- import { cookies, headers, type UnsafeUnwrappedHeaders } from 'next/headers';
-
+ import { cookies, headers, type UnsafeUnwrappedHeaders } from 'next/headers';
+ 
- export function myFun() {
+ export function myFun() {
-   return async function () {
+   return async function () {
-     (await cookies()).get('name')
+     (await cookies()).get('name')
-   };
+   };
- }
-
+ }
+ 
- export function myFun2() {
+ export function myFun2() {
-   return function () {
+   return function () {
-     void (headers() as unknown as UnsafeUnwrappedHeaders)
+     void (headers() as unknown as UnsafeUnwrappedHeaders)
-   };
+   };
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-21

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

- Expected  - 7
+ Received  + 7

- const nextHeaders = /* @next-codemod-error The APIs under 'next/headers' are async now, need to be manually awaited. */
+ const nextHeaders = /* @next-codemod-error The APIs under 'next/headers' are async now, need to be manually awaited. */
- import('next/headers')
-
+ import('next/headers')
+ 
- function myFunc() {
+ function myFunc() {
-   nextHeaders.cookies()
+   nextHeaders.cookies()
- }
-
+ }
+ 
  const nextHeaders2 = /* @next-codemod-error The APIs under 'next/headers' are async now, need to be manually awaited. */ import('next/headers')

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-22

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

- Expected  - 10
+ Received  + 10

- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- export const GET = async function() {
+ export const GET = async function() {
-   (await cookies()).get('token')
+   (await cookies()).get('token')
- }
-
+ }
+ 
- export async function POST(req: Request) {
+ export async function POST(req: Request) {
-   if (req.method === 'POST') {
+   if (req.method === 'POST') {
-     (await cookies()).get('token')
+     (await cookies()).get('token')
-   }
+   }
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-23

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

- Expected  - 5
+ Received  + 5

- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- export type Cookie = Awaited<ReturnType<typeof cookies>>
+ export type Cookie = Awaited<ReturnType<typeof cookies>>
- export function foo(c: Awaited<ReturnType<typeof cookies>>) {
+ export function foo(c: Awaited<ReturnType<typeof cookies>>) {
-   return c
+   return c
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-24

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

- Expected  - 12
+ Received  + 12

- import { use } from "react";
+ import { use } from "react";
- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- function useHook() {}
-
+ function useHook() {}
+ 
- export default function Page() {
+ export default function Page() {
-   useHook()
+   useHook()
-   const c = use(cookies());
+   const c = use(cookies());
- }
-
+ }
+ 
- export async function generateMetadata() {
+ export async function generateMetadata() {
-   await cookies()
+   await cookies()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-25

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

- Expected  - 5
+ Received  + 5

- import { cookies, type UnsafeUnwrappedCookies } from 'next/headers';
-
+ import { cookies, type UnsafeUnwrappedCookies } from 'next/headers';
+ 
- export function myFunc() {
+ export function myFunc() {
-   const c = (cookies() as unknown as UnsafeUnwrappedCookies)
+   const c = (cookies() as unknown as UnsafeUnwrappedCookies)
-   void (cookies() as unknown as UnsafeUnwrappedCookies)
+   void (cookies() as unknown as UnsafeUnwrappedCookies)
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-01

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

- Expected  - 26
+ Received  + 26

- import React from 'react'
+ import React from 'react'
- import {
+ import {
-   headers,
+   headers,
-   cookies,
+   cookies,
-   draftMode,
+   draftMode,
-   type UnsafeUnwrappedHeaders,
+   type UnsafeUnwrappedHeaders,
-   type UnsafeUnwrappedCookies,
+   type UnsafeUnwrappedCookies,
-   type UnsafeUnwrappedDraftMode,
+   type UnsafeUnwrappedDraftMode,
- } from 'next/headers';
-
+ } from 'next/headers';
+ 
- export function MyDraftComponent() {
+ export function MyDraftComponent() {
-   if ((draftMode() as unknown as UnsafeUnwrappedDraftMode).isEnabled) {
+   if ((draftMode() as unknown as UnsafeUnwrappedDraftMode).isEnabled) {
-     return null
+     return null
-   }
-
+   }
+ 
-   return <p>page</p>
+   return <p>page</p>
- }
-
+ }
+ 
- export function MyCookiesComponent() {
+ export function MyCookiesComponent() {
-   const c = (cookies() as unknown as UnsafeUnwrappedCookies)
+   const c = (cookies() as unknown as UnsafeUnwrappedCookies)
-   return c.get('name')
+   return c.get('name')
- }
-
+ }
+ 
- export function MyHeadersComponent() {
+ export function MyHeadersComponent() {
-   const h = (headers() as unknown as UnsafeUnwrappedHeaders)
+   const h = (headers() as unknown as UnsafeUnwrappedHeaders)
-   return <p>{h.get('x-foo')}</p>
+   return <p>{h.get('x-foo')}</p>
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-02

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

- Expected  - 28
+ Received  + 28

- import React from 'react'
+ import React from 'react'
- import { 
+ import { 
-   headers,
+   headers,
-   cookies, 
+   cookies, 
-   draftMode, 
+   draftMode, 
- } from 'next/headers'
-
+ } from 'next/headers'
+ 
- export function MyDraftComponent() {
+ export function MyDraftComponent() {
- if (/* @next-codemod-error Manually await this call and refactor the function to be async */
+ if (/* @next-codemod-error Manually await this call and refactor the function to be async */
- draftMode().isEnabled) {
+ draftMode().isEnabled) {
-     return null
+     return null
-   }
-
+   }
+ 
-   return <p>page</p>
+   return <p>page</p>
- }
-
+ }
+ 
- export function MyCookiesComponent() {
+ export function MyCookiesComponent() {
-   const c = /* @next-codemod-error Manually await this call and refactor the function to be async */
+   const c = /* @next-codemod-error Manually await this call and refactor the function to be async */
-   cookies()
+   cookies()
-   return c.get('name')
+   return c.get('name')
- }
-
+ }
+ 
- export function MyHeadersComponent() {
+ export function MyHeadersComponent() {
-   const h = /* @next-codemod-error Manually await this call and refactor the function to be async */
+   const h = /* @next-codemod-error Manually await this call and refactor the function to be async */
-   headers()
+   headers()
-   return (
+   return (
-     <p>{h.get('x-foo')}</p>
+     <p>{h.get('x-foo')}</p>
-   )
+   )
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/custom-routes-access-api-prop-01

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

- Expected  - 12
+ Received  + 12

- import { headers } from 'next/headers'
-
+ import { headers } from 'next/headers'
+ 
- export const GET = async function() {
+ export const GET = async function() {
-   await headers()
+   await headers()
- }
-
+ }
+ 
- export async function POST() {
+ export async function POST() {
-   await headers()
+   await headers()
- }
-
+ }
+ 
- export async function DELETE() {
+ export async function DELETE() {
-   await headers()
+   await headers()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-01

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

- Expected  - 4
+ Received  + 4

- import { headers } from 'next/headers'
-
+ import { headers } from 'next/headers'
+ 
- export async function generateMetadata() {
+ export async function generateMetadata() {
-   await headers()
+   await headers()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-02

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

- Expected  - 4
+ Received  + 4

- import { headers } from 'next/headers'
-
+ import { headers } from 'next/headers'
+ 
- export const generateMetadata = async function() {
+ export const generateMetadata = async function() {
-   await headers()
+   await headers()
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-03

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

- Expected  - 5
+ Received  + 5

- import { draftMode } from 'next/headers'
-
+ import { draftMode } from 'next/headers'
+ 
- export async function generateMetadata(props: any) {
+ export async function generateMetadata(props: any) {
-   const params = await props.params
+   const params = await props.params
-   await getMostRecentChangelog(params.slug, (await draftMode()).isEnabled)
+   await getMostRecentChangelog(params.slug, (await draftMode()).isEnabled)
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/origin-name-01-util

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

- Expected  - 5
+ Received  + 5

- import { cookies, type UnsafeUnwrappedCookies } from 'next/headers';
-
+ import { cookies, type UnsafeUnwrappedCookies } from 'next/headers';
+ 
- export default function Foo(): string {
+ export default function Foo(): string {
-   const name = (cookies() as unknown as UnsafeUnwrappedCookies).get('name')
+   const name = (cookies() as unknown as UnsafeUnwrappedCookies).get('name')
-   return name
+   return name
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/origin-name-02-util

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

- Expected  - 6
+ Received  + 6

- import { cookies } from 'next/headers'
-
+ import { cookies } from 'next/headers'
+ 
- export default function Foo() {
+ export default function Foo() {
-   const name = /* @next-codemod-error Manually await this call and refactor the function to be async */
+   const name = /* @next-codemod-error Manually await this call and refactor the function to be async */
-   cookies().get('name')
+   cookies().get('name')
-   return name
+   return name
  }

  53 |
  54 |     it(`transforms correctly ${prefix}`, () => {
> 55 |       runInlineTest(
     |       ^
  56 |         transform,
  57 |         null,
  58 |         {

  at runInlineTest (../node_modules/.pnpm/jscodeshift@17.0.0_@babel+preset-env@7.26.9_@babel+core@7.26.10_/node_modules/jscodeshift/dist/testUtils.js:49:18)
  at Object.runInlineTest (../packages/next-codemod/transforms/__tests__/next-async-request-api-dynamic-apis.test.js:55:7)

@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from b0b99e5 to 48cd127 Compare December 30, 2025 14:05
@feedthejim
feedthejim force-pushed the perf-dev-scripts branch 2 times, most recently from 5ab4764 to b44ff28 Compare December 30, 2025 14:06
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from 48cd127 to f99d4bf Compare December 30, 2025 14:06
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch 2 times, most recently from 7ee2c16 to bfda4a0 Compare December 30, 2025 14:11
Comment thread packages/next/src/cli/next-dev.ts Resolved
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from bfda4a0 to 24fed95 Compare December 30, 2025 14:28
@feedthejim
feedthejim changed the base branch from perf-dev-scripts to graphite-base/87938 December 30, 2025 14:52
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from 24fed95 to e0b1d39 Compare December 30, 2025 14:55
@feedthejim
feedthejim changed the base branch from graphite-base/87938 to perf-dev-scripts December 30, 2025 14:55
@nextjs-bot

nextjs-bot commented Dec 30, 2025 •

Copy link
Copy Markdown
Contributor

✅ Tests Passed

Updated 2026-01-01 20:53:26 UTC · Commit: ec1251f

@feedthejim
feedthejim force-pushed the perf-dev-scripts branch 2 times, most recently from 8f76e8a to 3517bf6 Compare December 30, 2025 15:19
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from e0b1d39 to c8890a1 Compare December 30, 2025 15:20
@nextjs-bot

nextjs-bot commented Jan 1, 2026 •

Copy link
Copy Markdown
Contributor

✅ Tests Passed

Updated 2026-01-02 10:05:06 UTC · Commit: 0d3fe75

@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from ec1251f to 0d3fe75 Compare January 2, 2026 09:52
@nextjs-bot

nextjs-bot commented Jan 2, 2026 •

Copy link
Copy Markdown
Contributor

✅ Tests Passed

Updated 2026-01-02 10:05:53 UTC · Commit: 0d3fe75

@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch 2 times, most recently from e512c82 to 534d64c Compare January 2, 2026 10:09
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from 534d64c to 414909d Compare January 2, 2026 10:17
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch 3 times, most recently from 8ab4728 to bb211f2 Compare January 2, 2026 11:22
@feedthejim
feedthejim force-pushed the perf-cpu-profiling branch 2 times, most recently from c1a42c5 to 5d7d2b9 Compare January 2, 2026 11:25
@feedthejim
feedthejim force-pushed the perf-dev-lazy-loading branch from bb211f2 to 2ab2231 Compare January 2, 2026 11:25
Comment thread packages/next/src/cli/next-dev.ts Resolved
@nextjs-bot

nextjs-bot commented Jan 2, 2026 •

Copy link
Copy Markdown
Contributor

✅ Tests Passed

Updated 2026-01-03 10:44:34 UTC · Commit: f1af452

let enabledTypeScript = await verifyTypeScript(opts)
// Start TypeScript verification in the background to avoid blocking startup.
// The result will be awaited when first needed in the aggregated handler.
let enabledTypeScript = false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Race condition where TypeScript verification state is captured before the background promise completes, causing incorrect conditional logic downstream.

View Details
📝 Patch Details
diff --git a/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts b/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts
index 2b103c59e8..4fab15202b 100644
--- a/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts
+++ b/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts
@@ -387,6 +387,13 @@ async function startWatcher(
 
     let initialWatchTime = performance.now() + performance.timeOrigin
     wp.on('aggregated', async () => {
+      // Ensure the deferred TypeScript verification is complete before capturing
+      // the TypeScript status to avoid a race condition where the background promise
+      // completes after this aggregation event fires but before we capture the status.
+      if (!tsVerificationComplete) {
+        await tsVerificationPromise
+      }
+
       let writeEnvDefinitions = false
       let typescriptStatusFromLastAggregation = enabledTypeScript
       let middlewareMatchers: ProxyMatcher[] | undefined
@@ -1126,11 +1133,6 @@ async function startWatcher(
         }
         prevSortedRoutes = sortedRoutes
 
-        // Ensure the deferred TypeScript verification is complete before proceeding
-        if (!tsVerificationComplete) {
-          await tsVerificationPromise
-        }
-
         if (enabledTypeScript) {
           // Using === false to make the check clearer.
           if (typescriptStatusFromLastAggregation === false) {

Analysis

Race condition in TypeScript verification state capture during dev server startup

What fails: The aggregated file watcher event handler in setup-dev-bundler.ts incorrectly captures TypeScript verification state before the background promise completes. If the first file watcher aggregation event fires before the background TypeScript verification promise resolves, it captures an outdated false state, causing unnecessary re-verification and config reloading when the promise eventually completes.

How to reproduce:

  1. Start Next.js dev server with TypeScript installed but no .ts files initially present
  2. The background verifyTypeScript(opts) promise starts at line 377 but is not awaited
  3. If the file watcher's first 'aggregated' event fires before this promise completes:
    • Line 391 captures typescriptStatusFromLastAggregation = false (promise not resolved yet)
    • Lines 415-595 process files (may or may not find TypeScript files)
    • Later at line 1130, the promise gets awaited and resolves, setting enabledTypeScript = true
    • Line 1136 checks if TypeScript transitioned from false to true
    • Line 1138-1143 triggers unnecessary re-verification and sets tsconfigChange = true

Result: Unnecessary tsconfigChange = true causes config reloading, Turbopack project updates, and webpack configuration reprocessing on the first aggregation, even though TypeScript was already verified by the background process.

Expected: The typescriptStatusFromLastAggregation should reflect the actual TypeScript state before the aggregation began. If the background promise completes with enabledTypeScript = true, this completion should not trigger re-verification - only file-based TypeScript discovery during the aggregation should trigger re-verification.

Fix: Move the TypeScript promise wait to the beginning of the aggregated event handler, before capturing typescriptStatusFromLastAggregation. This ensures the background verification completes before capturing the initial state, preventing the race condition where the promise resolution is mistaken for TypeScript becoming enabled during this aggregation.

@nextjs-bot

nextjs-bot commented Jan 2, 2026 •

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 4 regressions, 8 improvements

Metric Canary PR Change
node_modules Size 457 MB 457 MB 🔴 +111 kB (+0%)
Turbo Build Time 4.125s 4.160s 🔴 +35ms (+1%)
Cold (First Request) 1.124s 1.168s 🔴 +44ms (+4%)
Webpack Build Time (cached) 13.843s 13.946s 🔴 +103ms (+1%)
Turbo Build Time (cached) 4.157s 4.044s 🟢 113ms (-3%)
Cold (Listen) 455ms 405ms 🟢 50ms (-11%)
Warm (Listen) 455ms 406ms 🟢 49ms (-11%)
Warm (First Request) 401ms 343ms 🟢 58ms (-14%)
Webpack Build Time 13.763s 13.753s 🟢 10ms (0%)
Webpack Cold (Listen) 455ms 405ms 🟢 50ms (-11%)
Webpack Warm (Listen) 457ms 405ms 🟢 52ms (-11%)
Webpack Warm (First Request) 1.830s 1.816s 🟢 14ms (-1%)
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 10ms AND < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 405ms 🟢 50ms (-11%)
Cold (First Request) 1.124s 1.168s 🔴 +44ms (+4%)
Warm (Listen) 455ms 406ms 🟢 49ms (-11%)
Warm (First Request) 401ms 343ms 🟢 58ms (-14%)
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 405ms 🟢 50ms (-11%)
Cold (First Request) 1.821s 1.813s ✓
Warm (Listen) 457ms 405ms 🟢 52ms (-11%)
Warm (First Request) 1.830s 1.816s 🟢 14ms (-1%)

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.125s 4.160s 🔴 +35ms (+1%)
Cached Build 4.157s 4.044s 🟢 113ms (-3%)
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 13.763s 13.753s 🟢 10ms (0%)
Cached Build 13.843s 13.946s 🔴 +103ms (+1%)
node_modules Size 457 MB 457 MB 🔴 +111 kB (+0%) ▁████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Client Bundles (main, webpack) (Turbopack)
Canary PR Change
02069f30d0d06047.js gzip 12.6 kB N/A -
089159762797868b.js gzip 39.7 kB N/A -
0b02037753b0b4f1.js gzip 8.39 kB N/A -
0b54c5fafa2733c8.js gzip 6.3 kB N/A -
19754beb0ed18b96.js gzip 161 B N/A -
1e2fda25d939c4f8.js gzip 5.48 kB N/A -
24ae09d915c5342b.js gzip 449 B N/A -
27810823d87cd399.js gzip 165 B N/A -
3143edb75fc4a439.js gzip 225 B N/A -
3c829086eec678a3.js gzip 162 B N/A -
4473c84e5b1ecd43.js gzip 13.1 kB N/A -
484a114ec46812db.js gzip 8.38 kB N/A -
4c3cbe92816ec967.js gzip 2.29 kB N/A -
58fa317e3b5181d3.js gzip 8.33 kB N/A -
5999d057f7b2b7db.js gzip 8.41 kB N/A -
606861785163..490.css gzip 110 B 110 B ✓
63087ec0f64d60e0.js gzip 162 B N/A -
70b01b754af09302.js gzip 163 B N/A -
77edc4893a7b88b6.js gzip 10.2 kB N/A -
7d974a69f93c95b2.js gzip 65.6 kB N/A -
85e5a9da88552af4.js gzip 12.8 kB N/A -
8646ad52848abe04.js gzip 162 B N/A -
9795f91b63a577e9.js gzip 160 B N/A -
9e8311494c07a7bc.js gzip 7.41 kB N/A -
a12334fca185dcf1.js gzip 8.4 kB N/A -
a6dad97d9634a72d.js gzip 39.4 kB 39.4 kB ✓
a6dad97d9634...js.map gzip 39.9 kB 39.9 kB ✓
adddbdae2b130e8f.js gzip 69.9 kB N/A -
af6e69f7f2b62b03.js gzip 163 B N/A -
b6baa11b4e06ffa0.js gzip 8.38 kB N/A -
bd8184425e096fd5.js gzip 8.33 kB N/A -
ca841edfdebb1d6c.js gzip 159 B N/A -
d579a3be9548c23e.js gzip 10 kB N/A -
d930e035d8e37af5.js gzip 168 B N/A -
dac0c32b8825306c.js gzip 9.62 kB N/A -
db86f4450b7f2f2c.js gzip 165 B N/A -
e4c2f244236b04a7.js gzip 9.11 kB N/A -
e73fd3fe0b24cac9.js gzip 176 B N/A -
e7e00b1389b16abe.js gzip 214 B N/A -
f82cba3977d0b628.js gzip 1.47 kB N/A -
fc1cc1e2f7d79b4e.js gzip 167 B N/A -
fd8715ff3d58edc1.js gzip 8.44 kB N/A -
turbopack-HASH.js gzip 4.05 kB 4.03 kB ✓
044236a3c8fa8786.js gzip N/A 161 B -
08164710c41f8d24.js gzip N/A 5.49 kB -
096056d9d41999fc.js gzip N/A 12.6 kB -
09f8a8ff6d2dee18.js gzip N/A 7.4 kB -
1478eb435a0bee23.js gzip N/A 213 B -
14a89c7337562a0d.js gzip N/A 8.41 kB -
16259c56ab84126f.js gzip N/A 6.3 kB -
1a817045a1531811.js gzip N/A 225 B -
2973a44ed012a2b1.js gzip N/A 8.39 kB -
3eec7ccab26ca61a.js gzip N/A 39.7 kB -
43ddee7f2b2cc43c.js gzip N/A 8.33 kB -
46ee13060cfd60ad.js gzip N/A 65.6 kB -
57b64dd6a91f71b4.js gzip N/A 165 B -
62766be727774030.js gzip N/A 169 B -
63d838cacf795d8a.js gzip N/A 1.47 kB -
6833dcfe2801259c.js gzip N/A 158 B -
684d38ad3bb66acc.js gzip N/A 10.2 kB -
716e63d1cec92122.js gzip N/A 69.9 kB -
72adbe84e4f22cdb.js gzip N/A 8.44 kB -
793b8540179d16ed.js gzip N/A 449 B -
88ccf3270fb50d89.js gzip N/A 8.38 kB -
8bc9d87933c91b60.js gzip N/A 175 B -
8c9f85edc1dab350.js gzip N/A 163 B -
8ea24c2e2816a2fd.js gzip N/A 162 B -
93dcffbcde961e8a.js gzip N/A 163 B -
965e64477529d230.js gzip N/A 8.41 kB -
a0f7ce4a21d94b45.js gzip N/A 10 kB -
a488536570d8cbc9.js gzip N/A 12.8 kB -
b5b270dbde99572e.js gzip N/A 9.11 kB -
b61b0800bf850ee9.js gzip N/A 167 B -
b8779d00a73130ac.js gzip N/A 162 B -
bdc9fd6392e02d75.js gzip N/A 2.29 kB -
dbefec92319c3c37.js gzip N/A 162 B -
dc9486dd309defeb.js gzip N/A 9.62 kB -
e43befb10fbc3a75.js gzip N/A 162 B -
ec04b93b2429ae27.js gzip N/A 8.38 kB -
ed272ab406ad65e0.js gzip N/A 8.33 kB -
f2a283a6e51b8589.js gzip N/A 13.1 kB -
f79d27963289bb95.js gzip N/A 162 B -
Total 429 kB 429 kB ✅ -17 B

Server

Middleware size (Turbopack)
Canary PR Change
middleware-b..fest.js gzip 793 B 788 B ✓
Total 793 B 788 B ✅ -5 B
Next Runtimes (Turbopack)
Canary PR Change
app-page-exp...dev.js gzip 301 kB 301 kB ✓
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB ✓
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB ✓
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB ✓
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 59.9 kB ✓
Total 2.67 MB 2.67 MB ⚠️ +1 B
Build Details
Client Build Manifests (Turbopack)
Canary PR Change
_buildManifest.js gzip 452 B 450 B ✓
Total 452 B 450 B ✅ -2 B

📦 Webpack

Client

Client Bundles (main, webpack) (Webpack)
Canary PR Change
2086.HASH.js gzip 169 B N/A -
2161-HASH.js gzip 5.39 kB N/A -
2747-HASH.js gzip 4.48 kB N/A -
4322-HASH.js gzip 51.2 kB N/A -
ec793fe8-HASH.js gzip 62.3 kB N/A -
framework-HASH.js gzip 59.8 kB 59.8 kB ✓
main-app-HASH.js gzip 251 B 254 B 🔴 +3 B (+1%)
main-HASH.js gzip 38.4 kB 38.7 kB ✓
webpack-HASH.js gzip 1.68 kB 1.69 kB ✓
1596.HASH.js gzip N/A 169 B -
2658-HASH.js gzip N/A 51 kB -
6349-HASH.js gzip N/A 4.46 kB -
7019-HASH.js gzip N/A 5.41 kB -
b17a3386-HASH.js gzip N/A 62.3 kB -
Total 224 kB 224 kB ⚠️ +117 B
Legacy Client Bundles (polyfills) (Webpack)
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB ✓
Total 39.4 kB 39.4 kB ✓
Client Pages (Webpack)
Canary PR Change
_app-HASH.js gzip 194 B 193 B ✓
_error-HASH.js gzip 182 B 182 B ✓
css-HASH.js gzip 336 B 335 B ✓
dynamic-HASH.js gzip 1.8 kB 1.8 kB ✓
edge-ssr-HASH.js gzip 256 B 256 B ✓
head-HASH.js gzip 352 B 349 B ✓
hooks-HASH.js gzip 385 B 384 B ✓
image-HASH.js gzip 580 B 580 B ✓
index-HASH.js gzip 259 B 258 B ✓
link-HASH.js gzip 2.5 kB 2.51 kB ✓
routerDirect..HASH.js gzip 319 B 317 B ✓
script-HASH.js gzip 385 B 387 B ✓
withRouter-HASH.js gzip 316 B 315 B ✓
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Total 7.97 kB 7.96 kB ✅ -8 B

Server

Edge SSR bundle Size (Webpack)
Canary PR Change
edge-ssr.js gzip 124 kB 124 kB ✓
page.js gzip 237 kB 238 kB ✓
Total 362 kB 362 kB ⚠️ +611 B
Middleware size (Webpack)
Canary PR Change
middleware-b..fest.js gzip 653 B 655 B ✓
middleware-r..fest.js gzip 155 B 156 B ✓
middleware.js gzip 32.8 kB 33 kB ✓
edge-runtime..pack.js gzip 846 B 846 B ✓
Total 34.4 kB 34.6 kB ⚠️ +221 B
Next Runtimes (Webpack)
Canary PR Change
app-page-exp...dev.js gzip 301 kB 301 kB ✓
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB ✓
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB ✓
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB ✓
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 59.9 kB ✓
Total 2.67 MB 2.67 MB ✅ -1 B
Build Details
Client Build Manifests (Webpack)
Canary PR Change
_buildManifest.js gzip 738 B 738 B ✓
Total 738 B 738 B ✓
build cache (Webpack)
Canary PR Change
0.pack gzip 3.6 MB 3.61 MB 🔴 +7.33 kB (+0%)
index.pack gzip 100 kB 98.5 kB 🟢 1.53 kB (-2%)
Total 3.7 MB 3.71 MB ⚠️ +5.8 kB

@nextjs-bot

nextjs-bot commented Jan 5, 2026 •

Copy link
Copy Markdown
Contributor

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
buildDuration 17.1s 14.9s N/A
buildDurationCached 13.9s 10.8s N/A
nodeModulesSize 457 MB 457 MB ⚠️ +61.6 kB
nextStartRea..uration (ms) 717ms 714ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
2086.HASH.js gzip 169 B 169 B ✓
2161-HASH.js gzip 5.39 kB 5.41 kB N/A
2747-HASH.js gzip 4.48 kB 4.46 kB N/A
4322-HASH.js gzip 51.2 kB 51 kB N/A
ec793fe8-HASH.js gzip 62.3 kB 62.3 kB N/A
framework-HASH.js gzip 59.8 kB 59.8 kB N/A
main-app-HASH.js gzip 251 B 253 B N/A
main-HASH.js gzip 38.4 kB 38.7 kB ⚠️ +368 B
webpack-HASH.js gzip 1.68 kB 1.69 kB N/A
Overall change 38.5 kB 38.9 kB ⚠️ +368 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js perf-dev-lazy-loading 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 perf-dev-lazy-loading Change
_app-HASH.js gzip 194 B 193 B N/A
_error-HASH.js gzip 182 B 182 B ✓
css-HASH.js gzip 336 B 335 B N/A
dynamic-HASH.js gzip 1.8 kB 1.8 kB N/A
edge-ssr-HASH.js gzip 256 B 256 B ✓
head-HASH.js gzip 352 B 349 B N/A
hooks-HASH.js gzip 385 B 384 B N/A
image-HASH.js gzip 580 B 580 B ✓
index-HASH.js gzip 259 B 258 B N/A
link-HASH.js gzip 2.5 kB 2.51 kB N/A
routerDirect..HASH.js gzip 319 B 317 B N/A
script-HASH.js gzip 385 B 387 B N/A
withRouter-HASH.js gzip 316 B 315 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Overall change 1.12 kB 1.12 kB ✓
Client Build Manifests
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
_buildManifest.js gzip 738 B 738 B ✓
Overall change 738 B 738 B ✓
Rendered Page Sizes
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
index.html gzip 523 B 525 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 Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
edge-ssr.js gzip 124 kB 124 kB N/A
page.js gzip 237 kB 238 kB ⚠️ +597 B
Overall change 237 kB 238 kB ⚠️ +597 B
Middleware size Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
middleware-b..fest.js gzip 652 B 655 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 32.8 kB 32.9 kB ⚠️ +182 B
edge-runtime..pack.js gzip 846 B 846 B ✓
Overall change 33.6 kB 33.8 kB ⚠️ +182 B
Next Runtimes
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
app-page-exp...dev.js gzip 301 kB 301 kB ✓
app-page-exp..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 301 kB 301 kB N/A
app-page-tur..prod.js gzip 156 kB 156 kB ✓
app-page-tur...dev.js gzip 298 kB 298 kB N/A
app-page-tur..prod.js gzip 154 kB 154 kB ✓
app-page.run...dev.js gzip 298 kB 298 kB N/A
app-page.run..prod.js gzip 154 kB 154 kB ✓
app-route-ex...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-ex..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.7 kB 68.7 kB ✓
app-route-tu..prod.js gzip 47.5 kB 47.5 kB ✓
app-route-tu...dev.js gzip 68.3 kB 68.3 kB ✓
app-route-tu..prod.js gzip 47.3 kB 47.3 kB ✓
app-route.ru...dev.js gzip 68.3 kB 68.3 kB ✓
app-route.ru..prod.js gzip 47.3 kB 47.3 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 41.1 kB 41.1 kB ✓
pages-api-tu..prod.js gzip 31.2 kB 31.2 kB ✓
pages-api.ru...dev.js gzip 41 kB 41 kB ✓
pages-api.ru..prod.js gzip 31.2 kB 31.2 kB ✓
pages-turbo....dev.js gzip 50.7 kB 50.7 kB ✓
pages-turbo...prod.js gzip 38.2 kB 38.2 kB ✓
pages.runtim...dev.js gzip 50.6 kB 50.6 kB ✓
pages.runtim..prod.js gzip 38.1 kB 38.1 kB ✓
server.runti..prod.js gzip 59.9 kB 59.9 kB ✓
Overall change 1.77 MB 1.77 MB ✓
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js perf-dev-lazy-loading Change
0.pack gzip 3.61 MB 3.61 MB ⚠️ +4.55 kB
index.pack gzip 98.8 kB 98.9 kB N/A
Overall change 3.61 MB 3.61 MB ⚠️ +4.55 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
       numHashes: NaN,
       bitArray: [],
     },
-    "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+    "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
     "/_error": [
-      "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+      "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
     ],
     "/css": [
       "static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
-      "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+      "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
     ],
     "/dynamic": [
-      "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+      "static\u002Fchunks\u002Fpages\u002Fdynamic-8ed3486bb68dd6c6.js",
     ],
     "/edge-ssr": [
-      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
     ],
-    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
-    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
     "/image": [
-      "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
-      "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+      "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+      "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
     ],
-    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
     "/routerDirect": [
-      "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+      "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
     ],
     "/script": [
-      "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+      "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
     ],
     "/withRouter": [
-      "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+      "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
     ],
     sortedPages: [
       "\u002F",
Diff for dynamic-HASH.js
@@ -1,17 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 1231: /***/ (
-      module,
+    /***/ 2604: /***/ (
+      __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(4464);
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/dynamic",
+        function () {
+          return __webpack_require__(3643);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
 
-    /***/ 2101: /***/ (
+    /***/ 3401: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -38,24 +45,63 @@
       /***/
     },
 
-    /***/ 3458: /***/ (
+    /***/ 3643: /***/ (
       __unused_webpack_module,
-      __unused_webpack_exports,
+      __webpack_exports__,
       __webpack_require__
     ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/dynamic",
-        function () {
-          return __webpack_require__(9381);
-        },
-      ]);
-      if (false) {
-      }
+      "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__(3108);
+      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(3973);
+      /* 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() */ 1596)
+            .then(__webpack_require__.bind(__webpack_require__, 1596))
+            .then((mod) => mod.Hello),
+        {
+          loadableGenerated: {
+            webpack: () => [/*require.resolve*/ 1596],
+          },
+        }
+      );
+      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;
 
       /***/
     },
 
-    /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3660: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -88,7 +134,7 @@
         __webpack_require__(4312)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(9799)
+        __webpack_require__(4539)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +234,17 @@
       /***/
     },
 
-    /***/ 9381: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
+    /***/ 3973: /***/ (
+      module,
+      __unused_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__(3108);
-      /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1231);
-      /* 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() */ 2086)
-            .then(__webpack_require__.bind(__webpack_require__, 2086))
-            .then((mod) => mod.Hello),
-        {
-          loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 2086],
-          },
-        }
-      );
-      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;
+      module.exports = __webpack_require__(3660);
 
       /***/
     },
 
-    /***/ 9799: /***/ (
+    /***/ 4539: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -286,7 +286,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(4312)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(2101);
+      const _loadablecontextsharedruntime = __webpack_require__(3401);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -524,7 +524,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(3458)
+      __webpack_exec__(2604)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [676],
   {
-    /***/ 1564: /***/ (
+    /***/ 7046: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/edge-ssr",
+        function () {
+          return __webpack_require__(7142);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7142: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -20,30 +37,13 @@
 
       /***/
     },
-
-    /***/ 4300: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/edge-ssr",
-        function () {
-          return __webpack_require__(1564);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4300)
+      __webpack_exec__(7046)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for head-HASH.js
@@ -1,34 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [5350],
   {
-    /***/ 1548: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/head",
-        function () {
-          return __webpack_require__(4282);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 3952: /***/ (
+    /***/ 3770: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(1653);
+      module.exports = __webpack_require__(9025);
 
       /***/
     },
 
-    /***/ 4282: /***/ (
+    /***/ 6236: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(3952);
+        __webpack_require__(3770);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
 
       /***/
     },
+
+    /***/ 6510: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/head",
+        function () {
+          return __webpack_require__(6236);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(1548)
+      __webpack_exec__(6510)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for index-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3332],
   {
-    /***/ 6376: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/",
-        function () {
-          return __webpack_require__(8460);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 8460: /***/ (
+    /***/ 830: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -36,13 +19,30 @@
 
       /***/
     },
+
+    /***/ 1938: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/",
+        function () {
+          return __webpack_require__(830);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6376)
+      __webpack_exec__(1938)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,7 +1,220 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 857: /***/ (module, exports, __webpack_require__) => {
+    /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "useIntersection", {
+        enumerable: true,
+        get: function () {
+          return useIntersection;
+        },
+      });
+      const _react = __webpack_require__(4312);
+      const _requestidlecallback = __webpack_require__(9413);
+      const hasIntersectionObserver =
+        typeof IntersectionObserver === "function";
+      const observers = new Map();
+      const idList = [];
+      function createObserver(options) {
+        const id = {
+          root: options.root || null,
+          margin: options.rootMargin || "",
+        };
+        const existing = idList.find(
+          (obj) => obj.root === id.root && obj.margin === id.margin
+        );
+        let instance;
+        if (existing) {
+          instance = observers.get(existing);
+          if (instance) {
+            return instance;
+          }
+        }
+        const elements = new Map();
+        const observer = new IntersectionObserver((entries) => {
+          entries.forEach((entry) => {
+            const callback = elements.get(entry.target);
+            const isVisible =
+              entry.isIntersecting || entry.intersectionRatio > 0;
+            if (callback && isVisible) {
+              callback(isVisible);
+            }
+          });
+        }, options);
+        instance = {
+          id,
+          observer,
+          elements,
+        };
+        idList.push(id);
+        observers.set(id, instance);
+        return instance;
+      }
+      function observe(element, callback, options) {
+        const { id, observer, elements } = createObserver(options);
+        elements.set(element, callback);
+        observer.observe(element);
+        return function unobserve() {
+          elements.delete(element);
+          observer.unobserve(element);
+          // Destroy observer when there's nothing left to watch:
+          if (elements.size === 0) {
+            observer.disconnect();
+            observers.delete(id);
+            const index = idList.findIndex(
+              (obj) => obj.root === id.root && obj.margin === id.margin
+            );
+            if (index > -1) {
+              idList.splice(index, 1);
+            }
+          }
+        };
+      }
+      function useIntersection({ rootRef, rootMargin, disabled }) {
+        const isDisabled = disabled || !hasIntersectionObserver;
+        const [visible, setVisible] = (0, _react.useState)(false);
+        const elementRef = (0, _react.useRef)(null);
+        const setElement = (0, _react.useCallback)((element) => {
+          elementRef.current = element;
+        }, []);
+        (0, _react.useEffect)(() => {
+          if (hasIntersectionObserver) {
+            if (isDisabled || visible) return;
+            const element = elementRef.current;
+            if (element && element.tagName) {
+              const unobserve = observe(
+                element,
+                (isVisible) => isVisible && setVisible(isVisible),
+                {
+                  root: rootRef?.current,
+                  rootMargin,
+                }
+              );
+              return unobserve;
+            }
+          } else {
+            if (!visible) {
+              const idleCallback = (0,
+              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+              return () =>
+                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+            }
+          }
+          // eslint-disable-next-line react-hooks/exhaustive-deps
+        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+        const resetVisible = (0, _react.useCallback)(() => {
+          setVisible(false);
+        }, []);
+        return [setElement, visible, resetVisible];
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-intersection.js.map
+
+      /***/
+    },
+
+    /***/ 3351: /***/ (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__(4312);
+      function useMergedRef(refA, refB) {
+        const cleanupA = (0, _react.useRef)(null);
+        const cleanupB = (0, _react.useRef)(null);
+        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+        // (because it hasn't been updated for React 19)
+        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+        return (0, _react.useCallback)(
+          (current) => {
+            if (current === null) {
+              const cleanupFnA = cleanupA.current;
+              if (cleanupFnA) {
+                cleanupA.current = null;
+                cleanupFnA();
+              }
+              const cleanupFnB = cleanupB.current;
+              if (cleanupFnB) {
+                cleanupB.current = null;
+                cleanupFnB();
+              }
+            } else {
+              if (refA) {
+                cleanupA.current = applyRef(refA, current);
+              }
+              if (refB) {
+                cleanupB.current = applyRef(refB, current);
+              }
+            }
+          },
+          [refA, refB]
+        );
+      }
+      function applyRef(refA, current) {
+        if (typeof refA === "function") {
+          const cleanup = refA(current);
+          if (typeof cleanup === "function") {
+            return cleanup;
+          } else {
+            return () => refA(null);
+          }
+        } else {
+          refA.current = current;
+          return () => {
+            refA.current = null;
+          };
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=use-merged-ref.js.map
+
+      /***/
+    },
+
+    /***/ 3440: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(4757);
+
+      /***/
+    },
+
+    /***/ 4757: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
           return useLinkStatus;
         },
       });
-      const _interop_require_wildcard = __webpack_require__(8781);
+      const _interop_require_wildcard = __webpack_require__(1162);
       const _jsxruntime = __webpack_require__(3108);
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(4312)
       );
-      const _resolvehref = __webpack_require__(4055);
-      const _islocalurl = __webpack_require__(7175);
-      const _formaturl = __webpack_require__(9674);
-      const _utils = __webpack_require__(7424);
-      const _addlocale = __webpack_require__(589);
-      const _routercontextsharedruntime = __webpack_require__(7010);
-      const _useintersection = __webpack_require__(2330);
-      const _getdomainlocale = __webpack_require__(7207);
-      const _addbasepath = __webpack_require__(9942);
-      const _usemergedref = __webpack_require__(8067);
-      const _erroronce = __webpack_require__(1945);
+      const _resolvehref = __webpack_require__(4691);
+      const _islocalurl = __webpack_require__(4763);
+      const _formaturl = __webpack_require__(3246);
+      const _utils = __webpack_require__(7372);
+      const _addlocale = __webpack_require__(1809);
+      const _routercontextsharedruntime = __webpack_require__(2254);
+      const _useintersection = __webpack_require__(2774);
+      const _getdomainlocale = __webpack_require__(8803);
+      const _addbasepath = __webpack_require__(5834);
+      const _usemergedref = __webpack_require__(3351);
+      const _erroronce = __webpack_require__(6021);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -417,168 +630,43 @@
       /***/
     },
 
-    /***/ 1945: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
+    /***/ 5326: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(9058);
         },
-      });
-      let errorOnce = (_) => {};
+      ]);
       if (false) {
-      } //# sourceMappingURL=error-once.js.map
+      }
 
       /***/
     },
 
-    /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+    /***/ 6021: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "useIntersection", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return useIntersection;
+          return errorOnce;
         },
       });
-      const _react = __webpack_require__(4312);
-      const _requestidlecallback = __webpack_require__(601);
-      const hasIntersectionObserver =
-        typeof IntersectionObserver === "function";
-      const observers = new Map();
-      const idList = [];
-      function createObserver(options) {
-        const id = {
-          root: options.root || null,
-          margin: options.rootMargin || "",
-        };
-        const existing = idList.find(
-          (obj) => obj.root === id.root && obj.margin === id.margin
-        );
-        let instance;
-        if (existing) {
-          instance = observers.get(existing);
-          if (instance) {
-            return instance;
-          }
-        }
-        const elements = new Map();
-        const observer = new IntersectionObserver((entries) => {
-          entries.forEach((entry) => {
-            const callback = elements.get(entry.target);
-            const isVisible =
-              entry.isIntersecting || entry.intersectionRatio > 0;
-            if (callback && isVisible) {
-              callback(isVisible);
-            }
-          });
-        }, options);
-        instance = {
-          id,
-          observer,
-          elements,
-        };
-        idList.push(id);
-        observers.set(id, instance);
-        return instance;
-      }
-      function observe(element, callback, options) {
-        const { id, observer, elements } = createObserver(options);
-        elements.set(element, callback);
-        observer.observe(element);
-        return function unobserve() {
-          elements.delete(element);
-          observer.unobserve(element);
-          // Destroy observer when there's nothing left to watch:
-          if (elements.size === 0) {
-            observer.disconnect();
-            observers.delete(id);
-            const index = idList.findIndex(
-              (obj) => obj.root === id.root && obj.margin === id.margin
-            );
-            if (index > -1) {
-              idList.splice(index, 1);
-            }
-          }
-        };
-      }
-      function useIntersection({ rootRef, rootMargin, disabled }) {
-        const isDisabled = disabled || !hasIntersectionObserver;
-        const [visible, setVisible] = (0, _react.useState)(false);
-        const elementRef = (0, _react.useRef)(null);
-        const setElement = (0, _react.useCallback)((element) => {
-          elementRef.current = element;
-        }, []);
-        (0, _react.useEffect)(() => {
-          if (hasIntersectionObserver) {
-            if (isDisabled || visible) return;
-            const element = elementRef.current;
-            if (element && element.tagName) {
-              const unobserve = observe(
-                element,
-                (isVisible) => isVisible && setVisible(isVisible),
-                {
-                  root: rootRef?.current,
-                  rootMargin,
-                }
-              );
-              return unobserve;
-            }
-          } else {
-            if (!visible) {
-              const idleCallback = (0,
-              _requestidlecallback.requestIdleCallback)(() => setVisible(true));
-              return () =>
-                (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
-            }
-          }
-          // eslint-disable-next-line react-hooks/exhaustive-deps
-        }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
-        const resetVisible = (0, _react.useCallback)(() => {
-          setVisible(false);
-        }, []);
-        return [setElement, visible, resetVisible];
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-intersection.js.map
-
-      /***/
-    },
-
-    /***/ 4972: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(7600);
-        },
-      ]);
+      let errorOnce = (_) => {};
       if (false) {
-      }
+      } //# sourceMappingURL=error-once.js.map
 
       /***/
     },
 
-    /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+    /***/ 8803: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
           return getDomainLocale;
         },
       });
-      const _normalizetrailingslash = __webpack_require__(151);
+      const _normalizetrailingslash = __webpack_require__(1315);
       const basePath =
         /* unused pure expression or super */ null && (false || "");
       function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
       /***/
     },
 
-    /***/ 7600: /***/ (
+    /***/ 9058: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -629,7 +717,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(7830);
+        __webpack_require__(3440);
       /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
 
       /***/
     },
-
-    /***/ 7830: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(857);
-
-      /***/
-    },
-
-    /***/ 8067: /***/ (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__(4312);
-      function useMergedRef(refA, refB) {
-        const cleanupA = (0, _react.useRef)(null);
-        const cleanupB = (0, _react.useRef)(null);
-        // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
-        // (this happens often if the user doesn't pass a ref to Link/Form/Image)
-        // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
-        // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
-        // (because it hasn't been updated for React 19)
-        // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
-        // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
-        return (0, _react.useCallback)(
-          (current) => {
-            if (current === null) {
-              const cleanupFnA = cleanupA.current;
-              if (cleanupFnA) {
-                cleanupA.current = null;
-                cleanupFnA();
-              }
-              const cleanupFnB = cleanupB.current;
-              if (cleanupFnB) {
-                cleanupB.current = null;
-                cleanupFnB();
-              }
-            } else {
-              if (refA) {
-                cleanupA.current = applyRef(refA, current);
-              }
-              if (refB) {
-                cleanupB.current = applyRef(refB, current);
-              }
-            }
-          },
-          [refA, refB]
-        );
-      }
-      function applyRef(refA, current) {
-        if (typeof refA === "function") {
-          const cleanup = refA(current);
-          if (typeof cleanup === "function") {
-            return cleanup;
-          } else {
-            return () => refA(null);
-          }
-        } else {
-          refA.current = current;
-          return () => {
-            refA.current = null;
-          };
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=use-merged-ref.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(4972)
+      __webpack_exec__(5326)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 1179: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9864);
-
-      /***/
-    },
-
-    /***/ 1640: /***/ (
+    /***/ 2014: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1179);
+        __webpack_require__(4169);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
       /***/
     },
 
-    /***/ 2172: /***/ (
+    /***/ 4169: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(9700);
+
+      /***/
+    },
+
+    /***/ 4414: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -54,7 +54,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/routerDirect",
         function () {
-          return __webpack_require__(1640);
+          return __webpack_require__(2014);
         },
       ]);
       if (false) {
@@ -68,7 +68,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2172)
+      __webpack_exec__(4414)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,17 +1,34 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 4977: /***/ (
+    /***/ 2591: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(326);
+      module.exports = __webpack_require__(4634);
 
       /***/
     },
 
-    /***/ 5887: /***/ (
+    /***/ 5030: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(7557);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7557: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +43,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4977);
+        __webpack_require__(2591);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
 
       /***/
     },
-
-    /***/ 6268: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(5887);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6268)
+      __webpack_exec__(5030)
     );
     /******/ 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],
   {
-    /***/ 1179: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(9864);
-
-      /***/
-    },
-
-    /***/ 2028: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/withRouter",
-        function () {
-          return __webpack_require__(4501);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 4501: /***/ (
+    /***/ 559: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(3108);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1179);
+        __webpack_require__(4169);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
 
       /***/
     },
+
+    /***/ 726: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/withRouter",
+        function () {
+          return __webpack_require__(559);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 4169: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(9700);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2028)
+      __webpack_exec__(726)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 2161-HASH.js

Diff too large to display

Diff for 2747-HASH.js

Diff too large to display

Diff for 4322-HASH.js
failed to diff
Diff for main-HASH.js

Diff too large to display

Diff for main-app-HASH.js
@@ -1,64 +1,64 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4977],
   {
-    /***/ 341: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
-
-    /***/ 8495: /***/ (
+    /***/ 283: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 375, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7413, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2972, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9898, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7508, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9854, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6043, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9261, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 9797, 23)
+        __webpack_require__.t.bind(__webpack_require__, 867, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2933, 23)
+        __webpack_require__.t.bind(__webpack_require__, 2463, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 4220, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1866, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 97, 23)
+        __webpack_require__.t.bind(__webpack_require__, 9667, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 464, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8822, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 619, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1717, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1464, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5366, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 5297)
+        __webpack_require__.bind(__webpack_require__, 1155)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7937, 23)
+        __webpack_require__.t.bind(__webpack_require__, 391, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7584, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7346, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6826, 23)
+        __webpack_require__.t.bind(__webpack_require__, 1340, 23)
       );
 
       /***/
     },
+
+    /***/ 2751: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [5639, 4322],
-      () => (__webpack_exec__(2193), __webpack_exec__(8495))
+      [8580, 2658],
+      () => (__webpack_exec__(9851), __webpack_exec__(283))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Commit: 1f6179b

@vercel vercel Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The import of getSupportedBrowsers should use the new lightweight module instead of the heavy build/utils to achieve the stated optimization goal.

View Details
📝 Patch Details
diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts
index c0b9d4c826..07c9e15f95 100644
--- a/packages/next/src/server/dev/hot-reloader-turbopack.ts
+++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts
@@ -97,7 +97,8 @@ import { devIndicatorServerState } from './dev-indicator-server-state'
 import { getDisableDevIndicatorMiddleware } from '../../next-devtools/server/dev-indicator-middleware'
 import { getRestartDevServerMiddleware } from '../../next-devtools/server/restart-dev-server-middleware'
 import { backgroundLogCompilationEvents } from '../../shared/lib/turbopack/compilation-events'
-import { getSupportedBrowsers, printBuildErrors } from '../../build/utils'
+import { getSupportedBrowsers } from '../../build/get-supported-browsers'
+import { printBuildErrors } from '../../build/utils'
 import {
   receiveBrowserLogsTurbopack,
   handleClientFileLogs,

Analysis

hot-reloader-turbopack imports getSupportedBrowsers from heavy module instead of lightweight extraction

What fails: hot-reloader-turbopack.ts imports getSupportedBrowsers from build/utils.ts (which loads many heavy server-side dependencies) instead of the dedicated lightweight module build/get-supported-browsers.ts, defeating the extraction's stated optimization goal.

How to reproduce:

# Examine the imports in hot-reloader-turbopack.ts
grep -n "getSupportedBrowsers\|printBuildErrors" packages/next/src/server/dev/hot-reloader-turbopack.ts

# Check what dependencies build/utils.ts loads:
head -60 packages/next/src/build/utils.ts

# Compare to the lightweight module:
cat packages/next/src/build/get-supported-browsers.ts

Result: Line 100 imports both functions from build/utils, which loads heavy dependencies including server modules, require-hook, node-polyfill-crypto, webpack plugins, etc. The lightweight module build/get-supported-browsers.ts only imports browserslist and a constant.

Expected: According to the comment in build/get-supported-browsers.ts: "Lightweight module for getting supported browsers. Extracted from build/utils.ts to avoid loading heavy dependencies in hot-reloader-turbopack." The import should split the two functions:

  • getSupportedBrowsers from ../../build/get-supported-browsers (lightweight)
  • printBuildErrors from ../../build/utils (only this needs the heavy module)

This optimization reduces module load time during hot-reloader initialization on dev server startup.

Fix applied: Split the import statement to use the lightweight module for getSupportedBrowsers while keeping printBuildErrors on the heavy module.

Fix on Vercel

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

Labels

CI Bypass Graphite Optimization Ignore Graphite CI optimizations, run the full CI suite. https://graphite.dev/docs/stacking-and-ci created-by: Next.js team PRs by the Next.js team. locked tests type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants