tl-dr; I didn't wrote a parser.
Instead, I used regular expressions for extracting values, flags and other kind of parameters from a string or from an argv-like array.
I've tried commander, minimist, yargs, etc. but no one fulfilled my exact requirements, e.g.
const str = '/ _csrf=`token` --json accept:"text/plain; charset=utf8" -- x';
const argv = ['/', '_csrf=`token`', '--json', 'accept:text/plain; charset=utf8', '--', 'x'];
Both values are representing the same input, the former can be taken from any source while the latter is usually provided by process.argv.slice(2)
, etc.
Most importantly: these modules will won't work with a string as input.
wargs will do and return: _
, raw
, data
, flags
and params
.
{
_: ['/'],
raw: ['x'],
data: { _csrf: '`token`' },
flags: { json: true },
params: { accept: 'text/plain; charset=utf8' },
}
Hint: It suits -and feels- very well on a repl for making http requests. ;-)
wargs use getopts to understand regular flags, -short
or --long
, etc.
Also it will collect key:value
and key=value
values as params
and data
respectively.
wargs('-x').flags.x; // true
wargs('--x').flags.x; // true
wargs('x:y').params.x; // y
wargs('x=y').data; // { x: 'y' }
wargs('x y')._ // ['x', 'y']
wargs('--x-y', { camelCase: true }).flags; // { xY: true }
wargs('-x y', { format: v => v.toUpperCase() }).flags; // { x: 'Y' }
format
— function decorator for all valuescamelCase
— normalize keys from--camel-case
tocamelCase
alias
,boolean
,default
andunknown
— those are given as is to getopts
- When I was looking for a name for this module I found that
xargs
,yargs
andzargs
already existed - I'm totally wrong on calling this module a "parser" for command line arguments, don't be rude
- Finally, I discovered that wargs are a thing from GoT