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