Commander.js has a major design flaw in the option
API, such that options like name
, opts
, command
, option
, domain
collide with names of properties on the commander instance. See issues: #404, #584, #648
Important: safe-commander
solves the name collision problem, however using it requires changing your code.
$ npm install safe-commander --save
Follow Commander API documentation
Options created with option
API will no longer be available on the Commander instance object. Instead, a new object store optsObj
was added.
The original Commander.js example should be modified as follows:
#!/usr/bin/env node
/**
* Module dependencies.
*/
-var program = require('commander');
+var program = require('safe-commander');
program
.version('0.1.0')
.option('-p, --peppers', 'Add peppers')
.option('-P, --pineapple', 'Add pineapple')
.option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);
console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineapple');
-if (program.bbqSauce) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
+if (program.optsObj.peppers) console.log(' - peppers');
+if (program.optsObj.pineapple) console.log(' - pineapple');
+if (program.optsObj.bbqSauce) console.log(' - bbq');
+console.log(' - %s cheese', program.optsObj.cheese);
- Ildar Sagdejev <> @specious
- Improve the documentation
- Feel free to open any PR