bun-bundler — Claude Code skill: what it does, how to install
Teaches your agent how to bundle JavaScript and TypeScript with Bun CLI and Bun.build API. Useful for browser, Node, or Bun runtimes.
npx skills add secondsky/claude-skills --skill bun-bundler -a claude-codeWhat bun-bundler does
The skill gives your agent ready-to-use patterns for Bun's bundler. It documents CLI commands like bun build alongside programmatic options for Bun.build, covering code splitting, minification, external modules, and sourcemap generation.
Starting in Bun 1.2, Bun.build rejects on build failure. The script halts immediately. You must wrap the call in try/catch or pass { throw: false } to handle build errors cleanly.
The reference includes built-in loaders for formats like .tsx, .json, and .css. It also demonstrates how to write custom plugins using onResolve and onLoad hooks.
What it helps with
- configure a production build with code splitting and sourcemaps using Bun.build
- bundle TypeScript entry points to ESM via the bun build CLI
- externalize dependencies for a reusable library build
- write custom plugins with onResolve and onLoad hooks for unsupported file formats
Example prompts for the agent
- Generate a Bun.build script with code splitting, external modules, and minification for a browser target.
- Create a bun build CLI command to compile ./src/index.ts and ./src/worker.ts into ./dist.
- Show how to handle build failures in Bun 1.2 using Bun.build options.
How to install bun-bundler
1Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-bundler -a claude-code2Manually: put the files in place
~/.claude/skills/bun-bundler/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/bun-bundler/
1Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-bundler -a codex2Manually: put the files in place
.agents/skills/bun-bundler/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-bundler -a cursor2Manually: put the files in place
.cursor/skills/bun-bundler/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills bun-bundler2Manually: put the files in place
.github/skills/bun-bundler/SKILL.md1Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-bundler -a gemini-cli2Platform CLI
gemini skills install https://github.com/secondsky/claude-skills --path plugins/bun/skills/bun-bundlerManually: put the files in place
.devin/skills/bun-bundler/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-bundler -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about bun-bundler
How to install bun-bundler in Claude Code?
Run npx skills add secondsky/claude-skills --skill bun-bundler -a claude-code in your terminal.
What does bun-bundler do?
It provides instructions and code templates for Bun's bundler. The agent learns how to configure CLI commands and the Bun.build API for browser, Bun, and Node.js targets.
How does Bun.build handle errors in Bun 1.2?
Starting with Bun 1.2, Bun.build throws an exception when a build fails instead of resolving with logs. You need to wrap the call in a try/catch block or pass { throw: false } to keep the legacy return shape.
Source text
SKILL.md · MIT
---
name: bun-bundler
description: This skill should be used when the user asks about "bun build", "Bun.build", "bundling with Bun", "code splitting", "tree shaking", "minification", "sourcemaps", "bundle optimization", "esbuild alternative", "building for production", "bundling TypeScript", "bundling for browser", "bundling for Node", or JavaScript/TypeScript bundling with Bun.
metadata:
version: "1.0.0"
license: MIT
---
# Bun Bundler
Bun's bundler is a fast JavaScript/TypeScript bundler built on the same engine as Bun's runtime. It's an esbuild-compatible alternative with native performance.
## Quick Start
### CLI
```bash
# Basic bundle
bun build ./src/index.ts --outdir ./dist
# Production build
bun build ./src/index.ts --outdir ./dist --minify
# Multiple entry points
bun build ./src/index.ts ./src/worker.ts --outdir ./dist
```
### JavaScript API
```typescript
// Since Bun 1.2, Bun.build REJECTS on failure (throws).
// Wrap in try/catch to handle errors; pass { throw: false } to restore the
// old resolve-with-{ success, logs } contract if you prefer that style.
try {
const result = await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
});
console.log(`Built ${result.outputs.length} files`);
} catch (err) {
console.error("Build failed:", err);
process.exit(1);
}
```
## Bun.build Options
```typescript
await Bun.build({
// Entry points (required)
entrypoints: ["./src/index.ts"],
// Output directory
outdir: "./dist",
// Target environment
target: "browser", // "browser" | "bun" | "node"
// Output format
format: "esm", // "esm" | "cjs" | "iife"
// Minification
minify: true, // or { whitespace: true, identifiers: true, syntax: true }
// Code splitting
splitting: true,
// Source maps
sourcemap: "external", // "none" | "inline" | "external" | "linked"
// Naming patterns
naming: {
entry: "[dir]/[name].[ext]",
chunk: "[name]-[hash].[ext]",
asset: "[name]-[hash].[ext]",
},
// Define globals
define: {
"process.env.NODE_ENV": JSON.stringify("production"),
},
// External packages
external: ["react", "react-dom"],
// Loaders
loader: {
".svg": "text",
".png": "file",
},
// Plugins
plugins: [myPlugin],
// Root directory
root: "./src",
// Public path for assets
publicPath: "/static/",
});
```
## CLI Flags
```bash
bun build <entrypoints> [flags]
```
| Flag | Description |
|------|-------------|
| `--outdir` | Output directory |
| `--outfile` | Output single file |
| `--target` | `browser`, `bun`, `node` |
| `--format` | `esm`, `cjs`, `iife` |
| `--minify` | Enable minification |
| `--minify-whitespace` | Minify whitespace only |
| `--minify-identifiers` | Minify identifiers only |
| `--minify-syntax` | Minify syntax only |
| `--splitting` | Enable code splitting |
| `--sourcemap` | `none`, `inline`, `external`, `linked` |
| `--external` | Mark packages as external |
| `--define` | Define compile-time constants |
| `--loader` | Custom loaders for extensions |
| `--public-path` | Public path for assets |
| `--root` | Root directory |
| `--entry-naming` | Entry point naming pattern |
| `--chunk-naming` | Chunk naming pattern |
| `--asset-naming` | Asset naming pattern |
## Target Environments
### Browser (default)
```typescript
await Bun.build({
entrypoints: ["./src/index.ts"],
target: "browser",
outdir: "./dist",
});
```
### Bun Runtime
```typescript
await Bun.build({
entrypoints: ["./src/server.ts"],
target: "bun",
outdir: "./dist",
});
```
### Node.js
```typescript
await Bun.build({
entrypoints: ["./src/server.ts"],
target: "node",
outdir: "./dist",
});
```
## Code Splitting
```typescript
await Bun.build({
entrypoints: ["./src/index.ts", "./src/admin.ts"],
splitting: true,
outdir: "./dist",
});
```
Shared dependencies are extracted into separate chunks automatically.
## Loaders
| Loader | Extensions | Output |
|--------|------------|--------|
| `js` | `.js`, `.mjs`, `.cjs` | JavaScript |
| `jsx` | `.jsx` | JavaScript |
| `ts` | `.ts`, `.mts`, `.cts` | JavaScript |
| `tsx` | `.tsx` | JavaScript |
| `json` | `.json` | JavaScript |
| `toml` | `.toml` | JavaScript |
| `text` | - | String export |
| `file` | - | File path export |
| `base64` | - | Base64 string |
| `dataurl` | - | Data URL |
| `css` | `.css` | CSS file |
Custom loaders:
```typescript
await Bun.build({
entrypoints: ["./src/index.ts"],
loader: {
".svg": "text",
".png": "file",
".woff2": "file",
},
});
```
## Plugins
```typescript
const myPlugin = {
name: "my-plugin",
setup(build) {
// Resolve hook
build.onResolve({ filter: /\.special$/ }, (args) => {
return { path: args.path, namespace: "special" };
});
// Load hook
build.onLoad({ filter: /.*/, namespace: "special" }, (args) => {
return {
contents: `export default "special"`,
loader: "js",
};
});
},
};
await Bun.build({
entrypoints: ["./src/index.ts"],
plugins: [myPlugin],
});
```
## Build Output
```typescript
// Bun 1.2+: Bun.build rejects on failure. Use try/catch to surface build
// errors (or pass { throw: false } and keep the legacy { success, logs } shape).
try {
const result = await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
});
// Access outputs
for (const output of result.outputs) {
console.log(output.path); // File path
console.log(output.kind); // "entry-point" | "chunk" | "asset"
console.log(output.hash); // Content hash
console.log(output.loader); // Loader used
// Read content
const text = await output.text();
}
} catch (err) {
console.error("Build failed:", err);
process.exit(1);
}
```
## Common Patterns
### Production Build
```typescript
await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
target: "browser",
minify: true,
sourcemap: "external",
splitting: true,
define: {
"process.env.NODE_ENV": JSON.stringify("production"),
},
});
```
### Library Build
```typescript
await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
target: "bun",
format: "esm",
external: ["*"], // Externalize all dependencies
sourcemap: "external",
});
```
### Build Script
```typescript
// build.ts
// Bun 1.2+: Bun.build rejects on failure, so try/catch is the modern idiom.
try {
const result = await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
minify: process.env.NODE_ENV === "production",
});
console.log(`Built ${result.outputs.length} files`);
} catch (err) {
console.error("Build failed:", err);
process.exit(1);
}
```
Run: `bun run build.ts`
## Common Errors
| Error | Cause | Fix |
|-------|-------|-----|
| `Could not resolve` | Missing import | Install package or fix path |
| `No matching export` | Named export missing | Check export name |
| `Unexpected token` | Syntax error | Fix source code |
| `Target not supported` | Invalid target | Use `browser`, `bun`, or `node` |
## When to Load References
Load `references/options.md` when:
- Need complete option reference
- Configuring advanced features
Load `references/plugins.md` when:
- Writing custom plugins
- Understanding plugin API
Load `references/macros.md` when:
- Using compile-time macros
- Build-time code generation
© secondsky · MIT · secondsky/claude-skills