Commit Graph

40 Commits

Author SHA1 Message Date
robobun
2b7fc18092 fix(lint): resolve no-unused-expressions errors (#23127)
## Summary

Fixes all oxlint `no-unused-expressions` violations across the codebase
by:
- Adding an oxlint override to disable the rule for
`src/js/builtins/**`, where special syntax markers like `$getter`,
`$constructor`, etc. are intentionally used as standalone expressions
- Converting short-circuit expressions (`condition && fn()`) to proper
if statements for improved code clarity
- Wrapping intentional property access side effects (e.g.,
`this.stdio;`, `err.stack;`) with the `void` operator
- Converting ternary expressions used for control flow to if/else
statements

## Test plan

- [x] `bun lint` passes with no errors

🤖 Generated with [Claude Code](https://claude.com/claude-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-30 04:45:34 -07:00
robobun
40b310c208 Fix child_process stdio properties not enumerable for Object.assign() compatibility (#22322)
## Summary

Fixes compatibility issue with Node.js libraries that use
`Object.assign(promise, childProcess)` pattern, specifically `tinyspawn`
(used by `youtube-dl-exec`).

## Problem

In Node.js, child process stdio properties (`stdin`, `stdout`, `stderr`,
`stdio`) are enumerable own properties that can be copied by
`Object.assign()`. In Bun, they were non-enumerable getters on the
prototype, causing `Object.assign()` to fail copying them.

This broke libraries like:
- `tinyspawn` - uses `Object.assign(promise, childProcess)` to merge
properties
- `youtube-dl-exec` - depends on tinyspawn internally

## Solution

Make stdio properties enumerable own properties during spawn while
preserving:
-  Lazy initialization (streams created only when accessed)
-  Original getter functionality and caching
-  Performance (minimal overhead)

## Testing

- Added comprehensive regression tests
- Verified compatibility with `tinyspawn` and `youtube-dl-exec`
- Existing child_process tests still pass

## Related

- Fixes: https://github.com/microlinkhq/youtube-dl-exec/issues/246

🤖 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-06 01:40:36 -07:00
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
Meghan Denny
6286824e28 node: some builtins cleanup (#22200)
Co-authored-by: Meghan Denny <meghan@bun.com>
2025-08-27 20:34:37 -07:00
robobun
255a3dbd04 Replace ShimmedStdin and ShimmedStdioOutStream with standard streams (#21910)
## Summary

Fixes #21704

Replace custom `ShimmedStdin` and `ShimmedStdioOutStream` classes with
proper Node.js `Readable`/`Writable` streams that are immediately
destroyed. This provides better compatibility and standards compliance
while maintaining the same graceful error handling behavior.

## Changes

- ✂️ **Remove shimmed classes**: Delete `ShimmedStdin` and
`ShimmedStdioOutStream` (~40 lines of code)
- 🔄 **Replace with standard streams**: 
- `ShimmedStdin` → destroyed `Writable` stream with graceful write
handling
  - `ShimmedStdioOutStream` → destroyed `Readable` stream
- 🛡️ **Maintain compatibility**: Streams return `false` for writes and
handle operations gracefully without throwing errors
-  **Standards compliant**: Uses proper Node.js stream inheritance and
behavior

## Technical Details

The new implementation creates streams that are immediately destroyed
using `.destroy()`, which properly marks them as unusable while still
providing the expected stream interface. The `Writable` streams include
a custom `write()` method that always returns `false` and calls
callbacks to prevent hanging, matching the original shimmed behavior.

## Test plan

- [x] Verified basic child_process functionality works
- [x] Tested error cases (non-existent processes, killed processes)
- [x] Confirmed graceful handling of writes to destroyed streams
- [x] Validated stream state properties (`.destroyed`, `.readable`,
etc.)
- [x] Ensured no exceptions are thrown during normal operation

🤖 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-08-15 17:49:35 -07:00
Jarred Sumner
0d4089ea7c Fixes #20753 (#20789)
Co-authored-by: Jarred-Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2025-07-03 01:06:22 -07:00
Michael H
770c1c8327 fix test-child-process-fork-exec-argv.js (#19639)
Co-authored-by: 190n <ben@bun.sh>
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
2025-06-20 11:53:36 -07:00
Jarred Sumner
fd894f5a65 Fix test-child-process-server-close (#20062) 2025-05-30 00:15:26 -07:00
Meghan Denny
d774baa28a tidyings from 18962 (#19644) 2025-05-14 18:47:51 -07:00
pfg
00a3cbd977 more child-process (#18688)
Co-authored-by: pfgithub <6010774+pfgithub@users.noreply.github.com>
2025-05-06 22:12:24 -07:00
Jarred Sumner
032713c58c Fix several lints (#19121) 2025-04-19 05:41:34 -07:00
pfg
d1ac711a7e Fix maxbuf (#18786) 2025-04-04 15:14:41 -07:00
pfg
d9c77be90d node child process maxbuf support (#18293) 2025-04-03 17:03:26 -07:00
pfg
fdd181d68d Even more child process tests passing (#18052) 2025-03-11 22:52:12 -07:00
pfg
174a0f70df return null rather than process.stdin on child process (#17741) 2025-02-26 20:47:49 -08:00
Jarred Sumner
75a95aa5fa Rewrite the internal Web Stream native bindings to use less memory (#16349) 2025-01-26 00:04:39 -08:00
Meghan Denny
cc3994cfba js: ERR_INVALID_ARG_TYPE and ERR_BUFFER_OUT_OF_BOUNDS fixes (#16629) 2025-01-24 17:03:31 -08:00
Ani Betts
40d150be5e node: Fix race condition with accessing stdioOptions (#16670) 2025-01-23 18:56:24 -08:00
chloe caruso
5819fe49a7 node fs compat pr #2 (#16422)
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
Co-authored-by: Meghan Denny <meghan@bun.sh>
Co-authored-by: dylan-conway <35280289+dylan-conway@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-01-21 10:28:35 -08:00
Don Isaac
288f256ce4 test(node): copy over passing parallel/child-process tests (#16383)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-01-18 03:01:30 +00:00
Meghan Denny
2d481e7bcb fix more node:stream (#16385)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-01-16 22:40:39 -08:00
Meghan Denny
65530c91d0 use native validators for validateObject and validateOneOf more (#16203) 2025-01-06 23:51:09 -08:00
Meghan Denny
e1cfea4925 node: fix the rest of test-process (#16026) 2025-01-06 14:30:36 -08:00
Meghan Denny
53318c8b13 ci: run re-enable node tests on all platforms (#15572) 2024-12-09 19:08:30 -08:00
Jarred Sumner
0d5e4e162b spawnSync shouldn't throw (#15561)
Co-authored-by: Meghan Denny <meghan@bun.sh>
2024-12-03 19:26:36 -08:00
ippsav
ec91e91fda Pass missing signal code for child_process.spawnSync (#15137) 2024-11-13 15:07:43 -08:00
Meghan Denny
68e6304c73 node:child_process: 'ineherit' stdio should make getters be null (#14576) 2024-10-14 23:41:34 -07:00
Meghan Denny
e831bbf4ca node: implement more validators in native code (#14177)
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
2024-10-01 21:55:05 -07:00
Meghan Denny
e44d10cf17 node: lowercase primitive expectations of ERR_INVALID_ARG_TYPE (#14284) 2024-10-01 20:37:13 -07:00
Ciro Spaciari
eb8ed27a4a fix(ipc/subprocess) (#13414)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-08-20 05:19:23 -07:00
Meghan Denny
fd75ca7585 implement node:cluster (#11492)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: nektro <nektro@users.noreply.github.com>
Co-authored-by: cirospaciari <ciro.spaciari@gmail.com>
2024-08-18 00:12:42 -07:00
Meghan Denny
4d6480050c NodeError: add more and use them in child_process and dgram (#12929) 2024-07-29 19:15:23 -07:00
Jarred Sumner
fd55cdae34 Try deflaking child process test again (#11496) 2024-05-31 04:17:59 -07:00
Jarred Sumner
9693fc9183 Deflake child process test (#11488) 2024-05-30 21:05:57 -07:00
Jarred Sumner
6d87c965bf Fixes #10170 (#11209) 2024-05-20 21:30:44 -07:00
dave caruso
f9be0bef45 add [Symbol.dispose] in some bun apis (#10818)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
2024-05-06 19:49:23 -07:00
Georgijs
78aef2d894 fix some child_process tests (#10521) 2024-04-25 16:02:19 -07:00
Meghan Denny
2abe6e7c3f node:child_process: allow passing stdin,stdout,stderr to spawn (#10451)
* node:child_process: allow passing stdin,stdout,stderr to spawn

* this doesnt actually need to be limited to 0,1,2

* Apply formatting changes

* fix stream guards

* undo process internals change

* wrap check in function for better clarity

* lazy load node:fs more

---------

Co-authored-by: nektro <nektro@users.noreply.github.com>
2024-04-23 17:03:11 -07:00
Meghan Denny
0f8d74e3dc node:*: fix some typescript errors (#10310)
* node:*: fix some typescript errors

* add dom to tsconfig

* fix url regression

* fix diagnostics_channel regression

* use $isJSArray instead of ArrayIsArray

* $isArray wasnt actually a real builtin

* Revert "$isArray wasnt actually a real builtin"

This reverts commit 319926b538.

* Apply formatting changes

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
2024-04-22 18:24:07 -07:00
Meghan Denny
df190815df node: convert remaining js packages to ts (#10289) 2024-04-16 15:42:24 -07:00