minimist→util.parseArgs

Node.js v18.3.0でutilモジュールにparseArgsというものが生えた。コマンドライン引数(のような配列)をパースできる。minimistくらいで済んでいるものは置き換えられそうだ。

例えば以下のような引数と出力のコードを考えてみる。真偽値と、文字列、2語のもの、加えてオプションではない引数が最後に付くものだ。

$ node ./test.js --boolean --string 'Test' --two-words -- 'Rest' '--of' 'Test'
true Test true Rest --of Test

minimistの場合は以下のように書ける。

import minimist from "minimist";

const {
	_: rest,
	boolean,
	string,
	"two-words": twoWords
} = minimist(process.argv.slice(2), {
	alias: {
		b: "boolean",
		s: "string"
	},
	boolean: [
		"boolean",
		"two-words"
	],
	string: [
		"string"
	]
});
console.log(boolean, string, twoWords, ...rest);

対してutil.parseArgsでは以下のように書ける。

import { parseArgs } from "node:util";

const {
	positionals: rest,
	values: {
		boolean,
		string,
		"two-words": twoWords
	}
} = parseArgs({
	allowPositionals: true,
	options: {
		boolean: {
			short: "b",
			type: "boolean"
		},
		string: {
			short: "s",
			type: "string"
		},
		"two-words": {
			type: "boolean"
		}
	}
});
console.log(boolean, string, twoWords, ...rest);

コード量はあまり変わらない。--foo-barのようなオプションの書き方もほぼ同じだ。minimistでstopEarlyや--を使っていないなら、簡単に置き換えられる。私見ではオプションごとに定義できるutil.parseArgsの方が書きやすい。ただし、minimistでは引数が省略された時の既定の値を指定できるが、util.parseArgsでは指定できないなど、周辺のコードに影響を与える違いもある。