🎛️ @benev/argv
对打字符的最大命令行解析器, 也许
用于制作节点 cli 程序
难以置信的打字类型推论
零依赖关系
自由公开的源头,只为你
自动生成 --help 页次
pizza --help

pizza large --pepperoni --slices 3
# or, any way you like it
pizza --slices=9 large
pizza medium -p --slices=5
pizza small --pepperoni="no" --slices="2"
盖起你的 cli
- 安装
@benev/argv通过 npmnpm i @benev/argv - 导入东西
import {cli, command, arg, param, string, number} from "@benev/argv" - 指定您的 cli, 并进行解析
const {args, params} = cli(process.argv, { name: "pizza", commands: command({ args: [ arg("size").required(string), ], params: { slices: param.default(number, "1"), pepperoni: param.flag("p"), }, }), }).tree - 现在,你有你的标语和标语
args.size // "large" params.slices // 5 params.pepperoni // true- 这是接收您的参数和参数的"平面策略".
简单,简单!
- 这是接收您的参数和参数的"平面策略".
- 你们这种人都是自发的!
我花了很长的时间才让它这么优雅和酷.
配置你的cli的 args 财务报告和审定财务报表 params
- 我们先发出命令
command({ args: [], params: {}, }) - 命令可以选择接受
help字符串command({ help: "what a time to be alive!", args: [], params: {}, }) - 让我们添加位置参数
command({ args: [ arg("active").required(boolean), arg("count").default(number, "101"), arg("name").optional(string), ], params: {}, })- 参数在一个阵列中,所以每个阵列都需要一个名称,例如上面的"活性"
- 有三个模式,
required, (中文(简体) ),default,以及optional default需要一个倒数- 有三个基本类型,
string, (中文(简体) ),number,以及boolean,但你可以 自己类型
- 现在,让我们谈谈抛物
command({ args: [], params: { active: param.required(boolean), count: param.default(number, "101"), name: param.optional(string), verbose: param.flag("-v"), }, })- 相当相似,但看到名字不同了吗?
- 有种叫新车厢的
flag当然,这是自动的boolean(怎么会是其他的?)
参数和参数的验证
- 你可以设置一个
validate函数在任意arg或者说paramarg("quality").optional(number, { validate: n => { if (n > 100) throw new Error("to big") if (n < 0) throw new Error("to smol") return n }, })- 如果您在其中投出任何错误
validate,它将被打印出来 所有良好的用户
- 如果您在其中投出任何错误
help 到处都是!
- 事实上,每个
arg财务报告和审定财务报表param可以拥有自己的helpcommand({ help: "it's the best command, nobody makes commands like me", args: [ arg("active").required(boolean, { help: "all systems go?", }), arg("count").default(number, "101", { help: "number of dalmatians", }), arg("name").optional(string, { help: ` see this multi-line string? it will be trimmed all nicely on the help page. ` }), ], params: { active: param.required(boolean, { help: "toggle this carefully!", }), count: param.default(number, "101", { help: "classroom i'm late for", }), name: param.optional(string, { help: "pick your pseudonym", }), verbose: param.flag("-v", { help: "going loud", }), }, })
list 帮助者
- 好吧,这是严重的疯狂酷, 看这个
param.required(list(string)) - 您可以在
list帮助者- 用户输入逗号分隔值
mp3,wav,ogg - 获得数组
["mp3", "wav", "ogg"]
- 用户输入逗号分隔值
- 与 任何类型,像数字和这样的
param.required(list(number))- 现在你得到一个
number[]数组( 不是字符串) - 对,
list保存类型验证
- 现在你得到一个
choice 帮助者
- 用户可以选择允许的值之一
param.required(string, choice(["thick", "thin"])) - 你也可以加入帮助它
param.required(string, choice(["thick", "thin"], { help: "made with organic whole-wheat flour", }))
multipleChoice 帮助者
- 允许用户选择多个允许的选择
param.required(string, multipleChoice(["bacon", "lettuce", "tomatoes"])) - 您可以添加帮助,并决定是否允许用户作出零选择
param.required(string, choice(["bacon", "lettuce", "tomatoes"], { help: "all available ingredients are gmo'd", zeroAllowed: true, // defaults to false }))
++多树 commands
- 页:1
commands对象是一个递归树command叶子const {tree} = cli(process.argv, { name: "converter", commands: { image: command({ args: [], params: { quality: param.required(number), }, }), media: { audio: command({ args: [], params: { mono: param.required(boolean), }, }), video: command({ args: [], params: { codec: param.required(string), }, }) }, }, })
树战略
- 你明白吗
tree反映其形状的天体tree.image?.params.quality // 9 tree.media.audio?.mono // false tree.media.video?.codec // "av1"- 所有的命令都是
undefined除了"选定"命令 - 对,所有的打字都行
- 所有的命令都是
命令执行策略
- 您可以选择提供每个命令的自动同步
execute函数command({ args: [], params: { active: param.required(boolean), count: param.default(number, "101"), }, async execute({params}) { params.active // true params.count // 101 }, })- 您的执行函数收到相关的全类型
args, (中文(简体) ),params和一些东西
- 您的执行函数收到相关的全类型
-
execute函数可以通过扔出一个ExecutionErrorimport {ExecutionError, command} from "@benev/argv" async execute({params}) { throw new ExecutionError("scary error printed in red!") } - 如果你选择使用这个命令执行策略, 那你需要调用您的 cli 的终局
execute函数// 👇 awaiting cli execution await cli(process.argv, { name: "pizza", commands: { meatlovers: command({ args: [], params: { meatiness: param.required(number), }, async execute({params}) { console.log(params.meatiness) // 9 }, }), hawaiian: command({ args: [], params: { pineappleyness: param.required(number), }, async execute({params}) { console.log(params.pineappleyness) // 8 }, }), }, }).execute() // ☝️ calling cli final execute
qq 自定义类型
- 真不敢相信,我得到了所有的类型 工作所有与定制类型
- 做自己的类型很容易
const date = asType({ name: "date", coerce: string => new Date(string), })- 页:1
name在帮助页面中显示 - 页:1
coerce函数需要字符串输入,然后将其变成任何您喜欢的
- 页:1
- 那样你就可以像正常人一样用它们来配乐
param.required(date) - 嘿,为什么我们不列出他们的名单呢
param.required(list(date)) - 感觉很不舒服吗? 用这个奇怪的提示来制作一组自定义类型
const myTypes = asTypes({ date: string => new Date(string), integer: string => Math.floor(Number(string)), })asTypes将使用对象的属性名称作为类型name
- 您的自定义类型可以丢出出错误, 并起到校验作用
const integer = asType({ name: "integer", coerce: string => { const n = Number(string) if (isNaN(n)) throw new Error("not a number") if (!Number.isSafeInteger(n)) throw new Error("not a safe integer") return n }, })
qq 自定义主题
- 您可以为您的 -- help 页设置主题
import {themes} from "@benev/argv" await cli(process.argv, { // the default theme theme: themes.standard, ...otherStuff, }).execute()- 也许试试
themes.seaside更冷静的氛围 - 如果你讨厌乐趣,用
themes.noColor以禁用 ansi 颜色
- 也许试试
- 做你自己的主题像这样
import {theme, color} from "@benev/argv" const seaside = theme({ plain: [color.white], error: [color.brightRed, color.bold], program: [color.brightCyan, color.bold], command: [color.cyan, color.bold], property: [color.blue], link: [color.brightBlue, color.underline], arg: [color.brightBlue, color.bold], param: [color.brightBlue, color.bold], flag: [color.brightBlue], required: [color.cyan], mode: [color.blue], type: [color.brightBlue], value: [color.cyan], })
给我一颗 gi星!
- 我太费劲了
- 请针对任何问题或问题提出问题
- 也许做一个很酷的帮助主题 并提交一个PR