514 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			514 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # DEPRECATION NOTICE
 | ||
|  | 
 | ||
|  | I don't want to maintain this module anymore since I just use | ||
|  | [minimist](https://npmjs.org/package/minimist), the argument parsing engine, | ||
|  | directly instead nowadays. | ||
|  | 
 | ||
|  | See [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed | ||
|  | successor to optimist. | ||
|  | 
 | ||
|  | [](https://github.com/chevex/yargs) | ||
|  | 
 | ||
|  | You should also consider [nomnom](https://github.com/harthur/nomnom). | ||
|  | 
 | ||
|  | optimist | ||
|  | ======== | ||
|  | 
 | ||
|  | Optimist is a node.js library for option parsing for people who hate option | ||
|  | parsing. More specifically, this module is for people who like all the --bells | ||
|  | and -whistlz of program usage but think optstrings are a waste of time. | ||
|  | 
 | ||
|  | With optimist, option parsing doesn't have to suck (as much). | ||
|  | 
 | ||
|  | [](http://travis-ci.org/substack/node-optimist) | ||
|  | 
 | ||
|  | examples | ||
|  | ======== | ||
|  | 
 | ||
|  | With Optimist, the options are just a hash! No optstrings attached. | ||
|  | ------------------------------------------------------------------- | ||
|  | 
 | ||
|  | xup.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist').argv; | ||
|  | 
 | ||
|  | if (argv.rif - 5 * argv.xup > 7.138) { | ||
|  |     console.log('Buy more riffiwobbles'); | ||
|  | } | ||
|  | else { | ||
|  |     console.log('Sell the xupptumblers'); | ||
|  | } | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./xup.js --rif=55 --xup=9.52 | ||
|  |     Buy more riffiwobbles | ||
|  |      | ||
|  |     $ ./xup.js --rif 12 --xup 8.1 | ||
|  |     Sell the xupptumblers | ||
|  | 
 | ||
|  |  | ||
|  | 
 | ||
|  | But wait! There's more! You can do short options: | ||
|  | ------------------------------------------------- | ||
|  |   | ||
|  | short.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist').argv; | ||
|  | console.log('(%d,%d)', argv.x, argv.y); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./short.js -x 10 -y 21 | ||
|  |     (10,21) | ||
|  | 
 | ||
|  | And booleans, both long and short (and grouped): | ||
|  | ---------------------------------- | ||
|  | 
 | ||
|  | bool.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var util = require('util'); | ||
|  | var argv = require('optimist').argv; | ||
|  | 
 | ||
|  | if (argv.s) { | ||
|  |     util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: '); | ||
|  | } | ||
|  | console.log( | ||
|  |     (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '') | ||
|  | ); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./bool.js -s | ||
|  |     The cat says: meow | ||
|  |      | ||
|  |     $ ./bool.js -sp | ||
|  |     The cat says: meow. | ||
|  | 
 | ||
|  |     $ ./bool.js -sp --fr | ||
|  |     Le chat dit: miaou. | ||
|  | 
 | ||
|  | And non-hypenated options too! Just use `argv._`! | ||
|  | ------------------------------------------------- | ||
|  |   | ||
|  | nonopt.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist').argv; | ||
|  | console.log('(%d,%d)', argv.x, argv.y); | ||
|  | console.log(argv._); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./nonopt.js -x 6.82 -y 3.35 moo | ||
|  |     (6.82,3.35) | ||
|  |     [ 'moo' ] | ||
|  |      | ||
|  |     $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz | ||
|  |     (0.54,1.12) | ||
|  |     [ 'foo', 'bar', 'baz' ] | ||
|  | 
 | ||
|  | Plus, Optimist comes with .usage() and .demand()! | ||
|  | ------------------------------------------------- | ||
|  | 
 | ||
|  | divide.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .usage('Usage: $0 -x [num] -y [num]') | ||
|  |     .demand(['x','y']) | ||
|  |     .argv; | ||
|  | 
 | ||
|  | console.log(argv.x / argv.y); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  |   | ||
|  |     $ ./divide.js -x 55 -y 11 | ||
|  |     5 | ||
|  |      | ||
|  |     $ node ./divide.js -x 4.91 -z 2.51 | ||
|  |     Usage: node ./divide.js -x [num] -y [num] | ||
|  | 
 | ||
|  |     Options: | ||
|  |       -x  [required] | ||
|  |       -y  [required] | ||
|  | 
 | ||
|  |     Missing required arguments: y | ||
|  | 
 | ||
|  | EVEN MORE HOLY COW | ||
|  | ------------------ | ||
|  | 
 | ||
|  | default_singles.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .default('x', 10) | ||
|  |     .default('y', 10) | ||
|  |     .argv | ||
|  | ; | ||
|  | console.log(argv.x + argv.y); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./default_singles.js -x 5 | ||
|  |     15 | ||
|  | 
 | ||
|  | default_hash.js: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .default({ x : 10, y : 10 }) | ||
|  |     .argv | ||
|  | ; | ||
|  | console.log(argv.x + argv.y); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./default_hash.js -y 7 | ||
|  |     17 | ||
|  | 
 | ||
|  | And if you really want to get all descriptive about it... | ||
|  | --------------------------------------------------------- | ||
|  | 
 | ||
|  | boolean_single.js | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .boolean('v') | ||
|  |     .argv | ||
|  | ; | ||
|  | console.dir(argv); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./boolean_single.js -v foo bar baz | ||
|  |     true | ||
|  |     [ 'bar', 'baz', 'foo' ] | ||
|  | 
 | ||
|  | boolean_double.js | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .boolean(['x','y','z']) | ||
|  |     .argv | ||
|  | ; | ||
|  | console.dir([ argv.x, argv.y, argv.z ]); | ||
|  | console.dir(argv._); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ ./boolean_double.js -x -z one two three | ||
|  |     [ true, false, true ] | ||
|  |     [ 'one', 'two', 'three' ] | ||
|  | 
 | ||
|  | Optimist is here to help... | ||
|  | --------------------------- | ||
|  | 
 | ||
|  | You can describe parameters for help messages and set aliases. Optimist figures | ||
|  | out how to format a handy help string automatically. | ||
|  | 
 | ||
|  | line_count.js | ||
|  | 
 | ||
|  | ````javascript | ||
|  | #!/usr/bin/env node
 | ||
|  | var argv = require('optimist') | ||
|  |     .usage('Count the lines in a file.\nUsage: $0') | ||
|  |     .demand('f') | ||
|  |     .alias('f', 'file') | ||
|  |     .describe('f', 'Load a file') | ||
|  |     .argv | ||
|  | ; | ||
|  | 
 | ||
|  | var fs = require('fs'); | ||
|  | var s = fs.createReadStream(argv.file); | ||
|  | 
 | ||
|  | var lines = 0; | ||
|  | s.on('data', function (buf) { | ||
|  |     lines += buf.toString().match(/\n/g).length; | ||
|  | }); | ||
|  | 
 | ||
|  | s.on('end', function () { | ||
|  |     console.log(lines); | ||
|  | }); | ||
|  | ```` | ||
|  | 
 | ||
|  | *** | ||
|  | 
 | ||
|  |     $ node line_count.js | ||
|  |     Count the lines in a file. | ||
|  |     Usage: node ./line_count.js | ||
|  | 
 | ||
|  |     Options: | ||
|  |       -f, --file  Load a file  [required] | ||
|  | 
 | ||
|  |     Missing required arguments: f | ||
|  | 
 | ||
|  |     $ node line_count.js --file line_count.js  | ||
|  |     20 | ||
|  |      | ||
|  |     $ node line_count.js -f line_count.js  | ||
|  |     20 | ||
|  | 
 | ||
|  | methods | ||
|  | ======= | ||
|  | 
 | ||
|  | By itself, | ||
|  | 
 | ||
|  | ````javascript | ||
|  | require('optimist').argv | ||
|  | ````` | ||
|  | 
 | ||
|  | will use `process.argv` array to construct the `argv` object. | ||
|  | 
 | ||
|  | You can pass in the `process.argv` yourself: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | require('optimist')([ '-x', '1', '-y', '2' ]).argv | ||
|  | ```` | ||
|  | 
 | ||
|  | or use .parse() to do the same thing: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | require('optimist').parse([ '-x', '1', '-y', '2' ]) | ||
|  | ```` | ||
|  | 
 | ||
|  | The rest of these methods below come in just before the terminating `.argv`. | ||
|  | 
 | ||
|  | .alias(key, alias) | ||
|  | ------------------ | ||
|  | 
 | ||
|  | Set key names as equivalent such that updates to a key will propagate to aliases | ||
|  | and vice-versa. | ||
|  | 
 | ||
|  | Optionally `.alias()` can take an object that maps keys to aliases. | ||
|  | 
 | ||
|  | .default(key, value) | ||
|  | -------------------- | ||
|  | 
 | ||
|  | Set `argv[key]` to `value` if no option was specified on `process.argv`. | ||
|  | 
 | ||
|  | Optionally `.default()` can take an object that maps keys to default values. | ||
|  | 
 | ||
|  | .demand(key) | ||
|  | ------------ | ||
|  | 
 | ||
|  | If `key` is a string, show the usage information and exit if `key` wasn't | ||
|  | specified in `process.argv`. | ||
|  | 
 | ||
|  | If `key` is a number, demand at least as many non-option arguments, which show | ||
|  | up in `argv._`. | ||
|  | 
 | ||
|  | If `key` is an Array, demand each element. | ||
|  | 
 | ||
|  | .describe(key, desc) | ||
|  | -------------------- | ||
|  | 
 | ||
|  | Describe a `key` for the generated usage information. | ||
|  | 
 | ||
|  | Optionally `.describe()` can take an object that maps keys to descriptions. | ||
|  | 
 | ||
|  | .options(key, opt) | ||
|  | ------------------ | ||
|  | 
 | ||
|  | Instead of chaining together `.alias().demand().default()`, you can specify | ||
|  | keys in `opt` for each of the chainable methods. | ||
|  | 
 | ||
|  | For example: | ||
|  | 
 | ||
|  | ````javascript | ||
|  | var argv = require('optimist') | ||
|  |     .options('f', { | ||
|  |         alias : 'file', | ||
|  |         default : '/etc/passwd', | ||
|  |     }) | ||
|  |     .argv | ||
|  | ; | ||
|  | ```` | ||
|  | 
 | ||
|  | is the same as | ||
|  | 
 | ||
|  | ````javascript | ||
|  | var argv = require('optimist') | ||
|  |     .alias('f', 'file') | ||
|  |     .default('f', '/etc/passwd') | ||
|  |     .argv | ||
|  | ; | ||
|  | ```` | ||
|  | 
 | ||
|  | Optionally `.options()` can take an object that maps keys to `opt` parameters. | ||
|  | 
 | ||
|  | .usage(message) | ||
|  | --------------- | ||
|  | 
 | ||
|  | Set a usage message to show which commands to use. Inside `message`, the string | ||
|  | `$0` will get interpolated to the current script name or node command for the | ||
|  | present script similar to how `$0` works in bash or perl. | ||
|  | 
 | ||
|  | .check(fn) | ||
|  | ---------- | ||
|  | 
 | ||
|  | Check that certain conditions are met in the provided arguments. | ||
|  | 
 | ||
|  | If `fn` throws or returns `false`, show the thrown error, usage information, and | ||
|  | exit. | ||
|  | 
 | ||
|  | .boolean(key) | ||
|  | ------------- | ||
|  | 
 | ||
|  | Interpret `key` as a boolean. If a non-flag option follows `key` in | ||
|  | `process.argv`, that string won't get set as the value of `key`. | ||
|  | 
 | ||
|  | If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be | ||
|  | `false`. | ||
|  | 
 | ||
|  | If `key` is an Array, interpret all the elements as booleans. | ||
|  | 
 | ||
|  | .string(key) | ||
|  | ------------ | ||
|  | 
 | ||
|  | Tell the parser logic not to interpret `key` as a number or boolean. | ||
|  | This can be useful if you need to preserve leading zeros in an input. | ||
|  | 
 | ||
|  | If `key` is an Array, interpret all the elements as strings. | ||
|  | 
 | ||
|  | .wrap(columns) | ||
|  | -------------- | ||
|  | 
 | ||
|  | Format usage output to wrap at `columns` many columns. | ||
|  | 
 | ||
|  | .help() | ||
|  | ------- | ||
|  | 
 | ||
|  | Return the generated usage string. | ||
|  | 
 | ||
|  | .showHelp(fn=console.error) | ||
|  | --------------------------- | ||
|  | 
 | ||
|  | Print the usage data using `fn` for printing. | ||
|  | 
 | ||
|  | .parse(args) | ||
|  | ------------ | ||
|  | 
 | ||
|  | Parse `args` instead of `process.argv`. Returns the `argv` object. | ||
|  | 
 | ||
|  | .argv | ||
|  | ----- | ||
|  | 
 | ||
|  | Get the arguments as a plain old object. | ||
|  | 
 | ||
|  | Arguments without a corresponding flag show up in the `argv._` array. | ||
|  | 
 | ||
|  | The script name or node command is available at `argv.$0` similarly to how `$0` | ||
|  | works in bash or perl. | ||
|  | 
 | ||
|  | parsing tricks | ||
|  | ============== | ||
|  | 
 | ||
|  | stop parsing | ||
|  | ------------ | ||
|  | 
 | ||
|  | Use `--` to stop parsing flags and stuff the remainder into `argv._`. | ||
|  | 
 | ||
|  |     $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4 | ||
|  |     { _: [ '-c', '3', '-d', '4' ], | ||
|  |       '$0': 'node ./examples/reflect.js', | ||
|  |       a: 1, | ||
|  |       b: 2 } | ||
|  | 
 | ||
|  | negate fields | ||
|  | ------------- | ||
|  | 
 | ||
|  | If you want to explicity set a field to false instead of just leaving it | ||
|  | undefined or to override a default you can do `--no-key`. | ||
|  | 
 | ||
|  |     $ node examples/reflect.js -a --no-b | ||
|  |     { _: [], | ||
|  |       '$0': 'node ./examples/reflect.js', | ||
|  |       a: true, | ||
|  |       b: false } | ||
|  | 
 | ||
|  | numbers | ||
|  | ------- | ||
|  | 
 | ||
|  | Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to | ||
|  | one. This way you can just `net.createConnection(argv.port)` and you can add | ||
|  | numbers out of `argv` with `+` without having that mean concatenation, | ||
|  | which is super frustrating. | ||
|  | 
 | ||
|  | duplicates | ||
|  | ---------- | ||
|  | 
 | ||
|  | If you specify a flag multiple times it will get turned into an array containing | ||
|  | all the values in order. | ||
|  | 
 | ||
|  |     $ node examples/reflect.js -x 5 -x 8 -x 0 | ||
|  |     { _: [], | ||
|  |       '$0': 'node ./examples/reflect.js', | ||
|  |         x: [ 5, 8, 0 ] } | ||
|  | 
 | ||
|  | dot notation | ||
|  | ------------ | ||
|  | 
 | ||
|  | When you use dots (`.`s) in argument names, an implicit object path is assumed. | ||
|  | This lets you organize arguments into nested objects. | ||
|  | 
 | ||
|  |      $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5 | ||
|  |      { _: [], | ||
|  |        '$0': 'node ./examples/reflect.js', | ||
|  |          foo: { bar: { baz: 33 }, quux: 5 } } | ||
|  | 
 | ||
|  | short numbers | ||
|  | ------------- | ||
|  | 
 | ||
|  | Short numeric `head -n5` style argument work too: | ||
|  | 
 | ||
|  |     $ node reflect.js -n123 -m456 | ||
|  |     { '3': true, | ||
|  |       '6': true, | ||
|  |       _: [], | ||
|  |       '$0': 'node ./reflect.js', | ||
|  |       n: 123, | ||
|  |       m: 456 } | ||
|  | 
 | ||
|  | installation | ||
|  | ============ | ||
|  | 
 | ||
|  | With [npm](http://github.com/isaacs/npm), just do: | ||
|  |     npm install optimist | ||
|  |   | ||
|  | or clone this project on github: | ||
|  | 
 | ||
|  |     git clone http://github.com/substack/node-optimist.git | ||
|  | 
 | ||
|  | To run the tests with [expresso](http://github.com/visionmedia/expresso), | ||
|  | just do: | ||
|  |      | ||
|  |     expresso | ||
|  | 
 | ||
|  | inspired By | ||
|  | =========== | ||
|  | 
 | ||
|  | This module is loosely inspired by Perl's | ||
|  | [Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm). |