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