This article is part of the article series "Node.JS Modules You Should Know About."
<- previous article next article ->
node logo

Hey everyone! This is the second post in my new node.js modules you should know about article series.

The first post was about dnode - the freestyle rpc library for node.

This time I'll introduce you to node-optimist - the lightweight options parser library. This library is also written by James Halliday (SubStack), my co-founder of Browserling and Testling.

Wonder how lightweight an options parser can be? Check this out:

var argv = require('optimist').argv;

And you're done! All options have been parsed for you and have been put in argv.

Here are various use cases. First off, it supports long arguments:

#!/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');
}

Now you can run this script with --rif and --xup arguments like this:

$ ./xup.js --rif=55 --xup=9.52
Buy more riffiwobbles

$ ./xup.js --rif 12 --xup 8.1
Sell the xupptumblers

I know you want to buy more riffiwobbles and sell your xupptumblers.

Next, it supports short args:

#!/usr/bin/env node
var argv = require('optimist').argv;
console.log('(%d,%d)', argv.x, argv.y);

You can use -x and -y as arguments:

$ ./short.js -x 10 -y 21
(10,21)

Then node-optimist supports boolean arguments, both short, long and grouped:

#!/usr/bin/env node
var argv = require('optimist').argv;

if (argv.s) {
    console.log(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
}
console.log(
    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
);

And now you can invoke the script with various options:

$ ./bool.js -s
The cat says: meow

$ ./bool.js -sp
The cat says: meow.

$ ./bool.js -sp --fr
Le chat dit: miaou.

Next, you can easily get to non-hypenated options via argv._:

#!/usr/bin/env node
var argv = require('optimist').argv;

console.log('(%d,%d)', argv.x, argv.y);
console.log(argv._);

Here are use cases for non-hypenated options:

$ ./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' ]

Optimist also comes with .usage() and .demand() functions:

#!/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);

Here arguments x and y are required and if they are not passed, the usage will be printed automatically:

$ ./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

Optimist also supports default arguments via .default():

#!/usr/bin/env node
var argv = require('optimist')
    .default('x', 10)
    .default('y', 10)
    .argv
;
console.log(argv.x + argv.y);

Here x and y default to 10:

$ ./default_singles.js -x 5
15

Enjoy this stranger:

Alternatively you can use isaacs's nopt that can enforce data types on arguments and can be used to easily handle a lot of arguments. Or you can use nomnom that noms your args and gives them back to you in a hash.

If you love these articles, subscribe to my blog for more, follow me on Twitter to find about my adventures, and watch me produce code on GitHub!

Sponsor this blog series!

Doing a node.js company and want your ad to appear in the series? The ad will go out to 14,000 rss subscribers, 7,000 email subscribers, and it will get viewed by thousands of my blog visitors! Email me and we'll set it up!

This article is part of the article series "Node.JS Modules You Should Know About."
<- previous article next article ->

Comments

nisc Permalink
December 02, 2011, 20:13

Beautiful.

Jed Parsons Permalink
December 03, 2011, 01:43

If you haven't seen it, I would recommend looking at commander.js: http://tjholowaychuk.com/post/9103188408/commander-js-nodejs-command-line-interfaces-made-easy

Leave a new comment

(why do I need your e-mail?)

(Your twitter name, if you have one. (I'm @pkrumins, btw.))

Type the word "floppy": (just to make sure you're a human)

Please preview the comment before submitting to make sure it's OK.

Advertisements