Spaces:
Sleeping
Sleeping
| # Arg | |
| `arg` is an unopinionated, no-frills CLI argument parser. | |
| ## Installation | |
| ```bash | |
| npm install arg | |
| ``` | |
| ## Usage | |
| `arg()` takes either 1 or 2 arguments: | |
| 1. Command line specification object (see below) | |
| 2. Parse options (_Optional_, defaults to `{permissive: false, argv: process.argv.slice(2), stopAtPositional: false}`) | |
| It returns an object with any values present on the command-line (missing options are thus | |
| missing from the resulting object). Arg performs no validation/requirement checking - we | |
| leave that up to the application. | |
| All parameters that aren't consumed by options (commonly referred to as "extra" parameters) | |
| are added to `result._`, which is _always_ an array (even if no extra parameters are passed, | |
| in which case an empty array is returned). | |
| ```javascript | |
| const arg = require('arg'); | |
| // `options` is an optional parameter | |
| const args = arg( | |
| spec, | |
| (options = { permissive: false, argv: process.argv.slice(2) }) | |
| ); | |
| ``` | |
| For example: | |
| ```console | |
| $ node ./hello.js --verbose -vvv --port=1234 -n 'My name' foo bar --tag qux --tag=qix -- --foobar | |
| ``` | |
| ```javascript | |
| // hello.js | |
| const arg = require('arg'); | |
| const args = arg({ | |
| // Types | |
| '--help': Boolean, | |
| '--version': Boolean, | |
| '--verbose': arg.COUNT, // Counts the number of times --verbose is passed | |
| '--port': Number, // --port <number> or --port=<number> | |
| '--name': String, // --name <string> or --name=<string> | |
| '--tag': [String], // --tag <string> or --tag=<string> | |
| // Aliases | |
| '-v': '--verbose', | |
| '-n': '--name', // -n <string>; result is stored in --name | |
| '--label': '--name' // --label <string> or --label=<string>; | |
| // result is stored in --name | |
| }); | |
| console.log(args); | |
| /* | |
| { | |
| _: ["foo", "bar", "--foobar"], | |
| '--port': 1234, | |
| '--verbose': 4, | |
| '--name': "My name", | |
| '--tag': ["qux", "qix"] | |
| } | |
| */ | |
| ``` | |
| The values for each key=>value pair is either a type (function or [function]) or a string (indicating an alias). | |
| - In the case of a function, the string value of the argument's value is passed to it, | |
| and the return value is used as the ultimate value. | |
| - In the case of an array, the only element _must_ be a type function. Array types indicate | |
| that the argument may be passed multiple times, and as such the resulting value in the returned | |
| object is an array with all of the values that were passed using the specified flag. | |
| - In the case of a string, an alias is established. If a flag is passed that matches the _key_, | |
| then the _value_ is substituted in its place. | |
| Type functions are passed three arguments: | |
| 1. The parameter value (always a string) | |
| 2. The parameter name (e.g. `--label`) | |
| 3. The previous value for the destination (useful for reduce-like operations or for supporting `-v` multiple times, etc.) | |
| This means the built-in `String`, `Number`, and `Boolean` type constructors "just work" as type functions. | |
| Note that `Boolean` and `[Boolean]` have special treatment - an option argument is _not_ consumed or passed, but instead `true` is | |
| returned. These options are called "flags". | |
| For custom handlers that wish to behave as flags, you may pass the function through `arg.flag()`: | |
| ```javascript | |
| const arg = require('arg'); | |
| const argv = [ | |
| '--foo', | |
| 'bar', | |
| '-ff', | |
| 'baz', | |
| '--foo', | |
| '--foo', | |
| 'qux', | |
| '-fff', | |
| 'qix' | |
| ]; | |
| function myHandler(value, argName, previousValue) { | |
| /* `value` is always `true` */ | |
| return 'na ' + (previousValue || 'batman!'); | |
| } | |
| const args = arg( | |
| { | |
| '--foo': arg.flag(myHandler), | |
| '-f': '--foo' | |
| }, | |
| { | |
| argv | |
| } | |
| ); | |
| console.log(args); | |
| /* | |
| { | |
| _: ['bar', 'baz', 'qux', 'qix'], | |
| '--foo': 'na na na na na na na na batman!' | |
| } | |
| */ | |
| ``` | |
| As well, `arg` supplies a helper argument handler called `arg.COUNT`, which equivalent to a `[Boolean]` argument's `.length` | |
| property - effectively counting the number of times the boolean flag, denoted by the key, is passed on the command line.. | |
| For example, this is how you could implement `ssh`'s multiple levels of verbosity (`-vvvv` being the most verbose). | |
| ```javascript | |
| const arg = require('arg'); | |
| const argv = ['-AAAA', '-BBBB']; | |
| const args = arg( | |
| { | |
| '-A': arg.COUNT, | |
| '-B': [Boolean] | |
| }, | |
| { | |
| argv | |
| } | |
| ); | |
| console.log(args); | |
| /* | |
| { | |
| _: [], | |
| '-A': 4, | |
| '-B': [true, true, true, true] | |
| } | |
| */ | |
| ``` | |
| ### Options | |
| If a second parameter is specified and is an object, it specifies parsing options to modify the behavior of `arg()`. | |
| #### `argv` | |
| If you have already sliced or generated a number of raw arguments to be parsed (as opposed to letting `arg` | |
| slice them from `process.argv`) you may specify them in the `argv` option. | |
| For example: | |
| ```javascript | |
| const args = arg( | |
| { | |
| '--foo': String | |
| }, | |
| { | |
| argv: ['hello', '--foo', 'world'] | |
| } | |
| ); | |
| ``` | |
| results in: | |
| ```javascript | |
| const args = { | |
| _: ['hello'], | |
| '--foo': 'world' | |
| }; | |
| ``` | |
| #### `permissive` | |
| When `permissive` set to `true`, `arg` will push any unknown arguments | |
| onto the "extra" argument array (`result._`) instead of throwing an error about | |
| an unknown flag. | |
| For example: | |
| ```javascript | |
| const arg = require('arg'); | |
| const argv = [ | |
| '--foo', | |
| 'hello', | |
| '--qux', | |
| 'qix', | |
| '--bar', | |
| '12345', | |
| 'hello again' | |
| ]; | |
| const args = arg( | |
| { | |
| '--foo': String, | |
| '--bar': Number | |
| }, | |
| { | |
| argv, | |
| permissive: true | |
| } | |
| ); | |
| ``` | |
| results in: | |
| ```javascript | |
| const args = { | |
| _: ['--qux', 'qix', 'hello again'], | |
| '--foo': 'hello', | |
| '--bar': 12345 | |
| }; | |
| ``` | |
| #### `stopAtPositional` | |
| When `stopAtPositional` is set to `true`, `arg` will halt parsing at the first | |
| positional argument. | |
| For example: | |
| ```javascript | |
| const arg = require('arg'); | |
| const argv = ['--foo', 'hello', '--bar']; | |
| const args = arg( | |
| { | |
| '--foo': Boolean, | |
| '--bar': Boolean | |
| }, | |
| { | |
| argv, | |
| stopAtPositional: true | |
| } | |
| ); | |
| ``` | |
| results in: | |
| ```javascript | |
| const args = { | |
| _: ['hello', '--bar'], | |
| '--foo': true | |
| }; | |
| ``` | |
| ### Errors | |
| Some errors that `arg` throws provide a `.code` property in order to aid in recovering from user error, or to | |
| differentiate between user error and developer error (bug). | |
| ##### ARG_UNKNOWN_OPTION | |
| If an unknown option (not defined in the spec object) is passed, an error with code `ARG_UNKNOWN_OPTION` will be thrown: | |
| ```js | |
| // cli.js | |
| try { | |
| require('arg')({ '--hi': String }); | |
| } catch (err) { | |
| if (err.code === 'ARG_UNKNOWN_OPTION') { | |
| console.log(err.message); | |
| } else { | |
| throw err; | |
| } | |
| } | |
| ``` | |
| ```shell | |
| node cli.js --extraneous true | |
| Unknown or unexpected option: --extraneous | |
| ``` | |
| # FAQ | |
| A few questions and answers that have been asked before: | |
| ### How do I require an argument with `arg`? | |
| Do the assertion yourself, such as: | |
| ```javascript | |
| const args = arg({ '--name': String }); | |
| if (!args['--name']) throw new Error('missing required argument: --name'); | |
| ``` | |
| # License | |
| Released under the [MIT License](LICENSE.md). | |