Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/ obuild Public

πŸ“¦ 😯 Zero-config ESM/TS package builder. powered by oxc, rolldown and rolldown-plugin-dts.

License

Notifications You must be signed in to change notification settings

unjs/obuild

Repository files navigation

πŸ“¦ obuild 😯

βœ… 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.

Proof of Concept

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.

Currently Used by

Usage

CLI

# bundle
npx obuild ./src/index.ts
# transform
npx obuild ./src/runtime/:./dist/runtime

You 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.

Programmatic

import { build } from "obuild";
await build({
 cwd: ".",
 entries: ["./src/index.ts"],
});

Config

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) => {},
 },
});

Stub Mode

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, .mjs and .d.mts files 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 .ts or .mjs extensions.
  • For bundle mode, if you add a new entry or add/remove a default export, 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)

Prior Arts

  • unbuild: Stable solution based on rollup and mkdist.
  • tsdown: Alternative bundler based on rolldown.

License

πŸ’› Released under the MIT license.

About

πŸ“¦ 😯 Zero-config ESM/TS package builder. powered by oxc, rolldown and rolldown-plugin-dts.

Resources

License

Stars

Watchers

Forks

Contributors 16

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /