robobun 87deb0e98e fix(bundler): default import from 'bun' with --bytecode no longer undefined (#27175)
## Summary
- Fixes `import Bun from 'bun'` being `undefined` when bundled with
`--bytecode` flag
- The CJS lowering pass was incorrectly adding `.default` property
access to `globalThis.Bun`, which doesn't have a `default` property
- Also skips unnecessary `__toESM` wrapper inclusion for built-in `bun`
module imports

## Root Cause
When `--bytecode` is used, the bundler wraps output in CJS format. For
external modules, the linker sets up a `namespace_alias` with `alias:
"default"` so the printer generates property access like
`require_module().default`. The printer correctly replaces the `bun`
import source with `globalThis.Bun`, but was still appending `.default`
— producing `import_bun.default` instead of just `import_bun`.

## Fix
Three targeted changes:
1. **`scanImportsAndExports.zig`**: Skip CJS interop wrapping
(`__toESM`) for `bun` tagged imports since `globalThis.Bun` doesn't need
it
2. **`LinkerContext.zig`**: Pass `import_record_index` through to
`namespace_alias` so the printer can identify the import source
3. **`js_printer.zig`**: Skip the `.default` property access for `bun`
tagged import records, while preserving named property accesses (e.g.
`.serve`)

## Test plan
- [x] `bun bd test test/regression/issue/20670.test.ts` — 4 pass
(default, aliased, combined, namespace imports)
- [x] Tests fail with `USE_SYSTEM_BUN=1` confirming they test the actual
fix
- [x] `bun bd test test/bundler/bundler_bun.test.ts` — 10 pass
- [x] `bun bd test test/bundler/bundler_cjs.test.ts` — 23 pass
- [x] `bun bd test test/bundler/bundler_edgecase.test.ts` — 99 pass

Closes #20670

🤖 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: Jarred Sumner <jarred@jarredsumner.com>
2026-03-01 02:26:08 -08:00
2026-02-20 17:54:21 -08:00
2025-11-28 17:51:45 +11:00
2026-01-25 10:38:13 -08:00
2025-12-18 18:03:23 -08:00
2024-12-26 11:48:30 -08:00
2024-12-12 03:21:56 -08:00
2026-01-18 00:17:14 -08:00
2025-01-07 20:19:12 -08:00
2025-11-25 11:06:24 -08:00
2026-02-18 18:08:10 -08:00
2022-09-03 20:54:15 -07:00
2026-02-26 23:02:43 -08:00
2026-02-26 23:02:43 -08:00
2026-02-25 20:55:23 -08: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 & arm64).

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.sh/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 805 MiB
Languages
Zig 60.6%
C++ 24.8%
TypeScript 8.3%
C 3.3%
JavaScript 1.5%
Other 1%