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では指定できないなど、周辺のコードに影響を与える違いもある。