--- title: "最近作ったBun向けの小さいツール(+alpha)たちの紹介 [自己満記事]" date: '2024-08-21' isPublished: true lang: 'ja' --- 最近いくつか Bun 向けに小さいツールをいくつか作ったので紹介します。 > [!NOTE] > これは完全に自己満足の記事です # bun-plugin-isolated-decl https://github.com/ryoppippi/bun-plugin-isolated-decl Bun には `Bun.build` という Bundler 備わっています。 https://bun.sh/docs/bundler とても速くて、プラグインを書くのも簡単なので、個人的にも気に入ってよく使ってます(ただし、tree-shaking が甘いという問題がある)。 しかし、`Bun.build` には現在のところ、型定義ファイルを生成する機能がありません。 Issueも立っているのですが、まだ実装されていません。 https://github.com/oven-sh/bun/issues/5141#issuecomment-1719218286 `bun-plugin-isolated-decl` は、Bun のプラグインとして、型定義ファイルを生成する機能を提供します。 使い方は簡単で、`build.ts` のオプションに plugin として追加するだけです。 ```typescript import isolatedDecl from 'bun-plugin-isolated-decl'; await Bun.build({ entrypoints: ['./index.ts'], outdir: './dist', plugins: [isolatedDecl()], // ... other configuration options }); ``` 内部では `oxc-transformer` を用いています。 `oxc-transformer` は rust で書かれた `oxc` を用いて型定義を生成するツールです(ただし、` isolated declarations` を `tsconfig.json` で有効にする必要があります)。 これにより、`tsc` を用いるよりも圧倒的に高速に型定義ファイルを生成することができます。 自分はしばらくこの `Bun.build` + `bun-plugin-isolated-decl` の組み合わせでライブラリのビルドを行ってています。 高速にビルドが完了するので、とても便利です。 とはいえ、ここ1ヶ月くらいで[`rolldown`](https://rolldown.rs/) が比較的実用的になってきたこと、`rolldown` の出力の方が綺麗で tree-shaking もよくできていること (`rollup` の出力に近い)、 `rolldown` のラッパーである [`tsdown`](https://github.com/sxzz/tsdown) がそこそこ使い物になってきたことから、今後は `rolldown` をメインに使っていくかもしれません。 # bunpare Bun の Lockfile は、`bun.lock` というファイル名で保存されます。 この Lockfile はバイナリ形式です。 `Bun install` の高速さはこのバイナリ形式によるものですが、テキストファイルではないため git での管理が難しいという問題があります。 Bun 公式では、git の `textconv` を設定することで `git diff` で差分を見ることができるような方法を紹介しています。 https://bun.sh/docs/install/lockfile ただ、この設定を一々行うのは面倒です。 また、チームでの利用を考えると、これらの設定は自動的に行われるべきです。 そこでこれらの設定を自動で行ってくれる小さなコマンド、`bunpare` を作りました。 https://github.com/ryoppippi/bunpare 中身はとてもシンプルで、 公式の紹介している方法を `index.ts` に書き下した(コマンドの実行には [`bun shell`](https://bun.sh/docs/runtime/shell) を使用) だけです。 便利な使い方としては、`bunpare` を `prepare` スクリプトに登録しておくことです。 ```json { "scripts": { "prepare": "bun x bunpare", } ``` これにより、`git clone` したときに、`bun install` するだけで、`git diff` で Lockfile の差分を見ることができるようになります。 自分はこの `bunpare` を Bun を使っている全てのプロジェクトに導入しています。 # pkg-to-jsr https://github.com/ryoppippi/pkg-to-jsr このツールは Bun 特有ではないのですが、流れで紹介します。 `pkg-to-jsr` は、`package.json` から `jsr.json` を生成するツールです。 JSR とは、Deno が提供しているJS/TS用のレジストリです。 Denoだけでなく、Node.js のプロジェクトを アップロードすることもできます。 JSRの動作のイメージは以下の記事が参考になるので、あわせて読んでみてください! https://zenn.dev/kesin11/articles/20240530_publish_jsr JSR は個人的には JSR に Node のパッケージをアップロードするためには、`jsr.json` というファイルを `package.json` とは別に用意する必要があります。 `jsr.json` には - `name` - `version` - `publis.include`/ `publish.exclude` - `exports` などを記述する必要があります。 しかし、ある程度このファイルを手で書くのは面倒です。 `package.json` と共通の情報が多いため、`package.json` から `jsr.json` を生成するツールがあれば便利だと思い、作りました。 ## pkg-to-jsrの使い方 `pkg-to-jsr` は、zero config を謳っています。 たとえば、以下のような `package.json` からは ```json { "name": "example", "jsrName": "@scope/example", "version": "1.0.0", "main": "dist/index.js" } ``` 以下のような `jsr.json` が生成されます。 ```json { "name": "@scope/example", "version": "1.0.0", "exports": { ".": "dist/index.js" } } ``` また、JSR 向けの `exports` の設定、`package.json` の `name` と `author` から自動的に scoped package name を生成するなど、いくつかの機能があります。 そのため、以下のような比較的複雑な `package.json` からは、 ```json { "name": "example", "author": "ryoppippi", "version": "1.0.0", "exports": { ".": { "import": "./dist/index.js", "require": "./dist/index.js", "types": "./dist/index.d.ts", "jsr": "./src/index.ts" } } } ``` 以下のような `jsr.json` が生成されます。 ```json { "name": "@ryoppippi/example", "version": "1.0.0", "exports": { ".": "./src/index.ts" } } ``` 詳しい使い方は [`README.md`](https://github.com/ryoppippi/pkg-to-jsr) を参照してください。 # まとめ 以上、最近作った Bun 向け(+ alpha) の小さいツールたちを紹介しました。 ぜひ使ってみてください!