Default to using Bun instead of Node.js.
- Use
bun <file>instead ofnode <file>orts-node <file> - Use
bun testinstead ofjestorvitest - Use
bun installinstead ofnpm installoryarn installorpnpm install - Use
bun run <script>instead ofnpm run <script>oryarn run <script>orpnpm run <script> - Bun automatically loads .env, so don't use dotenv.
NOTE: When only changing typescript, you do NOT need to run the build script. The build is only needed when changing native code.
Bun.serve()supports WebSockets, HTTPS, and routes. Don't useexpress.bun:sqlitefor SQLite. Don't usebetter-sqlite3.Bun.redisfor Redis. Don't useioredis.Bun.sqlfor Postgres. Don't usepgorpostgres.js.WebSocketis built-in. Don't usews.- Prefer
Bun.fileovernode:fs's readFile/writeFile - Bun.$
lsinstead of execa.
Use bun test to run tests from the packages directories for a specific package.
import { test, expect } from "bun:test";
test("hello world", () => {
expect(1).toBe(1);
});For more information, read the Bun API docs in node_modules/bun-types/docs/**.md.
To build the project (before running typescript tests), run
bun run build
FROM THE REPO ROOT to make sure all packages are built correctly.
To run native tests for packages/core, run
bun run test:native
FROM THE packages/core DIRECTORY.
To filter native tests, use:
bun run test:native -Dtest-filter="test name"
FROM THE packages/core DIRECTORY.
- Runtime: Bun with TypeScript
- Formatting: Prettier (semi: false, printWidth: 120)
- Imports: Use explicit imports, group by: built-ins, external deps, internal modules
- Types: Strict TypeScript, use interfaces for options/configs, explicit return types for public APIs
- Naming: camelCase for variables/functions, PascalCase for classes/interfaces, UPPER_CASE for constants
- Error Handling: Use proper Error objects, avoid silent failures
- Async: Prefer async/await over Promises, handle errors explicitly
- Comments: Minimal comments, NO JSDoc
- File Structure: Index files for clean exports, group related functionality
- Testing: Bun test framework, descriptive test names, use beforeEach/afterEach for setup
Reproduce the issue in a test case. Do NOT start fixing without a reproducible test case. Use debug logs to see what is actually happening. DO NOT GUESS.