Skip to content

Turbopack: Add Next.js version to "initialize project" trace span#90545

Open
sokra wants to merge 2 commits intocanaryfrom
sokra/version-in-trace
Open

Turbopack: Add Next.js version to "initialize project" trace span#90545
sokra wants to merge 2 commits intocanaryfrom
sokra/version-in-trace

Conversation

@sokra
Copy link
Member

@sokra sokra commented Feb 25, 2026

Summary

Adds the Next.js version as a version field on the Turbopack "initialize project" tracing span. The version is passed from the TypeScript side (process.env.__NEXT_VERSION) through the NAPI bindings into Rust ProjectOptions, where it is recorded on the span.

This makes it easy to correlate trace data with the specific Next.js version that produced it.

Also standardizes all version reads in packages/next/src/ to use process.env.__NEXT_VERSION (which is inlined at build time by taskfile-swc.js) instead of require('next/package.json').version or import { version } from 'next/package.json'.

Changes

Trace span (commit 1):

  • crates/next-api/src/project.rs — Added next_version field to ProjectOptions; recorded as version on the "initialize project" span
  • crates/next-napi-bindings/src/next_api/project.rs — Added next_version to NapiProjectOptions and wired it through the From impl
  • crates/next-build-test/src/main.rs — Added next_version to test ProjectOptions init
  • packages/next/src/build/swc/generated-native.d.ts — Added nextVersion to the TypeScript NapiProjectOptions interface
  • packages/next/src/server/dev/hot-reloader-turbopack.ts, packages/next/src/build/turbopack-build/impl.ts, packages/next/src/build/turbopack-analyze/index.ts — Pass nextVersion: process.env.__NEXT_VERSION when creating the Turbopack project
  • test/development/basic/next-rs-api.test.ts — Added nextVersion to both createProject call sites

Consistent __NEXT_VERSION usage (commit 2):

  • packages/next/src/server/dev/hot-reloader-shared-utils.tsrequire('next/package.json').versionprocess.env.__NEXT_VERSION
  • packages/next/src/lib/patch-incorrect-lockfile.tsnextPkgJson.versionprocess.env.__NEXT_VERSION; narrowed import to only optionalDependencies
  • packages/next/src/telemetry/events/swc-load-failure.tsimport { version as nextVersion }process.env.__NEXT_VERSION; narrowed import to only optionalDependencies

Test Plan

  • Verified Rust compilation with cargo check -p next-api, cargo check -p next-build-test
  • Verified TypeScript types with pnpm --filter=next types

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js. type: next labels Feb 25, 2026
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 25, 2026

Failing test suites

Commit: ca36b00 | About building and testing Next.js

pnpm test-dev-turbo test/development/acceptance-app/version-staleness.test.ts (turbopack) (job)

  • Error Overlay version staleness > should show version staleness in runtime error (DD)
  • Error Overlay version staleness > should show version staleness in render error (DD)
  • Error Overlay version staleness > should show version staleness in build error (DD)
Expand output

● Error Overlay version staleness › should show version staleness in runtime error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Error Overlay version staleness should show version staleness in runtime error 1`

- Snapshot  - 1
+ Received  + 1

- Next.js 1.0.0 (outdated)
+ Next.js 16.2.0-canary.62
  Turbopack

  49 |
  50 |     if (process.env.IS_TURBOPACK_TEST) {
> 51 |       expect(await getStaleness(browser)).toMatchInlineSnapshot(`
     |                                           ^
  52 |          "Next.js 1.0.0 (outdated)
  53 |          Turbopack"
  54 |         `)

  at Object.toMatchInlineSnapshot (development/acceptance-app/version-staleness.test.ts:51:43)

● Error Overlay version staleness › should show version staleness in render error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Error Overlay version staleness should show version staleness in render error 1`

- Snapshot  - 1
+ Received  + 1

- Next.js 2.0.0 (outdated)
+ Next.js 16.2.0-canary.62
  Turbopack

  91 |
  92 |     if (process.env.IS_TURBOPACK_TEST) {
> 93 |       expect(await getStaleness(browser)).toMatchInlineSnapshot(`
     |                                           ^
  94 |          "Next.js 2.0.0 (outdated)
  95 |          Turbopack"
  96 |         `)

  at Object.toMatchInlineSnapshot (development/acceptance-app/version-staleness.test.ts:93:43)

● Error Overlay version staleness › should show version staleness in build error

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Error Overlay version staleness should show version staleness in build error 1`

- Snapshot  - 1
+ Received  + 1

- Next.js 3.0.0 (outdated)
+ Next.js 16.2.0-canary.62
  Turbopack

  130 |
  131 |     if (process.env.IS_TURBOPACK_TEST) {
> 132 |       expect(await getStaleness(browser)).toMatchInlineSnapshot(`
      |                                           ^
  133 |          "Next.js 3.0.0 (outdated)
  134 |          Turbopack"
  135 |         `)

  at Object.toMatchInlineSnapshot (development/acceptance-app/version-staleness.test.ts:132:43)

pnpm test-start test/e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts (job)

  • app dir client cache with parallel routes > prefetch={true} > should re-use the cache for the full page, only for 5 mins (DD)
Expand output

● app dir client cache with parallel routes › prefetch={true} › should re-use the cache for the full page, only for 5 mins

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

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:56:5)
  at describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:30:3)
  at Object.describe (e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts:7:1)

@codspeed-hq
Copy link

codspeed-hq bot commented Feb 25, 2026

Merging this PR will not alter performance

✅ 9 untouched benchmarks
⏩ 11 skipped benchmarks1


Comparing sokra/version-in-trace (ca36b00) with canary (d7db744)

Open in CodSpeed

Footnotes

  1. 11 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Pass the Next.js version from the TypeScript side through NAPI bindings
into the Rust ProjectOptions, and record it as a `version` field on the
"initialize project" tracing span.
@sokra sokra force-pushed the sokra/version-in-trace branch from d1b70ef to dcfd6e5 Compare February 26, 2026 07:10
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 26, 2026

Stats from current PR

✅ No significant changes detected

📊 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 < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 456ms ▁▅▁▅▁
Cold (Ready in log) 439ms 440ms █▆▅▆▂
Cold (First Request) 1.942s 1.951s ▆█▄▅▁
Warm (Listen) 455ms 455ms ▃▃▁▃▃
Warm (Ready in log) 440ms 440ms ▇▇▅▆▁
Warm (First Request) 1.961s 1.954s ▄█▄▄▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.048s 14.114s ▂█▂▂▁
Cached Build 14.140s 14.286s ▃█▂▂▁
node_modules Size 475 MB 475 MB ▁▁▁▁▁
📦 Bundle Sizes

Bundle Sizes

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 58.3 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.6 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 255 B 254 B
main-HASH.js gzip 39.1 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.6 kB -
9544-HASH.js gzip N/A 59 kB -
Total 232 kB 233 kB ⚠️ +720 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.5 kB 2.5 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.97 kB ✅ -2 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 254 kB 254 kB
Total 379 kB 379 kB ⚠️ +318 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 617 B 612 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.8 kB 43.7 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.4 kB 45.3 kB ✅ -114 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.01 MB 4.02 MB 🔴 +7.11 kB (+0%)
index.pack gzip 102 kB 103 kB
index.pack.old gzip 102 kB 101 kB
Total 4.22 MB 4.23 MB ⚠️ +7.06 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 320 kB 320 kB
app-page-exp..prod.js gzip 170 kB 170 kB
app-page-tur...dev.js gzip 319 kB 319 kB
app-page-tur..prod.js gzip 169 kB 169 kB
app-page-tur...dev.js gzip 316 kB 316 kB
app-page-tur..prod.js gzip 168 kB 168 kB
app-page.run...dev.js gzip 316 kB 316 kB
app-page.run..prod.js gzip 168 kB 168 kB
app-route-ex...dev.js gzip 70.8 kB 70.8 kB
app-route-ex..prod.js gzip 49.2 kB 49.2 kB
app-route-tu...dev.js gzip 70.8 kB 70.8 kB
app-route-tu..prod.js gzip 49.2 kB 49.2 kB
app-route-tu...dev.js gzip 70.4 kB 70.4 kB
app-route-tu..prod.js gzip 49 kB 49 kB
app-route.ru...dev.js gzip 70.4 kB 70.4 kB
app-route.ru..prod.js gzip 49 kB 49 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 43.2 kB 43.2 kB
pages-api-tu..prod.js gzip 32.9 kB 32.9 kB
pages-api.ru...dev.js gzip 43.2 kB 43.2 kB
pages-api.ru..prod.js gzip 32.8 kB 32.8 kB
pages-turbo....dev.js gzip 52.5 kB 52.5 kB
pages-turbo...prod.js gzip 38.5 kB 38.5 kB
pages.runtim...dev.js gzip 52.5 kB 52.5 kB
pages.runtim..prod.js gzip 38.4 kB 38.4 kB
server.runti..prod.js gzip 62 kB 62 kB
Total 2.82 MB 2.82 MB
📎 Tarball URL
next@https://vercel-packages.vercel.app/next/prs/90545/next

Replace all require('next/package.json').version and import { version }
from 'next/package.json' usages with process.env.__NEXT_VERSION, which
is inlined at build time by taskfile-swc.js.

Co-Authored-By: Claude <noreply@anthropic.com>
@sokra sokra marked this pull request as ready for review February 26, 2026 09:06
@sokra sokra changed the title Add Next.js version to "initialize project" trace span Turbopack: Add Next.js version to "initialize project" trace span Feb 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. tests Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants