Prettier 1.18.0 に大きなバグを入れてしまった

今日リリースされたPrettier v 1.18.0で、自分のPRのせいでかなり大きなバグを引き起こしてしまいました。


概要

https://github.com/prettier/prettier/issues/6189

僕の出したPRの影響で、以下のようなバグが起こるようになりました。

拡張子が.tsxのファイルでtrailing-commaオプションをnoneにしていても下のような末尾カンマの挿入が起こるバグです。

// Input

function func<T>() {}
interface Interface<T> {}

// Output
function func<T,>() {}
interface Interface<T,> {}

バグの原因である僕のPRの本来の目的についてはブログを読んでいただけると嬉しいです。


原因

もともとこの末尾カンマは、型引数が一つのアロー関数のみに対してつけるべきものでしたが、私の実装ではそうなっていませんでした。結果として、.tsxのファイルでは通常の関数、インターフェース、タイプエイリアス、などあらゆる型引数受け取る構文に対して末尾カンマを挿入してしまうことになりました。

そしてバグをリリース前に発見できなかった理由ですが、フォーマット結果がファイル名(拡張子が .tsx であること)に依存するためにPlayground上でバグを発見できなかったためです。Prettierは https://prettier.io/playground でフォーマットの結果を試してみることができるのですが、これにはファイル名の概念が(現時点では)存在しないため、.tsxとして解釈されないので、Playgroundで確認しても正しく動いているように見えてしまっていたのです。


現在

現在はバージョン 1.18.1 がリリースされ、修正されています。ちなみに、その修正のPRは https://github.com/prettier/prettier/pull/6190 にあります。授業中に死ぬほどドキドキしながら書きました。


ごめんなさい

本当に申し訳なく思っています。もっと慎重にやります、、、。