NodeJS を使った Alfred Workflow を作る

NodeJS を使った Alfred Workflow は、 Alfred から入力された情報を NodeJS スクリプトを通して Alfred の期待する形で出力する事で作れます。(入力を受け取れて出力できれば良いので特に NodeJS でなければいけないことはない)

準備

以下の通りに見ていきます。

  1. ワークフロー作成
  2. NodeJS 環境構築

ワークフロー作成

Alfred の Preferences からWorkflows を開き下部の+で開くコンテキストメニューにある Blank Workflow という項目からワークフローを作れます。
これを適当な名前(ここではFoo)で作成します。

作成されたワークフローの上で右クリックして開くコンテキストメニューの中に Open in Folder という項目があります。これで開くフォルダが Alfred Workflow になり、 NodeJS プロジェクトや Git リポジトリになるディレクトリになります。

NodeJS スクリプトなどを実行する際にそのファイルパスを指定する必要があります。このディレクトリ内にそのスクリプトファイルを含ませれば、ルートディレクトリからの相対パス指定でアクセスできます。

NodeJS 環境構築

Workflow ディレクトリにpackage.jsonを作り、以下の依存パッケージをインストールします。

yarn add -D ncc

nccはある.jsで読み込まれている依存モジュールの内容を取り込み1つの.jsファイルにしてくれるツールです。これにより作成した Alfred Workflow を別環境で使いたい場合に、一々依存解決(npmyarnなどを用いた)をしなくても良くなります。

以下のコマンドいくつかのrun-scriptsを追加します。これでyarn devsrc/main.jsに変更がある度コンパイルする開発モードで起動し、yarn buildでコンパイルだけされます。

npx npe scripts.dev 'ncc build --watch src/main.js'
npx npe scripts.build 'ncc build'

NodeJS スクリプトを使うアクション

ワークフロー編集画面から右クリックで開くコンテキストメニューから ActionsRun Script から、そのアクションを実行する時に行われる Bash スクリプトを書けます。引数はシェルスクリプトと同様に渡されてきます。

eval $(/usr/libexec/path_helper -s)
export PATH=/usr/local/bin:$($(echo $SHELL) -ic 'echo $PATH'):$PATH

query=$1

node ./dist/index.js $query

このワークフローのPATH変数には最初/usr/bin:/bin:/usr/sbin:/sbinとしか登録されていません。node/usr/local/bin/nodeなどにインストールされてるとそのままでは実行すらできませんが、頭の2行を実行するとPATHにそのマシンのデフォルトシェルと同じ値が設定されるので使えるようになります。

後は引数をスクリプトに渡すだけです。

Run Action では最後をconsole.log(text)で出力します。そこで出力したtextが次のアクションのqueryとして渡されていきます。
もし Run Action ではなく、Script Filter の場合は、ここに載っている JSONconsole.logが必要など若干の違いはあります。

配布

Workflow 名の上で開けるコンテキストメニューに Export の項目があるので、ここから保存します。保存したファイルを Github リポジトリの Release ページなどへ上げれが誰でもそのワークフローを使えるようになります。