Skip to content

[nest] Use AST-based CommonJS import rewriting#2080

Open
VaguelySerious wants to merge 3 commits into
mainfrom
peter/nest-cjs-ast-rewrite-fixes
Open

[nest] Use AST-based CommonJS import rewriting#2080
VaguelySerious wants to merge 3 commits into
mainfrom
peter/nest-cjs-ast-rewrite-fixes

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 22, 2026

Co-Authored-By: yao <zhangyaoruo@outlook.com>

Closes #2001. Picks up @boomyao's AST-based CJS import rewriter from #2001 and addresses review feedback on top:

  • Fix shebang handling. SWC's module.span.start keeps a leading shebang line inside the module span but excludes leading line/block comments and a BOM. The previous getLeadingSyntaxByteOffset skipped the shebang, which made module.span.start - leadingOffset - 1 shift every byte→string mapping by the shebang's length. A steps bundle starting with #!/usr/bin/env node would either throw Unable to map SWC byte position X to a string index or silently corrupt the rewrite. Renamed to getLeadingCommentByteOffset and dropped the shebang branch.
  • Document the byte-position invariant. The math tying SWC's 1-based global byte counter to source-relative offsets is now spelled out where the mapper is constructed, so a future change to SWC's span behavior is easier to notice.
  • Test coverage. Added cases for shebang, shebang+comment, BOM, CRLF, dynamic import("..."), empty named imports, default as, mixed default+namespace, two imports of the same module, and an import-shaped substring inside a template literal.

boomyao and others added 2 commits May 22, 2026 11:45
Signed-off-by: yao <zhangyaoruo@outlook.com>
SWC's `module.span.start` keeps the leading shebang line inside the
module span but excludes leading line/block comments and a BOM. The
previous `getLeadingSyntaxByteOffset` skipped the shebang, which made
`module.span.start - leadingOffset - 1` shift every subsequent byte→string
mapping. A steps bundle that starts with `#!/usr/bin/env node` would
either throw `Unable to map SWC byte position X to a string index` or
silently corrupt the rewrite.

- Rename `getLeadingSyntaxByteOffset` → `getLeadingCommentByteOffset` and
  drop the shebang branch.
- Document the invariant tying SWC's 1-based global byte counter to
  source-relative offsets so a future change to SWC's span behavior
  doesn't silently break the rewriter.
- Add test coverage for shebang, shebang+comment, BOM, CRLF, dynamic
  imports, empty named imports, `default as`, mixed default+namespace,
  duplicate imports of the same module, and template-literal substrings.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 22, 2026

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 May 22, 2026 11:39am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 22, 2026 11:39am
example-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-astro-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-express-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-fastify-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-hono-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-nitro-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-nuxt-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workbench-vite-workflow Ready Ready Preview, Comment May 22, 2026 11:39am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 22, 2026 11:39am
workflow-swc-playground Ready Ready Preview, Comment May 22, 2026 11:39am
workflow-tarballs Ready Ready Preview, Comment May 22, 2026 11:39am
workflow-web Ready Ready Preview, Comment May 22, 2026 11:39am

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

🦋 Changeset detected

Latest commit: 7ae4af5

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

This PR includes changesets to release 16 packages
Name Type
@workflow/nest Patch
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
@workflow/astro Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt 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
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

📊 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 🥇 Express 0.029s (-34.1% 🟢) 1.005s (~) 0.976s 10 1.00x
💻 Local Nitro 0.031s (-27.8% 🟢) 1.006s (~) 0.975s 10 1.07x
🐘 Postgres Express 0.040s (-31.7% 🟢) 1.009s (~) 0.970s 10 1.36x
💻 Local Next.js (Turbopack) 0.048s 1.006s 0.957s 10 1.65x
🐘 Postgres Nitro 0.049s (-48.4% 🟢) 1.012s (-2.9%) 0.963s 10 1.68x
🐘 Postgres Next.js (Turbopack) 0.057s 1.012s 0.955s 10 1.96x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.761s (+223.3% 🔺) 2.991s (+40.0% 🔺) 2.229s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.066s (-5.3% 🟢) 2.006s (~) 0.940s 10 1.00x
💻 Local Nitro 1.077s (-4.8%) 2.007s (~) 0.930s 10 1.01x
🐘 Postgres Nitro 1.079s (-5.3% 🟢) 2.008s (~) 0.929s 10 1.01x
🐘 Postgres Express 1.090s (-4.9%) 2.017s (~) 0.927s 10 1.02x
💻 Local Next.js (Turbopack) 1.117s 2.006s 0.889s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.119s 2.009s 0.890s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.637s (-12.7% 🟢) 4.071s (+6.9% 🔺) 2.434s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.394s (-4.8%) 11.022s (~) 0.628s 3 1.00x
🐘 Postgres Nitro 10.403s (-4.3%) 11.014s (~) 0.611s 3 1.00x
💻 Local Nitro 10.421s (-4.8%) 11.023s (~) 0.602s 3 1.00x
🐘 Postgres Express 10.455s (-4.6%) 11.028s (~) 0.573s 3 1.01x
💻 Local Next.js (Turbopack) 10.722s 11.024s 0.302s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.751s 11.012s 0.260s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.623s (-19.8% 🟢) 15.812s (-21.0% 🟢) 2.190s 2 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.440s (-10.2% 🟢) 14.028s (-6.7% 🟢) 0.589s 5 1.00x
🐘 Postgres Nitro 13.450s (-7.8% 🟢) 14.017s (-6.7% 🟢) 0.567s 5 1.00x
💻 Local Nitro 13.496s (-10.4% 🟢) 14.028s (-12.5% 🟢) 0.532s 5 1.00x
🐘 Postgres Express 13.607s (-6.7% 🟢) 14.026s (-6.6% 🟢) 0.419s 5 1.01x
💻 Local Next.js (Turbopack) 14.125s 15.033s 0.908s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.139s 15.015s 0.876s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 23.268s (-53.7% 🟢) 25.457s (-51.6% 🟢) 2.188s 3 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 11.838s (-15.2% 🟢) 12.018s (-16.0% 🟢) 0.180s 8 1.00x
💻 Local Express 11.874s (-28.5% 🟢) 12.022s (-29.4% 🟢) 0.148s 8 1.00x
🐘 Postgres Express 11.936s (-14.8% 🟢) 12.395s (-15.1% 🟢) 0.458s 8 1.01x
💻 Local Nitro 11.947s (-28.8% 🟢) 12.023s (-29.4% 🟢) 0.076s 8 1.01x
💻 Local Next.js (Turbopack) 13.034s 13.454s 0.420s 7 1.10x
🐘 Postgres Next.js (Turbopack) 13.210s 14.015s 0.805s 7 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 34.727s (-71.4% 🟢) 36.755s (-70.3% 🟢) 2.028s 3 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.141s (-9.4% 🟢) 2.007s (~) 0.865s 15 1.00x
🐘 Postgres Nitro 1.142s (-10.4% 🟢) 2.007s (~) 0.865s 15 1.00x
💻 Local Express 1.169s (-21.5% 🟢) 2.006s (~) 0.837s 15 1.02x
💻 Local Nitro 1.177s (-27.8% 🟢) 2.006s (-3.3%) 0.829s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.210s 2.007s 0.797s 15 1.06x
💻 Local Next.js (Turbopack) 1.295s 2.006s 0.711s 15 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.617s (-8.5% 🟢) 4.292s (-7.2% 🟢) 1.675s 7 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.182s (-49.9% 🟢) 2.007s (-33.3% 🟢) 0.824s 15 1.00x
🐘 Postgres Nitro 1.187s (-49.5% 🟢) 2.007s (-33.3% 🟢) 0.820s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.388s 2.007s 0.619s 15 1.17x
💻 Local Express 1.693s (-42.7% 🟢) 2.005s (-41.9% 🟢) 0.312s 15 1.43x
💻 Local Next.js (Turbopack) 1.853s 2.140s 0.287s 15 1.57x
💻 Local Nitro 1.889s (-39.9% 🟢) 2.222s (-42.8% 🟢) 0.332s 14 1.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.610s (~) 4.963s (-2.9%) 1.354s 7 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.311s (-62.3% 🟢) 2.007s (-49.9% 🟢) 0.696s 15 1.00x
🐘 Postgres Express 1.359s (-61.0% 🟢) 2.077s (-48.2% 🟢) 0.718s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.631s 2.007s 0.376s 15 1.24x
💻 Local Express 4.640s (-44.4% 🟢) 5.180s (-42.6% 🟢) 0.540s 6 3.54x
💻 Local Nitro 5.616s (-32.7% 🟢) 6.414s (-28.9% 🟢) 0.798s 5 4.28x
💻 Local Next.js (Turbopack) 6.062s 6.214s 0.152s 5 4.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.323s (+25.5% 🔺) 8.451s (+37.9% 🔺) 3.128s 4 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.145s (-8.9% 🟢) 2.008s (~) 0.863s 15 1.00x
🐘 Postgres Express 1.176s (-6.5% 🟢) 2.011s (~) 0.836s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.205s 2.008s 0.803s 15 1.05x
💻 Local Express 1.277s (-32.6% 🟢) 2.006s (-15.1% 🟢) 0.729s 15 1.12x
💻 Local Next.js (Turbopack) 1.295s 2.006s 0.712s 15 1.13x
💻 Local Nitro 1.411s (-24.3% 🟢) 2.006s (-14.3% 🟢) 0.595s 15 1.23x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.162s (+22.5% 🔺) 4.789s (+10.1% 🔺) 1.628s 7 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.197s (-48.8% 🟢) 2.008s (-33.3% 🟢) 0.812s 15 1.00x
🐘 Postgres Express 1.223s (-47.8% 🟢) 2.009s (-33.3% 🟢) 0.786s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.339s 2.007s 0.668s 15 1.12x
💻 Local Express 1.864s (-40.5% 🟢) 2.315s (-38.5% 🟢) 0.451s 13 1.56x
💻 Local Next.js (Turbopack) 2.148s 3.008s 0.860s 10 1.80x
💻 Local Nitro 2.180s (-28.9% 🟢) 2.675s (-31.2% 🟢) 0.496s 12 1.82x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.159s (+30.3% 🔺) 6.017s (+25.6% 🔺) 1.858s 6 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.309s (-62.4% 🟢) 2.009s (-49.9% 🟢) 0.700s 15 1.00x
🐘 Postgres Express 1.384s (-60.4% 🟢) 2.141s (-46.6% 🟢) 0.757s 15 1.06x
🐘 Postgres Next.js (Turbopack) 1.658s 2.012s 0.354s 15 1.27x
💻 Local Express 5.347s (-39.2% 🟢) 6.012s (-35.2% 🟢) 0.666s 5 4.09x
💻 Local Nitro 5.593s (-38.8% 🟢) 6.214s (-38.0% 🟢) 0.621s 5 4.27x
💻 Local Next.js (Turbopack) 6.478s 6.816s 0.338s 5 4.95x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.789s (-9.8% 🟢) 7.601s (-7.1% 🟢) 1.813s 4 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.453s (-44.7% 🟢) 1.007s (~) 0.553s 60 1.00x
💻 Local Express 0.475s (-51.8% 🟢) 1.004s (-6.7% 🟢) 0.529s 60 1.05x
💻 Local Nitro 0.505s (-48.5% 🟢) 1.005s (-8.2% 🟢) 0.500s 60 1.11x
🐘 Postgres Express 0.564s (-32.8% 🟢) 1.069s (+4.5%) 0.505s 57 1.24x
🐘 Postgres Next.js (Turbopack) 0.670s 1.006s 0.336s 60 1.48x
💻 Local Next.js (Turbopack) 0.752s 1.005s 0.253s 60 1.66x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.721s (-69.9% 🟢) 7.719s (-63.8% 🟢) 1.998s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.026s (-46.8% 🟢) 1.458s (-30.6% 🟢) 0.432s 62 1.00x
🐘 Postgres Express 1.073s (-45.7% 🟢) 1.536s (-32.0% 🟢) 0.463s 59 1.05x
💻 Local Express 1.206s (-60.0% 🟢) 2.005s (-44.1% 🟢) 0.799s 45 1.18x
💻 Local Nitro 1.335s (-56.0% 🟢) 2.123s (-43.5% 🟢) 0.788s 43 1.30x
🐘 Postgres Next.js (Turbopack) 1.584s 2.007s 0.423s 45 1.54x
💻 Local Next.js (Turbopack) 1.820s 2.006s 0.186s 45 1.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.058s (-59.3% 🟢) 16.182s (-56.0% 🟢) 2.124s 6 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.983s (-51.7% 🟢) 2.334s (-49.3% 🟢) 0.351s 52 1.00x
🐘 Postgres Express 2.284s (-42.8% 🟢) 2.696s (-38.3% 🟢) 0.412s 45 1.15x
💻 Local Express 2.658s (-71.1% 🟢) 3.007s (-70.0% 🟢) 0.350s 40 1.34x
💻 Local Nitro 2.711s (-70.8% 🟢) 3.008s (-70.0% 🟢) 0.297s 40 1.37x
🐘 Postgres Next.js (Turbopack) 3.120s 4.009s 0.889s 30 1.57x
💻 Local Next.js (Turbopack) 3.755s 4.008s 0.253s 30 1.89x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 34.068s (-73.8% 🟢) 36.309s (-72.5% 🟢) 2.241s 4 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.175s (-38.2% 🟢) 1.006s (~) 0.831s 60 1.00x
🐘 Postgres Express 0.202s (-28.5% 🟢) 1.014s (+0.6%) 0.812s 60 1.15x
🐘 Postgres Next.js (Turbopack) 0.229s 1.006s 0.777s 60 1.31x
💻 Local Express 0.374s (-33.3% 🟢) 1.004s (~) 0.630s 60 2.14x
💻 Local Nitro 0.425s (-29.8% 🟢) 1.005s (-1.7%) 0.580s 60 2.43x
💻 Local Next.js (Turbopack) 0.523s 1.004s 0.481s 60 2.99x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.634s (+34.8% 🔺) 4.533s (+24.6% 🔺) 1.900s 14 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.287s (-42.2% 🟢) 1.006s (~) 0.719s 90 1.00x
🐘 Postgres Express 0.366s (-28.2% 🟢) 1.014s (+0.8%) 0.648s 89 1.28x
🐘 Postgres Next.js (Turbopack) 0.426s 1.006s 0.581s 90 1.48x
💻 Local Express 2.046s (-18.6% 🟢) 2.608s (-13.3% 🟢) 0.562s 35 7.13x
💻 Local Nitro 2.159s (-14.9% 🟢) 2.853s (-5.2% 🟢) 0.694s 32 7.53x
💻 Local Next.js (Turbopack) 2.395s 3.010s 0.615s 30 8.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.350s (+75.6% 🔺) 6.961s (+44.8% 🔺) 1.610s 14 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.596s (-24.6% 🟢) 1.006s (~) 0.410s 120 1.00x
🐘 Postgres Express 0.644s (-21.3% 🟢) 1.102s (+8.4% 🔺) 0.458s 110 1.08x
🐘 Postgres Next.js (Turbopack) 0.878s 1.041s 0.163s 116 1.47x
💻 Local Express 9.845s (-12.0% 🟢) 10.443s (-12.5% 🟢) 0.598s 12 16.53x
💻 Local Nitro 10.297s (-8.0% 🟢) 10.937s (-6.2% 🟢) 0.641s 11 17.29x
💻 Local Next.js (Turbopack) 11.156s 11.758s 0.603s 11 18.73x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 15.959s (+115.1% 🔺) 18.212s (+97.0% 🔺) 2.253s 7 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

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.132s (+468.4% 🔺) 2.005s (+99.6% 🔺) 0.010s (-14.9% 🟢) 2.017s (+98.1% 🔺) 0.886s 10 1.00x
💻 Local Nitro 1.133s (+430.3% 🔺) 2.005s (+99.6% 🔺) 0.012s (-4.8%) 2.019s (+98.2% 🔺) 0.886s 10 1.00x
🐘 Postgres Nitro 1.135s (+453.6% 🔺) 2.000s (+100.1% 🔺) 0.001s (-40.0% 🟢) 2.010s (+98.8% 🔺) 0.875s 10 1.00x
🐘 Postgres Express 1.137s (+454.2% 🔺) 1.996s (+99.9% 🔺) 0.001s (-50.0% 🟢) 2.013s (+99.0% 🔺) 0.876s 10 1.00x
💻 Local Next.js (Turbopack) 1.177s 2.004s 0.012s 2.020s 0.843s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.200s 2.002s 0.002s 2.011s 0.811s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.314s (-7.6% 🟢) 3.554s (-13.1% 🟢) 2.130s (+121.7% 🔺) 6.172s (+10.4% 🔺) 3.858s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.500s (+140.3% 🔺) 2.002s (+98.9% 🔺) 0.004s (-5.7% 🟢) 2.026s (+98.1% 🔺) 0.526s 30 1.00x
🐘 Postgres Express 1.632s (+159.1% 🔺) 2.069s (+105.6% 🔺) 0.003s (-19.9% 🟢) 2.097s (+105.0% 🔺) 0.465s 29 1.09x
💻 Local Next.js (Turbopack) 1.667s 2.011s 0.009s 2.023s 0.356s 30 1.11x
🐘 Postgres Next.js (Turbopack) 1.670s 2.011s 0.004s 2.025s 0.355s 30 1.11x
💻 Local Express 1.701s (+124.7% 🔺) 2.011s (+95.4% 🔺) 0.010s (+2.8%) 2.202s (+111.7% 🔺) 0.500s 28 1.13x
💻 Local Nitro 1.964s (+134.2% 🔺) 2.011s (+98.8% 🔺) 0.009s (-1.4%) 2.424s (+117.2% 🔺) 0.459s 25 1.31x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 7.186s (+10.5% 🔺) 8.874s (+10.8% 🔺) 0.306s (-25.1% 🟢) 9.647s (+9.2% 🔺) 2.461s 7 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.651s (-32.8% 🟢) 1.051s (-15.7% 🟢) 0.000s (-57.9% 🟢) 1.060s (-15.7% 🟢) 0.409s 57 1.00x
🐘 Postgres Next.js (Turbopack) 0.763s 1.034s 0.000s 1.054s 0.291s 57 1.17x
🐘 Postgres Express 0.889s (-7.5% 🟢) 1.303s (+1.9%) 0.000s (+150.0% 🔺) 1.321s (+1.2%) 0.433s 46 1.37x
💻 Local Express 1.337s (+9.1% 🔺) 2.016s (~) 0.000s (+20.0% 🔺) 2.018s (~) 0.682s 30 2.05x
💻 Local Nitro 1.392s (+13.8% 🔺) 2.014s (~) 0.000s (+200.0% 🔺) 2.016s (~) 0.625s 30 2.14x
💻 Local Next.js (Turbopack) 1.436s 2.015s 0.000s 2.018s 0.582s 30 2.21x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.374s (+16.9% 🔺) 5.641s (+10.6% 🔺) 0.000s (-100.0% 🟢) 6.182s (+11.8% 🔺) 1.808s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

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.321s (-26.2% 🟢) 2.104s (-1.8%) 0.000s (+93.1% 🔺) 2.116s (-2.7%) 0.795s 29 1.00x
🐘 Postgres Next.js (Turbopack) 1.562s 2.145s 0.000s 2.157s 0.595s 28 1.18x
🐘 Postgres Express 1.598s (-9.8% 🟢) 2.141s (-1.7%) 0.000s (+Infinity% 🔺) 2.167s (-1.5%) 0.568s 28 1.21x
💻 Local Next.js (Turbopack) 2.975s 3.472s 0.001s 3.477s 0.502s 18 2.25x
💻 Local Express 3.099s (-10.6% 🟢) 3.905s (-3.2%) 0.001s (+40.6% 🔺) 3.910s (-3.1%) 0.811s 16 2.35x
💻 Local Nitro 3.145s (-7.2% 🟢) 3.904s (-3.2%) 0.001s (+5.5% 🔺) 3.907s (-3.2%) 0.762s 16 2.38x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.590s (+21.9% 🔺) 7.019s (+16.5% 🔺) 0.000s (NaN%) 7.907s (+22.5% 🔺) 2.316s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 19/21
🐘 Postgres Nitro 18/21
▲ Vercel Express 21/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 14/21
Next.js (Turbopack) 🐘 Postgres 14/21
Nitro 🐘 Postgres 18/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
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1222 0 219 1441
✅ 💻 Local Development 1615 0 219 1834
✅ 📦 Local Production 1615 0 219 1834
✅ 🐘 Local Postgres 1615 0 219 1834
✅ 🪟 Windows 131 0 0 131
✅ 📋 Other 741 0 176 917
Total 6939 0 1052 7991

Details by Category

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

📋 View full workflow run

@VaguelySerious VaguelySerious marked this pull request as ready for review May 22, 2026 11:35
@VaguelySerious VaguelySerious requested a review from a team as a code owner May 22, 2026 11:35
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.

2 participants