robobun c1584b8a35 Fix spawnSync crash when stdio is set to process.stderr (#22329)
## Summary
- Fixes #20321 - spawnSync crashes with RangeError when stdio is set to
process.stderr
- Handles file descriptors in stdio array correctly by treating them as
non-captured output

## Problem
When `spawnSync` is called with `process.stderr` or `process.stdout` in
the stdio array, Bun.spawnSync returns the file descriptor number (e.g.,
2 for stderr) instead of a buffer or null. This causes a RangeError when
the code tries to call `toString(encoding)` on the number, since
`Number.prototype.toString()` expects a radix between 2 and 36, not an
encoding string.

This was blocking AWS CDK usage with Bun, as CDK internally uses
`spawnSync` with `stdio: ['ignore', process.stderr, 'inherit']`.

## Solution
Check if stdout/stderr from Bun.spawnSync are numbers (file descriptors)
and treat them as null (no captured output) instead of trying to convert
them to strings.

This aligns with Node.js's behavior where in
`lib/internal/child_process.js` (lines 1051-1055), when a stdio option
is a number or has an `fd` property, it's treated as a file descriptor:
```javascript
} else if (typeof stdio === 'number' || typeof stdio.fd === 'number') {
  ArrayPrototypePush(acc, {
    type: 'fd',
    fd: typeof stdio === 'number' ? stdio : stdio.fd,
  });
```

And when stdio is a stream object (like process.stderr), Node.js
extracts the fd from it (lines 1056-1067) and uses it as a file
descriptor, which means the output isn't captured in the result.

## Test plan
Added comprehensive regression tests in
`test/regression/issue/20321.test.ts` that cover:
- process.stderr as stdout
- process.stdout as stderr  
- All process streams in stdio array
- Mixed stdio options
- Direct file descriptor numbers
- The exact AWS CDK use case

All tests pass with the fix.

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-02 03:26:25 -07:00
2025-08-30 20:33:17 -07:00
2025-08-19 23:15:53 -07:00
2025-09-01 16:20:13 -07:00
2024-12-26 11:48:30 -08:00
2024-12-12 03:21:56 -08:00
2025-01-07 20:19:12 -08:00
2025-07-21 16:26:07 -07:00
2025-08-18 03:20:07 -07:00
2025-02-06 18:07:55 -08:00
2025-08-25 21:04:18 -07:00
2024-07-24 01:30:31 -07:00
2025-04-19 05:41:34 -07:00
2025-07-10 00:10:43 -07:00
2025-07-10 00:10:43 -07:00

Logo

Bun

stars Bun speed

Documentation   •   Discord   •   Issues   •   Roadmap

Read the docs →

What is Bun?

Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a single executable called bun.

At its core is the Bun runtime, a fast JavaScript runtime designed as a drop-in replacement for Node.js. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage.

bun run index.tsx             # TS and JSX supported out-of-the-box

The bun command-line tool also implements a test runner, script runner, and Node.js-compatible package manager. Instead of 1,000 node_modules for development, you only need bun. Bun's built-in tools are significantly faster than existing options and usable in existing Node.js projects with little to no changes.

bun test                      # run tests
bun run start                 # run the `start` script in `package.json`
bun install <pkg>             # install a package
bunx cowsay 'Hello, world!'   # execute a package

Install

Bun supports Linux (x64 & arm64), macOS (x64 & Apple Silicon) and Windows (x64).

Linux users — Kernel version 5.6 or higher is strongly recommended, but the minimum is 5.1.

x64 users — if you see "illegal instruction" or similar errors, check our CPU requirements

# with install script (recommended)
curl -fsSL https://bun.com/install | bash

# on windows
powershell -c "irm bun.com/install.ps1 | iex"

# with npm
npm install -g bun

# with Homebrew
brew tap oven-sh/bun
brew install bun

# with Docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

Upgrade

To upgrade to the latest version of Bun, run:

bun upgrade

Bun automatically releases a canary build on every commit to main. To upgrade to the latest canary build, run:

bun upgrade --canary

View canary build

Guides

Contributing

Refer to the Project > Contributing guide to start contributing to Bun.

License

Refer to the Project > License page for information about Bun's licensing.

Description
Bun is a fast, incrementally adoptable all-in-one JavaScript, TypeScript & JSX toolkit. Use individual tools like bun test or bun install in Node.js projects, or adopt the complete stack with a fast JavaScript runtime, bundler, test runner, and package manager built in. Bun aims for 100% Node.js compatibility.
Readme 680 MiB
Languages
Zig 60.5%
C++ 24.9%
TypeScript 8.3%
C 3.3%
JavaScript 1.4%
Other 1.1%