CLIアプリをJSON APIとしてデプロイする

console.logだけでAPIを構築する

さて、百聞一見にしかずなので、console.logのみでAPIを構築していきましょう。
とりあえず、 — nameでユーザ名が渡されたらそのユーザのプロダクトが配列で返ってくるようなCLIツールを書いてみます。

コマンドラインパーサをインストールしましょう。
substack製のminimistの方が多機能でユーザも多いですが、軽量なのでmriもおすすめです。

まあ普通ですね。実行してみます。

よさそうです。
それにしてもtjはやばい。
さて、準備は整ったのでAPIサーバへと変換しましょう。

といっても、cli-to-api を叩くだけです。

グレート!
CLIツールを書いているつもりがAPIサーバが完成しました。

よかったらスターください。

デプロイ

よくこういう状況があります。

「今から3分以内にこのクエリでこんなjsonを返すAPIをつくって公開して。時間厳守ね。」

こんなときは、upを使って秒でデプロイしましょう。

upはtj製のサーバーレス構築ツールです。
up.jsonを用意してupと叩くだけでaws lamdaにデプロイされ、一瞬で全世界にAPIが公開できます。
初回は構成があるので20秒ぐらいかかりますけど、次からは5秒ぐらいでデプロイできるので最高です。
100万リクエストまで無料なので50個ぐらい雑なAPIたててるけど今のところ無料で使えているので、こういう感じの雑なAPIはどんどんAWS lambdaに雑にデプロイすればいいと思います。

さて、up.jsonの作成ですが、秒でやるためtouch-altを使い時短します。
これはtouchで新規ファイルを作成する際、テンプレートが登録されているファイルを代わりに作成します。これでup.jsonの雛形ができました。
あとはupするだけです。

$ touch up.json

{
“name”: “console-api”
}

up urlでデプロイ先のurlが取得できるので、展開してcurlに食べさせます。

$ curl localhost:3000?name=tj
["express","koa","mocha","stylus","co"]

YES!!!!

これで、無事にconsole.logのみをJSON APIとしてデプロイできました。

upについて詳しく知りたい人は、GitHubなどを見てください。
あと、touch-alt、readmeとか.babelrcの雛形生成するのに便利なので使ってください。

How to Work?

さて、どのようにして動いているでしょうか?
一言で言うと、Babelでトランスパイルしているだけです。

それを行っているプラグインがbabel-plugin-api-over-consoleです。

このプラグインは、console.logres.json に変換し、process.argvを適切にqueryへと変換します。そして、babel-templateを用いて、処理をexpressのapp.get(‘/’, callback)のコールバックでラップします。それほど難しい処理はしてないので、興味があればコードを見てください。

Babel Plugin

さて、Babel Pluginの話ですが、Web上に良い資料があるのでそれを参考にするとよいです。

まずは、thejameskyle先生のBabel Handbookに目を通すのがよいと思います。
https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md

astexplorerを使うと非常に直感的に理解ができてよいです。
https://astexplorer.net/

Babel Pluginのテストは、babel-plugin-testerを使うとよいです。
snapshotテストで簡単にテストできます。
babel-plugin-api-over-consoleでも使っているので参考にしてください。
https://github.com/babel-utils/babel-plugin-tester

また、consoleでASTを逐次確認するのにbabel-logを使うと便利です。
https://github.com/babel-utils/babel-log

他の知見としては、BabelのレポジトリからFlowtypeの型定義ファイルを持ってくると開発がスムーズです。
https://github.com/babel/babel/blob/7.0/lib/types.js

babel公式のAPIについてのドキュメントも必須です。
こちらをにらめっこしながら書くことになると思います。
しかし、コメントまわりなどの処理を書こうとするとここに載っていないAPIを使うことになり、Babelのコードの読みに行く必要があります。
https://babeljs.io/docs/core-packages/babel-types/

おわりに

いちいちexpressでlocalhostで出力確認とかしないでconsole.logだけでいいので、雑にやる分にはいいのではないでしょうか?

もし気に入ってくれたなら、スターをくれると嬉しいです。

なにか議論があれば、コメント欄、Twitterで議論しましょう。

Help

無職です。
誰か…お仕事…

もう無職.jsとして生きていくしか…

A single golf clap? Or a long standing ovation?

By clapping more or less, you can signal to us which stories really stand out.