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
2025-08-01 14:35:04 -07:00
2025-08-11 18:42:55 -07:00
2025-08-11 14:22:49 -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-01 16:09:44 -07:00
2025-02-06 18:07:55 -08:00
2022-09-03 20:54:15 -07:00
2025-08-10 11:38:31 -07:00
2024-07-24 01:30:31 -07:00
2025-07-10 00:10:43 -07:00
2025-04-19 05:41:34 -07:00
2025-08-10 11:38:31 -07:00
2025-07-10 00:10:43 -07:00
2025-07-10 00:10:43 -07:00
go
2021-08-11 13:56:03 -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 766 MiB
Languages
Zig 60.6%
C++ 24.8%
TypeScript 8.3%
C 3.3%
JavaScript 1.4%
Other 1.1%