265 lines
6.2 KiB
Markdown
265 lines
6.2 KiB
Markdown
|
# Getopts
|
||
|
|
||
|
> Parse CLI arguments.
|
||
|
|
||
|
- Lightweight drop-in replacement for `minimist` and clones.
|
||
|
- Small (180 LOC), focused, no dependencies.
|
||
|
- Up to [6x faster](#benchmarks) than alternatives!
|
||
|
|
||
|
Break up command-line arguments into key-value pairs for easy look-up and retrieval. Built upon [utility conventions](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02) that have been used for decades, Getopts sane defaults help you write CLI tools that look and feel like the real deal.
|
||
|
|
||
|
```console
|
||
|
$ example --type=module -o main.js *.{js,json}
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
import getopts from "getopts"
|
||
|
|
||
|
const options = getopts(process.argv.slice(2), {
|
||
|
alias: {
|
||
|
output: ["o", "f"],
|
||
|
type: "t",
|
||
|
},
|
||
|
})
|
||
|
```
|
||
|
|
||
|
The result is an object populated with all the parsed arguments.
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
_: ["index.js", "package.json"],
|
||
|
output: "main.js",
|
||
|
type: "module",
|
||
|
o: "main.js",
|
||
|
f: "main.js",
|
||
|
t: "module",
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
```console
|
||
|
npm install getopts
|
||
|
```
|
||
|
|
||
|
## Parsing rules
|
||
|
|
||
|
### Short options
|
||
|
|
||
|
A short option consists of a `-` followed by a single alphabetic character. Multiple options can be grouped together without spaces. Short options are boolean by default unless followed by an [operand](#operand) (non-option) or if adjacent to any non-alphabetic characters:
|
||
|
|
||
|
```js
|
||
|
getopts(["-ab", "-c"]) //=> { _: [], a:true, b:true, c:true }
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
getopts(["-a", "alpha"]) //=> { _: [], a:"alpha" }
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
getopts(["-abc1"]) //=> { _: [], a:true, b:true, c:1 }
|
||
|
```
|
||
|
|
||
|
Use [`opts.string`](#optsstring) to parse an option as a string regardless.
|
||
|
|
||
|
```js
|
||
|
getopts(["-kF12"], {
|
||
|
string: ["k"],
|
||
|
}) //=> { _: [], k:"F12" }
|
||
|
```
|
||
|
|
||
|
The first operand following an option will be used as its value. Use [`opts.boolean`](#optsboolean) to specify that an option should be parsed as a boolean regardless, causing the following argument to be treated as an operand instead.
|
||
|
|
||
|
```js
|
||
|
getopts(["-a", "alpha"], {
|
||
|
boolean: ["a"],
|
||
|
}) //=> { _: ["alpha"], a:true }
|
||
|
```
|
||
|
|
||
|
Any character listed in the ASCII table can be used as a short option if it's the first character after the dash.
|
||
|
|
||
|
```js
|
||
|
getopts(["-9", "-#10", "-%0.01"]) //=> { _:[], 9:true, #:10, %:0.01 }
|
||
|
```
|
||
|
|
||
|
### Long options
|
||
|
|
||
|
A long option consists of a `--` followed by a name and a value separated by an `=`. Long options without a value are boolean by default.
|
||
|
|
||
|
```js
|
||
|
getopts(["--turbo", "--warp=10"]) //=> { _: [], turbo:true, warp:10 }
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
getopts(["--warp=e=mc^2"]) //=> { _: [], warp:"e=mc^2" }
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
getopts(["--@", "alpha"]) //=> { _: [], @:"alpha" }
|
||
|
```
|
||
|
|
||
|
Negated options start with `--no-` and are always `false`.
|
||
|
|
||
|
```js
|
||
|
getopts(["--no-turbo"]) //=> { _: [], turbo:false }
|
||
|
```
|
||
|
|
||
|
### Operands
|
||
|
|
||
|
Every non-option argument is an operand. Operands are saved to the `result._` operands array.
|
||
|
|
||
|
```js
|
||
|
getopts(["alpha", "-w9", "bravo"]) //=> { _: ["alpha", "bravo"], w:9 }
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
getopts(["--code=alpha", "bravo"]) //=> { _: ["bravo"], code:"alpha" }
|
||
|
```
|
||
|
|
||
|
Everything after a standalone `--` is an operand.
|
||
|
|
||
|
```js
|
||
|
getopts(["--alpha", "--", "--bravo", "--turbo"]) //=> { _:["--bravo", "--turbo"], alpha:true }
|
||
|
```
|
||
|
|
||
|
A single `-` is also treated as an operand.
|
||
|
|
||
|
```js
|
||
|
getopts(["--turbo", "-"]) //=> { _:["-"], turbo:true }
|
||
|
```
|
||
|
|
||
|
### Other
|
||
|
|
||
|
Options specified as boolean or string will be added to the result object as `false` or `""` (even if missing from the arguments array).
|
||
|
|
||
|
```js
|
||
|
getopts([], {
|
||
|
string: ["a"],
|
||
|
boolean: ["b"],
|
||
|
}) //=> { _:[], a:"", b:false }
|
||
|
```
|
||
|
|
||
|
Repeated options are stored as arrays with every value in order of appearance.
|
||
|
|
||
|
```js
|
||
|
getopts(["-x?alpha=bravo", "-x3.14", "-x"] //=> { _:[], a:["?alpha=bravo", 3.14, true] }
|
||
|
```
|
||
|
|
||
|
A value may contain newlines or other control characters.
|
||
|
|
||
|
```js
|
||
|
getopts(["--text=top\n\tbottom"]) //=> { _:[], text:"top\n\tbottom" }
|
||
|
```
|
||
|
|
||
|
`="false"` is converted to boolean by default.
|
||
|
|
||
|
```js
|
||
|
getopts(["--turbo=false"]) //=> { _:[], turbo:false }
|
||
|
```
|
||
|
|
||
|
## API
|
||
|
|
||
|
### `getopts(argv, opts)`
|
||
|
|
||
|
Parse command-line arguments. Returns an object mapping argument names to their values.
|
||
|
|
||
|
### `argv[]`
|
||
|
|
||
|
An array of arguments, usually [`process.argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv).
|
||
|
|
||
|
### `opts.alias`
|
||
|
|
||
|
An object of option aliases. An alias can be a string or an array of strings. Aliases let you declare substitute names for an option, e.g., the short (abbreviated) and long (canonical) variations.
|
||
|
|
||
|
```js
|
||
|
getopts(["-t"], {
|
||
|
alias: {
|
||
|
turbo: ["t", "T"],
|
||
|
},
|
||
|
}) //=> { _:[], t:true, T:true, turbo:true }
|
||
|
```
|
||
|
|
||
|
### `opts.boolean`
|
||
|
|
||
|
An array of options to parse as boolean. In the example below, `t` is parsed as a boolean, causing the following argument to be treated as an operand.
|
||
|
|
||
|
```js
|
||
|
getopts(["-t", "alpha"], {
|
||
|
boolean: ["t"],
|
||
|
}) //=> { _:["alpha"], t:true }
|
||
|
```
|
||
|
|
||
|
### `opts.string`
|
||
|
|
||
|
An array of flags to parse as strings. In the example below, `t` is parsed as a string, causing all adjacent characters to be treated as a single value and not as individual options.
|
||
|
|
||
|
```js
|
||
|
getopts(["-atabc"], {
|
||
|
string: ["t"],
|
||
|
}) //=> { _:[], a:true, t:"abc" }
|
||
|
```
|
||
|
|
||
|
### `opts.default`
|
||
|
|
||
|
An object of default values for options not present in the arguments array.
|
||
|
|
||
|
```js
|
||
|
getopts(["--warp=10"], {
|
||
|
default: {
|
||
|
warp: 15,
|
||
|
turbo: true,
|
||
|
},
|
||
|
}) //=> { _:[], warp:10, turbo:true }
|
||
|
```
|
||
|
|
||
|
### `opts.unknown()`
|
||
|
|
||
|
We call this function for each unknown option. Return `false` to discard the option. Unknown options are those that appear in the arguments array, but are not in `opts.string`, `opts.boolean`, `opts.default`, or `opts.alias`.
|
||
|
|
||
|
```js
|
||
|
getopts(["-abc"], {
|
||
|
unknown: (option) => "a" === option,
|
||
|
}) //=> { _:[], a:true }
|
||
|
```
|
||
|
|
||
|
### `opts.stopEarly`
|
||
|
|
||
|
A boolean property. If `true`, the operands array `_` will be populated with all the arguments after the first operand.
|
||
|
|
||
|
```js
|
||
|
getopts(["-w9", "alpha", "--turbo", "bravo"], {
|
||
|
stopEarly: true,
|
||
|
}) //=> { _:["alpha", "--turbo", "bravo"], w:9 }
|
||
|
```
|
||
|
|
||
|
This property is useful when implementing sub-commands in a CLI.
|
||
|
|
||
|
```js
|
||
|
import getopts from "getopts"
|
||
|
import { install, update, uninstall } from "./commands.js"
|
||
|
|
||
|
const options = getopts(process.argv.slice(2), {
|
||
|
stopEarly: true,
|
||
|
})
|
||
|
|
||
|
const [command, subargv] = options._
|
||
|
|
||
|
if (command === "install") {
|
||
|
install(subargv)
|
||
|
} else if (command === "update") {
|
||
|
update(subargv)
|
||
|
} else if (command === "uninstall") {
|
||
|
uninstall(subargv)
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Benchmarks
|
||
|
|
||
|
```console
|
||
|
npm --prefix bench start
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
[MIT](LICENSE.md)
|