1 | A light, featureful and explicit option parsing library for node.js.
|
---|
2 |
|
---|
3 | [Why another one? See below](#why). tl;dr: The others I've tried are one of
|
---|
4 | too loosey goosey (not explicit), too big/too many deps, or ill specified.
|
---|
5 | YMMV.
|
---|
6 |
|
---|
7 | Follow <a href="https://twitter.com/intent/user?screen_name=trentmick" target="_blank">@trentmick</a>
|
---|
8 | for updates to node-dashdash.
|
---|
9 |
|
---|
10 | # Install
|
---|
11 |
|
---|
12 | npm install dashdash
|
---|
13 |
|
---|
14 |
|
---|
15 | # Usage
|
---|
16 |
|
---|
17 | ```javascript
|
---|
18 | var dashdash = require('dashdash');
|
---|
19 |
|
---|
20 | // Specify the options. Minimally `name` (or `names`) and `type`
|
---|
21 | // must be given for each.
|
---|
22 | var options = [
|
---|
23 | {
|
---|
24 | // `names` or a single `name`. First element is the `opts.KEY`.
|
---|
25 | names: ['help', 'h'],
|
---|
26 | // See "Option specs" below for types.
|
---|
27 | type: 'bool',
|
---|
28 | help: 'Print this help and exit.'
|
---|
29 | }
|
---|
30 | ];
|
---|
31 |
|
---|
32 | // Shortcut form. As called it infers `process.argv`. See below for
|
---|
33 | // the longer form to use methods like `.help()` on the Parser object.
|
---|
34 | var opts = dashdash.parse({options: options});
|
---|
35 |
|
---|
36 | console.log("opts:", opts);
|
---|
37 | console.log("args:", opts._args);
|
---|
38 | ```
|
---|
39 |
|
---|
40 |
|
---|
41 | # Longer Example
|
---|
42 |
|
---|
43 | A more realistic [starter script "foo.js"](./examples/foo.js) is as follows.
|
---|
44 | This also shows using `parser.help()` for formatted option help.
|
---|
45 |
|
---|
46 | ```javascript
|
---|
47 | var dashdash = require('./lib/dashdash');
|
---|
48 |
|
---|
49 | var options = [
|
---|
50 | {
|
---|
51 | name: 'version',
|
---|
52 | type: 'bool',
|
---|
53 | help: 'Print tool version and exit.'
|
---|
54 | },
|
---|
55 | {
|
---|
56 | names: ['help', 'h'],
|
---|
57 | type: 'bool',
|
---|
58 | help: 'Print this help and exit.'
|
---|
59 | },
|
---|
60 | {
|
---|
61 | names: ['verbose', 'v'],
|
---|
62 | type: 'arrayOfBool',
|
---|
63 | help: 'Verbose output. Use multiple times for more verbose.'
|
---|
64 | },
|
---|
65 | {
|
---|
66 | names: ['file', 'f'],
|
---|
67 | type: 'string',
|
---|
68 | help: 'File to process',
|
---|
69 | helpArg: 'FILE'
|
---|
70 | }
|
---|
71 | ];
|
---|
72 |
|
---|
73 | var parser = dashdash.createParser({options: options});
|
---|
74 | try {
|
---|
75 | var opts = parser.parse(process.argv);
|
---|
76 | } catch (e) {
|
---|
77 | console.error('foo: error: %s', e.message);
|
---|
78 | process.exit(1);
|
---|
79 | }
|
---|
80 |
|
---|
81 | console.log("# opts:", opts);
|
---|
82 | console.log("# args:", opts._args);
|
---|
83 |
|
---|
84 | // Use `parser.help()` for formatted options help.
|
---|
85 | if (opts.help) {
|
---|
86 | var help = parser.help({includeEnv: true}).trimRight();
|
---|
87 | console.log('usage: node foo.js [OPTIONS]\n'
|
---|
88 | + 'options:\n'
|
---|
89 | + help);
|
---|
90 | process.exit(0);
|
---|
91 | }
|
---|
92 |
|
---|
93 | // ...
|
---|
94 | ```
|
---|
95 |
|
---|
96 |
|
---|
97 | Some example output from this script (foo.js):
|
---|
98 |
|
---|
99 | ```
|
---|
100 | $ node foo.js -h
|
---|
101 | # opts: { help: true,
|
---|
102 | _order: [ { name: 'help', value: true, from: 'argv' } ],
|
---|
103 | _args: [] }
|
---|
104 | # args: []
|
---|
105 | usage: node foo.js [OPTIONS]
|
---|
106 | options:
|
---|
107 | --version Print tool version and exit.
|
---|
108 | -h, --help Print this help and exit.
|
---|
109 | -v, --verbose Verbose output. Use multiple times for more verbose.
|
---|
110 | -f FILE, --file=FILE File to process
|
---|
111 |
|
---|
112 | $ node foo.js -v
|
---|
113 | # opts: { verbose: [ true ],
|
---|
114 | _order: [ { name: 'verbose', value: true, from: 'argv' } ],
|
---|
115 | _args: [] }
|
---|
116 | # args: []
|
---|
117 |
|
---|
118 | $ node foo.js --version arg1
|
---|
119 | # opts: { version: true,
|
---|
120 | _order: [ { name: 'version', value: true, from: 'argv' } ],
|
---|
121 | _args: [ 'arg1' ] }
|
---|
122 | # args: [ 'arg1' ]
|
---|
123 |
|
---|
124 | $ node foo.js -f bar.txt
|
---|
125 | # opts: { file: 'bar.txt',
|
---|
126 | _order: [ { name: 'file', value: 'bar.txt', from: 'argv' } ],
|
---|
127 | _args: [] }
|
---|
128 | # args: []
|
---|
129 |
|
---|
130 | $ node foo.js -vvv --file=blah
|
---|
131 | # opts: { verbose: [ true, true, true ],
|
---|
132 | file: 'blah',
|
---|
133 | _order:
|
---|
134 | [ { name: 'verbose', value: true, from: 'argv' },
|
---|
135 | { name: 'verbose', value: true, from: 'argv' },
|
---|
136 | { name: 'verbose', value: true, from: 'argv' },
|
---|
137 | { name: 'file', value: 'blah', from: 'argv' } ],
|
---|
138 | _args: [] }
|
---|
139 | # args: []
|
---|
140 | ```
|
---|
141 |
|
---|
142 |
|
---|
143 | See the ["examples"](examples/) dir for a number of starter examples using
|
---|
144 | some of dashdash's features.
|
---|
145 |
|
---|
146 |
|
---|
147 | # Environment variable integration
|
---|
148 |
|
---|
149 | If you want to allow environment variables to specify options to your tool,
|
---|
150 | dashdash makes this easy. We can change the 'verbose' option in the example
|
---|
151 | above to include an 'env' field:
|
---|
152 |
|
---|
153 | ```javascript
|
---|
154 | {
|
---|
155 | names: ['verbose', 'v'],
|
---|
156 | type: 'arrayOfBool',
|
---|
157 | env: 'FOO_VERBOSE', // <--- add this line
|
---|
158 | help: 'Verbose output. Use multiple times for more verbose.'
|
---|
159 | },
|
---|
160 | ```
|
---|
161 |
|
---|
162 | then the **"FOO_VERBOSE" environment variable** can be used to set this
|
---|
163 | option:
|
---|
164 |
|
---|
165 | ```shell
|
---|
166 | $ FOO_VERBOSE=1 node foo.js
|
---|
167 | # opts: { verbose: [ true ],
|
---|
168 | _order: [ { name: 'verbose', value: true, from: 'env' } ],
|
---|
169 | _args: [] }
|
---|
170 | # args: []
|
---|
171 | ```
|
---|
172 |
|
---|
173 | Boolean options will interpret the empty string as unset, '0' as false
|
---|
174 | and anything else as true.
|
---|
175 |
|
---|
176 | ```shell
|
---|
177 | $ FOO_VERBOSE= node examples/foo.js # not set
|
---|
178 | # opts: { _order: [], _args: [] }
|
---|
179 | # args: []
|
---|
180 |
|
---|
181 | $ FOO_VERBOSE=0 node examples/foo.js # '0' is false
|
---|
182 | # opts: { verbose: [ false ],
|
---|
183 | _order: [ { key: 'verbose', value: false, from: 'env' } ],
|
---|
184 | _args: [] }
|
---|
185 | # args: []
|
---|
186 |
|
---|
187 | $ FOO_VERBOSE=1 node examples/foo.js # true
|
---|
188 | # opts: { verbose: [ true ],
|
---|
189 | _order: [ { key: 'verbose', value: true, from: 'env' } ],
|
---|
190 | _args: [] }
|
---|
191 | # args: []
|
---|
192 |
|
---|
193 | $ FOO_VERBOSE=boogabooga node examples/foo.js # true
|
---|
194 | # opts: { verbose: [ true ],
|
---|
195 | _order: [ { key: 'verbose', value: true, from: 'env' } ],
|
---|
196 | _args: [] }
|
---|
197 | # args: []
|
---|
198 | ```
|
---|
199 |
|
---|
200 | Non-booleans can be used as well. Strings:
|
---|
201 |
|
---|
202 | ```shell
|
---|
203 | $ FOO_FILE=data.txt node examples/foo.js
|
---|
204 | # opts: { file: 'data.txt',
|
---|
205 | _order: [ { key: 'file', value: 'data.txt', from: 'env' } ],
|
---|
206 | _args: [] }
|
---|
207 | # args: []
|
---|
208 | ```
|
---|
209 |
|
---|
210 | Numbers:
|
---|
211 |
|
---|
212 | ```shell
|
---|
213 | $ FOO_TIMEOUT=5000 node examples/foo.js
|
---|
214 | # opts: { timeout: 5000,
|
---|
215 | _order: [ { key: 'timeout', value: 5000, from: 'env' } ],
|
---|
216 | _args: [] }
|
---|
217 | # args: []
|
---|
218 |
|
---|
219 | $ FOO_TIMEOUT=blarg node examples/foo.js
|
---|
220 | foo: error: arg for "FOO_TIMEOUT" is not a positive integer: "blarg"
|
---|
221 | ```
|
---|
222 |
|
---|
223 | With the `includeEnv: true` config to `parser.help()` the environment
|
---|
224 | variable can also be included in **help output**:
|
---|
225 |
|
---|
226 | usage: node foo.js [OPTIONS]
|
---|
227 | options:
|
---|
228 | --version Print tool version and exit.
|
---|
229 | -h, --help Print this help and exit.
|
---|
230 | -v, --verbose Verbose output. Use multiple times for more verbose.
|
---|
231 | Environment: FOO_VERBOSE=1
|
---|
232 | -f FILE, --file=FILE File to process
|
---|
233 |
|
---|
234 |
|
---|
235 | # Bash completion
|
---|
236 |
|
---|
237 | Dashdash provides a simple way to create a Bash completion file that you
|
---|
238 | can place in your "bash_completion.d" directory -- sometimes that is
|
---|
239 | "/usr/local/etc/bash_completion.d/"). Features:
|
---|
240 |
|
---|
241 | - Support for short and long opts
|
---|
242 | - Support for knowing which options take arguments
|
---|
243 | - Support for subcommands (e.g. 'git log <TAB>' to show just options for the
|
---|
244 | log subcommand). See
|
---|
245 | [node-cmdln](https://github.com/trentm/node-cmdln#bash-completion) for
|
---|
246 | how to integrate that.
|
---|
247 | - Does the right thing with "--" to stop options.
|
---|
248 | - Custom optarg and arg types for custom completions.
|
---|
249 |
|
---|
250 | Dashdash will return bash completion file content given a parser instance:
|
---|
251 |
|
---|
252 | var parser = dashdash.createParser({options: options});
|
---|
253 | console.log( parser.bashCompletion({name: 'mycli'}) );
|
---|
254 |
|
---|
255 | or directly from a `options` array of options specs:
|
---|
256 |
|
---|
257 | var code = dashdash.bashCompletionFromOptions({
|
---|
258 | name: 'mycli',
|
---|
259 | options: OPTIONS
|
---|
260 | });
|
---|
261 |
|
---|
262 | Write that content to "/usr/local/etc/bash_completion.d/mycli" and you will
|
---|
263 | have Bash completions for `mycli`. Alternatively you can write it to
|
---|
264 | any file (e.g. "~/.bashrc") and source it.
|
---|
265 |
|
---|
266 | You could add a `--completion` hidden option to your tool that emits the
|
---|
267 | completion content and document for your users to call that to install
|
---|
268 | Bash completions.
|
---|
269 |
|
---|
270 | See [examples/ddcompletion.js](examples/ddcompletion.js) for a complete
|
---|
271 | example, including how one can define bash functions for completion of custom
|
---|
272 | option types. Also see [node-cmdln](https://github.com/trentm/node-cmdln) for
|
---|
273 | how it uses this for Bash completion for full multi-subcommand tools.
|
---|
274 |
|
---|
275 | - TODO: document specExtra
|
---|
276 | - TODO: document includeHidden
|
---|
277 | - TODO: document custom types, `function complete\_FOO` guide, completionType
|
---|
278 | - TODO: document argtypes
|
---|
279 |
|
---|
280 |
|
---|
281 | # Parser config
|
---|
282 |
|
---|
283 | Parser construction (i.e. `dashdash.createParser(CONFIG)`) takes the
|
---|
284 | following fields:
|
---|
285 |
|
---|
286 | - `options` (Array of option specs). Required. See the
|
---|
287 | [Option specs](#option-specs) section below.
|
---|
288 |
|
---|
289 | - `interspersed` (Boolean). Optional. Default is true. If true this allows
|
---|
290 | interspersed arguments and options. I.e.:
|
---|
291 |
|
---|
292 | node ./tool.js -v arg1 arg2 -h # '-h' is after interspersed args
|
---|
293 |
|
---|
294 | Set it to false to have '-h' **not** get parsed as an option in the above
|
---|
295 | example.
|
---|
296 |
|
---|
297 | - `allowUnknown` (Boolean). Optional. Default is false. If false, this causes
|
---|
298 | unknown arguments to throw an error. I.e.:
|
---|
299 |
|
---|
300 | node ./tool.js -v arg1 --afe8asefksjefhas
|
---|
301 |
|
---|
302 | Set it to true to treat the unknown option as a positional
|
---|
303 | argument.
|
---|
304 |
|
---|
305 | **Caveat**: When a shortopt group, such as `-xaz` contains a mix of
|
---|
306 | known and unknown options, the *entire* group is passed through
|
---|
307 | unmolested as a positional argument.
|
---|
308 |
|
---|
309 | Consider if you have a known short option `-a`, and parse the
|
---|
310 | following command line:
|
---|
311 |
|
---|
312 | node ./tool.js -xaz
|
---|
313 |
|
---|
314 | where `-x` and `-z` are unknown. There are multiple ways to
|
---|
315 | interpret this:
|
---|
316 |
|
---|
317 | 1. `-x` takes a value: `{x: 'az'}`
|
---|
318 | 2. `-x` and `-z` are both booleans: `{x:true,a:true,z:true}`
|
---|
319 |
|
---|
320 | Since dashdash does not know what `-x` and `-z` are, it can't know
|
---|
321 | if you'd prefer to receive `{a:true,_args:['-x','-z']}` or
|
---|
322 | `{x:'az'}`, or `{_args:['-xaz']}`. Leaving the positional arg unprocessed
|
---|
323 | is the easiest mistake for the user to recover from.
|
---|
324 |
|
---|
325 |
|
---|
326 | # Option specs
|
---|
327 |
|
---|
328 | Example using all fields (required fields are noted):
|
---|
329 |
|
---|
330 | ```javascript
|
---|
331 | {
|
---|
332 | names: ['file', 'f'], // Required (one of `names` or `name`).
|
---|
333 | type: 'string', // Required.
|
---|
334 | completionType: 'filename',
|
---|
335 | env: 'MYTOOL_FILE',
|
---|
336 | help: 'Config file to load before running "mytool"',
|
---|
337 | helpArg: 'PATH',
|
---|
338 | helpWrap: false,
|
---|
339 | default: path.resolve(process.env.HOME, '.mytoolrc')
|
---|
340 | }
|
---|
341 | ```
|
---|
342 |
|
---|
343 | Each option spec in the `options` array must/can have the following fields:
|
---|
344 |
|
---|
345 | - `name` (String) or `names` (Array). Required. These give the option name
|
---|
346 | and aliases. The first name (if more than one given) is the key for the
|
---|
347 | parsed `opts` object.
|
---|
348 |
|
---|
349 | - `type` (String). Required. One of:
|
---|
350 |
|
---|
351 | - bool
|
---|
352 | - string
|
---|
353 | - number
|
---|
354 | - integer
|
---|
355 | - positiveInteger
|
---|
356 | - date (epoch seconds, e.g. 1396031701, or ISO 8601 format
|
---|
357 | `YYYY-MM-DD[THH:MM:SS[.sss][Z]]`, e.g. "2014-03-28T18:35:01.489Z")
|
---|
358 | - arrayOfBool
|
---|
359 | - arrayOfString
|
---|
360 | - arrayOfNumber
|
---|
361 | - arrayOfInteger
|
---|
362 | - arrayOfPositiveInteger
|
---|
363 | - arrayOfDate
|
---|
364 |
|
---|
365 | FWIW, these names attempt to match with asserts on
|
---|
366 | [assert-plus](https://github.com/mcavage/node-assert-plus).
|
---|
367 | You can add your own custom option types with `dashdash.addOptionType`.
|
---|
368 | See below.
|
---|
369 |
|
---|
370 | - `completionType` (String). Optional. This is used for [Bash
|
---|
371 | completion](#bash-completion) for an option argument. If not specified,
|
---|
372 | then the value of `type` is used. Any string may be specified, but only the
|
---|
373 | following values have meaning:
|
---|
374 |
|
---|
375 | - `none`: Provide no completions.
|
---|
376 | - `file`: Bash's default completion (i.e. `complete -o default`), which
|
---|
377 | includes filenames.
|
---|
378 | - *Any string FOO for which a `function complete_FOO` Bash function is
|
---|
379 | defined.* This is for custom completions for a given tool. Typically
|
---|
380 | these custom functions are provided in the `specExtra` argument to
|
---|
381 | `dashdash.bashCompletionFromOptions()`. See
|
---|
382 | ["examples/ddcompletion.js"](examples/ddcompletion.js) for an example.
|
---|
383 |
|
---|
384 | - `env` (String or Array of String). Optional. An environment variable name
|
---|
385 | (or names) that can be used as a fallback for this option. For example,
|
---|
386 | given a "foo.js" like this:
|
---|
387 |
|
---|
388 | var options = [{names: ['dry-run', 'n'], env: 'FOO_DRY_RUN'}];
|
---|
389 | var opts = dashdash.parse({options: options});
|
---|
390 |
|
---|
391 | Both `node foo.js --dry-run` and `FOO_DRY_RUN=1 node foo.js` would result
|
---|
392 | in `opts.dry_run = true`.
|
---|
393 |
|
---|
394 | An environment variable is only used as a fallback, i.e. it is ignored if
|
---|
395 | the associated option is given in `argv`.
|
---|
396 |
|
---|
397 | - `help` (String). Optional. Used for `parser.help()` output.
|
---|
398 |
|
---|
399 | - `helpArg` (String). Optional. Used in help output as the placeholder for
|
---|
400 | the option argument, e.g. the "PATH" in:
|
---|
401 |
|
---|
402 | ...
|
---|
403 | -f PATH, --file=PATH File to process
|
---|
404 | ...
|
---|
405 |
|
---|
406 | - `helpWrap` (Boolean). Optional, default true. Set this to `false` to have
|
---|
407 | that option's `help` *not* be text wrapped in `<parser>.help()` output.
|
---|
408 |
|
---|
409 | - `default`. Optional. A default value used for this option, if the
|
---|
410 | option isn't specified in argv.
|
---|
411 |
|
---|
412 | - `hidden` (Boolean). Optional, default false. If true, help output will not
|
---|
413 | include this option. See also the `includeHidden` option to
|
---|
414 | `bashCompletionFromOptions()` for [Bash completion](#bash-completion).
|
---|
415 |
|
---|
416 |
|
---|
417 | # Option group headings
|
---|
418 |
|
---|
419 | You can add headings between option specs in the `options` array. To do so,
|
---|
420 | simply add an object with only a `group` property -- the string to print as
|
---|
421 | the heading for the subsequent options in the array. For example:
|
---|
422 |
|
---|
423 | ```javascript
|
---|
424 | var options = [
|
---|
425 | {
|
---|
426 | group: 'Armament Options'
|
---|
427 | },
|
---|
428 | {
|
---|
429 | names: [ 'weapon', 'w' ],
|
---|
430 | type: 'string'
|
---|
431 | },
|
---|
432 | {
|
---|
433 | group: 'General Options'
|
---|
434 | },
|
---|
435 | {
|
---|
436 | names: [ 'help', 'h' ],
|
---|
437 | type: 'bool'
|
---|
438 | }
|
---|
439 | ];
|
---|
440 | ...
|
---|
441 | ```
|
---|
442 |
|
---|
443 | Note: You can use an empty string, `{group: ''}`, to get a blank line in help
|
---|
444 | output between groups of options.
|
---|
445 |
|
---|
446 |
|
---|
447 | # Help config
|
---|
448 |
|
---|
449 | The `parser.help(...)` function is configurable as follows:
|
---|
450 |
|
---|
451 | Options:
|
---|
452 | Armament Options:
|
---|
453 | ^^ -w WEAPON, --weapon=WEAPON Weapon with which to crush. One of: |
|
---|
454 | / sword, spear, maul |
|
---|
455 | / General Options: |
|
---|
456 | / -h, --help Print this help and exit. |
|
---|
457 | / ^^^^ ^ |
|
---|
458 | \ `-- indent `-- helpCol maxCol ---'
|
---|
459 | `-- headingIndent
|
---|
460 |
|
---|
461 | - `indent` (Number or String). Default 4. Set to a number (for that many
|
---|
462 | spaces) or a string for the literal indent.
|
---|
463 | - `headingIndent` (Number or String). Default half length of `indent`. Set to
|
---|
464 | a number (for that many spaces) or a string for the literal indent. This
|
---|
465 | indent applies to group heading lines, between normal option lines.
|
---|
466 | - `nameSort` (String). Default is 'length'. By default the names are
|
---|
467 | sorted to put the short opts first (i.e. '-h, --help' preferred
|
---|
468 | to '--help, -h'). Set to 'none' to not do this sorting.
|
---|
469 | - `maxCol` (Number). Default 80. Note that reflow is just done on whitespace
|
---|
470 | so a long token in the option help can overflow maxCol.
|
---|
471 | - `helpCol` (Number). If not set a reasonable value will be determined
|
---|
472 | between `minHelpCol` and `maxHelpCol`.
|
---|
473 | - `minHelpCol` (Number). Default 20.
|
---|
474 | - `maxHelpCol` (Number). Default 40.
|
---|
475 | - `helpWrap` (Boolean). Default true. Set to `false` to have option `help`
|
---|
476 | strings *not* be textwrapped to the helpCol..maxCol range.
|
---|
477 | - `includeEnv` (Boolean). Default false. If the option has associated
|
---|
478 | environment variables (via the `env` option spec attribute), then
|
---|
479 | append mentioned of those envvars to the help string.
|
---|
480 | - `includeDefault` (Boolean). Default false. If the option has a default value
|
---|
481 | (via the `default` option spec attribute, or a default on the option's type),
|
---|
482 | then a "Default: VALUE" string will be appended to the help string.
|
---|
483 |
|
---|
484 |
|
---|
485 | # Custom option types
|
---|
486 |
|
---|
487 | Dashdash includes a good starter set of option types that it will parse for
|
---|
488 | you. However, you can add your own via:
|
---|
489 |
|
---|
490 | var dashdash = require('dashdash');
|
---|
491 | dashdash.addOptionType({
|
---|
492 | name: '...',
|
---|
493 | takesArg: true,
|
---|
494 | helpArg: '...',
|
---|
495 | parseArg: function (option, optstr, arg) {
|
---|
496 | ...
|
---|
497 | },
|
---|
498 | array: false, // optional
|
---|
499 | arrayFlatten: false, // optional
|
---|
500 | default: ..., // optional
|
---|
501 | completionType: ... // optional
|
---|
502 | });
|
---|
503 |
|
---|
504 | For example, a simple option type that accepts 'yes', 'y', 'no' or 'n' as
|
---|
505 | a boolean argument would look like:
|
---|
506 |
|
---|
507 | var dashdash = require('dashdash');
|
---|
508 |
|
---|
509 | function parseYesNo(option, optstr, arg) {
|
---|
510 | var argLower = arg.toLowerCase()
|
---|
511 | if (~['yes', 'y'].indexOf(argLower)) {
|
---|
512 | return true;
|
---|
513 | } else if (~['no', 'n'].indexOf(argLower)) {
|
---|
514 | return false;
|
---|
515 | } else {
|
---|
516 | throw new Error(format(
|
---|
517 | 'arg for "%s" is not "yes" or "no": "%s"',
|
---|
518 | optstr, arg));
|
---|
519 | }
|
---|
520 | }
|
---|
521 |
|
---|
522 | dashdash.addOptionType({
|
---|
523 | name: 'yesno'
|
---|
524 | takesArg: true,
|
---|
525 | helpArg: '<yes|no>',
|
---|
526 | parseArg: parseYesNo
|
---|
527 | });
|
---|
528 |
|
---|
529 | var options = {
|
---|
530 | {names: ['answer', 'a'], type: 'yesno'}
|
---|
531 | };
|
---|
532 | var opts = dashdash.parse({options: options});
|
---|
533 |
|
---|
534 | See "examples/custom-option-\*.js" for other examples.
|
---|
535 | See the `addOptionType` block comment in "lib/dashdash.js" for more details.
|
---|
536 | Please let me know [with an
|
---|
537 | issue](https://github.com/trentm/node-dashdash/issues/new) if you write a
|
---|
538 | generally useful one.
|
---|
539 |
|
---|
540 |
|
---|
541 |
|
---|
542 | # Why
|
---|
543 |
|
---|
544 | Why another node.js option parsing lib?
|
---|
545 |
|
---|
546 | - `nopt` really is just for "tools like npm". Implicit opts (e.g. '--no-foo'
|
---|
547 | works for every '--foo'). Can't disable abbreviated opts. Can't do multiple
|
---|
548 | usages of same opt, e.g. '-vvv' (I think). Can't do grouped short opts.
|
---|
549 |
|
---|
550 | - `optimist` has surprise interpretation of options (at least to me).
|
---|
551 | Implicit opts mean ambiguities and poor error handling for fat-fingering.
|
---|
552 | `process.exit` calls makes it hard to use as a libary.
|
---|
553 |
|
---|
554 | - `optparse` Incomplete docs. Is this an attempted clone of Python's `optparse`.
|
---|
555 | Not clear. Some divergence. `parser.on("name", ...)` API is weird.
|
---|
556 |
|
---|
557 | - `argparse` Dep on underscore. No thanks just for option processing.
|
---|
558 | `find lib | wc -l` -> `26`. Overkill.
|
---|
559 | Argparse is a bit different anyway. Not sure I want that.
|
---|
560 |
|
---|
561 | - `posix-getopt` No type validation. Though that isn't a killer. AFAIK can't
|
---|
562 | have a long opt without a short alias. I.e. no `getopt_long` semantics.
|
---|
563 | Also, no whizbang features like generated help output.
|
---|
564 |
|
---|
565 | - ["commander.js"](https://github.com/visionmedia/commander.js): I wrote
|
---|
566 | [a critique](http://trentm.com/2014/01/a-critique-of-commander-for-nodejs.html)
|
---|
567 | a while back. It seems fine, but last I checked had
|
---|
568 | [an outstanding bug](https://github.com/visionmedia/commander.js/pull/121)
|
---|
569 | that would prevent me from using it.
|
---|
570 |
|
---|
571 |
|
---|
572 | # License
|
---|
573 |
|
---|
574 | MIT. See LICENSE.txt.
|
---|