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).
 |