Commit Graph

14506 Commits

Author SHA1 Message Date
Jarred Sumner
ff372f44cb Fix abort handler in "ws" polyfill (#21867)
### What does this PR do?

This does two things:
1. Fix an ASAN use-after-poison on macOS involving `ws` module when
running websocket.test.js. This was caused by the `open` callback firing
before the `.upgrade` function call returns. We need to update the
`socket` value on the ServerWebSocket to ensure the `NodeHTTPResponse`
object is kept alive for as long as it should be, but the `us_socket_t`
address can, in theory, change due to `realloc` being used when adopting
the socket.
2. Fixes an "undefined is not a function" error when the websocket
upgrade fails. This occurred because the `_httpMessage` property is not
set when a socket is upgraded

### How did you verify your code works?

There is a test and the asan error no longer triggers

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-14 16:00:03 -07:00
Jarred Sumner
7b31393d44 Don't run the "Date" header timer every second all the time (#21850)
### What does this PR do?

Only reschedule the Date header while there are in-flight incoming HTTP
requests.

Update the Date header if, at the time we reschedule it, it is now
stale.

Goal: don't wake up Bun's process on every second when we're idly doing
nothing.

| Metric | this branch | main |
|--------|--------------------------|-------------------|
| **task-clock** | **35.24 msec** 🟢 | **102.79 msec** |
| **context-switches** | 619 🟢 | 1,699 |
| **cpu-migrations** | 11 🟢| 35 |
| **page-faults** | 2,173 | 2,174 |
| **cpu_atom/instructions** | **109,904,685 (1.76 insn/cycle)** 🟢 |
**67,880,002 (0.55 insn/cycle)** |
| **cpu_core/instructions** | **87,183,124 (1.07 insn/cycle)** 🟢 |
**32,939,500 (0.44 insn/cycle)** |
| **cpu_atom/cycles** | 62,527,125 (1.774 GHz) 🔻 | 122,448,620 (1.191
GHz) |
| **cpu_core/cycles** | 81,651,366 (2.317 GHz) 🟢 | 75,584,111 (0.735
GHz) |
| **cpu_atom/branches** | 9,632,460 (273.338 M/sec) 🔻 | 12,119,616
(117.909 M/sec) |
| **cpu_core/branches** | 17,417,756 (494.259 M/sec) 🟢 | 6,901,859
(67.147 M/sec) |
| **cpu_atom/branch-misses** | 192,013 (1.99%) 🟢 | 1,735,446 (14.32%) |
| **cpu_core/branch-misses** | 473,567 (2.72%) 🟢 | 499,907 (7.24%) |
| **TopdownL1 (cpu_core)** | 31.4% backend_bound<br>11.7%
bad_speculation<br>36.0% frontend_bound 🔻<br>20.9% retiring<br>34.1%
bad_speculation<br>41.9% retiring<br>0.0% backend_bound<br>24.0%
frontend_bound 🔻 | 21.3% backend_bound<br>9.6% bad_speculation<br>56.2%
frontend_bound<br>12.9% retiring<br>-20.0% bad_speculation<br>55.2%
retiring<br>26.2% backend_bound<br>38.6% frontend_bound |
| **time elapsed** | 1000.0219 s | 1000.0107 s |
| **user time** | — | 0.042667 s |
| **sys time** | — | 0.060309 s |

### How did you verify your code works?

Added a test

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-14 15:39:09 -07:00
Jarred Sumner
bbe7f81ebe Delete makefile (#21863)
### What does this PR do?

### How did you verify your code works?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-14 14:44:47 -07:00
Zack Radisic
33d4757321 docs: Clarify security considerations for the Bun shell (#21691)
### What does this PR do?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Meghan Denny <meghan@bun.sh>
2025-08-14 14:35:44 -07:00
pfg
5097b129c6 fix "String contains an invalid character" when rendering multiple frontend errors (#21844)
This would happen sometimes because it was appending base64 strings to
eachother. You can't do that.

Tested locally and it fixes the bug. Not sure how to make a regression
test for this.
2025-08-14 12:31:37 -07:00
Michael H
a2637497a4 remove unnessary ending ) in bun upgrade error (#21841)
### What does this PR do?

```ts
error: Failed to verify Bun (code: AccessDenied))
```

### How did you verify your code works?
2025-08-14 12:31:03 -07:00
Ciro Spaciari
504052d9b0 fix(test) fix sql.test.ts (#21860)
### What does this PR do?
fix test to not include information that can change version to version
### How did you verify your code works?
CI
2025-08-14 12:25:16 -07:00
jarred-sumner-bot
cf9761367e Implement wildcard sideEffects support using glob API (#21039)
## Summary

Implements wildcard glob pattern support for the `sideEffects` field in
`package.json`, fixes #21034, fixes #5241. This enables more flexible
tree-shaking optimization by allowing developers to use glob patterns
instead of listing individual files.

## Changes

### Core Implementation
- **Extended `SideEffects` union** with `glob` and `mixed` variants in
`src/resolver/package_json.zig`
- **Enhanced parsing logic** to detect and handle glob patterns (`*`,
`?`, `[]`, `{}`, `**`)
- **Added mixed pattern support** for arrays containing both exact paths
and glob patterns
- **Updated resolver** in `src/resolver/resolver.zig` to handle new glob
variants
- **Performance optimized** with different data structures based on
pattern types

### Features Supported
-  **Basic wildcards**: `src/effects/*.js`
-  **Question marks**: `src/file?.js` 
-  **Character classes**: `src/file[abc].js`, `src/file[a-z].js`
-  **Brace expansion**: `src/{components,utils}/*.js`
-  **Globstar**: `src/**/effects/*.js`
-  **Mixed patterns**: `["src/specific.js", "src/glob/*.js"]`

### Before/After Comparison

**Before (shows warning and treats all files as having side effects):**
```json
{
  "sideEffects": ["src/effects/*.js"]
}
```
```
⚠️ wildcard sideEffects are not supported yet, which means this package will be deoptimized
```

**After (works correctly with proper tree-shaking):**
```json
{
  "sideEffects": ["src/effects/*.js"]
}
```
```
 Bundled 4 modules (preserving only files matching glob patterns)
```

## Test Coverage

### Comprehensive Test Suite
-  **Success cases**: Verify glob patterns correctly preserve intended
files
-  **Fail cases**: Verify patterns don't match unintended files  
-  **Edge cases**: Invalid globs, CSS files, deep nesting, mixed
patterns
-  **Performance**: Test different pattern combinations
-  **Regression**: Ensure no warnings and backward compatibility

### Test Categories
1. **Basic glob patterns** (`*.js`, `file?.js`)
2. **Advanced patterns** (brace expansion, character classes)
3. **Mixed exact/glob patterns**
4. **Edge cases** (invalid patterns, CSS handling)
5. **Tree-shaking verification** (positive/negative cases)

## Performance

Optimized implementation based on pattern types:
- **Exact matches only**: O(1) hashmap lookup
- **Glob patterns only**: Bun's optimized glob matcher  
- **Mixed patterns**: Combined approach for best performance

## Backward Compatibility

-  All existing `sideEffects` behavior preserved
-  No breaking changes to API
-  Graceful fallback for invalid patterns
-  CSS files automatically ignored (existing behavior)

## Documentation

Added comprehensive documentation covering:
- All supported glob patterns with examples
- Migration guide from previous versions
- Best practices and performance tips
- Troubleshooting guide

## Testing

Run the test suite:
```bash
bun test test/regression/issue/3595-wildcard-side-effects.test.js
bun test test/bundler/side-effects-glob.test.ts
```

All tests pass with comprehensive coverage of success/fail scenarios.


🤖 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: jarred-sumner-bot <220441119+jarred-sumner-bot@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: RiskyMH <git@riskymh.dev>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-14 11:58:37 -07:00
Jarred Sumner
fac5e71a0c Split subprocess into more files (#21842)
### What does this PR do?

Split subprocess into more files

### How did you verify your code works?

check

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-13 20:47:50 -07:00
robobun
53b870af74 feat: add GitHub Action to auto-label Claude PRs (#21840)
## Summary

- Adds a GitHub Action that automatically applies the 'claude' label to
PRs created by robobun user
- Triggers on `pull_request` `opened` events
- Only runs for PRs created by the `robobun` user account
- Uses `github-script` action to add the label

## Test plan

- [x] Created the workflow file with proper permissions
- [ ] Test by creating a new PR with robobun user (will happen
automatically on next Claude PR)
- [ ] Verify the label gets applied automatically

This ensures all future Claude-generated PRs are properly labeled for
tracking and organization.

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

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-13 20:41:33 -07:00
pfg
bf24d1b527 Split expect.zig into one file per expect matcher (#21810)
That's 75 files and 955 extra lines of imports. Maybe too many files.
2025-08-13 20:26:58 -07:00
Michael H
49f33c948a fix regression in node:crypto with lowercase rsa-sha keys (#21812)
### What does this PR do?

there was a regression in 1.2.5 where it stopped supporting lowercase
veriants of the crypto keys. This broke the `mailauth` lib and proabibly
many more.

simple code:
```ts
import { sign, constants } from 'crypto';

const DUMMY_PRIVATE_KEY = `-----BEGIN PRIVATE KEY-----\r\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMx5bEJhDzwNBG1m\r\nmIYn/V1HMK9g8WTVaHym4F4iPcTdZ4RYUrMa/xOUwPMAfrOJdf3joSUFWBx3ZPdW\r\nhrvpqjmcmgoYDRJzZwVKJ1uqTko6Anm3gplWl6JP3nGOL9Vt5K5xAJWif5fHPfCx\r\nLA2p/SnJDNmcyOWURUCRVCDlZgJRAgMBAAECgYEAt8a+ZZ7EyY1NmGJo3dMdZnPw\r\nrwArlhw08CwwZorSB5mTS6Dym2W9MsU08nNUbVs0AIBRumtmOReaWK+dI1GtmsT+\r\n/5YOrE8aU9xcTgMzZjr9AjI9cSc5J9etqqTjUplKfC5Ay0WBhPlx66MPAcTsq/u/\r\nIdPYvhvgXuJm6X3oDP0CQQDllIopSYXW+EzfpsdTsY1dW+xKM90NA7hUFLbIExwc\r\nvL9dowJcNvPNtOOA8Zrt0guVz0jZU/wPYZhvAm2/ab93AkEA5AFCfcAXrfC2lnDe\r\n9G5x/DGaB5jAsQXi9xv+/QECyAN3wzSlQNAZO8MaNr2IUpKuqMfxl0sPJSsGjOMY\r\ne8aOdwJBAIM7U3aiVmU5bgfyN8J5ncsd/oWz+8mytK0rYgggFFPA+Mq3oWPA7cBK\r\nhDly4hLLnF+4K3Y/cbgBG7do9f8SnaUCQQCLvfXpqp0Yv4q4487SUwrLff8gns+i\r\n76+uslry5/azbeSuIIsUETcV+LsNR9bQfRRNX9ZDWv6aUid+nAU6f3R7AkAFoONM\r\nmr4hjSGiU1o91Duatf4tny1Hp/hw2VoZAb5zxAlMtMifDg4Aqg4XFgptST7IUzTN\r\nK3P7zdJ30gregvjI\r\n-----END PRIVATE KEY-----`;

sign('rsa-sha256', Buffer.from('message'), {
    key: DUMMY_PRIVATE_KEY,
    padding: constants.RSA_PKCS1_PSS_PADDING,
});
// would throw invalid digest
```

### How did you verify your code works?

made test

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-13 19:38:01 -07:00
Alistair Smith
c106820a57 fix: Use the correct default lib path in bun-types integration test (#21825) 2025-08-13 13:34:15 -07:00
taylor.fish
a4555ee3df Add owned pointer types (#21776)
Add an owned pointer type—a wrapper around a pointer and an allocator.

`Owned(*Foo)` and `Owned([]Foo)` contain both the pointer/slice and the
allocator that was used to allocate it. Calling `deinit` on these types
first calls `Foo.deinit` and then frees the memory. This makes it easier
to remember to free the memory, and hard to accidentally free it with
the wrong allocator.

Optional pointers are also supported (`Owned(?*Foo)`, `Owned(?[]Foo)`),
and an unmanaged variant which doesn't store the allocator
(`Owned(*Foo).Unmanaged`) is available for cases where space efficiency
is a concern.

A `MaybeOwned` type is also provided for representing data that could be
owned or borrowed. If the data is owned, `MaybeOwned.deinit` works like
`Owned.deinit`; otherwise, it's a no-op.

(For internal tracking: fixes STAB-920, STAB-921)
2025-08-12 22:25:49 -07:00
taylor.fish
8d40ee17ed Add thread safety checks to MimallocArena (#21806)
Make sure allocations happen on the same thread.

(For internal tracking: fixes STAB-919)
2025-08-12 22:25:04 -07:00
robobun
d9742eece7 Optimize --lockfile-only to skip tarball downloads (#21768)
## Summary

Optimizes the `--lockfile-only` flag to skip downloading **npm package
tarballs** since they're not needed for lockfile generation. This saves
bandwidth and improves performance for lockfile-only operations while
preserving accuracy for non-npm dependencies.

## Changes

- **Add `prefetch_resolved_tarballs` flag** to
`PackageManagerOptions.Do` struct (defaults to `true`)
- **Set flag to `false`** when `--lockfile-only` is used
- **Skip tarball downloads for npm packages only** when flag is
disabled:
- `getOrPutResolvedPackageWithFindResult` - Main npm package resolution
(uses `Task.Id.forNPMPackage`)
- `enqueuePackageForDownload` - NPM package downloads (uses
`bun.Semver.Version`)
- **Preserve tarball downloads for non-npm dependencies** to maintain
lockfile accuracy:
  - Remote tarball URLs (needed for lockfile generation)
  - GitHub dependencies (needed for lockfile generation)  
  - Generic tarball downloads (may be remote)
  - Patch-related downloads (needed for patch application)
- **Add comprehensive test** that verifies only package manifests are
fetched for npm packages with `--lockfile-only`

## Rationale

Only npm registry packages can safely skip tarball downloads during
lockfile generation because:

 **NPM packages**: Metadata is available from registry manifests,
tarball not needed for lockfile
 **Remote URLs**: Need tarball content to determine package metadata
and generate accurate lockfile
 **GitHub deps**: Need tarball content to extract package.json and
determine dependencies
 **Tarball URIs**: Need content to determine package structure and
dependencies

This selective approach maximizes bandwidth savings while ensuring
lockfile accuracy.

## Test Plan

-  New test in `test/cli/install/lockfile-only.test.ts` verifies only
npm manifest URLs are requested
-  Uses absolute package versions to ensure the npm resolution code
path is hit
-  Test output normalized to work with both debug and non-debug builds
-  All existing install/update tests still pass (including remote
dependency tests)

## Performance Impact

For `--lockfile-only` operations with npm packages, this eliminates
unnecessary tarball downloads, reducing:
- **Network bandwidth usage** (manifests only, not tarballs)
- **Installation time** (no tarball extraction/processing)
- **Cache storage requirements** (tarballs not cached)

The optimization only affects npm packages in `--lockfile-only` mode and
has zero impact on:
- Regular installs (npm packages still download tarballs)
- Remote dependencies (always download tarballs for accuracy)
- GitHub dependencies (always download tarballs for accuracy)

## Files Changed

- `src/install/PackageManager/PackageManagerOptions.zig` - Add flag and
configure for lockfile-only
- `src/install/PackageManager/PackageManagerEnqueue.zig` - Skip npm
tarball generation selectively
- `test/cli/install/lockfile-only.test.ts` - Test with dummy registry

🤖 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>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Alistair Smith <hi@alistair.sh>
2025-08-12 22:19:10 -07:00
Kai Tamkun
37a207e2a4 NAPI fixes (#21775)
### What does this PR do?

Defers exceptions thrown by NAPI code until execution returns/flows to
JS code.

### How did you verify your code works?

Ran existing NAPI tests and added to napi.test.ts.
2025-08-12 19:59:34 -07:00
Michael H
3cf6da9c9b implement bunx --package (#21517)
### What does this PR do?

fixes #7034

### How did you verify your code works?

made tests, but need to do some more manual with release build
2025-08-12 17:07:46 -07:00
taylor.fish
0c83ff3f7e Fix z_allocator implementation when use_mimalloc is false; make Bun compile with use_mimalloc false (#21771)
We can't use `std.heap.c_allocator` as `z_allocator`; it doesn't
zero-initialize the memory. This PR adds a fallback implementation.

This PR also makes Bun compile successfully with `use_mimalloc` set to
false. More work is likely necessary to make it function correctly in
this case, but it should at least compile.

(For internal tracking: fixes STAB-978, STAB-979)
2025-08-11 20:20:58 -07:00
taylor.fish
41b1efe12c Rename disabled parameter in Output.scoped (#21769)
It's very confusing.

(For internal tracking: fixes STAB-977)
2025-08-11 20:19:34 -07:00
Jarred Sumner
4751f12678 Delete this line 2025-08-11 18:42:55 -07:00
Jarred Sumner
98524943f1 Fixes #21779 2025-08-11 18:42:33 -07:00
Jarred Sumner
b6b3dc7eb5 Update docs.yml 2025-08-11 17:04:30 -07:00
Michael H
020fe12887 bun.lock migration: fix packages with long version string (#21753)
### What does this PR do?

cases like `@prisma/engines-version` with version of
`6.14.0-17.fba13060ef3cfbe5e95af3aaba61eabf2b8a8a20` was having issues
with the version and using a "corrupted" string instead

### How did you verify your code works?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-11 16:26:03 -07:00
Alistair Smith
8e6184707d fix #21766 (#21767)
### What does this PR do?

### How did you verify your code works?
2025-08-11 14:22:49 -07:00
taylor.fish
a57dee5721 Various safety improvements (safety.ThreadLock, stack traces, MimallocArena, RefCount, safety.alloc) (#21726)
* Move `DebugThreadLock` to `bun.safety`
* Enable in `ci_assert` builds, but store stack traces only in debug
builds
  * Reduce size of struct by making optional field non-optional
* Add `initLockedIfNonComptime` as a workaround for not being able to
call `initLocked` in comptime contexts
* Add `lockOrAssert` method to acquire the lock if unlocked, or else
assert that the current thread acquired the lock
* Add stack traces to `CriticalSection` and `AllocPtr` in debug builds
* Make `MimallocArena.init` infallible
* Make `MimallocArena.heap` non-nullable
* Rename `RefCount.active_counts` to `raw_count` and provide read-only
`get` method
* Add `bun.safety.alloc.assertEq` to assert that two allocators are
equal (avoiding comparison of undefined `ptr`s)

(For internal tracking: fixes STAB-917, STAB-918, STAB-962, STAB-963,
STAB-964, STAB-965)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-11 13:40:07 -07:00
taylor.fish
e4beddb839 Reduce false negatives in ban-words.test.ts for undefined struct fields (#21748)
`ban-words.test.ts` attempts to detect places where a struct field is
given a default value of `undefined`, but it fails to detect cases like
the following:

```zig
foo: *Foo align(1) = undefined,
bar: [16 * 64]Bar = undefined,
baz: Baz(u8, true) = undefined,
```

This PR updates the check to detect more occurrences, while still
avoiding (as far as I can tell) the inclusion of any false positives.

(For internal tracking: fixes STAB-971)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-11 13:32:05 -07:00
taylor.fish
dd427a1c61 Improve deepClone methods (#21747)
Various types have a `deepClone` method, but there are two different
signatures in use. Some types, like those in the `css` directory, have
an infallible `deepClone` method that cannot return an error. Others,
like those in `ast`, are fallible and can return `error.OutOfMemory`.

Historically, `BabyList.deepClone` has only worked with the fallible
kind of `deepClone`, necessitating the addition of
`BabyList.deepClone2`, which only works with the *in*fallible kind.

This PR:

* Updates `BabyList.deepClone` so that it works with both kinds of
method
* Updates `BabyList.deepClone2` so that it works with both kinds of
method
* Renames `BabyList.deepClone2` to `BabyList.deepCloneInfallible`
* Adds `bun.handleOom(...)`, which is like `... catch bun.outOfMemory()`
but it can't accidentally catch non-OOM-related errors
* Replaces an occurrence of `anyerror` with a more specific error set

(For internal tracking: fixes STAB-969, STAB-970)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-11 13:29:53 -07:00
Michael H
0b7a6024e0 vscode extention: fix oom with test explorer from too many files (#21744)
### What does this PR do?

Limit to only 5k test files for initial scan + ignore node_modules for
subdirs.

### How did you verify your code works?

manual
2025-08-10 21:36:04 -07:00
robobun
35027a1399 Add GitHub metrics collection script (#21750) 2025-08-10 20:22:08 -07:00
robobun
cf8d3183b3 Bump LATEST file to 1.2.20 (#21749) 2025-08-10 20:19:25 -07:00
Meghan Denny
45ed0cb08e Bump 2025-08-10 11:38:31 -07:00
Jarred Sumner
6ad208bc32 Fix integer cast truncation panic on Windows for buffers > 4GB (#21738)
## Summary
This PR fixes a panic that occurs when file operations use buffers
larger than 4GB on Windows.

## The Problem
When calling `fs.readSync()` or `fs.writeSync()` with buffers larger
than 4,294,967,295 bytes (u32::MAX), Bun panics with:
```
panic(main thread): integer cast truncated bits
```

## Root Cause
The Windows APIs `ReadFile()` and `WriteFile()` expect a `DWORD` (u32)
for the buffer length parameter. The code was using `@intCast` to
convert from `usize` to `u32`, which panics when the value exceeds
u32::MAX.

## The Fix
Changed `@intCast` to `@truncate` in four locations:
1. `sys.zig:1839` - ReadFile buffer length parameter
2. `sys.zig:1556` - WriteFile buffer length parameter  
3. `bun.zig:230` - platformIOVecCreate length field
4. `bun.zig:240` - platformIOVecConstCreate length field

With these changes, operations with buffers > 4GB will read/write up to
4GB at a time instead of panicking.

## Test Plan
```js
// This previously caused a panic on Windows
const fs = require('fs');
const fd = fs.openSync('test.txt', 'r');
const buffer = Buffer.allocUnsafe(4_294_967_296); // 4GB + 1 byte
fs.readSync(fd, buffer, 0, buffer.length, 0);
```

Fixes https://github.com/oven-sh/bun/issues/21699

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

---------

Co-authored-by: Jarred Sumner <jarred@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
bun-v1.2.20
2025-08-10 04:01:35 -07:00
Jarred Sumner
b0799da968 Harden Transfer-Encoding (#21737)
### What does this PR do?

### How did you verify your code works?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-10 03:52:40 -07:00
Jarred Sumner
a67ba81e0b Only highlight per chunk instead of per line (#21729) 2025-08-09 21:35:17 -07:00
Jarred Sumner
7cdc5d879c Don't highlight backgrounds when it's just words that changed (#21727)
### What does this PR do?

Setting the background color on plaintext diffs makes the plaintext
harder to read. This is particularly true when the input is longer.

This conservatively makes us only add the background color to the diff
when the characters being highlighted are all whitespaces, punctuation
or non-printable.

This branch:

<img width="748" height="388" alt="image"
src="https://github.com/user-attachments/assets/ceaf02ba-bf71-4207-a319-c041c8a887de"
/>

Canary:

<img width="742" height="404" alt="image"
src="https://github.com/user-attachments/assets/cc380f45-5540-48ed-aea1-07f4b0ab291e"
/>


### How did you verify your code works?

Updated test
2025-08-09 19:50:25 -07:00
Jarred Sumner
1dc9fdfd9b Fix process.stdout/stderr missing Symbol.asyncIterator (#21720)
## Summary
- Adds `Symbol.asyncIterator` to `process.stdout` and `process.stderr`
when they are TTY or pipe/socket streams
- Matches Node.js behavior where these streams are Duplex-like and
support async iteration
- Does not add the iterator when streams are redirected to files
(matching Node.js SyncWriteStream behavior)

## Test plan
- Added test in
`test/regression/issue/test-process-stdout-async-iterator.test.ts`
- Verified the fix works with Claude Code on Linux x64
- Test passes with `bun bd test
test/regression/issue/test-process-stdout-async-iterator.test.ts`

Fixes #21704

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-09 06:40:36 -07:00
robobun
584946b0ce Fix comma operator optimization to preserve 'this' binding semantics (#21653)
## Summary
- Fix transpiler bug where comma expressions like `(0, obj.method)()`
were incorrectly optimized to `obj.method()`
- This preserved the `this` binding instead of stripping it as per
JavaScript semantics
- Add comprehensive regression test to prevent future issues

## Root Cause
The comma operator optimization in `src/js_parser.zig:7281` was directly
returning the right operand when the left operand had no side effects,
without checking if the expression was being used as a call target.

## Solution
- Added the same `is_call_target` check that other operators (nullish
coalescing, logical OR/AND) use
- When a comma expression is used as a call target AND the right operand
has a value for `this`, preserve the comma expression to strip the
`this` binding
- Follows existing patterns in the codebase for consistent behavior

## Test Plan
- [x] Reproduce the original bug: `(0, obj.method)()` incorrectly
preserved `this`
- [x] Verify fix: comma expressions now correctly strip `this` binding
in function calls
- [x] All existing transpiler tests continue to pass
- [x] Added regression test covering various comma expression scenarios
- [x] Tested edge cases: nested comma expressions, side effects,
different operand types

🤖 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-09 05:11:50 -07:00
robobun
3766f183e6 deps: bump WebKit to eb92990ae9e0a8df3141b8cf946a4f250393e213 (#21702)
## Summary
- Updates WebKit from 75f6499 to eb92990 (latest release from
oven-sh/webkit)
- This brings in the latest WebKit improvements and fixes

## Test plan
- [ ] Verify the build completes successfully
- [ ] Run existing test suite to ensure no regressions

🤖 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: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-09 05:00:46 -07:00
Jarred Sumner
19fac68e81 Reduce stack space usage of parseSuffix (#21662)
### What does this PR do?

Reduce stack space usage of parseSuffix

### How did you verify your code works?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-09 00:20:17 -07:00
Meghan Denny
2f84949fe0 ci: do not retry error conditions that are always failure (#21716) 2025-08-08 23:25:52 -07:00
Jarred Sumner
964d4dac2c Rewrite AbortSignal.timeout (#21695)
### What does this PR do?

On Linux, AbortSignal.timeout created a file descriptor for each timeout
and did not keep the event loop alive when a timer was active. This is
fixed.

### How did you verify your code works?

Fewer flaky tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude <claude@anthropic.ai>
2025-08-08 23:07:19 -07:00
Meghan Denny
a9d62d58ea Revert "ci: lower windows test agent from c7i.2xlarge to c7i.xlarge (#21707)" (#21717) 2025-08-08 22:45:26 -07:00
robobun
0827add9a3 ci: optimize clang-format in GitHub Actions (#21715)
## Summary
- Replace cmake-based clang-format with dedicated bash script that
directly processes source files
- Optimize CI to only install clang-format-19 instead of entire LLVM
toolchain
- Script enforces specific clang-format version with no fallbacks

## Changes
1. **New bash script** (`scripts/run-clang-format.sh`):
   - Directly reads C++ files from `CxxSources.txt`
   - Finds all header files in `src/` and `packages/` directories
   - Respects existing `.clang-format` configuration files
   - Requires specific clang-format version (no fallbacks)
   - Defaults to format mode (modifies files in place)

2. **Optimized GitHub Action**:
- Only installs `clang-format-19` package with `--no-install-recommends`
   - Avoids installing unnecessary components like manpages
   - Uses new bash script instead of cmake targets

3. **Updated package.json scripts**:
- `clang-format`, `clang-format:check`, and `clang-format:diff` now use
the bash script

## Test plan
- [x] Verified script finds and processes all C++ source and header
files
- [x] Tested formatting works correctly by adding formatting issues and
running the script
- [x] Confirmed script respects `.clang-format` configuration files
- [x] Script correctly requires specific clang-format version

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

---------

Co-authored-by: Claude <claude@anthropic.ai>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-08 22:36:49 -07:00
Meghan Denny
05cff5cfde test: fix static-initializers.test.ts
regressed in 46e1c5a0fa
2025-08-08 22:28:42 -07:00
Meghan Denny
f5c138d646 ci: lower build-cpp agent from 16xlarge to 4xlarge (#21711)
this instance type was reported to be our 1st most expensive per aws
bill

as long as it finishes before build-zig it doesnt affect the total run
time

----

<img width="1512" height="165" alt="image"
src="https://github.com/user-attachments/assets/8581f0d6-348c-4be8-98e2-bff8f659b26f"
/>

<img width="1512" height="163" alt="image"
src="https://github.com/user-attachments/assets/cefd5a50-26b2-4dfb-8592-f723874bc461"
/>

<img width="1512" height="164" alt="image"
src="https://github.com/user-attachments/assets/7234cc28-2f7d-4ffa-97c1-67106749dd4e"
/>
2025-08-08 18:52:21 -07:00
Zack Radisic
ee88c489ab shell: fix $.braces(...) on unicode inputs, support more deeply nested braces (#21709)
### What does this PR do?

- Fixes `$.braces(...)` not working properly on non-ascii inputs
- Switches braces code to use `SmallList` to support more deeply nested
brace expansion

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-08 18:12:42 -07:00
Jarred Sumner
46e1c5a0fa Downgrade mimalloc + set libc musl flag (#21684)
### What does this PR do?

### How did you verify your code works?

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-08 18:02:19 -07:00
Meghan Denny
5893ae99c2 ci: lower link-bun agent from c7i.16xlarge to r7i.large (#21706)
this instance type was reported to be our 1st most expensive per aws
bill

----

before:

x64-linux: 19.5m
arm64-linux: 14m
x64-musl: 16.3m
arm64-musl: 13.3m
x64-windows: 2m

after:

x64-linux: 20.3m
arm64-linux: 15.3m
x64-musl: 16m
arm64-musl: 13.5m
x64-windows: 2.5m
2025-08-08 17:44:05 -07:00
Meghan Denny
0c46791d28 ci: lower windows test agent from c7i.2xlarge to c7i.xlarge (#21707)
this instance type was reported to be our 2nd most expensive per aws
bill
2025-08-08 17:06:33 -07:00