@ clerc/ parser (帮助)
一个强大的,轻量级的,灵活的命令行参数解析器.
安装
$ npm install @clerc/parser
$ yarn add @clerc/parser
$ pnpm add @clerc/parser
使用量
这个软件包的核心是 parse 函数。 它需要一系列参数和一个配置对象,并返回包含解析的旗帜、参数和其他有用信息的结构化对象.
import { parse } from "@clerc/parser";
const { flags, parameters, unknown } = parse(process.argv.slice(2), {
flags: {
// Define your flags here
port: {
type: Number,
alias: "p",
default: 8080,
},
help: {
type: Boolean,
alias: "h",
},
},
});
console.log("Flags:", flags);
console.log("Parameters:", parameters);
console.log("Unknown args:", unknown);
API 密码
parse(args, options)
args
- 类型 :
string[] - 要解析的命令行参数阵列( 例如 ),
process.argv.slice(2)) (中文(简体) ).
options
- 类型 :
ParseOptions
配置解析器的对象.
flags: 定义要解析的旗帜的对象.- 键:旗名 (在骆驼Case中).
- 数值 : 旗的配置,它可以是类型构造器(
String, (中文(简体) ),Number, (中文(简体) ),Boolean)或自定义函数取出字符串并返回解析值或具有以下属性的对象:type:国旗的种类. 可以像一个建筑师String, (中文(简体) ),Number, (中文(简体) ),Boolean, (中文(简体) ),Object,一个构造器的数组(例如,[String]),或使用字符串并返回解析值的自定义函数.alias:用于替代名称(例如短旗)的字符串或数组字符串.
default: 如果参数中未提供该旗帜的默认值 。 可以是值,也可以是返回值的函数.negatable: (对于布尔人) 是否支持--no-<flag>语法. 默认为true。 。 。 .
ignore: 有条件停止解析的函数。 它接收到type(单位:千美元)flag或者说parameter)和arg字符串, 并应当返回true从此停止分析.
回返
具有下列属性的对象:
flags: 含有已解析过的旗帜的对象.parameters:一系列位置参数.unknown: 含有图案中没有定义的旗帜的对象.doubleDash: 后面出现的一连串参数--。 。 。 .ignored: 由于ignore函数.
特征
基本类型
支助 Boolean, (中文(简体) ), String,以及 Number。 。 。 .
const { flags } = parse(["--bool", "--str", "hello", "--num", "42"], {
flags: {
bool: { type: Boolean },
str: { type: String },
num: { type: Number },
},
});
// flags: { bool: true, str: "hello", num: 42 }
别名
使用 alias 以定义旗帜的短名或替代名.
const { flags } = parse(["-b", "-s", "hello"], {
flags: {
bool: { type: Boolean, alias: "b" },
str: { type: String, alias: "s" },
},
});
// flags: { bool: true, str: "hello" }
阵列和计数器
- 要收集标记的多值,请使用一个数组类型,如
[String]。 。 。 . - 要计算布尔旗的出错,请使用
[Boolean]。 。 。 .
// Array of strings
const { flags: arrayFlags } = parse(["--arr", "a", "--arr", "b"], {
flags: {
arr: { type: [String] },
},
});
// arrayFlags: { arr: ["a", "b"] }
// Counter
const { flags: counterFlags } = parse(["-vvv"], {
flags: {
verbose: { type: [Boolean], alias: "v" },
},
});
// counterFlags: { verbose: 3 }
合并短旗
多布尔短旗可以合并. 组内最后一面旗帜可以取出一个值.
// -abc => a=true, b=true, c=true
const { flags: merged } = parse(["-abc"], {
flags: {
a: Boolean,
b: Boolean,
c: Boolean,
},
});
// merged: { a: true, b: true, c: true }
// -ab val => a=true, b="val"
const { flags: withValue } = parse(["-ab", "val"], {
flags: {
a: Boolean,
b: String,
},
});
// or -abval, b is not boolean
const { flags: withValue } = parse(["-abval"], {
flags: {
a: Boolean,
b: String,
},
});
// withValue: { a: true, b: "val" }
默认值
提供a default 用于不存在的旗帜的值.
const { flags } = parse([], {
flags: {
str: { type: String, default: "default" },
num: { type: Number, default: 123 },
fn: { type: String, default: () => "computed" },
},
});
// flags: { str: "default", num: 123, fn: "computed" }
默认情况下,布尔、计数器、数组和对象在 default 未提供:
- 布尔 :
false - 计数器 :
0 - 矩阵 :
[] - 对象 :
{}
可忽略的旗帜
布尔旗默认为可忽略 --no- 前缀.
如果您想要禁用此行为, 请设定 negatable: false 在旗帜配置中。 通过 --no-<flag> 然后作为不明旗帜对待.
const { flags, unknown } = parse(
["--no-cache", "--no-ssl=false", "--no-disable-negate"],
{
flags: {
cache: { type: Boolean, default: true },
ssl: { type: Boolean, default: true },
disableNegate: { type: Boolean, negatable: false, default: true },
},
},
);
// flags: { cache: false, ssl: true, disableNegate: true }
// unknown: { noDisableNegate: true }
自定义类型函数
您可以为您提供自定义函数 type 用于高级解析逻辑的属性。 该函数收到字符串值并应当返回解析值.
// Let's limit port between 1 and 65535
const { flags } = parse(["--port", "8080"], {
flags: {
port: {
type: (value: string) => {
const parsed = Number.parseInt(value, 10);
if (Number.isNaN(parsed)) {
throw new TypeError("Port must be a number!");
}
if (parsed < 1 || parsed > 65_535) {
throw new Error("Port must be between 1 and 65535!");
}
return parsed;
},
},
},
});
// flags: { port: 8080 }
点标记对象
定义标志 Object 类型将点注释参数分析成嵌入对象.
const { flags } = parse(
["--config.port", "8080", "--config.host", "localhost"],
{
flags: {
config: { type: Object },
},
},
);
// flags: { config: { port: "8080", host: "localhost" } }
多层筑巢也得到支持.
const { flags } = parse(
[
"--db.host",
"localhost",
"--db.port",
"5432",
"--db.credentials.user",
"admin",
"--db.credentials.password",
"secret",
],
{
flags: {
db: { type: Object },
},
},
);
// flags: { db: { host: "localhost", port: "5432", credentials: { user: "admin", password: "secret" } } }
未知的旗帜
计划内未定义的旗帜在 unknown 对象。 如果可能的话, 它们将被转换为布尔 true。 。 。 .
const { flags, unknown } = parse([
"--unknown1",
"--unknown2=foo",
"--unknown3",
"bar",
"--unknown.foo",
]);
// unknown: { unknown1: true, unknown2: "foo", unknown3: "bar", "unknown.foo": true }
停止分析
使用 ignore 函数可以在满足特定条件时停止解析。 随后的论据将添加到 ignored 阵列.
const { flags, ignored } = parse(["--a", "--b", "stop", "--c"], {
flags: {
a: Boolean,
b: Boolean,
c: Boolean,
},
ignore: (type, arg) => arg === "stop",
});
// flags: { a: true, b: true, c: false }
// ignored: ["stop", "--c"]
通过检查 type。 。 。 .
const { flags, parameters, ignored } = parse(
["--allow-all", "./deno.ts", "--param"],
{
flags: {
allowAll: Boolean,
},
ignore: (type) => type === "parameter",
},
);
// flags: { allowAll: true }
// parameters: []
// ignored: ["./deno.ts", "--param"]
双发--(中文(简体) )
参数后 -- 未解析为旗帜,在 doubleDash 阵列.
const { flags, doubleDash } = parse(["--foo", "--", "--bar"], {
flags: {
foo: Boolean,
bar: Boolean,
},
});
// flags: { foo: true, bar: false }
// doubleDash: ["--bar"]
基准
以Vitest为基准.
✓ packages/parser/bench/bench.bench.ts > bench 6267ms
name hz min max mean p75 p99 p995 p999 rme samples
· minimist 684,422.77 0.0012 3.5582 0.0015 0.0013 0.0031 0.0040 0.0222 ±1.50% 342212
· mri 2,451,855.02 0.0003 0.2422 0.0004 0.0004 0.0007 0.0009 0.0021 ±0.33% 1225928
· yargs-parser 90,437.66 0.0092 3.1595 0.0111 0.0103 0.0346 0.0602 0.1311 ±1.42% 45219
· nopt 636,086.73 0.0014 0.3214 0.0016 0.0015 0.0027 0.0031 0.0056 ±0.38% 318044
· type-flag 715,908.28 0.0012 0.3783 0.0014 0.0013 0.0022 0.0027 0.0282 ±0.61% 357955
· node:util parseArgs 1,204,359.72 0.0007 0.3827 0.0008 0.0008 0.0016 0.0017 0.0047 ±0.56% 602196
· args-tokens 2,379,934.00 0.0002 0.2923 0.0004 0.0004 0.0010 0.0015 0.0051 ±0.49% 1189967
· @clerc/parser 2,119,030.30 0.0003 0.2482 0.0005 0.0005 0.0009 0.0011 0.0017 ±0.49% 1059516
BENCH Summary
mri - packages/parser/bench/bench.bench.ts > bench
1.03x faster than args-tokens
1.16x faster than @clerc/parser
2.04x faster than node:util parseArgs
3.42x faster than type-flag
3.58x faster than minimist
3.85x faster than nopt
27.11x faster than yargs-parser