You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					575 lines
				
				18 KiB
			
		
		
			
		
	
	
					575 lines
				
				18 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								A light, featureful and explicit option parsing library for node.js.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[Why another one? See below](#why). tl;dr: The others I've tried are one of
							 | 
						||
| 
								 | 
							
								too loosey goosey (not explicit), too big/too many deps, or ill specified.
							 | 
						||
| 
								 | 
							
								YMMV.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Follow <a href="https://twitter.com/intent/user?screen_name=trentmick" target="_blank">@trentmick</a>
							 | 
						||
| 
								 | 
							
								for updates to node-dashdash.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Install
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    npm install dashdash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var dashdash = require('dashdash');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Specify the options. Minimally `name` (or `names`) and `type`
							 | 
						||
| 
								 | 
							
								// must be given for each.
							 | 
						||
| 
								 | 
							
								var options = [
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // `names` or a single `name`. First element is the `opts.KEY`.
							 | 
						||
| 
								 | 
							
								        names: ['help', 'h'],
							 | 
						||
| 
								 | 
							
								        // See "Option specs" below for types.
							 | 
						||
| 
								 | 
							
								        type: 'bool',
							 | 
						||
| 
								 | 
							
								        help: 'Print this help and exit.'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Shortcut form. As called it infers `process.argv`. See below for
							 | 
						||
| 
								 | 
							
								// the longer form to use methods like `.help()` on the Parser object.
							 | 
						||
| 
								 | 
							
								var opts = dashdash.parse({options: options});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log("opts:", opts);
							 | 
						||
| 
								 | 
							
								console.log("args:", opts._args);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Longer Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A more realistic [starter script "foo.js"](./examples/foo.js) is as follows.
							 | 
						||
| 
								 | 
							
								This also shows using `parser.help()` for formatted option help.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var dashdash = require('./lib/dashdash');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var options = [
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        name: 'version',
							 | 
						||
| 
								 | 
							
								        type: 'bool',
							 | 
						||
| 
								 | 
							
								        help: 'Print tool version and exit.'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: ['help', 'h'],
							 | 
						||
| 
								 | 
							
								        type: 'bool',
							 | 
						||
| 
								 | 
							
								        help: 'Print this help and exit.'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: ['verbose', 'v'],
							 | 
						||
| 
								 | 
							
								        type: 'arrayOfBool',
							 | 
						||
| 
								 | 
							
								        help: 'Verbose output. Use multiple times for more verbose.'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: ['file', 'f'],
							 | 
						||
| 
								 | 
							
								        type: 'string',
							 | 
						||
| 
								 | 
							
								        help: 'File to process',
							 | 
						||
| 
								 | 
							
								        helpArg: 'FILE'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var parser = dashdash.createParser({options: options});
							 | 
						||
| 
								 | 
							
								try {
							 | 
						||
| 
								 | 
							
								    var opts = parser.parse(process.argv);
							 | 
						||
| 
								 | 
							
								} catch (e) {
							 | 
						||
| 
								 | 
							
								    console.error('foo: error: %s', e.message);
							 | 
						||
| 
								 | 
							
								    process.exit(1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log("# opts:", opts);
							 | 
						||
| 
								 | 
							
								console.log("# args:", opts._args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Use `parser.help()` for formatted options help.
							 | 
						||
| 
								 | 
							
								if (opts.help) {
							 | 
						||
| 
								 | 
							
								    var help = parser.help({includeEnv: true}).trimRight();
							 | 
						||
| 
								 | 
							
								    console.log('usage: node foo.js [OPTIONS]\n'
							 | 
						||
| 
								 | 
							
								                + 'options:\n'
							 | 
						||
| 
								 | 
							
								                + help);
							 | 
						||
| 
								 | 
							
								    process.exit(0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ...
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Some example output from this script (foo.js):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								$ node foo.js -h
							 | 
						||
| 
								 | 
							
								# opts: { help: true,
							 | 
						||
| 
								 | 
							
								  _order: [ { name: 'help', value: true, from: 'argv' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								usage: node foo.js [OPTIONS]
							 | 
						||
| 
								 | 
							
								options:
							 | 
						||
| 
								 | 
							
								    --version             Print tool version and exit.
							 | 
						||
| 
								 | 
							
								    -h, --help            Print this help and exit.
							 | 
						||
| 
								 | 
							
								    -v, --verbose         Verbose output. Use multiple times for more verbose.
							 | 
						||
| 
								 | 
							
								    -f FILE, --file=FILE  File to process
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ node foo.js -v
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ true ],
							 | 
						||
| 
								 | 
							
								  _order: [ { name: 'verbose', value: true, from: 'argv' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ node foo.js --version arg1
							 | 
						||
| 
								 | 
							
								# opts: { version: true,
							 | 
						||
| 
								 | 
							
								  _order: [ { name: 'version', value: true, from: 'argv' } ],
							 | 
						||
| 
								 | 
							
								  _args: [ 'arg1' ] }
							 | 
						||
| 
								 | 
							
								# args: [ 'arg1' ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ node foo.js -f bar.txt
							 | 
						||
| 
								 | 
							
								# opts: { file: 'bar.txt',
							 | 
						||
| 
								 | 
							
								  _order: [ { name: 'file', value: 'bar.txt', from: 'argv' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ node foo.js -vvv --file=blah
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ true, true, true ],
							 | 
						||
| 
								 | 
							
								  file: 'blah',
							 | 
						||
| 
								 | 
							
								  _order:
							 | 
						||
| 
								 | 
							
								   [ { name: 'verbose', value: true, from: 'argv' },
							 | 
						||
| 
								 | 
							
								     { name: 'verbose', value: true, from: 'argv' },
							 | 
						||
| 
								 | 
							
								     { name: 'verbose', value: true, from: 'argv' },
							 | 
						||
| 
								 | 
							
								     { name: 'file', value: 'blah', from: 'argv' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								See the ["examples"](examples/) dir for a number of starter examples using
							 | 
						||
| 
								 | 
							
								some of dashdash's features.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Environment variable integration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you want to allow environment variables to specify options to your tool,
							 | 
						||
| 
								 | 
							
								dashdash makes this easy. We can change the 'verbose' option in the example
							 | 
						||
| 
								 | 
							
								above to include an 'env' field:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: ['verbose', 'v'],
							 | 
						||
| 
								 | 
							
								        type: 'arrayOfBool',
							 | 
						||
| 
								 | 
							
								        env: 'FOO_VERBOSE',         // <--- add this line
							 | 
						||
| 
								 | 
							
								        help: 'Verbose output. Use multiple times for more verbose.'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								then the **"FOO_VERBOSE" environment variable** can be used to set this
							 | 
						||
| 
								 | 
							
								option:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```shell
							 | 
						||
| 
								 | 
							
								$ FOO_VERBOSE=1 node foo.js
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ true ],
							 | 
						||
| 
								 | 
							
								  _order: [ { name: 'verbose', value: true, from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Boolean options will interpret the empty string as unset, '0' as false
							 | 
						||
| 
								 | 
							
								and anything else as true.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```shell
							 | 
						||
| 
								 | 
							
								$ FOO_VERBOSE= node examples/foo.js                 # not set
							 | 
						||
| 
								 | 
							
								# opts: { _order: [], _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ FOO_VERBOSE=0 node examples/foo.js                # '0' is false
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ false ],
							 | 
						||
| 
								 | 
							
								  _order: [ { key: 'verbose', value: false, from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ FOO_VERBOSE=1 node examples/foo.js                # true
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ true ],
							 | 
						||
| 
								 | 
							
								  _order: [ { key: 'verbose', value: true, from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ FOO_VERBOSE=boogabooga node examples/foo.js       # true
							 | 
						||
| 
								 | 
							
								# opts: { verbose: [ true ],
							 | 
						||
| 
								 | 
							
								  _order: [ { key: 'verbose', value: true, from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Non-booleans can be used as well. Strings:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```shell
							 | 
						||
| 
								 | 
							
								$ FOO_FILE=data.txt node examples/foo.js
							 | 
						||
| 
								 | 
							
								# opts: { file: 'data.txt',
							 | 
						||
| 
								 | 
							
								  _order: [ { key: 'file', value: 'data.txt', from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Numbers:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```shell
							 | 
						||
| 
								 | 
							
								$ FOO_TIMEOUT=5000 node examples/foo.js
							 | 
						||
| 
								 | 
							
								# opts: { timeout: 5000,
							 | 
						||
| 
								 | 
							
								  _order: [ { key: 'timeout', value: 5000, from: 'env' } ],
							 | 
						||
| 
								 | 
							
								  _args: [] }
							 | 
						||
| 
								 | 
							
								# args: []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ FOO_TIMEOUT=blarg node examples/foo.js
							 | 
						||
| 
								 | 
							
								foo: error: arg for "FOO_TIMEOUT" is not a positive integer: "blarg"
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								With the `includeEnv: true` config to `parser.help()` the environment
							 | 
						||
| 
								 | 
							
								variable can also be included in **help output**:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    usage: node foo.js [OPTIONS]
							 | 
						||
| 
								 | 
							
								    options:
							 | 
						||
| 
								 | 
							
								        --version             Print tool version and exit.
							 | 
						||
| 
								 | 
							
								        -h, --help            Print this help and exit.
							 | 
						||
| 
								 | 
							
								        -v, --verbose         Verbose output. Use multiple times for more verbose.
							 | 
						||
| 
								 | 
							
								                              Environment: FOO_VERBOSE=1
							 | 
						||
| 
								 | 
							
								        -f FILE, --file=FILE  File to process
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Bash completion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Dashdash provides a simple way to create a Bash completion file that you
							 | 
						||
| 
								 | 
							
								can place in your "bash_completion.d" directory -- sometimes that is
							 | 
						||
| 
								 | 
							
								"/usr/local/etc/bash_completion.d/"). Features:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- Support for short and long opts
							 | 
						||
| 
								 | 
							
								- Support for knowing which options take arguments
							 | 
						||
| 
								 | 
							
								- Support for subcommands (e.g. 'git log <TAB>' to show just options for the
							 | 
						||
| 
								 | 
							
								  log subcommand). See
							 | 
						||
| 
								 | 
							
								  [node-cmdln](https://github.com/trentm/node-cmdln#bash-completion) for
							 | 
						||
| 
								 | 
							
								  how to integrate that.
							 | 
						||
| 
								 | 
							
								- Does the right thing with "--" to stop options.
							 | 
						||
| 
								 | 
							
								- Custom optarg and arg types for custom completions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Dashdash will return bash completion file content given a parser instance:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var parser = dashdash.createParser({options: options});
							 | 
						||
| 
								 | 
							
								    console.log( parser.bashCompletion({name: 'mycli'}) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								or directly from a `options` array of options specs:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var code = dashdash.bashCompletionFromOptions({
							 | 
						||
| 
								 | 
							
								        name: 'mycli',
							 | 
						||
| 
								 | 
							
								        options: OPTIONS
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Write that content to "/usr/local/etc/bash_completion.d/mycli" and you will
							 | 
						||
| 
								 | 
							
								have Bash completions for `mycli`. Alternatively you can write it to
							 | 
						||
| 
								 | 
							
								any file (e.g. "~/.bashrc") and source it.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You could add a `--completion` hidden option to your tool that emits the
							 | 
						||
| 
								 | 
							
								completion content and document for your users to call that to install
							 | 
						||
| 
								 | 
							
								Bash completions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								See [examples/ddcompletion.js](examples/ddcompletion.js) for a complete
							 | 
						||
| 
								 | 
							
								example, including how one can define bash functions for completion of custom
							 | 
						||
| 
								 | 
							
								option types. Also see [node-cmdln](https://github.com/trentm/node-cmdln) for
							 | 
						||
| 
								 | 
							
								how it uses this for Bash completion for full multi-subcommand tools.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- TODO: document specExtra
							 | 
						||
| 
								 | 
							
								- TODO: document includeHidden
							 | 
						||
| 
								 | 
							
								- TODO: document custom types, `function complete\_FOO` guide, completionType
							 | 
						||
| 
								 | 
							
								- TODO: document argtypes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Parser config
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parser construction (i.e. `dashdash.createParser(CONFIG)`) takes the
							 | 
						||
| 
								 | 
							
								following fields:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `options` (Array of option specs). Required. See the
							 | 
						||
| 
								 | 
							
								  [Option specs](#option-specs) section below.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `interspersed` (Boolean). Optional. Default is true. If true this allows
							 | 
						||
| 
								 | 
							
								  interspersed arguments and options. I.e.:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        node ./tool.js -v arg1 arg2 -h   # '-h' is after interspersed args
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Set it to false to have '-h' **not** get parsed as an option in the above
							 | 
						||
| 
								 | 
							
								  example.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `allowUnknown` (Boolean).  Optional.  Default is false.  If false, this causes
							 | 
						||
| 
								 | 
							
								  unknown arguments to throw an error.  I.e.:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        node ./tool.js -v arg1 --afe8asefksjefhas
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Set it to true to treat the unknown option as a positional
							 | 
						||
| 
								 | 
							
								  argument.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  **Caveat**: When a shortopt group, such as `-xaz` contains a mix of
							 | 
						||
| 
								 | 
							
								  known and unknown options, the *entire* group is passed through
							 | 
						||
| 
								 | 
							
								  unmolested as a positional argument.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Consider if you have a known short option `-a`, and parse the
							 | 
						||
| 
								 | 
							
								  following command line:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        node ./tool.js -xaz
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  where `-x` and `-z` are unknown.  There are multiple ways to
							 | 
						||
| 
								 | 
							
								  interpret this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    1. `-x` takes a value: `{x: 'az'}`
							 | 
						||
| 
								 | 
							
								    2. `-x` and `-z` are both booleans: `{x:true,a:true,z:true}`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Since dashdash does not know what `-x` and `-z` are, it can't know
							 | 
						||
| 
								 | 
							
								  if you'd prefer to receive `{a:true,_args:['-x','-z']}` or
							 | 
						||
| 
								 | 
							
								  `{x:'az'}`, or `{_args:['-xaz']}`. Leaving the positional arg unprocessed
							 | 
						||
| 
								 | 
							
								  is the easiest mistake for the user to recover from.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Option specs
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example using all fields (required fields are noted):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    names: ['file', 'f'],       // Required (one of `names` or `name`).
							 | 
						||
| 
								 | 
							
								    type: 'string',             // Required.
							 | 
						||
| 
								 | 
							
								    completionType: 'filename',
							 | 
						||
| 
								 | 
							
								    env: 'MYTOOL_FILE',
							 | 
						||
| 
								 | 
							
								    help: 'Config file to load before running "mytool"',
							 | 
						||
| 
								 | 
							
								    helpArg: 'PATH',
							 | 
						||
| 
								 | 
							
								    helpWrap: false,
							 | 
						||
| 
								 | 
							
								    default: path.resolve(process.env.HOME, '.mytoolrc')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Each option spec in the `options` array must/can have the following fields:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `name` (String) or `names` (Array). Required. These give the option name
							 | 
						||
| 
								 | 
							
								  and aliases. The first name (if more than one given) is the key for the
							 | 
						||
| 
								 | 
							
								  parsed `opts` object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `type` (String). Required. One of:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    - bool
							 | 
						||
| 
								 | 
							
								    - string
							 | 
						||
| 
								 | 
							
								    - number
							 | 
						||
| 
								 | 
							
								    - integer
							 | 
						||
| 
								 | 
							
								    - positiveInteger
							 | 
						||
| 
								 | 
							
								    - date (epoch seconds, e.g. 1396031701, or ISO 8601 format
							 | 
						||
| 
								 | 
							
								      `YYYY-MM-DD[THH:MM:SS[.sss][Z]]`, e.g. "2014-03-28T18:35:01.489Z")
							 | 
						||
| 
								 | 
							
								    - arrayOfBool
							 | 
						||
| 
								 | 
							
								    - arrayOfString
							 | 
						||
| 
								 | 
							
								    - arrayOfNumber
							 | 
						||
| 
								 | 
							
								    - arrayOfInteger
							 | 
						||
| 
								 | 
							
								    - arrayOfPositiveInteger
							 | 
						||
| 
								 | 
							
								    - arrayOfDate
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  FWIW, these names attempt to match with asserts on
							 | 
						||
| 
								 | 
							
								  [assert-plus](https://github.com/mcavage/node-assert-plus).
							 | 
						||
| 
								 | 
							
								  You can add your own custom option types with `dashdash.addOptionType`.
							 | 
						||
| 
								 | 
							
								  See below.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `completionType` (String). Optional. This is used for [Bash
							 | 
						||
| 
								 | 
							
								  completion](#bash-completion) for an option argument. If not specified,
							 | 
						||
| 
								 | 
							
								  then the value of `type` is used. Any string may be specified, but only the
							 | 
						||
| 
								 | 
							
								  following values have meaning:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    - `none`: Provide no completions.
							 | 
						||
| 
								 | 
							
								    - `file`: Bash's default completion (i.e. `complete -o default`), which
							 | 
						||
| 
								 | 
							
								      includes filenames.
							 | 
						||
| 
								 | 
							
								    - *Any string FOO for which a `function complete_FOO` Bash function is
							 | 
						||
| 
								 | 
							
								      defined.* This is for custom completions for a given tool. Typically
							 | 
						||
| 
								 | 
							
								      these custom functions are provided in the `specExtra` argument to
							 | 
						||
| 
								 | 
							
								      `dashdash.bashCompletionFromOptions()`. See
							 | 
						||
| 
								 | 
							
								      ["examples/ddcompletion.js"](examples/ddcompletion.js) for an example.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `env` (String or Array of String). Optional. An environment variable name
							 | 
						||
| 
								 | 
							
								  (or names) that can be used as a fallback for this option. For example,
							 | 
						||
| 
								 | 
							
								  given a "foo.js" like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var options = [{names: ['dry-run', 'n'], env: 'FOO_DRY_RUN'}];
							 | 
						||
| 
								 | 
							
								        var opts = dashdash.parse({options: options});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Both `node foo.js --dry-run` and `FOO_DRY_RUN=1 node foo.js` would result
							 | 
						||
| 
								 | 
							
								  in `opts.dry_run = true`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  An environment variable is only used as a fallback, i.e. it is ignored if
							 | 
						||
| 
								 | 
							
								  the associated option is given in `argv`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `help` (String). Optional. Used for `parser.help()` output.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `helpArg` (String). Optional. Used in help output as the placeholder for
							 | 
						||
| 
								 | 
							
								  the option argument, e.g. the "PATH" in:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ...
							 | 
						||
| 
								 | 
							
								        -f PATH, --file=PATH    File to process
							 | 
						||
| 
								 | 
							
								        ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `helpWrap` (Boolean). Optional, default true. Set this to `false` to have
							 | 
						||
| 
								 | 
							
								  that option's `help` *not* be text wrapped in `<parser>.help()` output.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `default`. Optional. A default value used for this option, if the
							 | 
						||
| 
								 | 
							
								  option isn't specified in argv.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `hidden` (Boolean). Optional, default false. If true, help output will not
							 | 
						||
| 
								 | 
							
								  include this option. See also the `includeHidden` option to
							 | 
						||
| 
								 | 
							
								  `bashCompletionFromOptions()` for [Bash completion](#bash-completion).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Option group headings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can add headings between option specs in the `options` array.  To do so,
							 | 
						||
| 
								 | 
							
								simply add an object with only a `group` property -- the string to print as
							 | 
						||
| 
								 | 
							
								the heading for the subsequent options in the array.  For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var options = [
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        group: 'Armament Options'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: [ 'weapon', 'w' ],
							 | 
						||
| 
								 | 
							
								        type: 'string'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        group: 'General Options'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        names: [ 'help', 'h' ],
							 | 
						||
| 
								 | 
							
								        type: 'bool'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								...
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Note: You can use an empty string, `{group: ''}`, to get a blank line in help
							 | 
						||
| 
								 | 
							
								output between groups of options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Help config
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `parser.help(...)` function is configurable as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Options:
							 | 
						||
| 
								 | 
							
								          Armament Options:
							 | 
						||
| 
								 | 
							
								        ^^  -w WEAPON, --weapon=WEAPON  Weapon with which to crush. One of: |
							 | 
						||
| 
								 | 
							
								       /                                sword, spear, maul                  |
							 | 
						||
| 
								 | 
							
								      /   General Options:                                                  |
							 | 
						||
| 
								 | 
							
								     /      -h, --help                  Print this help and exit.           |
							 | 
						||
| 
								 | 
							
								    /   ^^^^                            ^                                   |
							 | 
						||
| 
								 | 
							
								    \       `-- indent                   `-- helpCol              maxCol ---'
							 | 
						||
| 
								 | 
							
								     `-- headingIndent
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `indent` (Number or String). Default 4. Set to a number (for that many
							 | 
						||
| 
								 | 
							
								  spaces) or a string for the literal indent.
							 | 
						||
| 
								 | 
							
								- `headingIndent` (Number or String). Default half length of `indent`. Set to
							 | 
						||
| 
								 | 
							
								  a number (for that many spaces) or a string for the literal indent. This
							 | 
						||
| 
								 | 
							
								  indent applies to group heading lines, between normal option lines.
							 | 
						||
| 
								 | 
							
								- `nameSort` (String). Default is 'length'. By default the names are
							 | 
						||
| 
								 | 
							
								  sorted to put the short opts first (i.e. '-h, --help' preferred
							 | 
						||
| 
								 | 
							
								  to '--help, -h'). Set to 'none' to not do this sorting.
							 | 
						||
| 
								 | 
							
								- `maxCol` (Number). Default 80. Note that reflow is just done on whitespace
							 | 
						||
| 
								 | 
							
								  so a long token in the option help can overflow maxCol.
							 | 
						||
| 
								 | 
							
								- `helpCol` (Number). If not set a reasonable value will be determined
							 | 
						||
| 
								 | 
							
								  between `minHelpCol` and `maxHelpCol`.
							 | 
						||
| 
								 | 
							
								- `minHelpCol` (Number). Default 20.
							 | 
						||
| 
								 | 
							
								- `maxHelpCol` (Number). Default 40.
							 | 
						||
| 
								 | 
							
								- `helpWrap` (Boolean). Default true. Set to `false` to have option `help`
							 | 
						||
| 
								 | 
							
								  strings *not* be textwrapped to the helpCol..maxCol range.
							 | 
						||
| 
								 | 
							
								- `includeEnv` (Boolean). Default false. If the option has associated
							 | 
						||
| 
								 | 
							
								  environment variables (via the `env` option spec attribute), then
							 | 
						||
| 
								 | 
							
								  append mentioned of those envvars to the help string.
							 | 
						||
| 
								 | 
							
								- `includeDefault` (Boolean). Default false. If the option has a default value
							 | 
						||
| 
								 | 
							
								  (via the `default` option spec attribute, or a default on the option's type),
							 | 
						||
| 
								 | 
							
								  then a "Default: VALUE" string will be appended to the help string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Custom option types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Dashdash includes a good starter set of option types that it will parse for
							 | 
						||
| 
								 | 
							
								you. However, you can add your own via:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var dashdash = require('dashdash');
							 | 
						||
| 
								 | 
							
								    dashdash.addOptionType({
							 | 
						||
| 
								 | 
							
								        name: '...',
							 | 
						||
| 
								 | 
							
								        takesArg: true,
							 | 
						||
| 
								 | 
							
								        helpArg: '...',
							 | 
						||
| 
								 | 
							
								        parseArg: function (option, optstr, arg) {
							 | 
						||
| 
								 | 
							
								            ...
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        array: false,  // optional
							 | 
						||
| 
								 | 
							
								        arrayFlatten: false,  // optional
							 | 
						||
| 
								 | 
							
								        default: ...,   // optional
							 | 
						||
| 
								 | 
							
								        completionType: ...  // optional
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, a simple option type that accepts 'yes', 'y', 'no' or 'n' as
							 | 
						||
| 
								 | 
							
								a boolean argument would look like:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var dashdash = require('dashdash');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function parseYesNo(option, optstr, arg) {
							 | 
						||
| 
								 | 
							
								        var argLower = arg.toLowerCase()
							 | 
						||
| 
								 | 
							
								        if (~['yes', 'y'].indexOf(argLower)) {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        } else if (~['no', 'n'].indexOf(argLower)) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            throw new Error(format(
							 | 
						||
| 
								 | 
							
								                'arg for "%s" is not "yes" or "no": "%s"',
							 | 
						||
| 
								 | 
							
								                optstr, arg));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dashdash.addOptionType({
							 | 
						||
| 
								 | 
							
								        name: 'yesno'
							 | 
						||
| 
								 | 
							
								        takesArg: true,
							 | 
						||
| 
								 | 
							
								        helpArg: '<yes|no>',
							 | 
						||
| 
								 | 
							
								        parseArg: parseYesNo
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var options = {
							 | 
						||
| 
								 | 
							
								        {names: ['answer', 'a'], type: 'yesno'}
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    var opts = dashdash.parse({options: options});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								See "examples/custom-option-\*.js" for other examples.
							 | 
						||
| 
								 | 
							
								See the `addOptionType` block comment in "lib/dashdash.js" for more details.
							 | 
						||
| 
								 | 
							
								Please let me know [with an
							 | 
						||
| 
								 | 
							
								issue](https://github.com/trentm/node-dashdash/issues/new) if you write a
							 | 
						||
| 
								 | 
							
								generally useful one.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Why
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Why another node.js option parsing lib?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `nopt` really is just for "tools like npm". Implicit opts (e.g. '--no-foo'
							 | 
						||
| 
								 | 
							
								  works for every '--foo'). Can't disable abbreviated opts. Can't do multiple
							 | 
						||
| 
								 | 
							
								  usages of same opt, e.g. '-vvv' (I think). Can't do grouped short opts.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `optimist` has surprise interpretation of options (at least to me).
							 | 
						||
| 
								 | 
							
								  Implicit opts mean ambiguities and poor error handling for fat-fingering.
							 | 
						||
| 
								 | 
							
								  `process.exit` calls makes it hard to use as a libary.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `optparse` Incomplete docs. Is this an attempted clone of Python's `optparse`.
							 | 
						||
| 
								 | 
							
								  Not clear. Some divergence. `parser.on("name", ...)` API is weird.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `argparse` Dep on underscore. No thanks just for option processing.
							 | 
						||
| 
								 | 
							
								  `find lib | wc -l` -> `26`. Overkill.
							 | 
						||
| 
								 | 
							
								  Argparse is a bit different anyway. Not sure I want that.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `posix-getopt` No type validation. Though that isn't a killer. AFAIK can't
							 | 
						||
| 
								 | 
							
								  have a long opt without a short alias. I.e. no `getopt_long` semantics.
							 | 
						||
| 
								 | 
							
								  Also, no whizbang features like generated help output.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- ["commander.js"](https://github.com/visionmedia/commander.js): I wrote
							 | 
						||
| 
								 | 
							
								  [a critique](http://trentm.com/2014/01/a-critique-of-commander-for-nodejs.html)
							 | 
						||
| 
								 | 
							
								  a while back. It seems fine, but last I checked had
							 | 
						||
| 
								 | 
							
								  [an outstanding bug](https://github.com/visionmedia/commander.js/pull/121)
							 | 
						||
| 
								 | 
							
								  that would prevent me from using it.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MIT. See LICENSE.txt.
							 |