应用同一标志的多个实例时自定义 opstring 解析?

Custom opstring parsing when multiple instances of same flag is applied?

我有一个命令行程序,我想在给定多个参数的情况下生成一张图片,其中应遵守参数的顺序,并且允许重复的参数

是否有任何 node.js 允许这样做的 optstring 解析器?

我想要类似的东西

generate_picture --red 100 --yellow 200 --red 100 --width 500

然后它生成一个“旗帜”,上面有一个 100px 的红色带,然后是一个 200px 的黄色带,然后是另一个 100px 的红色带,所有应用的宽度都是 500px

我的程序并没有真正做到这一点,但它是相似的

我认为我的程序接收这些参数的理想形式是像这样的数组

[
  ['red', 100],
  ['yellow', 200],
  ['red', 100],
  ['width', 500]
]

我可能会预先扫描这个数组中的数组,寻找我希望只应用一次的东西,比如宽度

我想现在我把它写出来了,手动解析 process.argv 数组以使其进入这种状态可能不会太难,但很好奇是否已经有可用的选项

为了帮助我的特殊情况,我制作了这个实用函数

function parseArgv(argv) {
  const map = [];
  while (argv.length) {
    const val = argv[0].slice(2);
    argv = argv.slice(1);
    const next = argv.findIndex((arg) => arg.startsWith("-"));

    if (next !== -1) {
      map.push([val, argv.slice(0, next)]);
      argv = argv.slice(next);
    } else {
      map.push([val, argv]);
      break;
    }
  }
  return map;
}

用法示例

test("parse", () => {
  expect(
    parseArgv(
      "--bam file1.bam color:red --vcf variants.vcf --bam file2.bam --defaultSession --out out.svg --fullSvg".split(
        " "
      )
    )
  ).toEqual([
    ["bam", ["file1.bam", "color:red"]],
    ["vcf", ["variants.vcf"]],
    ["bam", ["file2.bam"]],
    ["defaultSession", []],
    ["out", ["out.svg"]],
    ["fullSvg", []],
  ]);
});

然后 post 处理可以使这一点更有意义,但是这个实用函数以 yargs 或其他节点 optstring 解析器无法实现的方式对我的目的有所帮助