β Zero-config ESM/TS package builder.
Powered by oxc, rolldown and rolldown-plugin-dts.
The obuild project aims to be the next-generation successor to the current unbuild.
- π Focus on ESM compatibility.
- π± Fresh rewrite with cleanups and removal of legacy features.
- π Using oxc (for transform) and rolldown (for bundle) for much faster builds!
Some differences are not easy to adopt. Developing as a standalone project allows for faster progress and dogfooding in real projects.
Important
This is a proof-of-concept project.
Features are incomplete, and API and output behavior may change between 0.x versions.
Feedback and contributions are very welcome! If you'd like to make changes with more than a few lines of code, please open an issue first to discuss.
- π¦ obuild
- π³ rou3
- π₯ srvx
- ποΈ unenv
- π°οΈ omnichron
- βοΈ c12
- [...add yours...]
# bundle npx obuild ./src/index.ts # transform npx obuild ./src/runtime/:./dist/runtimeYou can use --dir to set the working directory.
If paths end with /, obuild uses transpile mode using oxc-transform instead of bundle mode with rolldown.
import { build } from "obuild"; await build({ cwd: ".", entries: ["./src/index.ts"], });You can use build.config.mjs (or .ts) or pass config to build() function.
import { defineBuildConfig } from "obuild/config"; export default defineBuildConfig({ entries: [ { type: "bundle", input: ["./src/index.ts", "./src/cli.ts"], // outDir: "./dist", // minify: false, // stub: false, // rolldown: {}, // https://rolldown.rs/reference/config-options // dts: {}, // https://github.com/sxzz/rolldown-plugin-dts#options }, { type: "transform", input: "./src/runtime", outDir: "./dist/runtime", // minify: false, // stub: false, // oxc: {}, // resolve: {} }, ], hooks: { // start: (ctx) => {}, // end: (ctx) => {}, // entries: (entries, ctx) => {}, // rolldownConfig: (config, ctx) => {}, // rolldownOutput: (output, res, ctx) => {}, }, });When working on a package locally, it can be tedious to rebuild or run the watch command every time.
You can use stub: true (per entry config) or the --stub CLI flag. In this mode, obuild skips the actual build and instead links the expected dist paths to the source files.
- For bundle entries,
.mjsand.d.mtsfiles re-export the source file. - For transpile entries, src dir is symlinked to dist.
Caveats:
- You need a runtime that natively supports TypeScript. Deno, Bun, Vite, and Node.js (1)
- For transpile mode, you need to configure your bundler to resolve either
.tsor.mjsextensions. - For bundle mode, if you add a new entry or add/remove a
defaultexport, you need to run the stub build again.
(1) For Node.js, you have several options:
- Using
node --experimental-strip-types(Available in 22.6) - Using jiti (
node --import jiti/register) - Using oxc-node (
node --import @oxc-node/core/register) - Using unloader (
node --import unloader/register)
π Released under the MIT license.