🍣

fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った

2024/05/16に公開

TL;DR

  • fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作った

https://github.com/ryoppippi/na.fish

0.gif
nを入力すると、lockfileを考慮してnpm, yarn, pnpm, bun, denoのどれかを自動で補完してくれる

はじめに

皆さんは@antfu/ni使ってますか?
niは、npm/yarn/pnpm/bun からプロジェクトの構造を読み取ってよしなにコマンドを選択、実行してくれるCLIツールです。

https://github.com/antfu-collective/ni

とても便利なのですが、いくつかの点で不満がありました。

  • 機能ごとにコマンドが別れていてそのうち別コマンドと被りそう
  • fishの履歴機能と相性が悪い
  • fishにはabbrという機能があるのに活用できてない

そこで、fishで自分好みのものを作ることにしました。

先行事例

Nodeに依存せず、シェルスクリプトでni相当の実装をしている例はいくつかあります。

https://efcl.info/2023/03/24/ni/
https://zenn.dev/karibash/articles/0e2cdc16d0596e

またZshですが、zeno.zshのabbrを用いて今回実装したコマンド展開を行っている例もあります。
https://www.m3tech.blog/entry/zeno-zsh-abbr

作ったもの

https://github.com/ryoppippi/na.fish
作ったものは☝️です。
これをfisherでインストールし、自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
ちなみに自分はかなりdenoを使うので、ちゃっかりdenoにも対応しました。

動作の様子は冒頭にあるGIFをご覧ください。

サブコマンドの補完について

先行事例では、サブコマンドの差異を吸収するような実装がされていました。
例えば、

  • ni -> npm install, yarn add
  • nun -> npm uninstall, yarn remove
  • nr dev -> npm run dev, yarn dev

などなど。

以前はnpmaddremoveといったサブコマンドはありませんでした。yarnpnpmbunなど他のパッケージマネージャにはありますね。
またnpmでscriptsを実行する際にはrunを使うのですが、他のパッケージマネージャではrunを省略できますね。

しかし、自分の使っているNode v22では

  • addremovenpmでも使える
  • npmでもrunを省略できる
    ことが確認できたため、これらのサブコマンドの差異を吸収するような実装は必要ないと判断しました。

(差異を吸収する必要があるとすれば、npm add --global->yarn global addくらいだと思いますが、そもそも自分はglobalのインストールをあまりしない/yarnを使わないので今回は対応していません)

まとめ

fishでNode.js/Denoのパッケージマネージャを自動で補完するプラグインを作りました。
自分の好きなコマンドをabbrとして登録することで、そのコマンドを入力した時に自動的にNode.js/Denoのパッケージマネージャを補完してくれます。
みなさんもぜひ使ってみてください。

Discussion