| # 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. |
| |
| [![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](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). |
| |
| [![build status](https://secure.travis-ci.org/substack/node-optimist.png)](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 |
| |
| ![This one's optimistic.](http://substack.net/images/optimistic.png) |
| |
| 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). |