Skip to content

feat(nitro): forward externals.external to workflow builder#1844

Merged
TooTallNate merged 3 commits into
mainfrom
feat/framework-externals-passthrough
Apr 28, 2026
Merged

feat(nitro): forward externals.external to workflow builder#1844
TooTallNate merged 3 commits into
mainfrom
feat/framework-externals-passthrough

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate commented Apr 23, 2026

Summary

  • Forwards string entries from nitro.options.externals.external to the workflow builder's esbuild external option.
  • Applies to both VercelBuilder and LocalBuilder.
  • RegExp and function entries are skipped since esbuild's external only supports literal strings.

Motivation

Nitro users can already mark packages as externals via the native externals.external config, but the Workflow SDK previously ignored that setting and bundled everything itself. This led to unnecessary bundling of packages (e.g. native-dep packages like fsevents) that users had already explicitly opted out of.

Rather than introduce a workflow-specific externalPackages option on the Nitro module, this PR reads Nitro's native externals config so the same declaration covers both Nitro's rollup build and our esbuild bundles.

Tests

8 new tests in packages/nitro/src/index.test.ts (4 per builder: VercelBuilder and LocalBuilder) covering empty externals, string-only forwarding, mixed string/RegExp/function filtering, and all-non-string rejection.

Nitro users can declare packages as externals via
`externals: { external: ['fsevents'] }` in `nitro.config.ts`. Previously
the workflow SDK's step/workflow/webhook bundles were built in isolation
and ignored that config, forcing users to either patch the Nitro adapter
or ship a custom builder (as in the 250MB bundle-size workaround gist).

Forward string entries from `nitro.options.externals.external` to the
builder's esbuild `external` option. Only string entries are forwarded
— RegExp and function matchers aren't supported by esbuild's
`external` API, so those are skipped.
Copilot AI review requested due to automatic review settings April 23, 2026 21:22
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 23, 2026

🦋 Changeset detected

Latest commit: e523cb4

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

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 23, 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 Apr 28, 2026 11:15pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Apr 28, 2026 11:15pm
example-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-astro-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-express-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-fastify-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-hono-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-nitro-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-nuxt-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workbench-vite-workflow Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Apr 28, 2026 11:15pm
workflow-swc-playground Ready Ready Preview, Comment Apr 28, 2026 11:15pm
workflow-web Ready Ready Preview, Comment Apr 28, 2026 11:15pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 23, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 978 0 67 1045
✅ 💻 Local Development 1054 0 86 1140
✅ 📦 Local Production 1054 0 86 1140
✅ 🐘 Local Postgres 1054 0 86 1140
✅ 🪟 Windows 95 0 0 95
✅ 📋 Other 267 0 18 285
Total 4502 0 343 4845

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 88 0 7
✅ example 88 0 7
✅ express 88 0 7
✅ fastify 88 0 7
✅ hono 88 0 7
✅ nextjs-turbopack 93 0 2
✅ nextjs-webpack 93 0 2
✅ nitro 88 0 7
✅ nuxt 88 0 7
✅ sveltekit 88 0 7
✅ vite 88 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 89 0 6
✅ express-stable 89 0 6
✅ fastify-stable 89 0 6
✅ hono-stable 89 0 6
✅ nextjs-turbopack-canary 76 0 19
✅ nextjs-turbopack-stable 95 0 0
✅ nextjs-webpack-canary 76 0 19
✅ nextjs-webpack-stable 95 0 0
✅ nitro-stable 89 0 6
✅ nuxt-stable 89 0 6
✅ sveltekit-stable 89 0 6
✅ vite-stable 89 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 95 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 89 0 6
✅ e2e-local-postgres-nest-stable 89 0 6
✅ e2e-local-prod-nest-stable 89 0 6

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 23, 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.042s (-6.1% 🟢) 1.006s (~) 0.964s 10 1.00x
💻 Local Nitro 0.043s (~) 1.005s (~) 0.962s 10 1.04x
💻 Local Next.js (Turbopack) 0.044s 1.005s 0.960s 10 1.06x
🐘 Postgres Next.js (Turbopack) 0.054s 1.012s 0.957s 10 1.31x
🐘 Postgres Express 0.055s (-4.7%) 1.009s (~) 0.954s 10 1.33x
🐘 Postgres Nitro 0.116s (+22.1% 🔺) 1.050s (+0.6%) 0.933s 10 2.79x
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.121s 2.006s 0.885s 10 1.00x
💻 Local Express 1.124s (~) 2.005s (~) 0.881s 10 1.00x
🐘 Postgres Next.js (Turbopack) 1.125s 2.011s 0.885s 10 1.00x
💻 Local Nitro 1.128s (~) 2.006s (~) 0.878s 10 1.01x
🐘 Postgres Express 1.152s (~) 2.009s (~) 0.857s 10 1.03x
🐘 Postgres Nitro 1.174s (+3.0%) 2.022s (+0.6%) 0.848s 10 1.05x
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 10.771s 11.025s 0.253s 3 1.00x
💻 Local Next.js (Turbopack) 10.806s 11.023s 0.217s 3 1.00x
🐘 Postgres Express 10.874s (-0.8%) 11.019s (~) 0.145s 3 1.01x
💻 Local Nitro 10.920s (~) 11.023s (~) 0.104s 3 1.01x
💻 Local Express 10.944s (~) 11.023s (~) 0.079s 3 1.02x
🐘 Postgres Nitro 11.221s (+3.2%) 11.718s (+6.3% 🔺) 0.498s 3 1.04x
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 14.204s 15.024s 0.820s 4 1.00x
🐘 Postgres Express 14.559s (~) 15.023s (~) 0.465s 4 1.02x
💻 Local Next.js (Turbopack) 14.614s 15.032s 0.418s 4 1.03x
💻 Local Nitro 14.959s (-0.7%) 15.028s (-6.3% 🟢) 0.069s 4 1.05x
💻 Local Express 14.976s (~) 15.029s (~) 0.052s 4 1.05x
🐘 Postgres Nitro 16.852s (+15.5% 🔺) 17.324s (+15.3% 🔺) 0.473s 4 1.19x
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 13.417s 14.021s 0.605s 7 1.00x
🐘 Postgres Express 13.843s (-1.2%) 14.020s (-3.9%) 0.177s 7 1.03x
💻 Local Next.js (Turbopack) 15.675s 16.029s 0.355s 6 1.17x
🐘 Postgres Nitro 16.343s (+17.0% 🔺) 16.883s (+18.0% 🔺) 0.540s 6 1.22x
💻 Local Nitro 16.664s (-0.7%) 17.031s (~) 0.367s 6 1.24x
💻 Local Express 16.757s (+0.9%) 17.030s (~) 0.273s 6 1.25x
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.187s 2.009s 0.822s 15 1.00x
🐘 Postgres Express 1.260s (~) 2.011s (~) 0.750s 15 1.06x
🐘 Postgres Nitro 1.429s (+12.1% 🔺) 2.102s (+4.6%) 0.673s 15 1.20x
💻 Local Nitro 1.510s (-7.4% 🟢) 2.006s (-3.3%) 0.495s 15 1.27x
💻 Local Express 1.526s (+2.5%) 2.006s (~) 0.480s 15 1.29x
💻 Local Next.js (Turbopack) 1.542s 2.006s 0.464s 15 1.30x
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.335s (-1.1%) 3.010s (~) 0.674s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.368s 3.009s 0.641s 10 1.01x
🐘 Postgres Nitro 2.555s (+8.7% 🔺) 3.050s (+1.4%) 0.495s 10 1.09x
💻 Local Next.js (Turbopack) 2.939s 3.565s 0.626s 9 1.26x
💻 Local Nitro 2.970s (-5.5% 🟢) 3.208s (-17.4% 🟢) 0.238s 10 1.27x
💻 Local Express 2.998s (+1.5%) 3.453s (~) 0.455s 9 1.28x
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.464s (-0.6%) 4.011s (~) 0.547s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.592s 4.012s 0.420s 8 1.04x
🐘 Postgres Nitro 4.278s (+22.9% 🔺) 5.037s (+25.7% 🔺) 0.760s 6 1.23x
💻 Local Next.js (Turbopack) 7.128s 7.518s 0.390s 4 2.06x
💻 Local Nitro 8.243s (-1.3%) 9.023s (~) 0.779s 4 2.38x
💻 Local Express 8.381s (+0.5%) 9.019s (~) 0.637s 4 2.42x
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.185s 2.008s 0.823s 15 1.00x
🐘 Postgres Express 1.261s (~) 2.008s (~) 0.747s 15 1.06x
🐘 Postgres Nitro 1.283s (+2.1%) 2.025s (+0.9%) 0.742s 15 1.08x
💻 Local Next.js (Turbopack) 1.507s 2.006s 0.499s 15 1.27x
💻 Local Express 1.538s (-18.8% 🟢) 2.006s (-15.1% 🟢) 0.468s 15 1.30x
💻 Local Nitro 1.539s (-17.5% 🟢) 2.006s (-14.3% 🟢) 0.467s 15 1.30x
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 2.364s 3.009s 0.646s 10 1.00x
🐘 Postgres Express 2.366s (+1.0%) 3.010s (~) 0.644s 10 1.00x
🐘 Postgres Nitro 2.752s (+17.6% 🔺) 3.126s (+3.8%) 0.374s 10 1.16x
💻 Local Next.js (Turbopack) 2.777s 3.008s 0.232s 10 1.17x
💻 Local Nitro 3.059s (~) 3.885s (~) 0.825s 8 1.29x
💻 Local Express 3.066s (-2.1%) 3.886s (+3.3%) 0.820s 8 1.30x
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.497s (~) 4.011s (~) 0.513s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.549s 4.012s 0.463s 8 1.01x
🐘 Postgres Nitro 4.131s (+18.7% 🔺) 4.369s (+9.0% 🔺) 0.238s 7 1.18x
💻 Local Next.js (Turbopack) 7.501s 8.019s 0.518s 4 2.14x
💻 Local Nitro 8.590s (-6.1% 🟢) 9.025s (-10.0% 🟢) 0.435s 4 2.46x
💻 Local Express 8.801s (~) 9.029s (-2.6%) 0.229s 4 2.52x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.684s 1.007s 0.323s 60 1.00x
🐘 Postgres Express 0.828s (-1.4%) 1.023s (~) 0.196s 59 1.21x
💻 Local Next.js (Turbopack) 0.841s 1.005s 0.163s 60 1.23x
💻 Local Express 0.993s (+0.9%) 1.205s (+12.0% 🔺) 0.212s 50 1.45x
💻 Local Nitro 0.996s (+1.5%) 1.255s (+14.7% 🔺) 0.259s 48 1.46x
🐘 Postgres Nitro 1.524s (+85.8% 🔺) 2.057s (+104.4% 🔺) 0.532s 30 2.23x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.599s 2.008s 0.409s 45 1.00x
🐘 Postgres Express 1.879s (-4.9%) 2.007s (-11.1% 🟢) 0.128s 45 1.18x
🐘 Postgres Nitro 2.418s (+25.5% 🔺) 2.920s (+39.0% 🔺) 0.501s 32 1.51x
💻 Local Next.js (Turbopack) 2.686s 3.041s 0.355s 30 1.68x
💻 Local Express 3.025s (~) 3.689s (+2.9%) 0.665s 25 1.89x
💻 Local Nitro 3.049s (~) 3.609s (-4.0%) 0.560s 25 1.91x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 3.312s 4.011s 0.699s 30 1.00x
🐘 Postgres Express 3.832s (-4.0%) 4.043s (-7.5% 🟢) 0.211s 30 1.16x
🐘 Postgres Nitro 6.227s (+51.8% 🔺) 6.833s (+48.4% 🔺) 0.606s 18 1.88x
💻 Local Next.js (Turbopack) 8.409s 9.017s 0.608s 14 2.54x
💻 Local Nitro 9.196s (-1.1%) 9.941s (-0.8%) 0.745s 13 2.78x
💻 Local Express 9.302s (+1.0%) 9.941s (-0.8%) 0.639s 13 2.81x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.212s 1.007s 0.795s 60 1.00x
🐘 Postgres Express 0.279s (-1.1%) 1.007s (~) 0.728s 60 1.31x
🐘 Postgres Nitro 0.365s (+28.7% 🔺) 1.033s (+2.5%) 0.668s 59 1.72x
💻 Local Nitro 0.569s (-5.9% 🟢) 1.004s (-1.7%) 0.435s 60 2.68x
💻 Local Next.js (Turbopack) 0.582s 1.004s 0.422s 60 2.74x
💻 Local Express 0.598s (+6.6% 🔺) 1.005s (~) 0.407s 60 2.81x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.446s 1.006s 0.560s 90 1.00x
🐘 Postgres Express 0.495s (-2.9%) 1.007s (~) 0.512s 90 1.11x
🐘 Postgres Nitro 0.603s (+21.6% 🔺) 1.086s (+7.9% 🔺) 0.482s 83 1.35x
💻 Local Next.js (Turbopack) 2.427s 3.009s 0.582s 30 5.44x
💻 Local Nitro 2.505s (-1.3%) 3.009s (~) 0.504s 30 5.62x
💻 Local Express 2.646s (+5.3% 🔺) 3.010s (~) 0.364s 30 5.93x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.671s 1.007s 0.336s 120 1.00x
🐘 Postgres Express 0.792s (-3.2%) 1.007s (-1.0%) 0.215s 120 1.18x
🐘 Postgres Nitro 0.949s (+20.0% 🔺) 1.347s (+33.7% 🔺) 0.398s 90 1.41x
💻 Local Next.js (Turbopack) 10.539s 11.115s 0.577s 11 15.71x
💻 Local Nitro 11.137s (~) 11.575s (-0.8%) 0.438s 11 16.61x
💻 Local Express 11.459s (+2.4%) 12.028s (+0.7%) 0.570s 10 17.08x
Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.167s 1.002s 0.001s 1.011s 0.844s 10 1.00x
💻 Local Next.js (Turbopack) 0.174s 1.003s 0.010s 1.016s 0.842s 10 1.04x
🐘 Postgres Nitro 0.194s (-5.6% 🟢) 0.993s (-0.7%) 0.383s (+25460.0% 🔺) 1.393s (+37.7% 🔺) 1.199s 10 1.16x
💻 Local Express 0.204s (+2.3%) 1.004s (~) 0.012s (~) 1.018s (~) 0.814s 10 1.22x
🐘 Postgres Express 0.206s (~) 0.997s (~) 0.002s (-6.3% 🟢) 1.009s (~) 0.803s 10 1.24x
💻 Local Nitro 0.206s (-3.5%) 1.004s (~) 0.012s (-5.6% 🟢) 1.018s (~) 0.812s 10 1.24x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.590s 1.025s 0.004s 1.039s 0.449s 58 1.00x
🐘 Postgres Express 0.604s (-4.2%) 1.005s (~) 0.009s (+129.2% 🔺) 1.028s (~) 0.424s 59 1.02x
💻 Local Next.js (Turbopack) 0.705s 1.012s 0.012s 1.027s 0.322s 59 1.20x
💻 Local Nitro 0.844s (+0.7%) 1.012s (~) 0.008s (-14.8% 🟢) 1.114s (~) 0.270s 54 1.43x
💻 Local Express 0.958s (+26.5% 🔺) 1.011s (-1.7%) 0.009s (-4.8%) 1.227s (+18.0% 🔺) 0.269s 49 1.62x
🐘 Postgres Nitro 1.207s (+93.3% 🔺) 1.662s (+65.1% 🔺) 0.128s (+2998.7% 🔺) 1.848s (+80.8% 🔺) 0.642s 33 2.05x
10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.940s (-2.2%) 1.172s (-8.3% 🟢) 0.000s (-100.0% 🟢) 1.184s (-9.3% 🟢) 0.244s 51 1.00x
🐘 Postgres Next.js (Turbopack) 0.941s 1.221s 0.000s 1.228s 0.287s 50 1.00x
💻 Local Nitro 1.212s (-0.9%) 2.020s (~) 0.000s (+100.0% 🔺) 2.021s (~) 0.809s 30 1.29x
💻 Local Express 1.254s (+2.3%) 2.022s (~) 0.000s (-20.0% 🟢) 2.024s (~) 0.770s 30 1.33x
💻 Local Next.js (Turbopack) 1.491s 2.022s 0.000s 2.204s 0.713s 28 1.59x
🐘 Postgres Nitro 2.205s (+127.6% 🔺) 2.565s (+105.6% 🔺) 0.000s (+4.3%) 2.649s (+110.6% 🔺) 0.444s 23 2.35x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.782s (+0.6%) 2.221s (+2.0%) 0.000s (+Infinity% 🔺) 2.240s (+1.9%) 0.457s 27 1.00x
🐘 Postgres Next.js (Turbopack) 1.890s 2.144s 0.000s 2.152s 0.262s 28 1.06x
🐘 Postgres Nitro 3.087s (+72.3% 🔺) 3.531s (+64.9% 🔺) 0.000s (+229.4% 🔺) 3.640s (+67.4% 🔺) 0.553s 17 1.73x
💻 Local Nitro 3.389s (~) 4.032s (~) 0.000s (-75.0% 🟢) 4.034s (~) 0.645s 15 1.90x
💻 Local Express 3.539s (+2.1%) 4.098s (+1.6%) 0.000s (-66.7% 🟢) 4.100s (+1.6%) 0.562s 15 1.99x
💻 Local Next.js (Turbopack) 3.733s 4.391s 0.000s 4.395s 0.662s 14 2.09x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 16/21
🐘 Postgres Next.js (Turbopack) 16/21
Fastest World by Framework

Winner determined by most benchmark wins

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

📋 View full workflow run

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Nitro integration so that string entries from Nitro’s native nitro.options.externals.external configuration are forwarded into the Workflow builder configuration (externalPackages), allowing esbuild bundling to treat those packages as external (while ignoring RegExp/function entries that esbuild can’t represent).

Changes:

  • Add a helper to extract only string externals from nitro.options.externals.external.
  • Pass the extracted externals through externalPackages for both VercelBuilder and LocalBuilder.
  • Add builder-level tests covering empty/mixed/all-non-string externals behavior, plus a changeset for release notes.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
packages/nitro/src/builders.ts Extracts Nitro string externals and forwards them into builder config as externalPackages.
packages/nitro/src/index.test.ts Adds tests validating forwarding/filtering behavior for both builders.
.changeset/nitro-forward-externals.md Declares a minor version bump and documents the new externals forwarding behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious left a comment

Choose a reason for hiding this comment

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

LGTM

Is this related to #1292? It doesn't say which framework he's using, but if nitro or nitro-derivate, this should cover their use, right?

@TooTallNate TooTallNate merged commit cbecbaa into main Apr 28, 2026
156 of 163 checks passed
@TooTallNate TooTallNate deleted the feat/framework-externals-passthrough branch April 28, 2026 23:54
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.

3 participants