Skip to content

feat: Add Bun test parity with Node.js#33

Open
celicoo wants to merge 26 commits intoremove-nodejs-supportfrom
bun-test-parity
Open

feat: Add Bun test parity with Node.js#33
celicoo wants to merge 26 commits intoremove-nodejs-supportfrom
bun-test-parity

Conversation

@celicoo
Copy link
Contributor

@celicoo celicoo commented Jan 18, 2026

Bun Test Parity with Node.js

Complete CI test coverage with strict 1:1 parity between Node.js and Bun runtimes. All test suites now run on both runtimes using 4-core GitHub-hosted runners.

Summary

  • Enable all test pipelines with ubuntu-latest-4-cores runners
  • Strict 1:1 parity: Every Node.js test job has a corresponding Bun equivalent
  • ~120 matrix jobs total (60 Node.js + 60 Bun)

Test Coverage

Test Suite Node.js Bun Runner Status
Unit Tests test-unit test-unit-bun 2-core ✅ Active
Unit Tests (Windows) test-unit-windows test-unit-bun-windows Windows ✅ Active
Unit Tests (macOS) - test-unit-bun-macos macOS ✅ Active
Dev Mode (6 groups) test-dev test-dev-bun 4-core ✅ Active
Prod Mode (7 groups) test-prod test-prod-bun 4-core ✅ Active
Integration (13 groups) test-integration test-integration-bun 4-core ✅ Active
PPR Dev (6 groups) test-ppr-dev test-ppr-dev-bun 4-core ✅ Active
PPR Prod (7 groups) test-ppr-prod test-ppr-prod-bun 4-core ✅ Active
PPR Integration test-ppr-integration test-ppr-integration-bun 4-core ✅ Active
Experimental Dev (6 groups) test-experimental-dev test-experimental-dev-bun 4-core ✅ Active
Experimental Prod (7 groups) test-experimental-prod test-experimental-prod-bun 4-core ✅ Active
Experimental Integration test-experimental-integration test-experimental-integration-bun 4-core ✅ Active
New Tests (Dev) (5 groups) test-new-tests-dev test-new-tests-dev-bun 2-core ✅ Active
New Tests (Prod) (5 groups) test-new-tests-start test-new-tests-start-bun 2-core ✅ Active
Browser (Firefox/Safari) test-firefox-safari test-firefox-safari-bun 2-core ✅ Active
Windows Dev/Prod/Integration Disabled Disabled Windows ⏸️ Runner issues

Why 4-Core Runners?

The test infrastructure has a hardcoded 10-second server startup timeout (/test/lib/next-modes/base.ts:89). On 2-core shared runners, server startup often exceeds this limit. 4-core runners provide adequate resources for reliable test execution while maintaining fast feedback loops.

Changes

Workflow Updates

  • Enable test-dev, test-prod, test-integration with 4-core runners
  • Enable test-ppr-* (dev, prod, integration) with 4-core runners
  • Enable test-experimental-* (dev, prod, integration) with 4-core runners
  • Add Bun equivalents for all test suites
  • Add test-firefox-safari-bun for browser testing parity
  • Split test-unit-bun-canary into non-blocking job (canary builds may have regressions)

Infrastructure

  • All E2E tests use runs_on_labels: '["ubuntu-latest-4-cores"]'
  • Requires GitHub Team plan for larger runner access

Non-Blocking Jobs

  • test-unit-bun-canary - Tests with Bun canary builds, failures don't block CI

Still Disabled

Windows test jobs remain disabled due to separate runner resource/timeout issues:

  • test-dev-windows / test-dev-bun-windows
  • test-integration-windows / test-integration-bun-windows
  • test-prod-windows / test-prod-bun-windows

🤖 Generated with Claude Code

Plan to extend CI test coverage to achieve 1:1 test parity between
Node.js and Bun runtimes across integration, dev, and prod tests.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions
Copy link
Contributor

github-actions bot commented Jan 18, 2026

Hi there 👋

It looks like this PR introduces broken links to the docs, please take a moment to fix them before merging:

Broken link Type File
/docs/app/api-reference/file-conventions/not-found link /errors/404-get-initial-props.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/404-get-initial-props.mdx
/docs/app/api-reference/file-conventions/not-found link /errors/404-get-initial-props.mdx
/docs/app/guides/migrating/app-router-migration link /errors/api-routes-static-export.mdx
/docs/app/api-reference/file-conventions/route link /errors/api-routes-static-export.mdx
/docs/pages/guides/static-exports link /errors/api-routes-static-export.mdx
/docs/app/api-reference/file-conventions/route link /errors/api-routes-static-export.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/app-container-deprecated.mdx
/docs/app/api-reference/components/link#href-required link /errors/app-dir-dynamic-href.mdx
/docs/app/getting-started/partial-prerendering#dynamic-rendering link /errors/app-static-to-dynamic-error.mdx
/docs/app/getting-started/partial-prerendering#dynamic-rendering link /errors/app-static-to-dynamic-error.mdx
/docs/architecture/nextjs-compiler link /errors/babel-font-loader-conflict.mdx
/docs/pages/guides/babel link /errors/babel-font-loader-conflict.mdx
/docs/pages/api-reference/file-conventions/middleware link /errors/beta-middleware.mdx
/docs/app/api-reference/functions/cacheLife link /errors/blocking-route.mdx
/docs/app/api-reference/functions/headers link /errors/blocking-route.mdx
/docs/app/api-reference/functions/cookies link /errors/blocking-route.mdx
/docs/app/api-reference/functions/draft-mode link /errors/blocking-route.mdx
/docs/app/api-reference/functions/connection link /errors/blocking-route.mdx
/docs/app/api-reference/functions/cacheLife link /errors/blocking-route.mdx
/docs/app/api-reference/functions/cacheTag link /errors/blocking-route.mdx
/docs/pages/guides/custom-server link /errors/build-dir-not-writeable.mdx
/docs/pages/guides/custom-server link /errors/build-dir-not-writeable.mdx
/docs/app/getting-started/css link /errors/built-in-css-disabled.mdx
/docs/pages/api-reference/config/next-config-js/webpack link /errors/built-in-css-disabled.mdx
/docs/app/guides/upgrading/codemods link /errors/built-in-next-font.mdx
/docs/app/api-reference/components/font link /errors/built-in-next-font.mdx
/docs/app/api-reference/functions/revalidateTag link /errors/cache-bypass-in-dev.mdx
/docs/app/api-reference/directives/use-cache link /errors/cache-bypass-in-dev.mdx
/docs/pages/api-reference/file-conventions/public-folder link /errors/can-not-output-to-public.mdx
/docs/pages/api-reference/file-conventions/public-folder link /errors/can-not-output-to-static.mdx
/docs/app/getting-started/server-and-client-components link /errors/class-component-in-server-component.mdx
/docs/pages/building-your-application/routing/custom-error#more-advanced-error-page-customizing link /errors/client-side-exception-occurred.mdx
/docs/pages/api-reference/file-conventions/public-folder link /errors/conflicting-public-file-page.mdx
/docs/pages/building-your-application/data-fetching/get-static-paths link /errors/conflicting-ssg-paths.mdx
/docs/app/getting-started/server-and-client-components#examples link /errors/context-in-server-component.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/css-global.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/css-global.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/css-global.mdx
/docs/app/getting-started/css link /errors/css-global.mdx
/docs/app/getting-started/css link /errors/css-global.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/css-global.mdx
/docs/architecture/nextjs-compiler#module-transpilation link /errors/css-modules-npm.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/custom-document-image-import.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/custom-document-image-import.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/custom-document-image-import.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/custom-document-image-import.mdx
/docs/pages/api-reference/file-conventions/public-folder link /errors/custom-document-image-import.mdx
/docs/pages/api-reference/components/image#disablestaticimages link /errors/custom-document-image-import.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/custom-error-no-custom-404.mdx
/docs/pages/building-your-application/routing/custom-error#404-page link /errors/custom-error-no-custom-404.mdx
/docs/app/api-reference/functions/use-search-params#static-rendering link /errors/deopted-into-client-rendering.mdx
/docs/app/api-reference/functions/use-search-params#static-rendering link /errors/deopted-into-client-rendering.mdx
/docs/app/api-reference/functions/use-search-params#static-rendering link /errors/deopted-into-client-rendering.mdx
/docs/app/api-reference/functions/use-search-params#static-rendering link /errors/deopted-into-client-rendering.mdx
/docs/app/api-reference/functions/use-report-web-vitals link /errors/deprecated-analyticsid.mdx
/docs/pages/api-reference/config/next-config-js/output link /errors/deprecated-target-config.mdx
/docs/pages/api-reference/edge#unsupported-apis link /errors/edge-dynamic-code-evaluation.mdx
/docs/pages/api-reference/config/next-config-js link /errors/empty-configuration.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/empty-object-getInitialProps.mdx
/docs/pages/guides/environment-variables link /errors/env-loading-disabled.mdx
/docs/app/getting-started link /errors/experimental-app-dir-config.mdx
/docs/pages/api-reference/cli/next#next-start-options link /errors/export-image-api.mdx
/docs/pages/api-reference/components/image#loader link /errors/export-image-api.mdx
/docs/pages/api-reference/components/image#unoptimized link /errors/export-image-api.mdx
/docs/pages/getting-started/deploying link /errors/export-image-api.mdx
/docs/pages/api-reference/components/image link /errors/export-image-api.mdx
/docs/pages/guides/static-exports link /errors/export-image-api.mdx
/docs/pages/api-reference/components/image link /errors/export-image-api.mdx
/docs/pages/api-reference/cli/next#next-start-options link /errors/export-no-custom-routes.mdx
/docs/pages/getting-started/deploying link /errors/export-no-custom-routes.mdx
/docs/pages/guides/static-exports link /errors/export-no-custom-routes.mdx
/docs/pages/api-reference/config/next-config-js/rewrites link /errors/export-no-custom-routes.mdx
/docs/pages/api-reference/config/next-config-js/redirects link /errors/export-no-custom-routes.mdx
/docs/pages/api-reference/config/next-config-js/headers link /errors/export-no-custom-routes.mdx
/docs/pages/api-reference/cli/next#next-start-options link /errors/export-no-i18n.mdx
/docs/pages/getting-started/deploying link /errors/export-no-i18n.mdx
/docs/pages/guides/static-exports link /errors/export-no-i18n.mdx
/docs/pages/guides/internationalization link /errors/export-no-i18n.mdx
/docs/pages/api-reference/config/next-config-js/exportPathMap link /errors/export-path-mismatch.mdx
/docs/app/getting-started/updating-data link /errors/failed-to-find-server-action.mdx
/docs/app/guides/data-security link /errors/failed-to-find-server-action.mdx
/docs/app/guides/data-security#overwriting-encryption-keys-advanced link /errors/failed-to-find-server-action.mdx
/docs/architecture/fast-refresh link /errors/fast-refresh-reload.mdx
/docs/pages/api-reference/functions/get-initial-props link /errors/get-initial-props-as-an-instance-method.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/get-initial-props-export.mdx
/docs/pages/api-reference/components/font link /errors/google-font-preconnect.mdx
/docs/pages/api-reference/components/font#specifying-a-subset link /errors/google-fonts-missing-subsets.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/gsp-redirect-during-prerender.mdx
/docs/pages/building-your-application/data-fetching link /errors/gssp-component-member.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/gssp-export.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/gssp-export.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/gssp-export.mdx
/docs/pages/api-reference/config/next-config-js/exportPathMap link /errors/gssp-export.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/gssp-mixed-not-found-redirect.mdx
/docs/pages/building-your-application/data-fetching/get-server-side-props link /errors/gssp-mixed-not-found-redirect.mdx
/docs/pages/building-your-application/data-fetching link /errors/gssp-no-mutating-res.mdx
/docs/pages/building-your-application/routing link /errors/href-interpolation-failed.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/href-interpolation-failed.mdx
/docs/architecture/nextjs-compiler link /errors/ignored-compiler-options.mdx
/docs/pages/guides/custom-server link /errors/import-next.mdx
/docs/pages/building-your-application/routing link /errors/incompatible-href-as.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/incompatible-href-as.mdx
/docs/pages/guides/scripts link /errors/inline-script-id.mdx
/docs/pages/guides/sass link /errors/install-sass.mdx
/docs/pages/guides/sass link /errors/install-sass.mdx
/docs/pages/api-reference/components/image link /errors/install-sharp.mdx
/docs/pages/guides/lazy-loading link /errors/invalid-dynamic-options-type.mdx
/docs/pages/guides/lazy-loading#nextdynamic link /errors/invalid-dynamic-suspense.mdx
/docs/pages/api-reference/config/next-config-js/rewrites link /errors/invalid-external-rewrite.mdx
/docs/pages/api-reference/functions/get-server-side-props link /errors/invalid-getserversideprops-value.mdx
/docs/pages/api-reference/functions/get-static-props link /errors/invalid-getstaticprops-value.mdx
/docs/pages/building-your-application/routing link /errors/invalid-href-passed.mdx
/docs/pages/guides/internationalization link /errors/invalid-i18n-config.mdx
/docs/pages/api-reference/components/image link /errors/invalid-images-config.mdx
/docs/pages/api-reference/components/image link /errors/invalid-images-config.mdx
/docs/pages/api-reference/components/link link /errors/invalid-new-link-with-extra-anchor.mdx
/docs/app/api-reference/config/eslint link /errors/invalid-next-config.mdx
/docs/app/api-reference/config/next-config-js/turbopack link /errors/invalid-next-config.mdx
/docs/app/api-reference/config/next-config-js link /errors/invalid-next-config.mdx
/docs/pages/api-reference/config/next-config-js link /errors/invalid-next-config.mdx
/docs/pages/building-your-application/routing/api-routes link /errors/invalid-page-config.mdx
/docs/app/api-reference/edge link /errors/invalid-page-config.mdx
/docs/pages/api-reference/cli/next link /errors/invalid-project-dir-casing.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/invalid-redirect-gssp.mdx
/docs/pages/building-your-application/routing link /errors/invalid-relative-url-external-as.mdx
/docs/pages/guides/scripts link /errors/invalid-script.mdx
/docs/app/api-reference/file-conventions/layout link /errors/invalid-segment-export.mdx
/docs/app/api-reference/file-conventions/page link /errors/invalid-segment-export.mdx
/docs/app/api-reference/file-conventions/route-segment-config link /errors/invalid-segment-export.mdx
/docs/pages/guides/css-in-js link /errors/invalid-styled-jsx-children.mdx
/docs/app/getting-started/updating-data link /errors/invalid-use-server-value.mdx
/docs/app/getting-started/updating-data link /errors/invalid-use-server-value.mdx
/docs/pages/building-your-application/data-fetching link /errors/large-page-data.mdx
/docs/app/guides/upgrading/codemods#remove-a-tags-from-link-components link /errors/link-multiple-children.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/max-custom-routes-reached.mdx
/docs/pages/api-reference/config/next-config-js/rewrites link /errors/max-custom-routes-reached.mdx
/docs/pages/api-reference/config/next-config-js/redirects link /errors/max-custom-routes-reached.mdx
/docs/pages/api-reference/config/next-config-js/headers link /errors/max-custom-routes-reached.mdx
/docs/app/api-reference/file-conventions/proxy link /errors/middleware-to-proxy.mdx
/docs/app/api-reference/edge link /errors/middleware-to-proxy.mdx
/docs/app/api-reference/file-conventions/proxy link /errors/middleware-to-proxy.mdx
/docs/pages/building-your-application/routing/api-routes link /errors/middleware-upgrade-guide.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/missing-document-component.mdx
/docs/app/api-reference/file-conventions/layout#root-layout link /errors/missing-root-layout-tags.mdx
/docs/app/api-reference/functions/connection link /errors/missing-suspense-with-csr-bailout.mdx
/docs/app/getting-started/layouts-and-pages#what-to-use-and-when link /errors/missing-suspense-with-csr-bailout.mdx
/docs/app/api-reference/functions/use-search-params link /errors/missing-suspense-with-csr-bailout.mdx
/docs/app/api-reference/functions/connection link /errors/missing-suspense-with-csr-bailout.mdx
/docs/app/getting-started/partial-prerendering#dynamic-rendering link /errors/missing-suspense-with-csr-bailout.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/nested-reserved-page.mdx
/docs/pages/building-your-application/routing/custom-error link /errors/nested-reserved-page.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/nested-reserved-page.mdx
/docs/pages/guides/css-in-js link /errors/nested-styled-jsx-tags.mdx
/docs/pages/api-reference/config/next-config-js link /errors/next-config-error.mdx
/docs/app/api-reference/functions/headers link /errors/next-dynamic-api-wrong-context.mdx
/docs/app/api-reference/functions/cookies link /errors/next-dynamic-api-wrong-context.mdx
/docs/app/api-reference/functions/draft-mode link /errors/next-dynamic-api-wrong-context.mdx
/docs/app/api-reference/functions/unstable_noStore link /errors/next-dynamic-api-wrong-context.mdx
/docs/app/api-reference/functions/unstable_cache link /errors/next-dynamic-api-wrong-context.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/next-head-count-missing.mdx
/docs/pages/api-reference/components/image#loader link /errors/next-image-missing-loader-width.mdx
/docs/pages/api-reference/components/image#loader link /errors/next-image-missing-loader-width.mdx
/docs/pages/api-reference/components/image#unoptimized link /errors/next-image-missing-loader-width.mdx
/docs/pages/api-reference/components/image link /errors/next-image-missing-loader-width.mdx
/docs/pages/api-reference/components/image link /errors/next-image-missing-loader-width.mdx
/docs/app/api-reference/config/next-config-js/images link /errors/next-image-missing-loader.mdx
/docs/pages/api-reference/components/image#loader link /errors/next-image-missing-loader.mdx
/docs/pages/api-reference/components/image#loader link /errors/next-image-missing-loader.mdx
/docs/app/api-reference/config/next-config-js/images link /errors/next-image-missing-loader.mdx
/docs/pages/api-reference/components/image link /errors/next-image-missing-loader.mdx
/docs/pages/api-reference/components/image link /errors/next-image-missing-loader.mdx
/docs/pages/api-reference/components/image#remotepatterns link /errors/next-image-unconfigured-host.mdx
/docs/pages/api-reference/components/image link /errors/next-image-unconfigured-host.mdx
/docs/pages/api-reference/components/image#remotepatterns link /errors/next-image-unconfigured-host.mdx
/docs/pages/api-reference/components/image link /errors/next-image-unconfigured-localpatterns.mdx
/docs/pages/api-reference/components/image#localpatterns link /errors/next-image-unconfigured-localpatterns.mdx
/docs/pages/api-reference/components/image link /errors/next-image-unconfigured-qualities.mdx
/docs/pages/api-reference/components/image#qualities link /errors/next-image-unconfigured-qualities.mdx
/docs/app/api-reference/components/image#loader link /errors/next-image-upgrade-to-13.mdx
/docs/pages/guides/upgrading/codemods#next-image-to-legacy-image link /errors/next-image-upgrade-to-13.mdx
/docs/pages/api-reference/components/image link /errors/next-image-upgrade-to-13.mdx
/docs/pages/api-reference/components/image-legacy link /errors/next-image-upgrade-to-13.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-crypto-client.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-crypto.mdx
/docs/app/api-reference/directives/use-cache link /errors/next-prerender-current-time-client.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-current-time.mdx
/docs/app/api-reference/functions/generate-metadata link /errors/next-prerender-dynamic-metadata.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-dynamic-metadata.mdx
/docs/app/api-reference/functions/cookies link /errors/next-prerender-dynamic-metadata.mdx
/docs/app/api-reference/directives/use-cache link /errors/next-prerender-dynamic-metadata.mdx
/docs/app/api-reference/functions/generate-viewport link /errors/next-prerender-dynamic-viewport.mdx
/docs/app/api-reference/functions/cookies link /errors/next-prerender-dynamic-viewport.mdx
/docs/app/api-reference/directives/use-cache link /errors/next-prerender-dynamic-viewport.mdx
/docs/app/api-reference/functions/cacheLife link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/headers link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/cookies link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/draft-mode link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/cacheLife link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/cacheTag link /errors/next-prerender-missing-suspense.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-random.mdx
/docs/app/guides/upgrading/version-15#async-request-apis-breaking-change link /errors/next-prerender-sync-headers.mdx
/docs/app/api-reference/functions/headers link /errors/next-prerender-sync-headers.mdx
/docs/app/api-reference/functions/cookies link /errors/next-prerender-sync-headers.mdx
/docs/app/api-reference/functions/draft-mode link /errors/next-prerender-sync-headers.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-sync-headers.mdx
/docs/app/guides/upgrading/version-15#async-request-apis-breaking-change link /errors/next-prerender-sync-params.mdx
/docs/app/api-reference/file-conventions/page link /errors/next-prerender-sync-params.mdx
/docs/app/api-reference/file-conventions/layout link /errors/next-prerender-sync-params.mdx
/docs/app/api-reference/file-conventions/route link /errors/next-prerender-sync-params.mdx
/docs/app/api-reference/functions/connection link /errors/next-prerender-sync-request.mdx
/docs/app/api-reference/file-conventions/route link /errors/next-prerender-sync-request.mdx
/docs/app/api-reference/functions/headers link /errors/next-request-in-use-cache.mdx
/docs/app/api-reference/functions/cookies link /errors/next-request-in-use-cache.mdx
/docs/app/api-reference/functions/draft-mode link /errors/next-request-in-use-cache.mdx
/docs/app/api-reference/file-conventions/route link /errors/next-response-next-in-app-route-handler.mdx
/docs/app/api-reference/functions/next-response link /errors/next-response-next-in-app-route-handler.mdx
/docs/pages/api-reference/functions/use-router#the-nextcompatrouter-export link /errors/next-router-not-mounted.mdx
/docs/app/guides/migrating/app-router-migration#step-5-migrating-routing-hooks link /errors/next-router-not-mounted.mdx
/docs/app/api-reference/functions/use-router link /errors/next-router-not-mounted.mdx
/docs/pages/guides/third-party-libraries link /errors/next-script-for-ga.mdx
/docs/app/guides/third-party-libraries#google-tag-manager link /errors/next-script-for-ga.mdx
/docs/app/guides/scripts link /errors/next-script-for-ga.mdx
/docs/app/guides/third-party-libraries link /errors/next-script-for-ga.mdx
/docs/app/guides/scripts link /errors/next-script-for-ga.mdx
/docs/app/guides/scripts link /errors/no-before-interactive-script-outside-document.mdx
/docs/pages/guides/scripts link /errors/no-before-interactive-script-outside-document.mdx
/docs/pages/guides/ci-build-caching link /errors/no-cache.mdx
/docs/app/getting-started/css link /errors/no-css-tags.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-document-import-in-page.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-duplicate-head.mdx
/docs/pages/api-reference/components/head link /errors/no-head-element.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-head-import-in-document.mdx
/docs/pages/api-reference/config/eslint#specifying-a-root-directory-within-a-monorepo link /errors/no-html-link-for-pages.mdx
/docs/pages/api-reference/components/link link /errors/no-html-link-for-pages.mdx
/docs/pages/api-reference/components/image link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image link /errors/no-img-element.mdx
/docs/pages/getting-started/deploying link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image#unoptimized link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image#loader link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image#loaderfile link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image link /errors/no-img-element.mdx
/docs/pages/api-reference/components/image#loaderfile link /errors/no-img-element.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-page-custom-font.mdx
/docs/pages/api-reference/components/font link /errors/no-page-custom-font.mdx
/docs/pages/api-reference/components/head link /errors/no-script-component-in-head.mdx
/docs/pages/guides/scripts link /errors/no-script-component-in-head.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/no-script-in-document.mdx
/docs/pages/guides/scripts link /errors/no-script-in-document.mdx
/docs/pages/api-reference/components/script link /errors/no-script-tags-in-head-component.mdx
/docs/pages/guides/scripts link /errors/no-script-tags-in-head-component.mdx
/docs/pages/api-reference/components/script link /errors/no-script-tags-in-head-component.mdx
/docs/pages/api-reference/file-conventions/proxy link /errors/no-server-import-in-page.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-styled-jsx-in-document.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/no-styled-jsx-in-document.mdx
/docs/pages/building-your-application/routing/custom-document#caveats link /errors/no-styled-jsx-in-document.mdx
/docs/pages/building-your-application/routing/pages-and-layouts#layout-pattern link /errors/no-styled-jsx-in-document.mdx
/docs/app/getting-started/css link /errors/no-styled-jsx-in-document.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/no-styled-jsx-in-document.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-stylesheets-in-head-component.mdx
/docs/pages/api-reference/components/head link /errors/no-title-in-document-head.mdx
/docs/pages/building-your-application/routing/custom-document link /errors/no-title-in-document-head.mdx
/docs/architecture/supported-browsers link /errors/no-unwanted-polyfillio.mdx
/docs/architecture/supported-browsers link /errors/no-unwanted-polyfillio.mdx
/docs/pages/api-reference/file-conventions/proxy link /errors/node-module-in-edge-runtime.mdx
/docs/pages/building-your-application/routing/api-routes link /errors/node-module-in-edge-runtime.mdx
/docs/pages/api-reference/edge#unsupported-apis link /errors/node-module-in-edge-runtime.mdx
/docs/pages/api-reference/edge link /errors/node-module-in-edge-runtime.mdx
/docs/pages/api-reference/file-conventions/proxy link /errors/node-module-in-edge-runtime.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/non-dynamic-getstaticpaths-usage.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/non-dynamic-getstaticpaths-usage.mdx
/docs/app/guides/content-security-policy link /errors/nonce-contained-invalid-characters.mdx
/docs/app/guides/content-security-policy link /errors/nonce-contained-invalid-characters.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/opt-out-auto-static-optimization.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/opt-out-auto-static-optimization.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/opt-out-auto-static-optimization.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/opt-out-auto-static-optimization.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/opt-out-auto-static-optimization.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/opt-out-automatic-prerendering.mdx
/docs/pages/building-your-application/rendering/automatic-static-optimization link /errors/opt-out-automatic-prerendering.mdx
/docs/pages/building-your-application/routing/custom-app link /errors/opt-out-automatic-prerendering.mdx
/docs/pages/building-your-application/data-fetching/get-static-paths link /errors/page-data-collection-timeout.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/page-data-collection-timeout.mdx
/docs/pages/api-reference/config/next-config-js/pageExtensions link /errors/page-without-valid-component.mdx
/docs/pages/api-reference/components/image#blurdataurl link /errors/placeholder-blur-data-url.mdx
/docs/pages/api-reference/components/image#src link /errors/placeholder-blur-data-url.mdx
/docs/pages/api-reference/components/image#placeholder link /errors/placeholder-blur-data-url.mdx
/docs/pages/guides/post-css link /errors/postcss-ignored-plugin.mdx
/docs/pages/guides/post-css link /errors/postcss-ignored-plugin.mdx
/docs/pages/guides/post-css link /errors/postcss-shape.mdx
/docs/app/api-reference/functions/unstable_noStore link /errors/ppr-caught-error.mdx
/docs/app/getting-started/project-structure#colocation link /errors/prerender-error.mdx
/docs/app/getting-started/error-handling link /errors/prerender-error.mdx
/docs/app/getting-started/fetching-data link /errors/prerender-error.mdx
/docs/app/getting-started/server-and-client-components link /errors/react-client-hook-in-server-component.mdx
/docs/app/guides/css-in-js link /errors/react-hydration-error.mdx
/docs/app/guides/lazy-loading#skipping-ssr link /errors/react-hydration-error.mdx
/docs/architecture/fast-refresh link /errors/react-version.mdx
/docs/architecture/fast-refresh link /errors/react-version.mdx
/docs/pages/api-reference/file-conventions/middleware#producing-a-response link /errors/returning-response-body-in-middleware.mdx
/docs/pages/api-reference/file-conventions/middleware link /errors/returning-response-body-in-middleware.mdx
/docs/pages/api-reference/file-conventions/middleware#using-cookies link /errors/returning-response-body-in-middleware.mdx
/docs/app/api-reference/functions/revalidateTag link /errors/revalidate-tag-single-arg.mdx
/docs/app/api-reference/functions/updateTag link /errors/revalidate-tag-single-arg.mdx
/docs/app/getting-started/caching-and-revalidating link /errors/revalidate-tag-single-arg.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/api-reference/functions/get-static-paths#getstaticpaths-return-values link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/api-reference/functions/get-static-paths#paths link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/building-your-application/data-fetching/get-server-side-props link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/building-your-application/routing/dynamic-routes link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/api-reference/functions/get-static-paths#getstaticpaths-return-values link /errors/rewrite-auto-export-fallback.mdx
/docs/pages/api-reference/components/image link /errors/sharp-missing-in-production.mdx
/docs/pages/api-reference/components/image link /errors/sharp-missing-in-production.mdx
/docs/pages/api-reference/config/next-config-js/output link /errors/sharp-missing-in-production.mdx
/docs/pages/api-reference/components/image#formats link /errors/sharp-version-avif.mdx
/docs/pages/api-reference/components/image link /errors/sharp-version-avif.mdx
/docs/pages/api-reference/components/image link /errors/sharp-version-avif.mdx
/docs/pages/getting-started/deploying link /errors/ssg-fallback-true-export.mdx
/docs/pages/getting-started/deploying link /errors/ssg-fallback-true-export.mdx
/docs/pages/api-reference/functions/get-static-paths#fallback-true link /errors/ssg-fallback-true-export.mdx
/docs/pages/api-reference/file-conventions/public-folder link /errors/static-dir-deprecated.mdx
/docs/pages/building-your-application/data-fetching/get-static-paths link /errors/static-page-generation-timeout.mdx
/docs/pages/building-your-application/data-fetching/get-static-props link /errors/static-page-generation-timeout.mdx
/docs/pages/guides/babel link /errors/swc-disabled.mdx
/docs/app/getting-started/partial-prerendering#dynamic-rendering link /errors/sync-dynamic-apis.mdx
/docs/app/guides/upgrading/version-15 link /errors/sync-dynamic-apis.mdx
/docs/app/guides/upgrading/codemods#next-async-request-api link /errors/sync-dynamic-apis.mdx
/docs/pages/api-reference/config/next-config-js/webpack link /errors/undefined-webpack-config.mdx
/docs/pages/guides/upgrading/codemods#url-to-withrouter link /errors/url-deprecated.mdx
/docs/pages/guides/upgrading link /errors/version-staleness.mdx
/docs/pages/guides/upgrading link /errors/version-staleness.mdx
/docs/app/getting-started/css link /errors/webpack5.mdx
/docs/pages/api-reference/config/next-config-js/productionBrowserSourceMaps link /errors/webpack5.mdx

Thank you 🙏

@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Jan 18, 2026

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
🟢
No security concerns identified No security vulnerabilities detected by AI analysis. Human verification advised for critical code.
Ticket Compliance
🎫 No ticket provided
  • Create ticket/issue
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

  • Update
Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Jan 18, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
Clarify PR scope: RFC vs. implementation
Suggestion Impact:The commit deleted the entire RFC document (all 221 lines), effectively removing the content that caused the mismatch between PR description and actual changes. This addresses the suggestion by removing the RFC file entirely, though it's unclear if this was accompanied by PR title/description updates or if implementation was added instead.

code diff:

# File: docs/rfc/bun-test-parity-plan.md
@@ -1,222 +1 @@
-# RFC: Bun Test Parity with Node.js
 
-## Summary
-
-Extend CI test coverage to achieve 1:1 test parity between Node.js and Bun runtimes. Currently, only unit tests run on both runtimes. This PR will add Bun versions of integration, development, and production test jobs.
-
-## Motivation
-
-With the Bun-first runtime implementation complete, we need comprehensive test coverage to ensure feature parity. Running the same test suites on both runtimes will:
-
-1. Catch Bun-specific regressions early
-2. Validate that all Next.js features work identically on Bun
-3. Build confidence for users running Next.js on Bun in production
-
-## Current State
-
-| Test Type | Node.js | Bun |
-|-----------|---------|-----|
-| Unit tests | `test-unit` | `test-unit-bun`, `test-unit-bun-windows`, `test-unit-bun-macos` |
-| Integration tests | `test-integration` (disabled) | None |
-| Dev mode tests | `test-dev` (disabled) | None |
-| Prod mode tests | `test-prod` (disabled) | None |
-| New tests (dev) | `test-new-tests-dev` | None |
-| New tests (prod) | `test-new-tests-start` | None |
-
-## Proposed Changes
-
-### Phase 1: Add Bun Integration Test Jobs
-
-Add to `.github/workflows/build_and_test.yml`:
-
-```yaml
-test-integration-bun:
-  name: test integration bun
-  needs: ['changes', 'build-next']
-  if: ${{ needs.changes.outputs.docs-only == 'false' }}
-
-  strategy:
-    fail-fast: false
-    matrix:
-      group: [1/12, 2/12, 3/12, 4/12, 5/12, 6/12, 7/12, 8/12, 9/12, 10/12, 11/12, 12/12]
-      bunVersion: ['latest']
-
-  uses: ./.github/workflows/build_reusable_bun.yml
-  with:
-    bunVersion: ${{ matrix.bunVersion }}
-    afterBuild: bun --bun run-tests.js --type integration --group ${{ matrix.group }}
-    stepName: 'test-integration-bun-${{ matrix.group }}'
-
-  secrets: inherit
-```
-
-### Phase 2: Add Bun Dev Mode Test Jobs
-
-```yaml
-test-dev-bun:
-  name: test dev bun
-  needs: ['changes', 'build-next']
-  if: ${{ needs.changes.outputs.docs-only == 'false' }}
-
-  strategy:
-    fail-fast: false
-    matrix:
-      group: [1/6, 2/6, 3/6, 4/6, 5/6, 6/6]
-      bunVersion: ['latest']
-
-  uses: ./.github/workflows/build_reusable_bun.yml
-  with:
-    bunVersion: ${{ matrix.bunVersion }}
-    afterBuild: |
-      bun --bun run-tests.js \
-        --type development \
-        --group ${{ matrix.group }}
-    stepName: 'test-dev-bun-${{ matrix.group }}'
-
-  secrets: inherit
-```
-
-### Phase 3: Add Bun Production Test Jobs
-
-```yaml
-test-prod-bun:
-  name: test prod bun
-  needs: ['changes', 'build-next']
-  if: ${{ needs.changes.outputs.docs-only == 'false' }}
-
-  strategy:
-    fail-fast: false
-    matrix:
-      group: [1/6, 2/6, 3/6, 4/6, 5/6, 6/6]
-      bunVersion: ['latest']
-
-  uses: ./.github/workflows/build_reusable_bun.yml
-  with:
-    bunVersion: ${{ matrix.bunVersion }}
-    afterBuild: |
-      bun --bun run-tests.js \
-        --type production \
-        --group ${{ matrix.group }}
-    stepName: 'test-prod-bun-${{ matrix.group }}'
-
-  secrets: inherit
-```
-
-### Phase 4: Add Bun New Tests Jobs
-
-```yaml
-test-new-tests-dev-bun:
-  name: Test new tests for flakes (dev) - Bun
-  needs: ['changes', 'build-next']
-  if: ${{ needs.changes.outputs.docs-only == 'false' }}
-
-  strategy:
-    fail-fast: false
-    matrix:
-      group: [1/5, 2/5, 3/5, 4/5, 5/5]
-
-  uses: ./.github/workflows/build_reusable_bun.yml
-  with:
-    bunVersion: latest
-    afterBuild: |
-      bun scripts/test-new-tests.mjs \
-        --flake-detection \
-        --mode dev \
-        --group ${{ matrix.group }}
-    stepName: 'test-new-tests-dev-bun-${{ matrix.group }}'
-    timeout_minutes: 60
-
-  secrets: inherit
-
-test-new-tests-start-bun:
-  name: Test new tests for flakes (prod) - Bun
-  needs: ['changes', 'build-next']
-  if: ${{ needs.changes.outputs.docs-only == 'false' }}
-
-  strategy:
-    fail-fast: false
-    matrix:
-      group: [1/5, 2/5, 3/5, 4/5, 5/5]
-
-  uses: ./.github/workflows/build_reusable_bun.yml
-  with:
-    bunVersion: latest
-    afterBuild: |
-      bun scripts/test-new-tests.mjs \
-        --flake-detection \
-        --mode start \
-        --group ${{ matrix.group }}
-    stepName: 'test-new-tests-start-bun-${{ matrix.group }}'
-    timeout_minutes: 60
-
-  secrets: inherit
-```
-
-### Phase 5: Update Final Status Check
-
-Update the `final-status-check` job to include new Bun test jobs:
-
-```yaml
-final-status-check:
-  needs:
-    # Existing...
-    - 'test-unit-bun'
-    - 'test-unit-bun-windows'
-    - 'test-unit-bun-macos'
-    # New Bun jobs
-    - 'test-integration-bun'
-    - 'test-dev-bun'
-    - 'test-prod-bun'
-    - 'test-new-tests-dev-bun'
-    - 'test-new-tests-start-bun'
-```
-
-### Phase 6: Test Runner Bun Compatibility
-
-Verify/update `run-tests.js` to work with Bun:
-
-1. Check for Bun-specific test exclusions needed
-2. Add `test/bun-test-exclusions.json` for tests that legitimately don't apply to Bun
-3. Update test utilities to detect Bun runtime
-
-## Test Exclusion Categories
-
-Some tests may need exclusion for Bun due to:
-
-| Category | Reason | Example |
-|----------|--------|---------|
-| Node.js-specific APIs | Uses Node.js internals not in Bun | `vm` module edge cases |
-| Worker threads | Different implementation | `worker_threads` tests |
-| Native addons | Node-API differences | Sharp, native modules |
-| Timing-sensitive | Different event loop behavior | Precise timing tests |
-
-## Implementation Order
-
-1. **Verify test runner compatibility** - Ensure `run-tests.js` works with `bun --bun`
-2. **Add integration tests** - Largest coverage gain
-3. **Add dev/prod tests** - E2E coverage
-4. **Add new-tests jobs** - Flake detection for both runtimes
-5. **Create exclusion list** - Document Bun-incompatible tests
-6. **Update status checks** - Ensure all jobs report to PR status
-
-## Success Criteria
-
-- [ ] All Bun test jobs added to CI workflow
-- [ ] Test runner works with `bun --bun` command
-- [ ] Exclusion list documented and minimal (<5% of tests)
-- [ ] CI passes on both Node.js and Bun
-- [ ] Final status check includes all Bun jobs
-
-## Rollout Plan
-
-1. Add jobs as disabled (commented) initially
-2. Enable one job type at a time
-3. Fix failures and add exclusions as needed
-4. Enable in final status check once stable
-
-## Future Work
-
-- Add Bun canary testing for integration/e2e (currently only unit tests)
-- Windows/macOS integration tests on Bun
-- Performance comparison reporting between runtimes
-

The PR's title and description suggest it implements CI changes, but it only
adds an RFC document. The suggestion is to align the PR's presentation with its
content by either adding the implementation or updating the text to clarify it's
a proposal.

Examples:

docs/rfc/bun-test-parity-plan.md [1-221]
# RFC: Bun Test Parity with Node.js

## Summary

Extend CI test coverage to achieve 1:1 test parity between Node.js and Bun runtimes. Currently, only unit tests run on both runtimes. This PR will add Bun versions of integration, development, and production test jobs.

## Motivation

With the Bun-first runtime implementation complete, we need comprehensive test coverage to ensure feature parity. Running the same test suites on both runtimes will:


 ... (clipped 211 lines)

Solution Walkthrough:

Before:

// PR Title: "Extend CI test coverage..."
// PR Description: "Implementation Plan..."

// Actual file changes in the PR:
// + docs/rfc/bun-test-parity-plan.md
// (No changes to CI workflow files like .github/workflows/*.yml)

After:

// Option 1: Update PR to be an RFC
// PR Title: "RFC: Plan for Bun Test Parity"
// PR Description: "This PR introduces an RFC for discussion and approval..."

// Actual file changes in the PR:
// + docs/rfc/bun-test-parity-plan.md

// Option 2: Add implementation to the PR
// PR Title: "feat: Add Bun test parity jobs to CI"
// Actual file changes in the PR:
// + docs/rfc/bun-test-parity-plan.md
// + .github/workflows/build_and_test.yml (with new jobs)
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a critical mismatch between the PR's description, which implies implementation, and its content, which is only an RFC document, preventing reviewer confusion.

Medium
  • Update

celicoo and others added 25 commits January 18, 2026 22:04
- Add isBun detection to next-dev.ts, next-start.ts, next-test-utils.ts
- Use 'bun run next' instead of 'pnpm next' when running under Bun
- Update spawn calls to use 'bun' instead of 'node' when under Bun
- Add test-new-tests-dev-bun and test-new-tests-start-bun CI jobs
- Update tests-pass job to include new Bun test parity jobs

This enables true 1:1 test parity between Node.js and Bun runtimes
by ensuring that when tests run under Bun, the spawned Next.js
processes also use Bun.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Skip directories that don't exist gracefully instead of throwing an
error. This is needed because the docs/ directory was intentionally
removed from this fork (Next.js documentation is hosted on nextjs.org).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove "type": "module" and -m flag to fix ES module compatibility
issues with ncc-compiled code that uses require().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The dist/package.json was still set to "type": "module" from a
previous ESM build, causing Node.js to treat the CJS output as ESM.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This handles forks where docs are hosted externally. When the docs
directory doesn't exist, the validation now reports success instead
of failing due to broken links in errors/ pointing to missing docs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bun canary (bleeding-edge) builds may contain regressions or breaking
changes. This separates the canary tests into their own job that runs
independently but doesn't block CI. This provides:

- Early warning of compatibility issues with upcoming Bun releases
- Stable CI that only requires Bun latest to pass
- Continued visibility into canary build status

The test-unit-bun job now uses only Bun latest, while the new
test-unit-bun-canary job runs with canary and reports status
without blocking merges.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds commented-out Bun versions of the disabled test jobs to maintain
1:1 parity between Node.js and Bun test configurations:

- test-dev-bun: Bun version of test-dev (6 groups)
- test-prod-bun: Bun version of test-prod (7 groups)
- test-integration-bun: Bun version of test-integration (13 groups)

All three jobs are disabled (commented out) for the same reason as their
Node.js counterparts: CI timeout issues with the hardcoded 10-second
server startup timeout in /test/lib/next-modes/base.ts.

These jobs will be enabled when the timeout issues are resolved. Having
them defined ensures:
1. Complete 1:1 Bun/Node.js test parity in the workflow
2. Easy enablement when infrastructure is upgraded
3. Clear documentation of the intended test coverage

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add missing Bun test job equivalents to achieve complete parity between
Node.js and Bun test suites:

- PPR tests: test-ppr-integration-bun, test-ppr-dev-bun, test-ppr-prod-bun
  (disabled, same timeout issues as Node.js equivalents)

- Experimental tests: test-experimental-integration-bun, test-experimental-dev-bun,
  test-experimental-prod-bun (disabled, same timeout issues)

- Windows tests: test-dev-bun-windows, test-integration-bun-windows,
  test-prod-bun-windows (disabled, same Windows runner issues)

- Browser test: test-firefox-safari-bun (active, runs cross-browser tests
  with Bun runtime)

Updated tests-pass job to reference all new jobs (active and disabled).
Updated Print job results step with all new job entries.

Every Node.js test job now has a corresponding Bun equivalent in the same
state (both active or both disabled with the same reason).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enable all previously disabled test suites now that GitHub Team plan
with larger runners is available. All test jobs now use 4-core runners
(ubuntu-latest-4-cores) to ensure server startup completes within the
10-second timeout.

Enabled test suites:
- test-dev / test-dev-bun (6 groups each)
- test-prod / test-prod-bun (7 groups each)
- test-integration / test-integration-bun (13 groups each)
- test-ppr-dev / test-ppr-dev-bun (6 groups each)
- test-ppr-prod / test-ppr-prod-bun (7 groups each)
- test-ppr-integration / test-ppr-integration-bun
- test-experimental-dev / test-experimental-dev-bun (6 groups each)
- test-experimental-prod / test-experimental-prod-bun (7 groups each)
- test-experimental-integration / test-experimental-integration-bun

All jobs use runs_on_labels: '["ubuntu-latest-4-cores"]' for reliable
performance. Windows tests remain disabled due to separate runner issues.

Total active test matrix jobs: ~120 (60 Node.js + 60 Bun)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The build-native job doesn't exist in this workflow. Removing the
references fixes the workflow parsing error that was preventing jobs
from being created.
The transformIgnorePatterns and modulePathIgnorePatterns used patterns
that started with '/' which doesn't match Windows paths that start
with drive letters (e.g., D:\...).

Updated patterns to use [/\\] at the start to match either forward
or backward slashes, making them work on both Unix and Windows.
Even with 4-core runners, some tests were timing out with the 10-second
limit. Increasing to 30 seconds provides more headroom for CI
environments while still catching genuine startup failures.
Each Next.js test spawns a dev/prod server with webpack compilation,
using ~1-2 GB RAM per server. With TEST_CONCURRENCY=8 and 4-core
runners (16 GB RAM), 8 concurrent servers could use 8-16+ GB RAM,
triggering the Linux OOM killer and causing tests to be "killed".

Reducing to 4 concurrent tests (matching core count) should keep
memory usage within bounds while still utilizing available parallelism.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The validate-externals-doc.js script was checking if the docs/ directory
exists but not if the specific serverExternalPackages.mdx files exist.
This caused lint failures in forks that have an empty docs/ directory.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tests were still being killed with 4 concurrent tests on 16 GB runners.
Each Next.js dev server with webpack can use 2-4 GB RAM (not 1-2 GB as
initially estimated). Reducing to 2 concurrent tests should keep memory
usage under 8-10 GB, leaving headroom for system processes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Jan 21, 2026

CI Feedback 🧐

(Feedback updated until commit 42aae99)

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: test experimental dev (5/6) / build

Failed stage: Run export __NEXT_EXPERIMENTAL_PPR=true [❌]

Failure summary:

The action failed because a required file is missing. Specifically:
- The file
/home/runner/work/next.js/next.js/test/experimental-tests-manifest.json could not be found
- This
file is required by test/get-test-filter.js at line 6
- The error occurred when run-tests.js at line
50 attempted to call getTestFilter()
- The build and compilation steps completed successfully, but
the test execution failed due to this missing manifest file

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

467:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■                                                |  40% of 2.3 MiB
468:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■                                        |  50% of 2.3 MiB
469:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■                                |  60% of 2.3 MiB
470:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■                        |  70% of 2.3 MiB
471:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■                |  80% of 2.3 MiB
472:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■        |  90% of 2.3 MiB
473:  .../node_modules/playwright-chromium install: |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 100% of 2.3 MiB
474:  .../node_modules/playwright-chromium install: FFMPEG playwright build v1010 downloaded to /home/runner/.cache/ms-playwright/ffmpeg-1010
475:  .../node_modules/playwright-chromium install: Done
476:  .../node_modules/protobufjs postinstall$ node scripts/postinstall
477:  .../node_modules/protobufjs postinstall$ node scripts/postinstall
478:  .../node_modules/protobufjs postinstall: Done
479:  .../node_modules/protobufjs postinstall: Done
480:  .../node_modules/dd-trace preinstall$ node scripts/preinstall.js
481:  .../node_modules/dd-trace preinstall: Done
482:  WARN  Failed to create bin at /home/runner/work/next.js/next.js/node_modules/.bin/create-next-app. ENOENT: no such file or directory, open '/home/runner/work/next.js/next.js/node_modules/create-next-app/dist/index.js'
483:  devDependencies:
...

640:  + third-parties 16.0.0 <- packages/third-parties
641:  + tree-kill 1.2.2
642:  + tsec 0.2.1
643:  + tsx 4.19.2
644:  + turbo 2.5.5
645:  + typescript 5.9.2
646:  + unfetch 4.2.0
647:  + wait-port 0.2.2
648:  + webpack 5.98.0
649:  + webpack-bundle-analyzer 4.7.0
650:  + webpack-dev-server 5.2.0
651:  + whatwg-fetch 3.0.0
652:  + ws 8.2.3
653:  + yargs 16.2.0
654:  + zod 3.25.76
655:  + zod-validation-error 3.4.0
656:  apps/docs postinstall$ fumadocs-mdx
657:  apps/docs postinstall: [MDX] types generated
658:  apps/docs postinstall: Done
659:  WARN  Failed to create bin at /home/runner/work/next.js/next.js/node_modules/.bin/create-next-app. ENOENT: no such file or directory, open '/home/runner/work/next.js/next.js/node_modules/create-next-app/dist/index.js'
660:  . postinstall$ node scripts/git-configure.mjs && node scripts/install-native.mjs
...

985:  [17:36:19] Starting api_esm
986:  [17:36:19] Starting nextbuild
987:  [17:36:19] Starting nextbuildjest
988:  [17:36:19] Starting nextbuildstatic
989:  [17:36:19] Starting nextbuildstatic_esm
990:  [17:36:19] Starting nextbuild_esm
991:  [17:36:19] Starting next_devtools_entrypoint
992:  [17:36:19] Starting next_devtools_server
993:  [17:36:19] Starting next_devtools_server_esm
994:  [17:36:19] Starting next_devtools_shared
995:  [17:36:19] Starting next_devtools_shared_esm
996:  [17:36:19] Starting next_devtools_userspace
997:  [17:36:19] Starting next_devtools_userspace_esm
998:  [17:36:19] Starting pages
999:  [17:36:19] Starting pages_app
1000:  [17:36:19] Starting pages_error
1001:  [17:36:19] Starting pages_document
1002:  [17:36:19] Starting pages_esm
1003:  [17:36:19] Starting pages_app_esm
1004:  [17:36:19] Starting pages_error_esm
1005:  [17:36:19] Starting pages_document_esm
1006:  [17:36:19] Starting lib
1007:  [17:36:19] Starting lib_esm
1008:  [17:36:19] Starting client
1009:  [17:36:19] Starting client_esm
1010:  [17:36:19] Starting diagnostics
1011:  [17:36:19] Starting telemetry
1012:  [17:36:19] Starting trace
1013:  [17:36:19] Starting routing
1014:  [17:36:19] Starting routing_esm
1015:  [17:36:19] Starting errors
1016:  [17:36:19] Starting errors_esm
1017:  [17:36:19] Starting hash
...

1050:  [17:36:19] Starting validation
1051:  [17:36:19] Starting validation_esm
1052:  [17:36:19] Starting shared
1053:  [17:36:19] Starting shared_esm
1054:  [17:36:19] Starting shared_re_exported
1055:  [17:36:19] Starting shared_re_exported_esm
1056:  [17:36:19] Starting server_wasm
1057:  [17:36:19] Starting experimental_testing
1058:  [17:36:19] Starting experimental_testmode
1059:  [17:36:21] Finished pages_app_esm in 2.31s
1060:  [17:36:21] Finished next_devtools_entrypoint in 2.32s
1061:  [17:36:21] Finished string in 2.31s
1062:  [17:36:21] Finished string_esm in 2.31s
1063:  [17:36:21] Finished concurrency in 2.30s
1064:  [17:36:21] Finished concurrency_esm in 2.30s
1065:  [17:36:21] Finished pages_error_esm in 2.32s
1066:  [17:36:21] Finished pages_error in 2.32s
1067:  [17:36:21] Finished pages_document in 2.32s
...

1071:  [17:36:21] Finished filesystem_esm in 2.37s
1072:  [17:36:21] Finished config in 2.38s
1073:  [17:36:21] Warning: Source did not match any files!
1074:  Patterns:   ["server/**/*.+(wasm)"]
1075:  [17:36:21] Finished server_wasm in 2.41s
1076:  [17:36:22] Finished cli_esm in 2.55s
1077:  [17:36:22] Finished hash in 2.62s
1078:  [17:36:22] Finished api_esm in 2.64s
1079:  [17:36:22] Finished hash_esm in 2.62s
1080:  [17:36:22] Finished hostname in 2.62s
1081:  [17:36:22] Finished hostname_esm in 2.62s
1082:  [17:36:22] Finished image in 2.66s
1083:  [17:36:22] Finished image_esm in 2.71s
1084:  [17:36:22] Finished routing in 2.83s
1085:  [17:36:22] Finished routing_esm in 2.98s
1086:  [17:36:22] Finished errors_esm in 2.99s
1087:  [17:36:22] Finished telemetry in 3.07s
1088:  [17:36:22] Finished fonts in 3.18s
1089:  [17:36:22] Finished pages_app in 3.20s
1090:  [17:36:22] Finished bin in 3.21s
1091:  [17:36:22] Finished fonts_esm in 3.18s
1092:  [17:36:22] Finished process_esm in 3.17s
1093:  [17:36:22] Finished process in 3.17s
1094:  [17:36:22] Finished validation_esm in 3.17s
1095:  [17:36:22] Finished cache in 3.18s
1096:  [17:36:22] Finished promise_esm in 3.19s
1097:  [17:36:22] Finished promise in 3.19s
1098:  [17:36:22] Finished memory_esm in 3.18s
1099:  [17:36:22] Finished pages_document_esm in 3.20s
1100:  [17:36:22] Finished next_devtools_shared in 3.20s
1101:  [17:36:22] Finished diagnostics in 3.19s
1102:  [17:36:22] Finished errors in 3.19s
1103:  [17:36:22] Finished object in 3.19s
...

1195:  ⚠ Module parse warning:
1196:  ╰─▶   ⚠ "__dirname" has been used, it will be mocked.
1197:  WARNING in ./dist/compiled/zod/index.cjs
1198:  ⚠ Module parse warning:
1199:  ╰─▶   ⚠ "__dirname" has been used, it will be mocked.
1200:  Rspack compiled with 7 warnings
1201:  [17:36:44] Finished next_bundle_devtools in 15.52s
1202:  [17:36:44] Finished next_bundle in 15.60s
1203:  [17:36:44] Starting ncc_react_refresh_utils
1204:  [17:36:44] Finished ncc_react_refresh_utils in 18ms
1205:  [17:36:44] Starting ncc_next_font
1206:  [17:36:44] Finished ncc_next_font in 86ms
1207:  [17:36:44] Starting capsize_metrics
1208:  [17:36:44] Finished capsize_metrics in 125ms
1209:  [17:36:44] Finished compile in 25.17s
1210:  [17:36:44] Starting check_error_codes
1211:  > nextjs-project@0.0.0 check-error-codes /home/runner/work/next.js/next.js
1212:  > node packages/next/check-error-codes.js
1213:  [17:36:45] Finished check_error_codes in 584ms
1214:  [17:36:45] Starting generate_types
...

2469:  NODE_LTS_VERSION: 20.9.0
2470:  TEST_CONCURRENCY: 4
2471:  NEXT_TELEMETRY_DISABLED: 1
2472:  NEXT_JUNIT_TEST_REPORT: true
2473:  TEST_TIMINGS_TOKEN: 
2474:  NEXT_TEST_JOB: 1
2475:  VERCEL_TEST_TOKEN: 
2476:  VERCEL_TEST_TEAM: openuiai
2477:  NEXT_TEST_PREFER_OFFLINE: 1
2478:  NEXT_CI_RUNNER: ["ubuntu-4-cores"]
2479:  NEXT_TEST_PROXY_ADDRESS: 
2480:  ##[endgroup]
2481:  node:internal/modules/cjs/loader:1051
2482:  throw err;
2483:  ^
2484:  Error: Cannot find module '/home/runner/work/next.js/next.js/test/experimental-tests-manifest.json'
2485:  Require stack:
...

2490:  at Module.require (node:internal/modules/cjs/loader:1115:19)
2491:  at require (node:internal/modules/helpers:130:18)
2492:  at getTestFilter (/home/runner/work/next.js/next.js/test/get-test-filter.js:6:7)
2493:  at Object.<anonymous> (/home/runner/work/next.js/next.js/run-tests.js:50:29)
2494:  at Module._compile (node:internal/modules/cjs/loader:1241:14)
2495:  at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
2496:  at Module.load (node:internal/modules/cjs/loader:1091:32)
2497:  at Module._load (node:internal/modules/cjs/loader:938:12) {
2498:  code: 'MODULE_NOT_FOUND',
2499:  requireStack: [
2500:  '/home/runner/work/next.js/next.js/test/get-test-filter.js',
2501:  '/home/runner/work/next.js/next.js/run-tests.js'
2502:  ]
2503:  }
2504:  Node.js v20.9.0
2505:  ##[error]Process completed with exit code 1.
2506:  ##[group]Run actions/upload-artifact@v4

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant