一年半くらい前に作ったやつの背景を書きたくなったので書く。
JSON で表現できる複雑度をもった任意のオブジェクトについて、それのキーがソートされているがバリューはそのままのオブジェクトがほしい。もしバリューがオブジェクトだったり配列だったりするのであれば、その内容についても再帰的に同じように処理してほしい。
例えば手動での編集が重なり混沌とした JSON/YAML であったり、処理系によっては出力される JSON のキーが順不同(毎回順番が違う)になる場合もあるらしい。キーの順序を一定にできればふたつの JSON の diff も読みやすくなるし、このような需要は常に一定程度あると思われる。
sort-keys というそのままの名前の NPM パッケージがすぐに見つかったのだが、個人的にもう少しやりたいことがあったので新しいツールを作った。
やりたいことの一つは、もしあるキーに対するバリューがオブジェクトや配列でない(つまり数値、文字列、真偽値、NULL のいずれか)ならば、そのキーは優先的に先頭に並べたいというやつ。これは構造が単純なものが先頭にまとまっていた方が見やすいと感じるという動機による。
{
"a": "A",
"b": [
"c",
"d",
"e"
],
"f": {
"g": "G",
"h": "H"
},
"i": "I"
}
より
{
"a": "A",
"i": "I",
"b": [
"c",
"d",
"e"
],
"f": {
"g": "G",
"h": "H"
}
}
の方がうれしくない? ぼくはそう思います。これを可能にするオプションをつけた。
もう一つは、場合によっては名前や内容に関係なく、常に先頭に指定された順序で並んでいてほしいキーバリューってあるよなというやつ。例えば package.json
だったら name
が最初に来てほしいのを筆頭に、ドキュメント通りの順番になっていてほしい。
ConfigMap や Secret を kubectl get
すると、kind
や metadata
より先に data
が来るのがキモくて、常に優先したいキーの配列をオプションで指定できるようにした。これはテストコードに実行例を入れた。
先に書いた既存パッケージでも Compare Function を与えられるようにはなっているのだけど、やりたいことその1を実現するにはキーだけの比較ではどうにもならないのだ。
せっかく作ったので、CLI も提供してついでにそれの Container Image も用意した。npx
でも実行できるし、Node がなくても docker run
でサッと試せます。