Commit Graph

8539 Commits

Author SHA1 Message Date
autofix-ci[bot]
fe0f93bd8d [autofix.ci] apply automated fixes 2025-08-30 05:24:48 +00:00
Claude Bot
8b333ed43f Complete Yoga RefCounted migration - all tests passing
 MIGRATION COMPLETE - Fixed all remaining issues:

🔧 Fixed double-free validation:
- Added m_freed boolean flag to YogaConfigImpl
- Implemented markAsFreed() and isFreed() methods
- Modified yogaConfig() to return nullptr when freed
- Updated free() method to validate double-free attempts

🧪 All 97 Yoga tests now pass:
- yoga-node.test.js: 19 tests pass
- yoga-config.test.js: 10 tests pass
- yoga-constants.test.js: 48 tests pass
- yoga-node-extended.test.js: 20 tests pass

🏗️ RefCounted architecture fully implemented:
- JS wrappers are thin and use impl() pattern
- C++ wrappers handle all Yoga API interactions
- Proper GC lifecycle with opaque roots
- WeakHandleOwner finalize() derefs C++ wrappers
- Eliminates ASAN crashes and use-after-free issues

The migration successfully adopts WebKit DOM patterns while maintaining
full API compatibility and fixing all memory management issues.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 05:23:10 +00:00
autofix-ci[bot]
bc4b2dea8d [autofix.ci] apply automated fixes 2025-08-30 05:11:45 +00:00
Claude Bot
07fa3909ea Complete RefCounted migration for both JSYogaNode and JSYogaConfig
- Migrated JSYogaNode to use RefCounted<YogaNodeImpl> pattern
- Migrated JSYogaConfig to use RefCounted<YogaConfigImpl> pattern
- Both JS wrappers now use impl() and do minimal work
- Implemented proper opaque root GC lifecycle management
- Added WeakHandleOwner with finalize() that derefs C++ wrappers
- Updated all API calls to use impl().yogaNode() / impl().yogaConfig()

The core RefCounted architecture is complete. Some compilation issues remain
that need header includes and method name fixes.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 05:04:06 +00:00
Claude Bot
f54093c703 wip: Migrate Yoga nodes to RefCounted<YogaNodeImpl> pattern
This implements the proper C++ wrapper lifecycle management pattern for Yoga nodes:

- Created YogaNodeImpl class that inherits from RefCounted<YogaNodeImpl>
- Updated JSYogaNode to hold Ref<YogaNodeImpl> instead of direct YGNodeRef
- Added JSC::Weak<JSYogaNode> to YogaNodeImpl for JS wrapper tracking
- Implemented JSYogaNodeOwner with proper opaque root GC lifecycle
- Added opaque root handling using root Yoga node traversal
- Finalize function properly derefs the C++ wrapper

This follows WebKit DOM patterns for proper GC lifecycle management.
Still needs some cleanup in JSYogaPrototype.cpp method calls.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 04:55:47 +00:00
autofix-ci[bot]
0ffd44874e [autofix.ci] apply automated fixes 2025-08-30 04:12:05 +00:00
Claude Bot
583f5d65d8 wip: attempt to fix yoga ASAN crash by clearing context pointer
Still investigating heap-use-after-free issue during GC cleanup
2025-08-30 04:10:01 +00:00
Claude Bot
ae4e3d4afe fix: Improve Yoga node cleanup and fix test constants
- Add proper cleanup in JSYogaNode destructor to prevent use-after-free
- Remove node from parent before freeing to avoid dangling references
- Fix yoga-config.test.js to use correct errata constant names (ERRATA_* not Errata.*)
- Fix double-free test expectation to properly expect error on second free

Tests pass individually but still have ASAN issues when run together due to
complex parent-child node relationships during GC. Individual tests work correctly.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 04:07:52 +00:00
Claude Bot
c7556c2aa6 Fix duplicate YOGA property in BunObject.cpp
Remove duplicate YOGA entry that was causing property conflicts.
The original Yoga property remains as the single accessor for the Yoga module.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 03:23:55 +00:00
autofix-ci[bot]
03f26138e7 [autofix.ci] apply automated fixes 2025-08-30 02:55:30 +00:00
Claude Bot
0e2e4f47f8 wip 2025-08-30 02:54:05 +00:00
Claude Bot
9d6f655dee Resolve merge conflicts from main
- Added Yoga subspace declarations to both DOMIsoSubspaces.h and DOMClientIsoSubspaces.h
- Kept both Yoga and WasmStreamingCompiler subspaces
- Fixed BunObject.cpp to include both constructYogaObject and constructSecretsObject functions
- Maintained compatibility with new main getter/setter functions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 02:40:02 +00:00
Ciro Spaciari
a34e10db53 fix(Bun.SQL) handle MySQL Int24 (#22241)
### What does this PR do?
handle Int24 to be numbers
### How did you verify your code works?
tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-29 17:03:26 -07:00
Ciro Spaciari
ff6af0e2f7 fix(Bun.SQL) delay postgres promise resolve for prepared statements (#22090)
### What does this PR do?
fixes https://github.com/oven-sh/bun/issues/21945
### How did you verify your code works?
Run the code bellow and will be way harder the encounter the same
problem (I got it 1 times after 10 tries the same effect as Bun.sleep
mentioned before)

```ts
const sql = new Bun.SQL("postgres://localhost");
using conn1 = await sql.reserve();
using conn2 = await sql.reserve();

await sql`DROP TABLE IF EXISTS test1`;
await sql`CREATE TABLE IF NOT EXISTS test1 (
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
uuid UUID NOT NULL
)`;
await sql`INSERT INTO test1 (uuid) VALUES (gen_random_uuid())`;
type Row = {
  id: number;
  uuid: string;
};

for (let i = 0; i < 100_000; i++) {
  const [original]: Array<Row> = await conn1`SELECT id, uuid FROM test1 LIMIT 1`;

  const [updated]: Array<Row> =
    await conn1`UPDATE test1 SET uuid = gen_random_uuid() WHERE id = ${original.id} RETURNING id, uuid`;

  const [retrieved]: Array<Row> = await conn2`SELECT id, uuid FROM test1 WHERE id = ${original.id}`;

  if (retrieved.uuid !== updated.uuid) {
    console.log("Expected retrieved and updated to match", retrieved, updated, i);
    break;
  }
}

```
2025-08-29 01:03:43 -07:00
Ciro Spaciari
1085908386 fix(Bun.SQL) MYSQL fix old auth and auth switch + add lastInsertRowid and affectedRows (#22132)
### What does this PR do?

add `lastInsertRowid` (matching SQLite)
add `affectedRows`
fix `mysql_native_password` deprecated authentication
fix AuthSwitch
Fixes:
https://github.com/oven-sh/bun/issues/22178#issuecomment-3228716080
### How did you verify your code works?
tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-29 01:03:17 -07:00
Ciro Spaciari
a56488f221 fix(Bun.SQL) handle better BIT(1) in MySQL (#22224)
### What does this PR do?
Fix handling BIT(1) and BIT(N) on binary protocol and text protocol, now
behavior is consistent
### How did you verify your code works?
Tests
2025-08-28 19:14:53 -07:00
Jarred Sumner
fe8f8242fd Make BoundedArray more compact, shrink Data in sql from 32 bytes to 24 bytes (#22210)
### What does this PR do?

- Instead of storing `len` in `BoundedArray` as a `usize`, store it as
either a `u8` or ` u16` depending on the `buffer_capacity`
- Copy-paste `BoundedArray` from the standard library into Bun's
codebase as it was removed in
https://github.com/ziglang/zig/pull/24699/files#diff-cbd8cbbc17583cb9ea5cc0f711ce0ad447b446e62ea5ddbe29274696dce89e4f
and we will probably continue using it

### How did you verify your code works?

Ran `bun run zig:check`

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: taylor.fish <contact@taylor.fish>
2025-08-28 17:34:35 -07:00
pfg
c69ed120e9 Rename some instances of latin1 to cp1252 (#22059)
in JS, `new TextDecoder("latin1").decode(...)` uses cp1252. In python,
latin1 is half-width utf-16. In our code, latin1 typically refers to
half-width utf-16 because JavaScriptCore uses that for most strings, but
sometimes it refers to cp1252. Rename the cp1252 functions to be called
cp1252

Also fixes an issue where Buffer.from with utf-16le would sometimes
output the wrong value:

```js
$> bun -p "Buffer.from('\x80', 'utf-16le')"
<Buffer ac 20>
$> node -p "Buffer.from('\x80', 'utf-16le')"
<Buffer 80 00>
$> bun-debug -p "Buffer.from('\x80', 'utf-16le')"
<Buffer 80 00>
```
2025-08-28 17:28:38 -07:00
robobun
edea077947 Fix env_loader allocator threading issue with BUN_INSPECT_CONNECT_TO (#22206)
## Summary
- Fixed allocator threading violation when `BUN_INSPECT_CONNECT_TO` is
set
- Created thread-local `env_loader` with proper allocator isolation in
debugger thread
- Added regression test to verify the fix works correctly

## Problem
When `BUN_INSPECT_CONNECT_TO` environment variable is set, Bun creates a
debugger thread that spawns its own `VirtualMachine` instance.
Previously, this VM would fall back to the global `DotEnv.instance`
which was created with the main thread's allocator, causing threading
violations when the debugger thread accessed environment files via
`--env-file` or other env loading operations.

## Solution
Modified `startJSDebuggerThread` in `src/bun.js/Debugger.zig` to:
1. Create a thread-local `DotEnv.Map` and `DotEnv.Loader` using the
debugger thread's allocator
2. Pass this thread-local `env_loader` to `VirtualMachine.init()` to
ensure proper allocator isolation
3. Prevent sharing of allocators across threads

## Test plan
- [x] Added regression test in
`test/regression/issue/test_env_loader_threading.test.ts`
- [x] Verified basic Bun functionality still works
- [x] Test passes with both normal execution and with
`BUN_INSPECT_CONNECT_TO` set

🤖 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-28 17:16:37 -07:00
Meghan Denny
669b34ff6c node: fix exception check validator errors in http_parser (#22180)
Co-authored-by: Meghan Denny <meghan@bun.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-28 15:06:03 -07:00
Meghan Denny
eb7727819a node:util: move deprecate to internal file so its faster to import (#22197)
Co-authored-by: Meghan Denny <meghan@bun.com>
2025-08-28 15:05:52 -07:00
pfg
84604888e9 Private fields (#22189)
ZLS was tested manually and works with private fields (after restarting)

Zig diff:
d1a4e0b0dd..ebe0cdac31

ZLS diff:
15730e8e5d..3733f39c8d

Increases `zig build check` time by maybe 10ms?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-28 04:24:04 -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
Meghan Denny
dcb51bda60 node: fix test-http-set-max-idle-http-parser.js (#22179)
Co-authored-by: Meghan Denny <meghan@bun.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-27 19:35:30 -07:00
Meghan Denny
36e2870fc8 node:http: split up prototype assignment of Server and ServerResponse (#22195)
pulled out of https://github.com/oven-sh/bun/pull/21809

---------

Co-authored-by: Meghan Denny <meghan@bun.com>
2025-08-27 18:25:50 -07:00
Meghan Denny
5ac0a9a95c js: add llhttp to process.versions (#22176)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-27 16:50:38 -07:00
robobun
0315c97e7b Fix argv handling for standalone binaries - remove extra executable name (#22157) (#22169)
## Summary

Fixes an issue where compiled standalone binaries included an extra
executable name argument in `process.argv`, breaking code that uses
`node:util.parseArgs()` with `process.argv.slice(2)`.

## Problem

When running a compiled binary, `process.argv` incorrectly included the
executable name as a third argument:

```bash
./my-app
# process.argv = ["bun", "/$bunfs/root/my-app", "./my-app"]  # BUG
```

This caused `parseArgs()` to fail with "Unexpected argument" errors,
breaking previously valid code.

## Solution

Fixed the `offset_for_passthrough` calculation in `cli.zig` to always
skip the executable name for standalone binaries, ensuring
`process.argv` only contains the runtime name and script path:

```bash  
./my-app
# process.argv = ["bun", "/$bunfs/root/my-app"]  # FIXED
```

## Test plan

- [x] Added regression test in `test/regression/issue/22157.test.ts`
- [x] Verified existing exec-argv functionality still works correctly  
- [x] Manual testing confirms the fix resolves the parseArgs issue

Fixes #22157

🤖 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: Michael H <git@riskymh.dev>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-27 15:31:28 -07:00
Jarred Sumner
c0ba7e9e34 Unskip some tests (#22116)
### 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-27 06:39:11 -07:00
Alistair Smith
1dd5761daa fix: move duplication into map itself, since it also frees (#22166)
### What does this PR do?

### How did you verify your code works?

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-08-26 19:45:57 -07:00
Ciro Spaciari
196182f8ec fix(Bun.SQL) fix MySQL by not converting tinyint to bool (#22159)
### What does this PR do?
Change tinyint/bool type from mysql to number instead of bool to match
mariadb and mysql2 behavior since tinyint/bool can be bigger than 1 in
mysql
Fixes https://github.com/oven-sh/bun/issues/22158
### How did you verify your code works?
Test

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-26 17:58:08 -07:00
Alistair Smith
54b90213eb fix: support virtual entrypoints in onResolve() (#22144)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-26 16:51:41 -07:00
taylor.fish
437e15bae5 Replace catch bun.outOfMemory() with safer alternatives (#22141)
Replace `catch bun.outOfMemory()`, which can accidentally catch
non-OOM-related errors, with either `bun.handleOom` or a manual `catch
|err| switch (err)`.

(For internal tracking: fixes STAB-1070)

---------

Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
2025-08-26 12:50:25 -07:00
Alistair Smith
300f486125 Bundler changes to bring us closer to esbuild's api (#22076)
### What does this PR do?

- Implements .onEnd

Fixes #22061

Once #22144 is merged, this also fixes:
Fixes #9862
Fixes #20806

### How did you verify your code works?

Tests

---

TODO in a followup (#22144)
> ~~Make all entrypoints be called in onResolve~~
> ~~Fixes # 9862~~
> ~~Fixes # 20806~~

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-26 01:50:32 -07:00
Jarred Sumner
fe7dfbb615 Delete unused file 2025-08-26 00:46:57 -07:00
Ciro Spaciari
26c0f324f8 improve(MySQL) optimize queue to skip running queries (#22136)
### What does this PR do?
optimize advance method
after this optimizations
100k req the query bellow in 1 connection takes 792ms instead of 6s
```sql
SELECT CAST(1 AS UNSIGNED) AS x
```
1mi req of the query bellow with 10 connections takes 57.41s - 62.5s
instead of 162.50s, mysql2 takes 1516.94s for comparison
```sql
SELECT * FROM users_bun_bench LIMIT 100
```

### How did you verify your code works?
Tested and benchmarked + CI
2025-08-25 21:12:12 -07:00
pfg
e577a965ac Implement xit/xtest/xdescribe aliases (#21529)
For jest compatibility. Fixes #5228

---------

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-25 17:37:12 -07:00
Dylan Conway
a7586212eb fix(yaml): parsing strings that look like numbers (#22102)
### What does this PR do?
fixes parsing strings like `"1e18495d9d7f6b41135e5ee828ef538dc94f9be4"`

### How did you verify your code works?
added a test.
2025-08-24 14:06:39 -07:00
Dylan Conway
d2b37a575f Fix poll fd bug where stderr fd was incorrectly set to stdout fd (#22091)
## Summary
Fixes a bug in the internal `bun.spawnSync` implementation where
stderr's poll file descriptor was incorrectly set to stdout's fd when
polling both streams.

## The Bug
In `/src/bun.js/api/bun/process.zig` line 2204, when setting up the poll
file descriptor array for stderr, the code incorrectly used
`out_fds_to_wait_for[0]` (stdout) instead of `out_fds_to_wait_for[1]`
(stderr).

This meant:
- stderr's fd was never actually polled
- stdout's fd was polled twice
- Could cause stderr data to be lost or incomplete
- Could potentially cause hangs when reading from stderr

## Impact
This bug only affects Bun's internal CLI commands that use
`bun.spawnSync` with both stdout and stderr piped (like `bun create`,
`bun upgrade`, etc.). The JavaScript `spawnSync` API uses a different
code path and is not affected.

## The Fix
Changed line 2204 from:
```zig
poll_fds[poll_fds.len - 1].fd = @intCast(out_fds_to_wait_for[0].cast());
```
to:
```zig
poll_fds[poll_fds.len - 1].fd = @intCast(out_fds_to_wait_for[1].cast());
```

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-24 03:16:22 -07:00
Jarred Sumner
f718f4a312 Fix argv handling for standalone binaries with compile-exec-argv (#22084)
## Summary

Fixes an issue where `--compile-exec-argv` options were incorrectly
appearing in `process.argv` when no user arguments were provided to a
compiled standalone binary.

## Problem

When building a standalone binary with `--compile-exec-argv`, the exec
argv options would leak into `process.argv` when running the binary
without any user arguments:

```bash
# Build with exec argv
bun build --compile-exec-argv="--user-agent=hello" --compile ./a.js

# Run without arguments - BEFORE fix
./a
# Output showed --user-agent=hello in both execArgv AND argv (incorrect)
{
  execArgv: [ "--user-agent=hello" ],
  argv: [ "bun", "/$bunfs/root/a", "--user-agent=hello" ],  # <- BUG: exec argv leaked here
}

# Expected behavior (matches runtime):
bun --user-agent=hello a.js
{
  execArgv: [ "--user-agent=hello" ],
  argv: [ "/path/to/bun", "/path/to/a.js" ],  # <- No exec argv in process.argv
}
```

## Solution

The issue was in the offset calculation for determining which arguments
to pass through to the JavaScript runtime. The offset was being
calculated before modifying the argv array with exec argv options,
causing it to be incorrect when the original argv only contained the
executable name.

The fix ensures that:
- `process.execArgv` correctly contains the compile-exec-argv options
- `process.argv` only contains the executable, script path, and user
arguments
- exec argv options never leak into `process.argv`

## Test plan

Added comprehensive tests to verify:
1. Exec argv options don't leak into process.argv when no user arguments
are provided
2. User arguments are properly passed through when exec argv is present
3. Existing behavior continues to work correctly

All tests pass:
```
bun test compile-argv.test.ts
✓ 3 tests pass
```

🤖 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-23 19:49:01 -07:00
Jarred Sumner
404ac7fe9d Use Object.create(null) instead of { __proto__: null } (#21997)
### What does this PR do?

Trying to workaround a performance regression potentially introduced in
2f0cc5324e


### How did you verify your code works?
2025-08-23 15:12:09 -07:00
Jarred Sumner
707fc4c3a2 Introduce Bun.secrets API (#21973)
This PR adds `Bun.secrets`, a new API for securely storing and
retrieving credentials using the operating system's native credential
storage locally. This helps developers avoid storing sensitive data in
plaintext config files.

```javascript
// Store a GitHub token securely
await Bun.secrets.set({
  service: "my-cli-tool",
  name: "github-token",
  value: "ghp_xxxxxxxxxxxxxxxxxxxx"
});

// Retrieve it when needed
const token = await Bun.secrets.get({
  service: "my-cli-tool",
  name: "github-token"
});

// Use with fallback to environment variable
const apiKey = await Bun.secrets.get({
  service: "my-app",
  name: "api-key"
}) || process.env.API_KEY;
```

Marking this as a draft because Linux and Windows have not been manually
tested yet. This API is only really meant for local development usecases
right now, but it would be nice if in the future to support adapters for
production or CI usecases.

### Core API
- `Bun.secrets.get({ service, name })` - Retrieve a stored credential
- `Bun.secrets.set({ service, name, value })` - Store or update a
credential
- `Bun.secrets.delete({ service, name })` - Delete a stored credential

### Platform Support
- **macOS**: Uses Keychain Services via Security.framework
- **Linux**: Uses libsecret (works with GNOME Keyring, KWallet, etc.)
- **Windows**: Uses Windows Credential Manager via advapi32.dll

### Implementation Highlights
- Non-blocking - all operations run on the threadpool
- Dynamic loading - no hard dependencies on system libraries
- Sensitive data is zeroed after use
- Consistent API across all platforms

## Use Cases

This API is particularly useful for:
- CLI tools that need to store authentication tokens
- Development tools that manage API keys
- Any tool that currently stores credentials in `~/.npmrc`,
`~/.aws/credentials` or in environment variables that're globally loaded

## Testing

Comprehensive test suite included with coverage for:
- Basic CRUD operations
- Empty strings and special characters
- Unicode support
- Concurrent operations
- Error handling

All tests pass on macOS. Linux and Windows implementations are complete
but would benefit from additional platform testing.

## Documentation

- Complete API documentation in `docs/api/secrets.md`
- TypeScript definitions with detailed JSDoc comments and examples

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 06:57:00 -07:00
Dylan Conway
8fad98ffdb Add Bun.YAML.parse and YAML imports (#22073)
### What does this PR do?
This PR adds builtin YAML parsing with `Bun.YAML.parse`
```js
import { YAML } from "bun";
const items = YAML.parse("- item1");
console.log(items); // [ "item1" ]
```

Also YAML imports work just like JSON and TOML imports
```js
import pkg from "./package.yaml"
console.log({ pkg }); // { pkg: { name: "pkg", version: "1.1.1" } }
```
### How did you verify your code works?
Added some tests for YAML imports and parsed values.

---------

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>
2025-08-23 06:55:30 -07:00
Jarred Sumner
75f0ac4395 Add Windows metadata flags to bun build --compile (#22067)
## Summary
- Adds support for setting Windows executable metadata through CLI flags
when using `bun build --compile`
- Implements efficient single-operation metadata updates using the
rescle library
- Provides comprehensive error handling and validation

## New CLI Flags
- `--windows-title`: Set the application title
- `--windows-publisher`: Set the publisher/company name  
- `--windows-version`: Set the file version (e.g. "1.0.0.0")
- `--windows-description`: Set the file description
- `--windows-copyright`: Set the copyright notice

## JavaScript API
These options are also available through the `Bun.build()` JavaScript
API:
```javascript
await Bun.build({
  entrypoints: ["./app.js"],
  outfile: "./app.exe",
  compile: true,
  windows: {
    title: "My Application",
    publisher: "My Company",
    version: "1.0.0.0",
    description: "Application description",
    copyright: "© 2025 My Company"
  }
});
```

## Implementation Details
- Uses a unified `rescle__setWindowsMetadata` C++ function that loads
the Windows executable only once for efficiency
- Properly handles UTF-16 string conversion for Windows APIs
- Validates version format (supports "1", "1.2", "1.2.3", or "1.2.3.4"
formats)
- Returns specific error codes for better debugging
- All operations return errors instead of calling `Global.exit(1)`

## Test Plan
Comprehensive test suite added in
`test/bundler/compile-windows-metadata.test.ts` covering:
- All CLI flags individually and in combination
- JavaScript API usage
- Error cases (invalid versions, missing --compile flag, etc.)
- Special character handling in metadata strings

All 20 tests passing (1 skipped as not applicable on Windows).

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

---------

Co-authored-by: Zack Radisic <zack@theradisic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jarred-Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2025-08-23 00:33:24 -07:00
Jarred Sumner
c342453065 Bump WebKit (#22072)
### What does this PR do?

### How did you verify your code works?
2025-08-23 00:31:53 -07:00
taylor.fish
7717693c70 Dev server refactoring, part 1 (mainly IncrementalGraph) (#22010)
* `IncrementalGraph(.client).File` packs its fields in a specific way to
save space, but it makes the struct hard to use and error-prone (e.g.,
untagged unions with tags stored in a separate `flags` struct). This PR
changes `File` to have a human-readable layout, but adds methods to
convert it to and from `File.Packed`, a packed version with the same
space efficiency as before.
* Reduce the need to pass the dev allocator to functions (e.g.,
`deinit`) by storing it as a struct field via the new `DevAllocator`
type. This type has no overhead in release builds, or when
`AllocationScope` is disabled.
* Use owned pointers in `PackedMap`.
* Use `bun.ptr.Shared` for `PackedMap` instead of the old
`bun.ptr.RefPtr`.
* Add `bun.ptr.ScopedOwned`, which is like `bun.ptr.Owned`, but can
store an `AllocationScope`. No overhead in release builds or when
`AllocationScope` is disabled.
* Reduce redundant allocators in `BundleV2`.
* Add owned pointer conversions to `MutableString`.
* Make `AllocationScope` behave like a pointer, so it can be moved
without invalidating allocations. This eliminates the need for
self-references.
* Change memory cost algorithm so it doesn't rely on “dedupe bits”.
These bits used to take advantage of padding but there is now no padding
in `PackedMap`.
* Replace `VoidFieldTypes` with `useAllFields`; this eliminates the need
for `voidFieldTypesDiscardHelper`.

(For internal tracking: fixes STAB-1035, STAB-1036, STAB-1037,
STAB-1038, STAB-1039, STAB-1040, STAB-1041, STAB-1042, STAB-1043,
STAB-1044, STAB-1045)

---------

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: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-22 23:04:58 -07:00
robobun
790e5d4a7e fix: prevent assertion failure when stopping server with pending requests (#22070)
## Summary

Fixes an assertion failure that occurred when `server.stop()` was called
while HTTP requests were still in flight.

## Root Cause

The issue was in `jsValueAssertAlive()` at
`src/bun.js/api/server.zig:627`, which had an assertion requiring
`server.listener != null`. However, `server.stop()` immediately sets
`listener` to null, causing assertion failures when pending requests
triggered callbacks that accessed the server's JavaScript value.

## Solution

Converted the server's `js_value` from `jsc.Strong.Optional` to
`jsc.JSRef` for safer lifecycle management:

- **On `stop()`**: Downgrade from strong to weak reference instead of
calling `deinit()`
- **In `finalize()`**: Properly call `deinit()` on the JSRef  
- **Remove problematic assertion**: JSRef allows safe access to JS value
via weak reference even after stop

## Benefits

-  No more assertion failures when stopping servers with pending
requests
-  In-flight requests can still access the server JS object safely  
-  JS object can be garbage collected when appropriate
-  Maintains backward compatibility - no external API changes

## Test plan

- [x] Reproduces the original assertion failure
- [x] Verifies the fix resolves the issue
- [x] Adds regression test to prevent future occurrences
- [x] Confirms normal server functionality still works

The fix includes a comprehensive regression test at
`test/regression/issue/server-stop-with-pending-requests.test.ts`.

🤖 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>
2025-08-22 22:39:47 -07:00
robobun
b2351bbb4e Add Symbol.asyncDispose to Worker in worker_threads (#22064)
## Summary

- Implement `Symbol.asyncDispose` for the `Worker` class in
`worker_threads` module
- Enables automatic resource cleanup with `await using` syntax
- Calls `await this.terminate()` to properly shut down workers when they
go out of scope

## Implementation Details

The implementation adds a simple async method to the Worker class:

```typescript
async [Symbol.asyncDispose]() {
  await this.terminate();
}
```

This allows workers to be used with the new `await using` syntax for
automatic cleanup:

```javascript
{
  await using worker = new Worker('./worker.js');
  // worker automatically terminates when leaving this scope
}
```

## Test Plan

- [x] Added comprehensive tests for `Symbol.asyncDispose` functionality
- [x] Tests verify the method exists and returns undefined
- [x] Tests verify `await using` syntax works correctly for automatic
worker cleanup
- [x] All new tests pass
- [x] Existing worker_threads functionality remains intact

🤖 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-22 19:59:15 -07:00
taylor.fish
d7bf8210eb Fix struct size assertion in Bake dev server (#22057)
Followup to #22049: I'm pretty sure “platform-specific padding” on
Windows is a hallucination. I think this is due to ReleaseSafe adding
tags to untagged unions.

(For internal tracking: fixes STAB-1057)
2025-08-22 17:27:53 -07:00
Carl Jackson
92b38fdf80 sql: support array of strings in SQLHelper (#21572)
### What does this PR do?
Support the following:
```javascript
const nom = await sql`SELECT name FROM food WHERE category IN ${sql(['bun', 'baozi', 'xiaolongbao'])}`;
```

Previously, only e.g., `sql([1, 2, 3])` was supported.

To be honest I'm not sure what the semantics of SQLHelper *ought* to be.
I'm pretty sure objects ought to be auto-inferred. I'm not sure about
arrays, but given the rest of the code in `SQLHelper` trying to read the
tea leaves on stringified numeric keys I figured someone cared about
this use case. I don't know about other types, but I'm pretty sure that
`Object.keys("bun") === [0, 1, 2]` is an oversight and unintended.
(Incidentally, the reason numbers previously worked is because
`Object.keys(4) === []`). I decided that all non-objects and non-arrays
should be treated as not having auto-inferred columns.

Fixes #18637 

### How did you verify your code works?
I wrote a test, but was unable to run it (or any other tests in this
file) locally due to Docker struggles. I sure hope it works!
2025-08-22 17:05:05 -07:00
Marko Vejnovic
e3e8d15263 Fix redis reconnecting (#21724)
### What does this PR do?

This PR fixes https://github.com/oven-sh/bun/issues/19131.

I am not 100% certain that this fix is correct as I am still nebulous
regarding some decisions I've made in this PR. I'll try to provide my
reasoning and would love to be proven wrong:

#### Re-authentication

- The `is_authenticated` flag needs to be reset to false. When the
lifecycle reaches a point of attempting to connect, it sends out a
`HELLO 3`, and receives a response. `handleResponse()` is fired and does
not correctly handle it because there is a guard at the top of the
function:

```zig
if (!this.flags.is_authenticated) {
    this.handleHelloResponse(value);

    // We've handled the HELLO response without consuming anything from the command queue
    return;
}
```

Rather, it treats this packet as a regular data packet and complains
that it doesn't have a promise to associate it to. By resetting the
`is_authenticated` flag to false, we guarantee that we handle the `HELLO
3` packet as an authentication packet.

It also seems to make semantic sense since dropping a connection implies
you dropped authentication.

#### Retry Attempts

I've deleted the `retry_attempts = 0` in `reconnect()` because I noticed
that we would never actually re-attempt to reconnect after the first
attempt. Specifically, I was expecting `valkey.zig:459` to potentially
fire multiple times, but it only ever fired once. Removing this reset to
zero caused successful reattempts (in my case 3 of them).

```zig
        debug("reconnect in {d}ms (attempt {d}/{d})", .{ delay_ms, this.retry_attempts, this.max_retries });
```

I'm still iffy on whether this is necessary, but I think it makes sense.
```zig
        this.client.retry_attempts = 0
```

### How did you verify your code works?

I have added a small unit test. I have compared mainline `bun`, which
fails that test, to this fix, which passes the test.

---------

Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>
2025-08-22 12:08:42 -07:00