Babelの勉強と称してmuscle-assertを作ってみる
私は型がないと死んでしまう(コンパイラと相談しないと考慮漏れが多発して死ぬ)ので、JS系を触る場合は主にTypeScriptなのですが、とはいえ昨今の事情的にBabelを食わず嫌いするのなぁ…と思ったのでライブラリとそれ用のpuluginを作ってみることにした。
勉強前のスキル
- Babel系の情報は追っていたが使うのは(ほぼ)始めて
- 既に別の人が構築したものをちょろっと触ったことならある
- TypeScriptは使える(詳しいわけではない)
方針
こういうのは強い方々の力を借りるに限る。
https://github.com/azu/power-assert-as-tool-demo
Babel pluginの知識は https://github.com/thejameskyle/babel-handbook を斜め読みしつつ、https://github.com/power-assert-js 下にあるbabel pluginを読み漁った。
作るついでに類似品チェック
Persimmon用アサーションライブラリMuscleAssertを作った - pocketberserkerの爆走
この記事の記憶がまだ自分の脳内に残っているうちに移植してみたかったので、今回はこれを題材にした。 一応類似品を紹介しておく。
https://www.npmjs.com/package/assert-diff
やっていることはだいたい同じだが、標準assertをベースにしたかったので自作しようという心持ちである。
あと、似たようなdiff表示はmocha
であれば行ってくれる。
だからmochaであれば必要ない…のだが、eaterなどではそういうわけにもいかないと思う。
成果物?
https://github.com/pocketberserker/muscle-assert https://github.com/pocketberserker/babel-plugin-muscle-assert https://github.com/pocketberserker/muscle-assert-demo
Babel初で一日少々にしては私的には頑張ったほうじゃないですね…まぁ、参考にできるものがおおかったからだろうけど。
muscle-assertは標準のassert.deepStrictEqual
のみを置き換える方針にした。
こうしたほうがシンプルだろうし、他のライブラリとも干渉しなくなるだろうと思った。
そういうわけでBabel plugin側も最低限の置き換えにとどめている。
使い方はデモプロジェクトをみればわかるはず。 表示がしょぼいのはプロトタイプなので勘弁してください。 バグっていたらそのうち直します。
ドキュメントがなさすぎるのは…本気で実装する気力が起きれば書く。
課題
なるべくpower-assertと干渉しないように作りたい…と思っていたのだが、以下の問題にぶつかった。
@pocketberserker babel-plugin-espower は Babel 黒魔術を使って他の全ての plugin に先回りして動作するからです
— Takuto Wada (@t_wada) 2016年6月6日
babel-plugin-espowerが先に変更してしまうのでテストがおかしくなる。
回避方法は今のところbabel-plugin-espowerのpatterns
にassert.deepStrictEqual
をいれないという場当たり的なもの…なんとかしたいが、なんとかできるのかなぁ。
というわけで、今のところbabel-preset-power-assertとの共存は難しいのではないかと考えている。
おわりに
Babelは入門するだけならそんなに時間がかからないようだ。 power-assertの導入は記事が乱立しすぎているし古い情報がノイズになってTypeScriptのときはつらい気持ちになっていたが、Babel前提だとbabel-preset-power-assertがよろしくやってくれるので良いと思う。 とはいえ、楽になったのはあくまでBabelマンだけなのでTypeScriptの時にもう少しどうにかならないか考えてみたくもある。
babel-plugin-espowerのあれはやりたいことを考えると仕方がないのだと思う。 こういうのは後発ライブラリが頭をひねれば良い問題だと思うので、babel-plugin-espwerさんはそのままの強さで居てほしい。