Skip to content

[vitest] Fix local imports failing to load in test step bundles#2351

Open
VaguelySerious wants to merge 1 commit into
mainfrom
peter/issue-2289
Open

[vitest] Fix local imports failing to load in test step bundles#2351
VaguelySerious wants to merge 1 commit into
mainfrom
peter/issue-2289

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Closes #2289

Problem

The vitest builder's generated bundles (combined.mjs / __step_registrations.mjs) are imported directly by Node's native ESM loader in the test worker — there is no downstream bundler. Project-local imports of step files were externalized, so the bundle referenced raw .ts sources on disk. Node can only load those via type stripping (erasable syntax only, recent Node versions), and transitive extensionless imports inside such files fail outright:

  • A local helper with an enum fails with ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX
  • A local module importing another local module without an extension fails with ERR_MODULE_NOT_FOUND
  • On the stable channel the additional .ts.js rewrite makes every externalized local import fail with ERR_MODULE_NOT_FOUND (or load a stale compiled .js neighbor)

Fix

Enable bundleTransitiveLocalStepDependencies in the vitest builder, the option introduced for the identical direct-runtime-loading situation in Nitro dev (#1965). Project-local files imported by step entries are now inlined into the step bundle; npm packages stay external, so vi.mock() of third-party packages keeps working (covered by existing workbench/vitest mock tests).

Tests

  • workbench/vitest: new local-deps.test.ts runs a workflow whose body and step use a local .ts helper with an enum, and asserts the helper is inlined into the generated step bundle rather than externalized. The bundle-content assertion is the regression guard: in the workbench the bundles happen to load through vitest's module runner (workspace symlinks), which masks the runtime failure that real app installs hit.
  • packages/vitest: unit test asserts the builder passes the flag.
  • Verified end-to-end with a packed tarball in a standalone app on Node 24: both issue symptoms reproduce without the fix and pass with it.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Jun 11, 2026 7:30am
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jun 11, 2026 7:30am
example-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-astro-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-express-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-fastify-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-hono-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-nitro-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workbench-vite-workflow Ready Ready Preview, Comment Jun 11, 2026 7:30am
workflow-docs Ready Ready Preview, Comment, Open in v0 Jun 11, 2026 7:30am
workflow-swc-playground Ready Ready Preview, Comment Jun 11, 2026 7:30am
workflow-tarballs Ready Ready Preview, Comment Jun 11, 2026 7:30am
workflow-web Ready Ready Preview, Comment Jun 11, 2026 7:30am

@changeset-bot

changeset-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 5b3b22d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@workflow/vitest Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.044s (+3.0%) 1.007s (~) 0.963s 10 1.00x
💻 Local Express 0.046s (+7.2% 🔺) 1.007s (~) 0.961s 10 1.05x
💻 Local Next.js (Turbopack) 0.061s (+11.8% 🔺) 1.007s (~) 0.946s 10 1.39x
🐘 Postgres Express 0.064s (-4.1%) 1.012s (~) 0.948s 10 1.44x
🐘 Postgres Nitro 0.065s (+2.8%) 1.012s (~) 0.947s 10 1.47x
🐘 Postgres Next.js (Turbopack) 0.070s (+0.6%) 1.013s (~) 0.943s 10 1.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.359s (+37.5% 🔺) 2.274s (-6.6% 🟢) 1.915s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.483s (+46.7% 🔺) 2.650s (+13.2% 🔺) 2.167s 10 1.34x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.093s (~) 2.006s (~) 0.914s 10 1.00x
💻 Local Express 1.094s (-0.6%) 2.007s (~) 0.913s 10 1.00x
🐘 Postgres Express 1.113s (+2.0%) 2.009s (~) 0.896s 10 1.02x
🐘 Postgres Nitro 1.116s (~) 2.010s (~) 0.894s 10 1.02x
💻 Local Next.js (Turbopack) 1.128s (+1.8%) 2.006s (~) 0.878s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.143s (~) 2.010s (~) 0.866s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.735s (+4.2%) 3.952s (-3.1%) 2.218s 10 1.00x
▲ Vercel Nitro 1.965s (+25.5% 🔺) 4.052s (+14.8% 🔺) 2.087s 10 1.13x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.533s (~) 11.022s (~) 0.489s 3 1.00x
🐘 Postgres Express 10.545s (-1.6%) 11.020s (-2.9%) 0.475s 3 1.00x
🐘 Postgres Nitro 10.553s (~) 11.021s (~) 0.468s 3 1.00x
💻 Local Express 10.554s (~) 11.023s (~) 0.469s 3 1.00x
💻 Local Next.js (Turbopack) 10.759s (+1.4%) 11.023s (~) 0.264s 3 1.02x
🐘 Postgres Next.js (Turbopack) 10.826s (~) 11.021s (~) 0.195s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.755s (+3.2%) 15.734s (+0.9%) 1.979s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.207s (+5.3% 🔺) 16.665s (+3.5%) 2.458s 2 1.03x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.764s (~) 14.027s (~) 0.263s 5 1.00x
🐘 Postgres Express 13.821s (~) 14.019s (-1.5%) 0.198s 5 1.00x
💻 Local Express 13.870s (~) 14.027s (-1.4%) 0.157s 5 1.01x
🐘 Postgres Nitro 13.922s (+0.5%) 14.223s (+1.4%) 0.301s 5 1.01x
💻 Local Next.js (Turbopack) 14.368s (+2.4%) 15.030s (+2.8%) 0.662s 4 1.04x
🐘 Postgres Next.js (Turbopack) 14.447s (-1.0%) 15.019s (~) 0.572s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 23.051s (-9.7% 🟢) 25.469s (-6.4% 🟢) 2.418s 3 1.00x
▲ Vercel Nitro 24.319s (-4.7%) 26.063s (-5.6% 🟢) 1.744s 3 1.06x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 12.490s (-1.9%) 13.015s (-2.2%) 0.525s 7 1.00x
💻 Local Nitro 12.490s (+0.6%) 13.026s (~) 0.535s 7 1.00x
💻 Local Express 12.541s (~) 13.027s (~) 0.486s 7 1.00x
🐘 Postgres Nitro 12.558s (-1.4%) 13.021s (~) 0.463s 7 1.01x
💻 Local Next.js (Turbopack) 13.553s (+4.7%) 14.027s (+5.4% 🔺) 0.474s 7 1.09x
🐘 Postgres Next.js (Turbopack) 13.900s (+1.0%) 14.166s (+1.1%) 0.266s 7 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 31.593s (+8.8% 🔺) 33.911s (+8.0% 🔺) 2.318s 3 1.00x
▲ Vercel Next.js (Turbopack) 33.290s (+12.4% 🔺) 36.269s (+13.8% 🔺) 2.978s 3 1.05x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.180s (-1.6%) 2.008s (-0.7%) 0.828s 15 1.00x
🐘 Postgres Nitro 1.186s (-1.1%) 2.007s (~) 0.822s 15 1.00x
💻 Local Express 1.198s (-5.2% 🟢) 2.007s (~) 0.809s 15 1.02x
💻 Local Nitro 1.235s (+1.8%) 2.006s (~) 0.772s 15 1.05x
🐘 Postgres Next.js (Turbopack) 1.238s (-1.1%) 2.009s (~) 0.771s 15 1.05x
💻 Local Next.js (Turbopack) 1.341s (+9.7% 🔺) 2.006s (~) 0.665s 15 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.956s (+6.7% 🔺) 4.695s (+8.2% 🔺) 1.740s 7 1.00x
▲ Vercel Next.js (Turbopack) 2.980s (+10.9% 🔺) 5.140s (+21.9% 🔺) 2.160s 7 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.250s (-0.7%) 2.007s (~) 0.757s 15 1.00x
🐘 Postgres Express 1.266s (-4.5%) 2.007s (~) 0.740s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.385s (-1.8%) 2.007s (~) 0.622s 15 1.11x
💻 Local Next.js (Turbopack) 1.769s (+2.5%) 2.074s (+3.4%) 0.305s 15 1.42x
💻 Local Express 1.969s (+4.6%) 2.316s (+4.3%) 0.347s 13 1.57x
💻 Local Nitro 2.020s (+18.5% 🔺) 2.315s (+11.7% 🔺) 0.296s 13 1.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.632s (-10.8% 🟢) 5.788s (-6.8% 🟢) 2.156s 6 1.00x
▲ Vercel Next.js (Turbopack) 4.193s (+2.1%) 6.349s (+3.4%) 2.155s 5 1.15x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.390s (-1.2%) 2.007s (~) 0.617s 15 1.00x
🐘 Postgres Express 1.394s (~) 2.007s (~) 0.614s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.734s (-1.5%) 2.224s (-3.1%) 0.490s 14 1.25x
💻 Local Next.js (Turbopack) 4.293s (-2.3%) 5.011s (~) 0.718s 6 3.09x
💻 Local Express 5.822s (+9.9% 🔺) 6.215s (+3.3%) 0.392s 5 4.19x
💻 Local Nitro 6.385s (+35.3% 🔺) 7.015s (+40.0% 🔺) 0.630s 5 4.59x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.311s (-21.2% 🟢) 7.301s (-16.1% 🟢) 1.990s 5 1.00x
▲ Vercel Next.js (Turbopack) 5.392s (-8.2% 🟢) 7.527s (-3.2%) 2.135s 5 1.02x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.196s (~) 2.008s (~) 0.812s 15 1.00x
🐘 Postgres Express 1.213s (+0.8%) 2.008s (~) 0.795s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.244s (-1.8%) 2.008s (~) 0.764s 15 1.04x
💻 Local Next.js (Turbopack) 1.379s (+5.6% 🔺) 2.006s (~) 0.627s 15 1.15x
💻 Local Nitro 1.572s (+1.9%) 2.007s (~) 0.435s 15 1.31x
💻 Local Express 1.628s (-1.7%) 2.007s (-3.2%) 0.379s 15 1.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.659s (-39.2% 🟢) 4.816s (-23.5% 🟢) 2.157s 7 1.00x
▲ Vercel Nitro 2.776s (+3.9%) 4.414s (+1.9%) 1.638s 7 1.04x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.260s (-1.2%) 2.009s (~) 0.749s 15 1.00x
🐘 Postgres Express 1.265s (+1.7%) 2.008s (~) 0.744s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.383s (-1.0%) 2.008s (~) 0.625s 15 1.10x
💻 Local Next.js (Turbopack) 1.941s (-3.9%) 2.315s (-7.6% 🟢) 0.374s 13 1.54x
💻 Local Nitro 2.058s (+17.2% 🔺) 2.592s (+25.1% 🔺) 0.534s 12 1.63x
💻 Local Express 2.255s (+6.1% 🔺) 2.675s (+3.3%) 0.420s 12 1.79x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.599s (-20.4% 🟢) 5.752s (-6.7% 🟢) 2.153s 6 1.00x
▲ Vercel Nitro 4.141s (+1.1%) 6.103s (+1.7%) 1.962s 5 1.15x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.374s (-6.0% 🟢) 2.010s (~) 0.636s 15 1.00x
🐘 Postgres Express 1.390s (-7.4% 🟢) 2.009s (-16.2% 🟢) 0.620s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.737s (+4.9%) 2.394s (+15.5% 🔺) 0.657s 13 1.26x
💻 Local Next.js (Turbopack) 5.176s (~) 5.513s (-8.4% 🟢) 0.337s 6 3.77x
💻 Local Nitro 5.615s (+18.4% 🔺) 6.215s (+16.3% 🔺) 0.600s 5 4.09x
💻 Local Express 6.108s (+4.2%) 6.817s (+9.7% 🔺) 0.709s 5 4.45x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.906s (+2.0%) 7.718s (+1.9%) 1.812s 4 1.00x
▲ Vercel Nitro 6.262s (+27.0% 🔺) 8.312s (+23.4% 🔺) 2.050s 4 1.06x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.554s (-9.0% 🟢) 1.007s (~) 0.453s 60 1.00x
🐘 Postgres Express 0.620s (-7.0% 🟢) 1.041s (-0.7%) 0.420s 58 1.12x
💻 Local Express 0.634s (-3.3%) 1.005s (-3.3%) 0.371s 60 1.15x
💻 Local Nitro 0.667s (-17.0% 🟢) 1.040s (-13.7% 🟢) 0.372s 58 1.20x
🐘 Postgres Next.js (Turbopack) 0.822s (+1.2%) 1.007s (~) 0.185s 60 1.48x
💻 Local Next.js (Turbopack) 0.865s (+24.3% 🔺) 1.039s (+3.5%) 0.174s 58 1.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.442s (-27.1% 🟢) 7.084s (-25.6% 🟢) 1.642s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.821s (+15.3% 🔺) 8.062s (+17.7% 🔺) 2.241s 8 1.07x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.331s (-13.4% 🟢) 2.008s (-6.7% 🟢) 0.677s 45 1.00x
🐘 Postgres Nitro 1.373s (-3.1%) 2.054s (+2.3%) 0.680s 44 1.03x
💻 Local Nitro 1.574s (+7.5% 🔺) 2.029s (+1.2%) 0.455s 45 1.18x
💻 Local Express 1.655s (+4.0%) 2.029s (~) 0.374s 45 1.24x
🐘 Postgres Next.js (Turbopack) 1.975s (+1.7%) 2.203s (+1.3%) 0.228s 41 1.48x
💻 Local Next.js (Turbopack) 2.066s (+19.5% 🔺) 2.883s (+42.2% 🔺) 0.817s 32 1.55x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 14.108s (+6.7% 🔺) 16.317s (+5.4% 🔺) 2.209s 6 1.00x
▲ Vercel Next.js (Turbopack) 14.763s (~) 17.291s (+2.1%) 2.528s 6 1.05x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.620s (-10.1% 🟢) 3.033s (-7.6% 🟢) 0.413s 40 1.00x
🐘 Postgres Express 2.708s (-7.0% 🟢) 3.086s (-12.8% 🟢) 0.378s 39 1.03x
💻 Local Nitro 3.307s (+3.1%) 4.010s (~) 0.703s 30 1.26x
💻 Local Express 3.427s (~) 4.009s (~) 0.583s 30 1.31x
🐘 Postgres Next.js (Turbopack) 3.837s (-0.6%) 4.077s (~) 0.239s 30 1.46x
💻 Local Next.js (Turbopack) 4.346s (+16.6% 🔺) 5.010s (+21.9% 🔺) 0.664s 24 1.66x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 26.475s (-11.1% 🟢) 28.636s (-10.5% 🟢) 2.161s 5 1.00x
▲ Vercel Next.js (Turbopack) 30.089s (+11.5% 🔺) 32.610s (+11.4% 🔺) 2.521s 4 1.14x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.223s (-5.3% 🟢) 1.006s (~) 0.783s 60 1.00x
🐘 Postgres Express 0.252s (~) 1.023s (+1.3%) 0.771s 59 1.13x
🐘 Postgres Next.js (Turbopack) 0.275s (-2.7%) 1.006s (~) 0.732s 60 1.23x
💻 Local Nitro 0.473s (+11.4% 🔺) 1.005s (~) 0.532s 60 2.12x
💻 Local Express 0.480s (+3.4%) 1.022s (+1.8%) 0.542s 59 2.15x
💻 Local Next.js (Turbopack) 0.566s (-7.3% 🟢) 1.005s (-3.3%) 0.439s 60 2.54x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.590s (+10.4% 🔺) 4.152s (-4.2%) 1.562s 15 1.00x
▲ Vercel Next.js (Turbopack) 24.409s (+1009.8% 🔺) 26.361s (+524.6% 🔺) 1.952s 14 9.43x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.352s (-5.0% 🟢) 1.007s (~) 0.654s 90 1.00x
🐘 Postgres Express 0.357s (+5.3% 🔺) 1.006s (~) 0.649s 90 1.01x
🐘 Postgres Next.js (Turbopack) 0.492s (+1.9%) 1.006s (~) 0.514s 90 1.40x
💻 Local Nitro 2.163s (+4.8%) 2.822s (+7.0% 🔺) 0.659s 32 6.14x
💻 Local Express 2.245s (+2.4%) 2.768s (-1.9%) 0.523s 33 6.37x
💻 Local Next.js (Turbopack) 2.323s (-5.2% 🟢) 2.979s (-4.2%) 0.656s 31 6.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.355s (-87.8% 🟢) 6.958s (-84.9% 🟢) 1.603s 13 1.00x
▲ Vercel Next.js (Turbopack) 67.592s (+977.9% 🔺) 69.720s (+720.5% 🔺) 2.128s 5 12.62x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.680s (+8.7% 🔺) 1.006s (-4.6%) 0.326s 120 1.00x
🐘 Postgres Nitro 0.687s (-2.9%) 1.006s (~) 0.319s 120 1.01x
🐘 Postgres Next.js (Turbopack) 0.992s (+1.3%) 1.580s (-1.7%) 0.588s 77 1.46x
💻 Local Nitro 9.946s (+14.2% 🔺) 10.445s (+11.9% 🔺) 0.499s 12 14.63x
💻 Local Express 10.090s (-2.2%) 10.696s (-1.6%) 0.607s 12 14.84x
💻 Local Next.js (Turbopack) 10.243s (-0.7%) 10.936s (-3.2%) 0.693s 11 15.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 15.590s (-95.0% 🟢) 17.650s (-94.4% 🟢) 2.059s 7 1.00x
▲ Vercel Next.js (Turbopack) 17.300s (-89.2% 🟢) 20.292s (-87.5% 🟢) 2.992s 6 1.11x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.170s (~) 2.006s (~) 0.013s (-1.6%) 2.021s (~) 0.850s 10 1.00x
💻 Local Nitro 1.171s (+1.7%) 2.005s (~) 0.012s (+20.0% 🔺) 2.019s (~) 0.849s 10 1.00x
🐘 Postgres Nitro 1.171s (-0.9%) 1.996s (~) 0.002s (+7.1% 🔺) 2.010s (~) 0.839s 10 1.00x
🐘 Postgres Express 1.173s (-1.7%) 1.996s (~) 0.001s (-96.8% 🟢) 2.010s (-1.6%) 0.837s 10 1.00x
💻 Local Next.js (Turbopack) 1.203s (+2.9%) 2.003s (~) 0.011s (+5.9% 🔺) 2.018s (~) 0.815s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.227s (-0.5%) 2.001s (~) 0.002s (~) 2.010s (~) 0.783s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.555s (+18.0% 🔺) 3.533s (+3.4%) 1.079s (+109.2% 🔺) 5.184s (+16.0% 🔺) 2.629s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.847s (+27.0% 🔺) 4.053s (+14.2% 🔺) 0.933s (-92.5% 🟢) 5.728s (-65.3% 🟢) 2.881s 10 1.11x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.590s (-4.4%) 2.004s (~) 0.005s (+31.6% 🔺) 2.026s (~) 0.436s 30 1.00x
🐘 Postgres Express 1.592s (-8.4% 🟢) 2.004s (-6.5% 🟢) 0.005s (+60.0% 🔺) 2.029s (-6.1% 🟢) 0.438s 30 1.00x
💻 Local Nitro 1.608s (-7.7% 🟢) 2.011s (~) 0.012s (+36.9% 🔺) 2.025s (-7.9% 🟢) 0.417s 30 1.01x
💻 Local Express 1.636s (~) 2.013s (~) 0.013s (+13.3% 🔺) 2.027s (~) 0.392s 30 1.03x
💻 Local Next.js (Turbopack) 1.714s (+4.5%) 2.009s (~) 0.013s (+31.4% 🔺) 2.025s (~) 0.312s 30 1.08x
🐘 Postgres Next.js (Turbopack) 1.747s (-0.9%) 2.010s (~) 0.005s (+30.6% 🔺) 2.028s (~) 0.280s 30 1.10x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.866s (+2.1%) 6.970s (-8.3% 🟢) 0.527s (+56.1% 🔺) 8.224s (-3.1%) 2.358s 8 1.00x
▲ Vercel Next.js (Turbopack) 5.926s (-7.0% 🟢) 7.738s (-2.5%) 0.301s (-16.8% 🟢) 8.752s (-1.3%) 2.826s 7 1.01x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.706s (-2.3%) 1.066s (+3.4%) 0.000s (-82.7% 🟢) 1.080s (+3.0%) 0.373s 56 1.00x
🐘 Postgres Express 0.734s (-24.9% 🟢) 1.049s (-26.6% 🟢) 0.000s (-50.9% 🟢) 1.066s (-26.4% 🟢) 0.332s 57 1.04x
🐘 Postgres Next.js (Turbopack) 0.864s (+3.8%) 1.090s (+1.7%) 0.000s (+1.8%) 1.098s (+1.7%) 0.234s 55 1.22x
💻 Local Express 1.432s (-3.4%) 2.014s (~) 0.001s (+46.7% 🔺) 2.017s (~) 0.584s 30 2.03x
💻 Local Nitro 1.441s (+6.5% 🔺) 2.013s (~) 0.000s (-53.3% 🟢) 2.016s (~) 0.574s 30 2.04x
💻 Local Next.js (Turbopack) 1.454s (~) 2.012s (~) 0.000s (-50.0% 🟢) 2.015s (~) 0.561s 30 2.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.049s (-15.3% 🟢) 4.409s (-13.1% 🟢) 0.000s (+Infinity% 🔺) 4.914s (-12.7% 🟢) 1.865s 13 1.00x
▲ Vercel Next.js (Turbopack) 3.379s (+2.1%) 5.123s (+4.7%) 0.000s (NaN%) 5.712s (+4.6%) 2.333s 11 1.11x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.407s (~) 2.142s (+7.3% 🔺) 0.000s (NaN%) 2.155s (+7.1% 🔺) 0.748s 28 1.00x
🐘 Postgres Express 1.533s (-5.1% 🟢) 2.217s (-1.6%) 0.000s (NaN%) 2.232s (-2.1%) 0.700s 27 1.09x
🐘 Postgres Next.js (Turbopack) 1.747s (+1.1%) 2.310s (+2.2%) 0.000s (+Infinity% 🔺) 2.321s (+2.3%) 0.574s 26 1.24x
💻 Local Next.js (Turbopack) 3.039s (-5.4% 🟢) 3.673s (-5.7% 🟢) 0.001s (+125.9% 🔺) 3.676s (-5.7% 🟢) 0.637s 17 2.16x
💻 Local Nitro 3.158s (+1.4%) 3.840s (-1.4%) 0.001s (+225.0% 🔺) 3.844s (-1.5%) 0.686s 16 2.24x
💻 Local Express 3.327s (~) 3.965s (+3.3%) 0.001s (+100.0% 🔺) 3.968s (+3.2%) 0.641s 16 2.36x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.889s (-5.4% 🟢) 6.984s (+4.6%) 0.000s (-71.9% 🟢) 7.594s (+5.4% 🔺) 2.705s 8 1.00x
▲ Vercel Nitro 5.037s (-28.5% 🟢) 6.292s (-26.6% 🟢) 0.000s (NaN%) 6.717s (-26.1% 🟢) 1.680s 9 1.03x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 11/21
🐘 Postgres Nitro 13/21
▲ Vercel Nitro 15/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 18/21
Next.js (Turbopack) 🐘 Postgres 14/21
Nitro 🐘 Postgres 15/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1266 0 219 1485
✅ 💻 Local Development 1671 0 219 1890
✅ 📦 Local Production 1671 0 219 1890
✅ 🐘 Local Postgres 1671 0 219 1890
✅ 🪟 Windows 135 0 0 135
✅ 📋 Other 769 0 176 945
Total 7183 0 1052 8235

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 109 0 26
✅ example 109 0 26
✅ express 109 0 26
✅ fastify 109 0 26
✅ hono 109 0 26
✅ nextjs-turbopack 133 0 2
✅ nextjs-webpack 133 0 2
✅ nitro 109 0 26
✅ nuxt 109 0 26
✅ sveltekit 128 0 7
✅ vite 109 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 135 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 110 0 25
✅ e2e-local-dev-tanstack-start- 110 0 25
✅ e2e-local-postgres-nest-stable 110 0 25
✅ e2e-local-postgres-tanstack-start- 110 0 25
✅ e2e-local-prod-nest-stable 110 0 25
✅ e2e-local-prod-tanstack-start- 110 0 25
✅ e2e-vercel-prod-tanstack-start 109 0 26

📋 View full workflow run

The vitest builder's generated bundles are imported directly by Node
in the test worker, with no downstream bundler. Externalized
project-local imports therefore surface as raw .ts specifiers that
Node's native ESM loader cannot reliably load (only erasable syntax
via type stripping, and not at all for extensionless transitive
imports).

Enable bundleTransitiveLocalStepDependencies (added for the same
direct-loading situation in Nitro dev, #1965) so local helpers are
inlined into the step bundle.

Fixes #2289

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

@workflow/vitest: workflow-body local .ts imports are externalized and fail to load on Node 24 (+ a require(esm) cycle)

1 participant