home / skills / daleseo / bun-skills / node-to-bun
This skill helps you migrate Node.js projects to Bun by analyzing dependencies, updating configs, and validating compatibility across tooling.
npx playbooks add skill daleseo/bun-skills --skill node-to-bunReview the files below or copy the command above to add this skill to your agents.
---
name: node-to-bun
description: Migrate Node.js projects to Bun with compatibility analysis. Use when converting existing npm/pnpm/yarn projects to Bun or auditing dependencies for Bun compatibility.
compatibility: Requires Bun 1.0+
allowed-tools: ["Bash", "Read", "Grep", "Write"]
metadata:
author: daleseo
category: bun-runtime
tags: [bun, migration, nodejs, node-to-bun, compatibility, dependencies]
---
# Node.js to Bun Migration
You are assisting with migrating an existing Node.js project to Bun. This involves analyzing dependencies, updating configurations, and ensuring compatibility.
## Migration Workflow
### 1. Pre-Migration Analysis
**Check if Bun is installed:**
```bash
bun --version
```
**Analyze current project:**
```bash
# Check Node.js version
node --version
# Check package manager
ls -la | grep -E "package-lock.json|yarn.lock|pnpm-lock.yaml"
```
Read `package.json` to understand the project structure.
### 2. Dependency Compatibility Check
**Read and analyze all dependencies** from `package.json`:
```bash
cat package.json
```
**Check for known incompatible native modules:**
Common problematic packages (check against current dependencies):
- `bcrypt` → Use `bcryptjs` or `@node-rs/bcrypt` instead
- `sharp` → Bun has native support, but may need version check
- `node-canvas` → Limited support, check version compatibility
- `sqlite3` → Use `bun:sqlite` instead
- `node-gyp` dependent packages → May require alternative pure JS versions
- `fsevents` → macOS-specific, usually optional dependency
- `esbuild` → Bun has built-in bundler, may be redundant
**Check workspace configuration** (for monorepos):
```bash
# Check if workspaces are defined
grep -n "workspaces" package.json
```
### 3. Generate Compatibility Report
Create a migration report file `BUN_MIGRATION_REPORT.md`:
```markdown
# Bun Migration Analysis Report
## Project Overview
- **Name**: [project name]
- **Current Node Version**: [version]
- **Package Manager**: [npm/yarn/pnpm]
- **Project Type**: [app/library/monorepo]
## Dependency Analysis
### ✅ Compatible Dependencies
[List dependencies that are Bun-compatible]
### ⚠️ Potentially Incompatible Dependencies
[List dependencies that may have issues]
**Recommended Actions:**
- [Specific migration steps for each incompatible dependency]
### 🔄 Recommended Replacements
[List suggested package replacements]
## Configuration Changes Needed
### package.json
- [ ] Update scripts to use `bun` instead of `npm`/`yarn`
- [ ] Review and update `engines` field
- [ ] Check `type` field (ESM vs CommonJS)
### tsconfig.json
- [ ] Update `moduleResolution` to `"bundler"`
- [ ] Add `bun-types` to types array
- [ ] Set `allowImportingTsExtensions` to `true`
### Build Configuration
- [ ] Review webpack/rollup/esbuild config (may use Bun bundler)
- [ ] Update test runner config (use Bun test instead of Jest)
## Migration Steps
1. Install Bun dependencies
2. Update configuration files
3. Run tests to verify compatibility
4. Update CI/CD pipelines
5. Update documentation
## Risk Assessment
**Low Risk:**
[List low-risk changes]
**Medium Risk:**
[List items needing testing]
**High Risk:**
[List critical compatibility concerns]
```
### 4. Backup Current State
Before making changes:
```bash
# Create backup branch if in git repo
git branch -c backup-before-bun-migration
# Or suggest user commits current state
git add -A
git commit -m "Backup before Bun migration"
```
### 5. Update package.json
**Read current package.json:**
```typescript
// Read and parse package.json
```
**Update scripts** to use Bun:
```json
{
"scripts": {
"dev": "bun run --hot src/index.ts",
"start": "bun run src/index.ts",
"build": "bun build src/index.ts --outdir=dist",
"test": "bun test",
"typecheck": "bun run --bun tsc --noEmit",
"lint": "bun run --bun eslint ."
}
}
```
**Update engines field:**
```json
{
"engines": {
"bun": ">=1.0.0"
}
}
```
**For libraries, add exports field** if not present:
```json
{
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs"
}
}
}
```
### 6. Update tsconfig.json
**Read current tsconfig:**
```bash
cat tsconfig.json
```
**Apply Bun-specific updates:**
```json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"types": ["bun-types"],
"lib": ["ES2022"],
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"allowImportingTsExtensions": true,
"noEmit": true
}
}
```
**Key changes explained:**
- `moduleResolution: "bundler"` → Uses Bun's module resolution
- `types: ["bun-types"]` → Adds Bun's TypeScript definitions
- `allowImportingTsExtensions: true` → Allows importing `.ts` files directly
- `noEmit: true` → Bun runs TypeScript directly, no compilation needed
### 7. Handle Workspace Configuration
**For monorepos with workspaces:**
Verify workspace configuration is compatible:
```json
{
"workspaces": [
"packages/*",
"apps/*"
]
}
```
Bun supports the same workspace syntax as npm/yarn/pnpm.
**Check workspace dependencies:**
```bash
# Verify workspace structure
find . -name "package.json" -not -path "*/node_modules/*"
```
### 8. Install Dependencies with Bun
**Remove old lockfiles:**
```bash
rm -f package-lock.json yarn.lock pnpm-lock.yaml
```
**Install with Bun:**
```bash
bun install
```
This creates `bun.lockb` (Bun's binary lockfile).
**For workspaces:**
```bash
bun install --frozen-lockfile # Equivalent to npm ci
```
### 9. Update Test Configuration
**If using Jest, migrate to Bun test:**
Create `bunfig.toml` for test configuration:
```toml
[test]
preload = ["./tests/setup.ts"]
coverage = true
coverageThreshold = 0.8
```
**Update test files:**
- Replace `import { test, expect } from '@jest/globals'`
- With `import { test, expect } from 'bun:test'`
**Jest compatibility notes:**
- Most Jest APIs work out of the box
- `jest.mock()` → Use `mock()` from `bun:test`
- Snapshot testing works the same
- Coverage reports may differ slightly
### 10. Update Environment Configuration
**Check .env files:**
```bash
ls -la | grep .env
```
Bun loads `.env` files automatically (same as dotenv package).
**Update environment loading code:**
- Remove `require('dotenv').config()`
- Bun loads `.env` by default
### 11. Update Build Configuration
**If using webpack/rollup/esbuild:**
Consider replacing with Bun's built-in bundler:
```typescript
// bun-build.ts
await Bun.build({
entrypoints: ['./src/index.ts'],
outdir: './dist',
minify: true,
splitting: true,
sourcemap: 'external',
target: 'bun',
});
```
**Update build script in package.json:**
```json
{
"scripts": {
"build": "bun run bun-build.ts"
}
}
```
### 12. Update CI/CD Configuration
**GitHub Actions example:**
```yaml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Run tests
run: bun test
- name: Type check
run: bun run typecheck
- name: Build
run: bun run build
```
### 13. Verification Steps
Run these commands to verify migration:
```bash
# 1. Check dependencies installed correctly
bun install
# 2. Run type checking
bun run --bun tsc --noEmit
# 3. Run tests
bun test
# 4. Try development server
bun run dev
# 5. Test production build
bun run build
```
### 14. Update Documentation
Create or update these documentation sections:
**README.md:**
```markdown
## Prerequisites
- [Bun](https://bun.sh) 1.0 or higher
## Installation
```bash
bun install
```
## Development
```bash
bun run dev
```
## Testing
```bash
bun test
```
```
**CHANGELOG.md entry:**
```markdown
## [Version] - [Date]
### Changed
- Migrated from Node.js/npm to Bun
- Updated all dependencies to Bun-compatible versions
- Replaced [specific packages] with [alternatives]
- Updated TypeScript configuration for Bun
```
## Common Migration Issues & Solutions
### Issue: Native Module Incompatibility
**Symptoms:**
```
error: Cannot find module "bcrypt"
```
**Solution:**
```bash
# Replace with pure JavaScript alternative
bun remove bcrypt
bun add bcryptjs
# Update imports
# Before: import bcrypt from 'bcrypt';
# After: import bcrypt from 'bcryptjs';
```
### Issue: ESM/CommonJS Conflicts
**Symptoms:**
```
error: require() of ES Module not supported
```
**Solution:**
Add to `package.json`:
```json
{
"type": "module"
}
```
Or use `.mts` extension for ES modules and `.cts` for CommonJS.
### Issue: Path Alias Resolution
**Symptoms:**
```
error: Cannot resolve "@/components"
```
**Solution:**
Verify `tsconfig.json` paths match:
```json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}
```
Bun respects TypeScript path aliases automatically.
### Issue: Test Failures
**Symptoms:**
```
error: jest is not defined
```
**Solution:**
Update test imports:
```typescript
// Before
import { describe, it, expect } from '@jest/globals';
// After
import { describe, it, expect } from 'bun:test';
```
## Migration Checklist
Present this checklist to the user:
- [ ] Bun installed and verified
- [ ] Dependency compatibility analyzed
- [ ] Migration report reviewed
- [ ] Current state backed up (git commit/branch)
- [ ] `package.json` scripts updated
- [ ] `tsconfig.json` configured for Bun
- [ ] Old lockfiles removed
- [ ] Dependencies installed with `bun install`
- [ ] Test configuration migrated
- [ ] Tests passing with `bun test`
- [ ] Build process verified
- [ ] CI/CD updated for Bun
- [ ] Documentation updated
- [ ] Team notified of migration
## Post-Migration Performance Verification
After migration, help user verify performance improvements:
```bash
# Compare install times
time bun install # Should be 3-10x faster than npm
# Compare test execution
time bun test # Should be faster than Jest
# Compare startup time
time bun run src/index.ts # Should be 90% faster than ts-node
```
## Rollback Procedure
If migration encounters critical issues:
```bash
# Return to backup branch
git checkout backup-before-bun-migration
# Or restore original state
git reset --hard HEAD~1
# Reinstall original dependencies
npm install # or yarn/pnpm
```
## Completion
Once migration is complete, provide summary:
- ✅ Migration status (success/partial/issues)
- ✅ List of changes made
- ✅ Performance improvements observed
- ✅ Any remaining manual steps
- ✅ Links to Bun documentation for ongoing development
This skill helps migrate Node.js projects to Bun by auditing dependencies, updating configs, and producing a concrete migration plan. It focuses on compatibility analysis, actionable replacements, and step-by-step changes to scripts, TypeScript, build, test, and CI configuration. Use it to minimize risk and speed up a migration from npm/yarn/pnpm to Bun.
The skill reads package.json, tsconfig.json, lockfiles and workspace layouts to identify compatibility issues and required config changes. It flags native or node-gyp-based modules, suggests replacements, and generates a BUN_MIGRATION_REPORT.md with recommended actions. It also provides updated scripts, tsconfig tweaks, CI snippets, and verification steps to validate the migration.
Will Bun support all npm packages?
Most pure JavaScript packages work, but native modules (bcrypt, sqlite3, node-canvas, node-gyp deps) may need replacements or adapters. The skill flags those and suggests alternatives.
Do I need to change TypeScript settings?
Yes. Recommended changes include moduleResolution: "bundler", adding "bun-types" to types, allowing TS extensions, and target/module tweaks to match Bun runtime expectations.