WIP - add extractor, generate snippet_data
This commit is contained in:
3
node_modules/ltcdr/.npmignore
generated
vendored
Normal file
3
node_modules/ltcdr/.npmignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
*.sock
|
||||
4
node_modules/ltcdr/.travis.yml
generated
vendored
Normal file
4
node_modules/ltcdr/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.4
|
||||
- 0.6
|
||||
193
node_modules/ltcdr/History.md
generated
vendored
Normal file
193
node_modules/ltcdr/History.md
generated
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
2.2.1 / 2014-3-18
|
||||
==================
|
||||
|
||||
* fix: excluded all the file by accedent
|
||||
|
||||
2.2.0 / 2014-3-18
|
||||
==================
|
||||
|
||||
* add: alias/aliases option for commands
|
||||
|
||||
2.1.0 / 2013-11-21
|
||||
==================
|
||||
|
||||
* add: allow cflag style option params, unit test, fixes #174
|
||||
|
||||
2.0.0 / 2013-07-18
|
||||
==================
|
||||
|
||||
* remove input methods (.prompt, .confirm, etc)
|
||||
|
||||
1.3.2 / 2013-07-18
|
||||
==================
|
||||
|
||||
* add support for sub-commands to co-exist with the original command
|
||||
|
||||
1.3.1 / 2013-07-18
|
||||
==================
|
||||
|
||||
* add quick .runningCommand hack so you can opt-out of other logic when running a sub command
|
||||
|
||||
1.3.0 / 2013-07-09
|
||||
==================
|
||||
|
||||
* add EACCES error handling
|
||||
* fix sub-command --help
|
||||
|
||||
1.2.0 / 2013-06-13
|
||||
==================
|
||||
|
||||
* allow "-" hyphen as an option argument
|
||||
* support for RegExp coercion
|
||||
|
||||
1.1.1 / 2012-11-20
|
||||
==================
|
||||
|
||||
* add more sub-command padding
|
||||
* fix .usage() when args are present. Closes #106
|
||||
|
||||
1.1.0 / 2012-11-16
|
||||
==================
|
||||
|
||||
* add git-style executable subcommand support. Closes #94
|
||||
|
||||
1.0.5 / 2012-10-09
|
||||
==================
|
||||
|
||||
* fix `--name` clobbering. Closes #92
|
||||
* fix examples/help. Closes #89
|
||||
|
||||
1.0.4 / 2012-09-03
|
||||
==================
|
||||
|
||||
* add `outputHelp()` method.
|
||||
|
||||
1.0.3 / 2012-08-30
|
||||
==================
|
||||
|
||||
* remove invalid .version() defaulting
|
||||
|
||||
1.0.2 / 2012-08-24
|
||||
==================
|
||||
|
||||
* add `--foo=bar` support [arv]
|
||||
* fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
|
||||
|
||||
1.0.1 / 2012-08-03
|
||||
==================
|
||||
|
||||
* fix issue #56
|
||||
* fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
|
||||
|
||||
1.0.0 / 2012-07-05
|
||||
==================
|
||||
|
||||
* add support for optional option descriptions
|
||||
* add defaulting of `.version()` to package.json's version
|
||||
|
||||
0.6.1 / 2012-06-01
|
||||
==================
|
||||
|
||||
* Added: append (yes or no) on confirmation
|
||||
* Added: allow node.js v0.7.x
|
||||
|
||||
0.6.0 / 2012-04-10
|
||||
==================
|
||||
|
||||
* Added `.prompt(obj, callback)` support. Closes #49
|
||||
* Added default support to .choose(). Closes #41
|
||||
* Fixed the choice example
|
||||
|
||||
0.5.1 / 2011-12-20
|
||||
==================
|
||||
|
||||
* Fixed `password()` for recent nodes. Closes #36
|
||||
|
||||
0.5.0 / 2011-12-04
|
||||
==================
|
||||
|
||||
* Added sub-command option support [itay]
|
||||
|
||||
0.4.3 / 2011-12-04
|
||||
==================
|
||||
|
||||
* Fixed custom help ordering. Closes #32
|
||||
|
||||
0.4.2 / 2011-11-24
|
||||
==================
|
||||
|
||||
* Added travis support
|
||||
* Fixed: line-buffered input automatically trimmed. Closes #31
|
||||
|
||||
0.4.1 / 2011-11-18
|
||||
==================
|
||||
|
||||
* Removed listening for "close" on --help
|
||||
|
||||
0.4.0 / 2011-11-15
|
||||
==================
|
||||
|
||||
* Added support for `--`. Closes #24
|
||||
|
||||
0.3.3 / 2011-11-14
|
||||
==================
|
||||
|
||||
* Fixed: wait for close event when writing help info [Jerry Hamlet]
|
||||
|
||||
0.3.2 / 2011-11-01
|
||||
==================
|
||||
|
||||
* Fixed long flag definitions with values [felixge]
|
||||
|
||||
0.3.1 / 2011-10-31
|
||||
==================
|
||||
|
||||
* Changed `--version` short flag to `-V` from `-v`
|
||||
* Changed `.version()` so it's configurable [felixge]
|
||||
|
||||
0.3.0 / 2011-10-31
|
||||
==================
|
||||
|
||||
* Added support for long flags only. Closes #18
|
||||
|
||||
0.2.1 / 2011-10-24
|
||||
==================
|
||||
|
||||
* "node": ">= 0.4.x < 0.7.0". Closes #20
|
||||
|
||||
0.2.0 / 2011-09-26
|
||||
==================
|
||||
|
||||
* Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
|
||||
|
||||
0.1.0 / 2011-08-24
|
||||
==================
|
||||
|
||||
* Added support for custom `--help` output
|
||||
|
||||
0.0.5 / 2011-08-18
|
||||
==================
|
||||
|
||||
* Changed: when the user enters nothing prompt for password again
|
||||
* Fixed issue with passwords beginning with numbers [NuckChorris]
|
||||
|
||||
0.0.4 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Fixed `Commander#args`
|
||||
|
||||
0.0.3 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Added default option value support
|
||||
|
||||
0.0.2 / 2011-08-15
|
||||
==================
|
||||
|
||||
* Added mask support to `Command#password(str[, mask], fn)`
|
||||
* Added `Command#password(str, fn)`
|
||||
|
||||
0.0.1 / 2010-01-03
|
||||
==================
|
||||
|
||||
* Initial release
|
||||
223
node_modules/ltcdr/Readme.md
generated
vendored
Normal file
223
node_modules/ltcdr/Readme.md
generated
vendored
Normal file
@ -0,0 +1,223 @@
|
||||
# Lieutenant Commander
|
||||
|
||||
The complete solution for [node.js](http://nodejs.org) command-line interfaces, a fork of [commander](https://github.com/visionmedia/commander.js).
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
$ npm install ltcdr
|
||||
```
|
||||
|
||||
|
||||
## Commands & Actions
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
program
|
||||
.command('initialize [env]')
|
||||
.alias('init')
|
||||
.alias('i')
|
||||
.description('initializes a deploy config for the given environment')
|
||||
.option('-b, --branch [name]', 'Which branch to use')
|
||||
.action(function(env, options) {
|
||||
var branch = options.branch || 'master';
|
||||
env = env || 'prod';
|
||||
console.log('initialized %s environment for %s branch', env, branch);
|
||||
})
|
||||
.parse(process.argv);
|
||||
|
||||
// deployer initialize alpha
|
||||
// deployer init beta
|
||||
// deployer i prod
|
||||
```
|
||||
|
||||
Aliases are optional, and can take a string or an array, e.g. `.aliases('s')` or `.aliases(['s', 'sup'])`.
|
||||
|
||||
|
||||
## Option parsing
|
||||
|
||||
Options with lieutenant commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('ltcdr');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --peppers', 'Add peppers')
|
||||
.option('-P, --pineapple', 'Add pineapple')
|
||||
.option('-b, --bbq', '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.bbq) console.log(' - bbq');
|
||||
console.log(' - %s cheese', program.cheese);
|
||||
```
|
||||
|
||||
Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
|
||||
|
||||
## Automated --help
|
||||
|
||||
The help information is auto-generated based on the information lieutenant commander already knows about your program, so the following `--help` info is for free:
|
||||
|
||||
```
|
||||
$ ./examples/pizza --help
|
||||
|
||||
Usage: pizza [options]
|
||||
|
||||
Options:
|
||||
|
||||
-V, --version output the version number
|
||||
-p, --peppers Add peppers
|
||||
-P, --pineapple Add pineapple
|
||||
-b, --bbq Add bbq sauce
|
||||
-c, --cheese <type> Add the specified type of cheese [marble]
|
||||
-h, --help output usage information
|
||||
|
||||
```
|
||||
|
||||
## Coercion
|
||||
|
||||
```js
|
||||
function range(val) {
|
||||
return val.split('..').map(Number);
|
||||
}
|
||||
|
||||
function list(val) {
|
||||
return val.split(',');
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.usage('[options] <file ...>')
|
||||
.option('-i, --integer <n>', 'An integer argument', parseInt)
|
||||
.option('-f, --float <n>', 'A float argument', parseFloat)
|
||||
.option('-r, --range <a>..<b>', 'A range', range)
|
||||
.option('-l, --list <items>', 'A list', list)
|
||||
.option('-o, --optional [value]', 'An optional value')
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' int: %j', program.integer);
|
||||
console.log(' float: %j', program.float);
|
||||
console.log(' optional: %j', program.optional);
|
||||
program.range = program.range || [];
|
||||
console.log(' range: %j..%j', program.range[0], program.range[1]);
|
||||
console.log(' list: %j', program.list);
|
||||
console.log(' args: %j', program.args);
|
||||
```
|
||||
|
||||
## Custom help
|
||||
|
||||
You can display arbitrary `-h, --help` information
|
||||
by listening for "--help". Commander will automatically
|
||||
exit once you are done so that the remainder of your program
|
||||
does not execute causing undesired behaviours, for example
|
||||
in the following executable "stuff" will not output when
|
||||
`--help` is used.
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
function list(val) {
|
||||
return val.split(',').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-f, --foo', 'enable some foo')
|
||||
.option('-b, --bar', 'enable some bar')
|
||||
.option('-B, --baz', 'enable some baz');
|
||||
|
||||
// must be before .parse() since
|
||||
// node's emit() is immediate
|
||||
|
||||
program.on('--help', function(){
|
||||
console.log(' Examples:');
|
||||
console.log('');
|
||||
console.log(' $ custom-help --help');
|
||||
console.log(' $ custom-help -h');
|
||||
console.log('');
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
console.log('stuff');
|
||||
```
|
||||
|
||||
yielding the following help output:
|
||||
|
||||
```
|
||||
|
||||
Usage: custom-help [options]
|
||||
|
||||
Options:
|
||||
|
||||
-h, --help output usage information
|
||||
-V, --version output the version number
|
||||
-f, --foo enable some foo
|
||||
-b, --bar enable some bar
|
||||
-B, --baz enable some baz
|
||||
|
||||
Examples:
|
||||
|
||||
$ custom-help --help
|
||||
$ custom-help -h
|
||||
|
||||
```
|
||||
|
||||
## .outputHelp()
|
||||
|
||||
Output help information without exiting.
|
||||
|
||||
## .help()
|
||||
|
||||
Output help information and exit immediately.
|
||||
|
||||
## Links
|
||||
|
||||
- [API documentation](http://visionmedia.github.com/commander.js/)
|
||||
- [ascii tables](https://github.com/LearnBoost/cli-table)
|
||||
- [progress bars](https://github.com/visionmedia/node-progress)
|
||||
- [more progress bars](https://github.com/substack/node-multimeter)
|
||||
- [examples](https://github.com/visionmedia/commander.js/tree/master/examples)
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
33
node_modules/ltcdr/examples/coercion
generated
vendored
Executable file
33
node_modules/ltcdr/examples/coercion
generated
vendored
Executable file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
function range(val) {
|
||||
return val.split('..').map(Number);
|
||||
}
|
||||
|
||||
function list(val) {
|
||||
return val.split(',');
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.usage('test')
|
||||
.option('-i, --integer <n>', 'An integer argument', parseInt)
|
||||
.option('-f, --float <n>', 'A float argument', parseFloat)
|
||||
.option('-r, --range <a>..<b>', 'A range', range)
|
||||
.option('-l, --list <items>', 'A list', list)
|
||||
.option('-o, --optional [value]', 'An optional value')
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' int: %j', program.integer);
|
||||
console.log(' float: %j', program.float);
|
||||
console.log(' optional: %j', program.optional);
|
||||
program.range = program.range || [];
|
||||
console.log(' range: %j..%j', program.range[0], program.range[1]);
|
||||
console.log(' list: %j', program.list);
|
||||
console.log(' args: %j', program.args);
|
||||
32
node_modules/ltcdr/examples/custom-help
generated
vendored
Executable file
32
node_modules/ltcdr/examples/custom-help
generated
vendored
Executable file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
function list(val) {
|
||||
return val.split(',').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-f, --foo', 'enable some foo')
|
||||
.option('-b, --bar', 'enable some bar')
|
||||
.option('-B, --baz', 'enable some baz');
|
||||
|
||||
// must be before .parse() since
|
||||
// node's emit() is immediate
|
||||
|
||||
program.on('--help', function(){
|
||||
console.log(' Examples:');
|
||||
console.log('');
|
||||
console.log(' $ custom-help --help');
|
||||
console.log(' $ custom-help -h');
|
||||
console.log('');
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
program.help();
|
||||
22
node_modules/ltcdr/examples/defaults
generated
vendored
Executable file
22
node_modules/ltcdr/examples/defaults
generated
vendored
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
function list(val) {
|
||||
return val.split(',').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-t, --template-engine [engine]', 'Add template [engine] support', 'jade')
|
||||
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
|
||||
.option('-l, --list [items]', 'Specify list items defaulting to 1,2,3', list, [1,2,3])
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' - %s template engine', program.templateEngine);
|
||||
console.log(' - %s cheese', program.cheese);
|
||||
console.log(' - %j', program.list);
|
||||
45
node_modules/ltcdr/examples/deploy
generated
vendored
Executable file
45
node_modules/ltcdr/examples/deploy
generated
vendored
Executable file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-C, --chdir <path>', 'change the working directory')
|
||||
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||
.option('-T, --no-tests', 'ignore test hook')
|
||||
|
||||
program
|
||||
.command('setup [env]')
|
||||
.description('run setup commands for all envs')
|
||||
.option("-s, --setup_mode [mode]", "Which setup mode to use")
|
||||
.action(function(env, options){
|
||||
var mode = options.setup_mode || "normal";
|
||||
env = env || 'all';
|
||||
console.log('setup for %s env(s) with %s mode', env, mode);
|
||||
});
|
||||
|
||||
program
|
||||
.command('exec <cmd>')
|
||||
.description('execute the given remote cmd')
|
||||
.option("-e, --exec_mode <mode>", "Which exec mode to use")
|
||||
.action(function(cmd, options){
|
||||
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
|
||||
}).on('--help', function() {
|
||||
console.log(' Examples:');
|
||||
console.log();
|
||||
console.log(' $ deploy exec sequential');
|
||||
console.log(' $ deploy exec async');
|
||||
console.log();
|
||||
});
|
||||
|
||||
program
|
||||
.command('*')
|
||||
.action(function(env){
|
||||
console.log('deploying "%s"', env);
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
18
node_modules/ltcdr/examples/express
generated
vendored
Executable file
18
node_modules/ltcdr/examples/express
generated
vendored
Executable file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-s, --sessions', 'add session support')
|
||||
.option('-t, --template <engine>', 'specify template engine (jade|ejs) [jade]', 'jade')
|
||||
.option('-c, --css <engine>', 'specify stylesheet engine (stylus|sass|less) [css]', 'css')
|
||||
.parse(process.argv);
|
||||
|
||||
console.log(' - sessions %j', program.sessions);
|
||||
console.log(' - template %j', program.template);
|
||||
console.log(' - css %j', program.css);
|
||||
17
node_modules/ltcdr/examples/help
generated
vendored
Executable file
17
node_modules/ltcdr/examples/help
generated
vendored
Executable file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-f, --foo', 'enable some foo')
|
||||
.option('-b, --bar', 'enable some bar')
|
||||
.option('-B, --baz', 'enable some baz')
|
||||
.parse(process.argv);
|
||||
|
||||
if (!program.args.length) program.help();
|
||||
|
||||
28
node_modules/ltcdr/examples/pizza
generated
vendored
Executable file
28
node_modules/ltcdr/examples/pizza
generated
vendored
Executable file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --peppers', 'Add peppers')
|
||||
.option('-P, --pineapple', 'Add pineapple')
|
||||
.option('-b, --bbq', 'Add bbq sauce')
|
||||
.option('-c, --cheese <type>', 'Add the specified type of cheese [marble]')
|
||||
.option('-C, --no-cheese', 'You do not want any cheese')
|
||||
.parse(process.argv);
|
||||
|
||||
console.log('you ordered a pizza with:');
|
||||
if (program.peppers) console.log(' - peppers');
|
||||
if (program.pineapple) console.log(' - pineapple');
|
||||
if (program.bbq) console.log(' - bbq');
|
||||
|
||||
var cheese = true === program.cheese
|
||||
? 'marble'
|
||||
: program.cheese || 'no';
|
||||
|
||||
console.log(' - %s cheese', cheese);
|
||||
console.log(program.args);
|
||||
26
node_modules/ltcdr/examples/pm
generated
vendored
Executable file
26
node_modules/ltcdr/examples/pm
generated
vendored
Executable file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var program = require('..');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.command('install [name]', 'install one or more packages')
|
||||
.command('search [query]', 'search with optional query')
|
||||
.command('list', 'list packages installed')
|
||||
.parse(process.argv);
|
||||
|
||||
// here .command() is invoked with a description,
|
||||
// and no .action(callback) calls to handle sub-commands.
|
||||
// this tells commander that you're going to use separate
|
||||
// executables for sub-commands, much like git(1) and other
|
||||
// popular tools.
|
||||
|
||||
// here only ./pm-install(1) is implemented, however you
|
||||
// would define ./pm-search(1) and ./pm-list(1) etc.
|
||||
|
||||
// Try the following:
|
||||
// ./examples/pm
|
||||
// ./examples/pm help install
|
||||
// ./examples/pm install -h
|
||||
// ./examples/pm install foo bar baz
|
||||
// ./examples/pm install foo bar baz --force
|
||||
21
node_modules/ltcdr/examples/pm-install
generated
vendored
Executable file
21
node_modules/ltcdr/examples/pm-install
generated
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var program = require('..');
|
||||
|
||||
program
|
||||
.option('-f, --force', 'force installation')
|
||||
.parse(process.argv);
|
||||
|
||||
var pkgs = program.args;
|
||||
|
||||
if (!pkgs.length) {
|
||||
console.error('packages required');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log();
|
||||
if (program.force) console.log(' force: install');
|
||||
pkgs.forEach(function(pkg){
|
||||
console.log(' install : %s', pkg);
|
||||
});
|
||||
console.log();
|
||||
20
node_modules/ltcdr/index.js
generated
vendored
Normal file
20
node_modules/ltcdr/index.js
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
var Option = require('./lib/option');
|
||||
var Command = require('./lib/command');
|
||||
|
||||
/**
|
||||
* Expose the root command.
|
||||
*/
|
||||
|
||||
exports = module.exports = new Command();
|
||||
|
||||
/**
|
||||
* Expose `Command`.
|
||||
*/
|
||||
|
||||
exports.Command = Command;
|
||||
|
||||
/**
|
||||
* Expose `Option`.
|
||||
*/
|
||||
|
||||
exports.Option = Option;
|
||||
813
node_modules/ltcdr/lib/command.js
generated
vendored
Normal file
813
node_modules/ltcdr/lib/command.js
generated
vendored
Normal file
@ -0,0 +1,813 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var spawn = require('child_process').spawn;
|
||||
var fs = require('fs');
|
||||
var exists = fs.existsSync;
|
||||
var path = require('path');
|
||||
var dirname = path.dirname;
|
||||
var basename = path.basename;
|
||||
var Option = require('./option');
|
||||
/**
|
||||
* Initialize a new `Command`.
|
||||
*
|
||||
* @param {String} name
|
||||
* @api public
|
||||
*/
|
||||
module.exports = Command;
|
||||
|
||||
function Command(name) {
|
||||
this.commands = [];
|
||||
this.options = [];
|
||||
this._aliases = [];
|
||||
this._execs = [];
|
||||
this._args = [];
|
||||
this._name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inherit from `EventEmitter.prototype`.
|
||||
*/
|
||||
|
||||
Command.prototype.__proto__ = EventEmitter.prototype;
|
||||
|
||||
/**
|
||||
* Add command `name`.
|
||||
*
|
||||
* The `.action()` callback is invoked when the
|
||||
* command `name` is specified via __ARGV__,
|
||||
* and the remaining arguments are applied to the
|
||||
* function for access.
|
||||
*
|
||||
* When the `name` is "*" an un-matched command
|
||||
* will be passed as the first arg, followed by
|
||||
* the rest of __ARGV__ remaining.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* program
|
||||
* .version('0.0.1')
|
||||
* .option('-C, --chdir <path>', 'change the working directory')
|
||||
* .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||
* .option('-T, --no-tests', 'ignore test hook')
|
||||
*
|
||||
* program
|
||||
* .command('setup')
|
||||
* .description('run remote setup commands')
|
||||
* .action(function(){
|
||||
* console.log('setup');
|
||||
* });
|
||||
*
|
||||
* program
|
||||
* .command('exec <cmd>')
|
||||
* .description('run the given remote command')
|
||||
* .action(function(cmd){
|
||||
* console.log('exec "%s"', cmd);
|
||||
* });
|
||||
*
|
||||
* program
|
||||
* .command('*')
|
||||
* .description('deploy the given env')
|
||||
* .action(function(env){
|
||||
* console.log('deploying "%s"', env);
|
||||
* });
|
||||
*
|
||||
* program.parse(process.argv);
|
||||
*
|
||||
* @param {String} name
|
||||
* @param {String} [desc]
|
||||
* @return {Command} the new command
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.command = function(name, desc){
|
||||
var args = name.split(/ +/);
|
||||
var cmd = new Command(args.shift());
|
||||
if (desc) cmd.description(desc);
|
||||
if (desc) this.executables = true;
|
||||
if (desc) this._execs[cmd._name] = true;
|
||||
this.commands.push(cmd);
|
||||
cmd.parseExpectedArgs(args);
|
||||
cmd.parent = this;
|
||||
if (desc) return this;
|
||||
return cmd;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add an implicit `help [cmd]` subcommand
|
||||
* which invokes `--help` for the given command.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.addImplicitHelpCommand = function() {
|
||||
this.command('help [cmd]', 'display help for [cmd]');
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse expected `args`.
|
||||
*
|
||||
* For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
|
||||
*
|
||||
* @param {Array} args
|
||||
* @return {Command} for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.parseExpectedArgs = function(args){
|
||||
if (!args.length) return;
|
||||
var self = this;
|
||||
args.forEach(function(arg){
|
||||
switch (arg[0]) {
|
||||
case '<':
|
||||
self._args.push({ required: true, name: arg.slice(1, -1) });
|
||||
break;
|
||||
case '[':
|
||||
self._args.push({ required: false, name: arg.slice(1, -1) });
|
||||
break;
|
||||
}
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
|
||||
Command.prototype.aliases = Command.prototype.alias = function (names) {
|
||||
this._aliases = this._aliases.concat(names);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Register callback `fn` for the command.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* program
|
||||
* .command('help')
|
||||
* .description('display verbose help')
|
||||
* .action(function(){
|
||||
* // output help here
|
||||
* });
|
||||
*
|
||||
* @param {Function} fn
|
||||
* @return {Command} for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.action = function(fn){
|
||||
var self = this;
|
||||
|
||||
function actionHandler(args, unknown) {
|
||||
// Parse any so-far unknown options
|
||||
unknown = unknown || [];
|
||||
var parsed = self.parseOptions(unknown);
|
||||
|
||||
// Output help if necessary
|
||||
outputHelpIfNecessary(self, parsed.unknown);
|
||||
|
||||
// If there are still any unknown options, then we simply
|
||||
// die, unless someone asked for help, in which case we give it
|
||||
// to them, and then we die.
|
||||
if (parsed.unknown.length > 0) {
|
||||
self.unknownOption(parsed.unknown[0]);
|
||||
}
|
||||
|
||||
// Leftover arguments need to be pushed back. Fixes issue #56
|
||||
if (parsed.args.length) args = parsed.args.concat(args);
|
||||
|
||||
self._args.forEach(function(arg, i){
|
||||
if (arg.required && null == args[i]) {
|
||||
self.missingArgument(arg.name);
|
||||
}
|
||||
});
|
||||
|
||||
// Always append ourselves to the end of the arguments,
|
||||
// to make sure we match the number of arguments the user
|
||||
// expects
|
||||
if (self._args.length) {
|
||||
args[self._args.length] = self;
|
||||
} else {
|
||||
args.push(self);
|
||||
}
|
||||
|
||||
fn.apply(this, args);
|
||||
}
|
||||
|
||||
// bind original command
|
||||
self.parent.on(this._name, actionHandler);
|
||||
|
||||
// bind aliases, if any
|
||||
if (this._aliases) {
|
||||
this._aliases.forEach(function (alias) {
|
||||
if (typeof alias === 'string') {
|
||||
self.parent.on(alias, actionHandler);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Define option with `flags`, `description` and optional
|
||||
* coercion `fn`.
|
||||
*
|
||||
* The `flags` string should contain both the short and long flags,
|
||||
* separated by comma, a pipe or space. The following are all valid
|
||||
* all will output this way when `--help` is used.
|
||||
*
|
||||
* "-p, --pepper"
|
||||
* "-p|--pepper"
|
||||
* "-p --pepper"
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* // simple boolean defaulting to false
|
||||
* program.option('-p, --pepper', 'add pepper');
|
||||
*
|
||||
* --pepper
|
||||
* program.pepper
|
||||
* // => Boolean
|
||||
*
|
||||
* // simple boolean defaulting to false
|
||||
* program.option('-C, --no-cheese', 'remove cheese');
|
||||
*
|
||||
* program.cheese
|
||||
* // => true
|
||||
*
|
||||
* --no-cheese
|
||||
* program.cheese
|
||||
* // => true
|
||||
*
|
||||
* // required argument
|
||||
* program.option('-C, --chdir <path>', 'change the working directory');
|
||||
*
|
||||
* --chdir /tmp
|
||||
* program.chdir
|
||||
* // => "/tmp"
|
||||
*
|
||||
* // optional argument
|
||||
* program.option('-c, --cheese [type]', 'add cheese [marble]');
|
||||
*
|
||||
* @param {String} flags
|
||||
* @param {String} description
|
||||
* @param {Function|Mixed} fn or default
|
||||
* @param {Mixed} defaultValue
|
||||
* @return {Command} for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.option = function(flags, description, fn, defaultValue){
|
||||
var self = this
|
||||
, option = new Option(flags, description)
|
||||
, oname = option.name()
|
||||
, name = camelcase(oname);
|
||||
|
||||
// default as 3rd arg
|
||||
if ('function' != typeof fn) defaultValue = fn, fn = null;
|
||||
|
||||
// preassign default value only for --no-*, [optional], or <required>
|
||||
if (false == option.bool || option.optional || option.required) {
|
||||
// when --no-* we make sure default is true
|
||||
if (false == option.bool) defaultValue = true;
|
||||
// preassign only if we have a default
|
||||
if (undefined !== defaultValue) self[name] = defaultValue;
|
||||
}
|
||||
|
||||
// register the option
|
||||
this.options.push(option);
|
||||
|
||||
// when it's passed assign the value
|
||||
// and conditionally invoke the callback
|
||||
this.on(oname, function(val){
|
||||
// coercion
|
||||
if (null != val && fn) val = fn(val);
|
||||
|
||||
// unassigned or bool
|
||||
if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
|
||||
// if no value, bool true, and we have a default, then use it!
|
||||
if (null == val) {
|
||||
self[name] = option.bool
|
||||
? defaultValue || true
|
||||
: false;
|
||||
} else {
|
||||
self[name] = val;
|
||||
}
|
||||
} else if (null !== val) {
|
||||
// reassign
|
||||
self[name] = val;
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse `argv`, settings options and invoking commands when defined.
|
||||
*
|
||||
* @param {Array} argv
|
||||
* @return {Command} for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.parse = function(argv){
|
||||
// implicit help
|
||||
if (this.executables) this.addImplicitHelpCommand();
|
||||
|
||||
// store raw args
|
||||
this.rawArgs = argv;
|
||||
|
||||
// guess name
|
||||
this._name = this._name || basename(argv[1], '.js');
|
||||
|
||||
// process argv
|
||||
var parsed = this.parseOptions(this.normalize(argv.slice(2)));
|
||||
var args = this.args = parsed.args;
|
||||
|
||||
var result = this.parseArgs(this.args, parsed.unknown);
|
||||
|
||||
// executable sub-commands
|
||||
var name = result.args[0];
|
||||
if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Execute a sub-command executable.
|
||||
*
|
||||
* @param {Array} argv
|
||||
* @param {Array} args
|
||||
* @param {Array} unknown
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.executeSubCommand = function(argv, args, unknown) {
|
||||
args = args.concat(unknown);
|
||||
|
||||
if (!args.length) this.help();
|
||||
if ('help' == args[0] && 1 == args.length) this.help();
|
||||
|
||||
// <cmd> --help
|
||||
if ('help' == args[0]) {
|
||||
args[0] = args[1];
|
||||
args[1] = '--help';
|
||||
}
|
||||
|
||||
// executable
|
||||
var dir = dirname(argv[1]);
|
||||
var bin = basename(argv[1], '.js') + '-' + args[0];
|
||||
|
||||
// check for ./<bin> first
|
||||
var local = path.join(dir, bin);
|
||||
|
||||
// run it
|
||||
args = args.slice(1);
|
||||
args.unshift(local);
|
||||
var proc = spawn('node', args, { stdio: 'inherit', customFds: [0, 1, 2] });
|
||||
proc.on('error', function(err){
|
||||
if (err.code == "ENOENT") {
|
||||
console.error('\n %s(1) does not exist, try --help\n', bin);
|
||||
} else if (err.code == "EACCES") {
|
||||
console.error('\n %s(1) not executable. try chmod or run with root\n', bin);
|
||||
}
|
||||
});
|
||||
|
||||
this.runningCommand = proc;
|
||||
};
|
||||
|
||||
/**
|
||||
* Normalize `args`, splitting joined short flags. For example
|
||||
* the arg "-abc" is equivalent to "-a -b -c".
|
||||
* This also normalizes equal sign and splits "--abc=def" into "--abc def".
|
||||
*
|
||||
* @param {Array} args
|
||||
* @return {Array}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.normalize = function(args){
|
||||
var ret = []
|
||||
, arg
|
||||
, lastOpt
|
||||
, index;
|
||||
|
||||
for (var i = 0, len = args.length; i < len; ++i) {
|
||||
arg = args[i];
|
||||
i > 0 && (lastOpt = this.optionFor(args[i-1]));
|
||||
|
||||
if (lastOpt && lastOpt.required) {
|
||||
ret.push(arg);
|
||||
} else if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
|
||||
arg.slice(1).split('').forEach(function(c){
|
||||
ret.push('-' + c);
|
||||
});
|
||||
} else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
|
||||
ret.push(arg.slice(0, index), arg.slice(index + 1));
|
||||
} else {
|
||||
ret.push(arg);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse command `args`.
|
||||
*
|
||||
* When listener(s) are available those
|
||||
* callbacks are invoked, otherwise the "*"
|
||||
* event is emitted and those actions are invoked.
|
||||
*
|
||||
* @param {Array} args
|
||||
* @return {Command} for chaining
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.parseArgs = function(args, unknown){
|
||||
var cmds = this.commands
|
||||
, len = cmds.length
|
||||
, name;
|
||||
|
||||
if (args.length) {
|
||||
name = args[0];
|
||||
if (this.listeners(name).length) {
|
||||
this.emit(args.shift(), args, unknown);
|
||||
} else {
|
||||
this.emit('*', args);
|
||||
}
|
||||
} else {
|
||||
outputHelpIfNecessary(this, unknown);
|
||||
|
||||
// If there were no args and we have unknown options,
|
||||
// then they are extraneous and we need to error.
|
||||
if (unknown.length > 0) {
|
||||
this.unknownOption(unknown[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return an option matching `arg` if any.
|
||||
*
|
||||
* @param {String} arg
|
||||
* @return {Option}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.optionFor = function(arg){
|
||||
for (var i = 0, len = this.options.length; i < len; ++i) {
|
||||
if (this.options[i].is(arg)) {
|
||||
return this.options[i];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse options from `argv` returning `argv`
|
||||
* void of these options.
|
||||
*
|
||||
* @param {Array} argv
|
||||
* @return {Array}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.parseOptions = function(argv){
|
||||
var args = []
|
||||
, len = argv.length
|
||||
, literal
|
||||
, option
|
||||
, arg;
|
||||
|
||||
var unknownOptions = [];
|
||||
|
||||
// parse options
|
||||
for (var i = 0; i < len; ++i) {
|
||||
arg = argv[i];
|
||||
|
||||
// literal args after --
|
||||
if ('--' == arg) {
|
||||
literal = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (literal) {
|
||||
args.push(arg);
|
||||
continue;
|
||||
}
|
||||
|
||||
// find matching Option
|
||||
option = this.optionFor(arg);
|
||||
|
||||
// option is defined
|
||||
if (option) {
|
||||
// requires arg
|
||||
if (option.required) {
|
||||
arg = argv[++i];
|
||||
if (null == arg) return this.optionMissingArgument(option);
|
||||
this.emit(option.name(), arg);
|
||||
// optional arg
|
||||
} else if (option.optional) {
|
||||
arg = argv[i+1];
|
||||
if (null == arg || ('-' == arg[0] && '-' != arg)) {
|
||||
arg = null;
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
this.emit(option.name(), arg);
|
||||
// bool
|
||||
} else {
|
||||
this.emit(option.name());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// looks like an option
|
||||
if (arg.length > 1 && '-' == arg[0]) {
|
||||
unknownOptions.push(arg);
|
||||
|
||||
// If the next argument looks like it might be
|
||||
// an argument for this option, we pass it on.
|
||||
// If it isn't, then it'll simply be ignored
|
||||
if (argv[i+1] && '-' != argv[i+1][0]) {
|
||||
unknownOptions.push(argv[++i]);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// arg
|
||||
args.push(arg);
|
||||
}
|
||||
|
||||
return { args: args, unknown: unknownOptions };
|
||||
};
|
||||
|
||||
/**
|
||||
* Argument `name` is missing.
|
||||
*
|
||||
* @param {String} name
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.missingArgument = function(name){
|
||||
console.error();
|
||||
console.error(" error: missing required argument `%s'", name);
|
||||
console.error();
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* `Option` is missing an argument, but received `flag` or nothing.
|
||||
*
|
||||
* @param {String} option
|
||||
* @param {String} flag
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.optionMissingArgument = function(option, flag){
|
||||
console.error();
|
||||
if (flag) {
|
||||
console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
|
||||
} else {
|
||||
console.error(" error: option `%s' argument missing", option.flags);
|
||||
}
|
||||
console.error();
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Unknown option `flag`.
|
||||
*
|
||||
* @param {String} flag
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.unknownOption = function(flag){
|
||||
console.error();
|
||||
console.error(" error: unknown option `%s'", flag);
|
||||
console.error();
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Set the program version to `str`.
|
||||
*
|
||||
* This method auto-registers the "-V, --version" flag
|
||||
* which will print the version number when passed.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {String} flags
|
||||
* @return {Command} for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.version = function(str, flags){
|
||||
if (0 == arguments.length) return this._version;
|
||||
this._version = str;
|
||||
flags = flags || '-V, --version';
|
||||
this.option(flags, 'output the version number');
|
||||
this.on('version', function(){
|
||||
console.log(str);
|
||||
process.exit(0);
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the description `str`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @return {String|Command}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.description = function(str){
|
||||
if (0 == arguments.length) return this._description;
|
||||
this._description = str;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set / get the command usage `str`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @return {String|Command}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.usage = function(str){
|
||||
var args = this._args.map(function(arg){
|
||||
return arg.required
|
||||
? '<' + arg.name + '>'
|
||||
: '[' + arg.name + ']';
|
||||
});
|
||||
|
||||
var usage = '[options'
|
||||
+ (this.commands.length ? '] [command' : '')
|
||||
+ ']'
|
||||
+ (this._args.length ? ' ' + args : '');
|
||||
|
||||
if (0 == arguments.length) return this._usage || usage;
|
||||
this._usage = str;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the largest option length.
|
||||
*
|
||||
* @return {Number}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.largestOptionLength = function(){
|
||||
return this.options.reduce(function(max, option){
|
||||
return Math.max(max, option.flags.length);
|
||||
}, 0);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return help for options.
|
||||
*
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.optionHelp = function(){
|
||||
var width = this.largestOptionLength();
|
||||
|
||||
// Prepend the help information
|
||||
return [pad('-h, --help', width) + ' ' + 'output usage information']
|
||||
.concat(this.options.map(function(option){
|
||||
return pad(option.flags, width)
|
||||
+ ' ' + option.description;
|
||||
}))
|
||||
.join('\n');
|
||||
};
|
||||
|
||||
/**
|
||||
* Return command help documentation.
|
||||
*
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.commandHelp = function(){
|
||||
if (!this.commands.length) return '';
|
||||
return [
|
||||
''
|
||||
, ' Commands:'
|
||||
, ''
|
||||
, this.commands.map(function(cmd){
|
||||
var args = cmd._args.map(function(arg){
|
||||
return arg.required
|
||||
? '<' + arg.name + '>'
|
||||
: '[' + arg.name + ']';
|
||||
}).join(' ');
|
||||
|
||||
return pad(cmd._name
|
||||
+ (cmd.options.length
|
||||
? ' [options]'
|
||||
: '') + ' ' + args, 22)
|
||||
+ (cmd.description()
|
||||
? ' ' + cmd.description()
|
||||
: '');
|
||||
}).join('\n').replace(/^/gm, ' ')
|
||||
, ''
|
||||
].join('\n');
|
||||
};
|
||||
|
||||
/**
|
||||
* Return program help documentation.
|
||||
*
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Command.prototype.helpInformation = function(){
|
||||
return [
|
||||
''
|
||||
, ' Usage: ' + this._name + ' ' + this.usage()
|
||||
, '' + this.commandHelp()
|
||||
, ' Options:'
|
||||
, ''
|
||||
, '' + this.optionHelp().replace(/^/gm, ' ')
|
||||
, ''
|
||||
, ''
|
||||
].join('\n');
|
||||
};
|
||||
|
||||
/**
|
||||
* Output help information for this command
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.outputHelp = function(){
|
||||
process.stdout.write(this.helpInformation());
|
||||
this.emit('--help');
|
||||
};
|
||||
|
||||
/**
|
||||
* Output help information and exit.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Command.prototype.help = function(){
|
||||
this.outputHelp();
|
||||
process.exit();
|
||||
};
|
||||
|
||||
/**
|
||||
* Camel-case the given `flag`
|
||||
*
|
||||
* @param {String} flag
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function camelcase(flag) {
|
||||
return flag.split('-').reduce(function(str, word){
|
||||
return str + word[0].toUpperCase() + word.slice(1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad `str` to `width`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Number} width
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function pad(str, width) {
|
||||
var len = Math.max(0, width - str.length);
|
||||
return str + Array(len + 1).join(' ');
|
||||
}
|
||||
|
||||
/**
|
||||
* Output help information if necessary
|
||||
*
|
||||
* @param {Command} command to output help for
|
||||
* @param {Array} array of options to search for -h or --help
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function outputHelpIfNecessary(cmd, options) {
|
||||
options = options || [];
|
||||
for (var i = 0; i < options.length; i++) {
|
||||
if (options[i] == '--help' || options[i] == '-h') {
|
||||
cmd.outputHelp();
|
||||
process.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
45
node_modules/ltcdr/lib/option.js
generated
vendored
Normal file
45
node_modules/ltcdr/lib/option.js
generated
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Initialize a new `Option` with the given `flags` and `description`.
|
||||
*
|
||||
* @param {String} flags
|
||||
* @param {String} description
|
||||
* @api public
|
||||
*/
|
||||
module.exports = Option;
|
||||
|
||||
function Option(flags, description) {
|
||||
this.flags = flags;
|
||||
this.required = ~flags.indexOf('<');
|
||||
this.optional = ~flags.indexOf('[');
|
||||
this.bool = !~flags.indexOf('-no-');
|
||||
flags = flags.split(/[ ,|]+/);
|
||||
if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
|
||||
this.long = flags.shift();
|
||||
this.description = description || '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Return option name.
|
||||
*
|
||||
* @return {String}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Option.prototype.name = function(){
|
||||
return this.long
|
||||
.replace('--', '')
|
||||
.replace('no-', '');
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if `arg` matches the short or long flag.
|
||||
*
|
||||
* @param {String} arg
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Option.prototype.is = function(arg){
|
||||
return arg == this.short
|
||||
|| arg == this.long;
|
||||
};
|
||||
60
node_modules/ltcdr/package.json
generated
vendored
Normal file
60
node_modules/ltcdr/package.json
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"_from": "ltcdr@^2.2.1",
|
||||
"_id": "ltcdr@2.2.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-Wrh60dTB2rjowIu/A37gwZAih88=",
|
||||
"_location": "/ltcdr",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "ltcdr@^2.2.1",
|
||||
"name": "ltcdr",
|
||||
"escapedName": "ltcdr",
|
||||
"rawSpec": "^2.2.1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^2.2.1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/copyfiles"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/ltcdr/-/ltcdr-2.2.1.tgz",
|
||||
"_shasum": "5ab87ad1d4c1dab8e8c08bbf037ee0c1902287cf",
|
||||
"_spec": "ltcdr@^2.2.1",
|
||||
"_where": "/Users/stefanfejes/Projects/30-seconds-of-python-code/node_modules/copyfiles",
|
||||
"author": {
|
||||
"name": "TJ Holowaychuk",
|
||||
"email": "tj@vision-media.ca"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/calvinmetcalf/ltcdr/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "the complete solution for node.js command-line programs",
|
||||
"devDependencies": {
|
||||
"tap-spec": "^0.1.5",
|
||||
"tape": "^2.10.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6.x"
|
||||
},
|
||||
"homepage": "https://github.com/calvinmetcalf/ltcdr#readme",
|
||||
"keywords": [
|
||||
"command",
|
||||
"option",
|
||||
"parser",
|
||||
"prompt",
|
||||
"stdin"
|
||||
],
|
||||
"main": "index",
|
||||
"name": "ltcdr",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/calvinmetcalf/ltcdr.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape test/test.*.js | tspec"
|
||||
},
|
||||
"version": "2.2.1"
|
||||
}
|
||||
19
node_modules/ltcdr/test/test.literal.args.js
generated
vendored
Normal file
19
node_modules/ltcdr/test/test.literal.args.js
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-f, --foo', 'add some foo')
|
||||
.option('-b, --bar', 'add some bar');
|
||||
|
||||
program.parse(['node', 'test', '--foo', '--', '--bar', 'baz']);
|
||||
test('literal args', function (t) {
|
||||
t.ok(program.foo);
|
||||
t.equal(program.bar, undefined);
|
||||
t.deepEqual(program.args, ['--bar', 'baz']);
|
||||
t.end();
|
||||
});
|
||||
24
node_modules/ltcdr/test/test.options.alias.js
generated
vendored
Normal file
24
node_modules/ltcdr/test/test.options.alias.js
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
|
||||
test('options alias', function (t) {
|
||||
t.plan(3);
|
||||
var i = 1;
|
||||
program
|
||||
.command('initialize <name>')
|
||||
.alias('init')
|
||||
.alias('i')
|
||||
.action(function () {
|
||||
t.pass('passed ' + i++);
|
||||
});
|
||||
|
||||
program.parse(['node', 'test', 'initialize', 'pepper']);
|
||||
program.parse(['node', 'test', 'init', 'pepper']);
|
||||
program.parse(['node', 'test', 'i', 'pepper']);
|
||||
});
|
||||
17
node_modules/ltcdr/test/test.options.args.optional.given.js
generated
vendored
Normal file
17
node_modules/ltcdr/test/test.options.args.optional.given.js
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-c, --cheese [type]', 'optionally specify the type of cheese');
|
||||
|
||||
program.parse(['node', 'test', '--cheese', 'feta']);
|
||||
test('options camelcase', function (t) {
|
||||
t.equals(program.cheese, 'feta');
|
||||
t.end();
|
||||
});
|
||||
17
node_modules/ltcdr/test/test.options.args.optional.js
generated
vendored
Normal file
17
node_modules/ltcdr/test/test.options.args.optional.js
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-c, --cheese [type]', 'optionally specify the type of cheese');
|
||||
|
||||
program.parse(['node', 'test', '--cheese']);
|
||||
test('options camelcase', function (t) {
|
||||
t.ok(program.cheese);
|
||||
t.end();
|
||||
});
|
||||
19
node_modules/ltcdr/test/test.options.bool.js
generated
vendored
Normal file
19
node_modules/ltcdr/test/test.options.bool.js
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --pepper', 'add pepper')
|
||||
.option('-c, --no-cheese', 'remove cheese');
|
||||
|
||||
program.parse(['node', 'test', '--pepper']);
|
||||
test('options camelcase', function (t) {
|
||||
t.ok(program.pepper);
|
||||
t.ok(program.cheese);
|
||||
t.end();
|
||||
});
|
||||
19
node_modules/ltcdr/test/test.options.bool.no.js
generated
vendored
Normal file
19
node_modules/ltcdr/test/test.options.bool.no.js
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --pepper', 'add pepper')
|
||||
.option('-c|--no-cheese', 'remove cheese');
|
||||
|
||||
program.parse(['node', 'test', '--no-cheese']);
|
||||
test('options bool no', function (t) {
|
||||
t.equals(program.pepper, undefined);
|
||||
t.equals(program.cheese, false);
|
||||
t.end();
|
||||
});
|
||||
19
node_modules/ltcdr/test/test.options.bool.small.combined.js
generated
vendored
Normal file
19
node_modules/ltcdr/test/test.options.bool.small.combined.js
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --pepper', 'add pepper')
|
||||
.option('-c, --no-cheese', 'remove cheese');
|
||||
|
||||
program.parse(['node', 'test', '-pc']);
|
||||
test('options bool small combined', function (t) {
|
||||
t.ok(program.pepper);
|
||||
t.equals(program.cheese, false);
|
||||
t.end();
|
||||
});
|
||||
19
node_modules/ltcdr/test/test.options.bool.small.js
generated
vendored
Normal file
19
node_modules/ltcdr/test/test.options.bool.small.js
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-p, --pepper', 'add pepper')
|
||||
.option('-c, --no-cheese', 'remove cheese');
|
||||
|
||||
program.parse(['node', 'test', '-p', '-c']);
|
||||
test('options bool, small', function (t) {
|
||||
t.ok(program.pepper);
|
||||
t.equals(program.cheese, false);
|
||||
t.end();
|
||||
});
|
||||
31
node_modules/ltcdr/test/test.options.camelcase.js
generated
vendored
Normal file
31
node_modules/ltcdr/test/test.options.camelcase.js
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
function parseRange(str) {
|
||||
return str.split('..').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-i, --my-int <n>', 'pass an int', parseInt)
|
||||
.option('-n, --my-num <n>', 'pass a number', Number)
|
||||
.option('-f, --my-fLOAT <n>', 'pass a float', parseFloat)
|
||||
.option('-m, --my-very-long-float <n>', 'pass a float', parseFloat)
|
||||
.option('-u, --my-URL-count <n>', 'pass a float', parseFloat)
|
||||
.option('-r, --my-long-range <a..b>', 'pass a range', parseRange);
|
||||
|
||||
program.parse('node test -i 5.5 -f 5.5 -m 6.5 -u 7.5 -n 15.99 -r 1..5'.split(' '));
|
||||
test('options camelcase', function (t) {
|
||||
t.equals(program.myInt, 5);
|
||||
t.equals(program.myNum, 15.99);
|
||||
t.equals(program.myFLOAT, 5.5);
|
||||
t.equals(program.myVeryLongFloat, 6.5);
|
||||
t.equals(program.myURLCount, 7.5);
|
||||
t.deepEquals(program.myLongRange, [1,5]);
|
||||
t.end();
|
||||
});
|
||||
26
node_modules/ltcdr/test/test.options.cflags.js
generated
vendored
Normal file
26
node_modules/ltcdr/test/test.options.cflags.js
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-c, --cflags <cflags>', 'pass options/flags to a compiler')
|
||||
.option('-o, --other', 'just some other option')
|
||||
.option('-x, --xother', 'just some other option')
|
||||
.option('-y, --yother', 'just some other option')
|
||||
.option('-z, --zother', 'just some other option');
|
||||
|
||||
|
||||
program.parse(['node', 'test', '--cflags', '-DDEBUG', '-o', '-xyz']);
|
||||
test('cflags', function(t) {
|
||||
t.equals(program.cflags, '-DDEBUG');
|
||||
t.ok(program.other);
|
||||
t.ok(program.xother);
|
||||
t.ok(program.yother);
|
||||
t.ok(program.zother);
|
||||
t.end();
|
||||
});
|
||||
27
node_modules/ltcdr/test/test.options.coercion.js
generated
vendored
Normal file
27
node_modules/ltcdr/test/test.options.coercion.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
function parseRange(str) {
|
||||
return str.split('..').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-i, --int <n>', 'pass an int', parseInt)
|
||||
.option('-n, --num <n>', 'pass a number', Number)
|
||||
.option('-f, --float <n>', 'pass a float', parseFloat)
|
||||
.option('-r, --range <a..b>', 'pass a range', parseRange);
|
||||
|
||||
program.parse('node test -i 5.5 -f 5.5 -n 15.99 -r 1..5'.split(' '));
|
||||
test('option coercion', function(t) {
|
||||
t.equals(program.int, 5);
|
||||
t.equals(program.num, 15.99);
|
||||
t.equals(program.float, 5.5);
|
||||
t.deepEquals(program.range, [1,5]);
|
||||
t.end();
|
||||
});
|
||||
188
node_modules/ltcdr/test/test.options.commands.js
generated
vendored
Normal file
188
node_modules/ltcdr/test/test.options.commands.js
generated
vendored
Normal file
@ -0,0 +1,188 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-C, --chdir <path>', 'change the working directory')
|
||||
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||
.option('-T, --no-tests', 'ignore test hook')
|
||||
|
||||
var envValue = '';
|
||||
var cmdValue = '';
|
||||
var nameValue = '';
|
||||
var customHelp = false;
|
||||
|
||||
program
|
||||
.command('setup [env]')
|
||||
.description('run setup commands for all envs')
|
||||
.option('-s, --setup_mode [mode]', 'Which setup mode to use')
|
||||
.option('-o, --host [host]', 'Host to use')
|
||||
.action(function(env, options){
|
||||
var mode = options.setup_mode || 'normal';
|
||||
env = env || 'all';
|
||||
|
||||
envValue = env;
|
||||
});
|
||||
|
||||
program
|
||||
.command('exec <cmd>')
|
||||
.aliases('run')
|
||||
.description('execute the given remote cmd')
|
||||
.option('-e, --exec_mode <mode>', 'Which exec mode to use')
|
||||
.option('-t, --target [target]', 'Target to use')
|
||||
.action(function(cmd, options){
|
||||
cmdValue = cmd;
|
||||
}).on('--help', function(){
|
||||
customHelp = true;
|
||||
});
|
||||
|
||||
program
|
||||
.command('initialize <name>')
|
||||
.aliases(['init', 'i'])
|
||||
.description('Initialises the config')
|
||||
.action(function (name) {
|
||||
nameValue = name;
|
||||
});
|
||||
|
||||
program
|
||||
.command('*')
|
||||
.action(function(env){
|
||||
console.log('deploying \'%s\'', env);
|
||||
});
|
||||
|
||||
|
||||
test('test 1', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf']);
|
||||
t.equals(program.config, 'conf');
|
||||
t.notOk(program.command[0] && 'setup_mode' in program.command[0]);
|
||||
t.notOk(program.command[1] && 'exec_mode' in program.command[1]);
|
||||
t.notOk(envValue);
|
||||
t.notOk(cmdValue);
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 2', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf1', 'setup', '--setup_mode', 'mode3', 'env1']);
|
||||
t.equals(program.config, 'conf1');
|
||||
t.equals(program.commands[0].setup_mode, 'mode3');
|
||||
t.equals(program.commands[0].host, undefined);
|
||||
t.equals(envValue, 'env1');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 3', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf2', 'setup', '--setup_mode', 'mode3', '-o', 'host1', 'env2']);
|
||||
t.equals(program.config, 'conf2');
|
||||
t.equals(program.commands[0].setup_mode, 'mode3');
|
||||
t.equals(program.commands[0].host, 'host1');
|
||||
t.equals(envValue, 'env2');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 4', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf3', 'setup', '-s', 'mode4', 'env3']);
|
||||
t.equals(program.config, 'conf3');
|
||||
t.equals(program.commands[0].setup_mode, 'mode4');
|
||||
t.equals(envValue, 'env3');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 5', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf4', 'exec', '--exec_mode', 'mode1', 'exec1']);
|
||||
t.equals(program.config, 'conf4');
|
||||
t.equals(program.commands[1].exec_mode, 'mode1');
|
||||
t.notOk('target' in program.commands[1]);
|
||||
t.equals(cmdValue, 'exec1');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 6', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf5', 'exec', '-e', 'mode2', 'exec2']);
|
||||
t.equals(program.config, 'conf5');
|
||||
t.equals(program.commands[1].exec_mode, 'mode2');
|
||||
t.equals(cmdValue, 'exec2');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('test 7', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf6', 'exec', '--target', 'target1', '-e', 'mode2', 'exec3']);
|
||||
t.equals(program.config, 'conf6');
|
||||
t.equals(program.commands[1].exec_mode, 'mode2');
|
||||
t.equals(program.commands[1].target, 'target1');
|
||||
t.equals(cmdValue, 'exec3');
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('has aliases', function (t) {
|
||||
program.parse(['node', 'test', '--config', 'conf7', 'exec', '--target', 'target7', '-e', 'mode7', 'exec7']);
|
||||
t.equals(program.config, 'conf7');
|
||||
t.equals(program.commands[1]._aliases[0], 'run');
|
||||
t.equals(program.commands[1].exec_mode, 'mode7');
|
||||
t.equals(program.commands[1].target, 'target7');
|
||||
t.equals(cmdValue, 'exec7');
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('multiple aliases', function (t) {
|
||||
program.parse(['node', 'test', 'initialize', 'config8']);
|
||||
|
||||
var command = program.commands[2],
|
||||
expectedAliases = ['init', 'i'];
|
||||
|
||||
t.equals(command._name, 'initialize');
|
||||
t.same(command._aliases, expectedAliases);
|
||||
t.equals(nameValue, 'config8');
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('running an alias', function (t) {
|
||||
program.parse(['node', 'test', 'init', 'config9']);
|
||||
|
||||
var command = program.commands[2];
|
||||
|
||||
t.equals(command._aliases.length, 2);
|
||||
t.equals(command._name, 'initialize');
|
||||
t.equals(nameValue, 'config9');
|
||||
t.end();
|
||||
});
|
||||
|
||||
// Make sure we still catch errors with required values for options
|
||||
test('errors', function (t) {
|
||||
|
||||
var exceptionOccurred = false;
|
||||
var oldProcessExit = process.exit;
|
||||
var oldConsoleError = console.error;
|
||||
process.exit = function() { exceptionOccurred = true; throw new Error(); };
|
||||
console.error = function() {};
|
||||
t.test('should work even if it throws', function (t) {
|
||||
try {
|
||||
program.parse(['node', 'test', '--config', 'conf6', 'exec', '--help']);
|
||||
} catch(ex) {
|
||||
t.equals(program.config, 'conf6');
|
||||
t.end();
|
||||
}
|
||||
});
|
||||
t.test('should exid right', function (t) {
|
||||
try {
|
||||
program.parse(['node', 'test', '--config', 'conf', 'exec', '-t', 'target1', 'exec1', '-e']);
|
||||
}
|
||||
catch(ex) {
|
||||
}
|
||||
|
||||
process.exit = oldProcessExit;
|
||||
t.ok(exceptionOccurred);
|
||||
t.ok(customHelp);
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
27
node_modules/ltcdr/test/test.options.defaults.given.js
generated
vendored
Normal file
27
node_modules/ltcdr/test/test.options.defaults.given.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-a, --anchovies', 'Add anchovies?')
|
||||
.option('-o, --onions', 'Add onions?', true)
|
||||
.option('-v, --olives', 'Add olives? Sorry we only have black.', 'black')
|
||||
.option('-s, --no-sauce', 'Uh… okay')
|
||||
.option('-r, --crust <type>', 'What kind of crust would you like?', 'hand-tossed')
|
||||
.option('-c, --cheese [type]', 'optionally specify the type of cheese', 'mozzarella');
|
||||
|
||||
program.parse(['node', 'test', '--anchovies', '--onions', '--olives', '--no-sauce', '--crust', 'thin', '--cheese', 'wensleydale']);
|
||||
test('options defaults given', function (t) {
|
||||
t.equals(program.anchovies, true);
|
||||
t.equals(program.onions, true);
|
||||
t.equals(program.olives, 'black');
|
||||
t.equals(program.sauce, false);
|
||||
t.equals(program.crust, 'thin');
|
||||
t.equals(program.cheese, 'wensleydale');
|
||||
t.end();
|
||||
});
|
||||
27
node_modules/ltcdr/test/test.options.defaults.js
generated
vendored
Normal file
27
node_modules/ltcdr/test/test.options.defaults.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-a, --anchovies', 'Add anchovies?')
|
||||
.option('-o, --onions', 'Add onions?', true)
|
||||
.option('-v, --olives', 'Add olives? Sorry we only have black.', 'black')
|
||||
.option('-s, --no-sauce', 'Uh… okay')
|
||||
.option('-r, --crust <type>', 'What kind of crust would you like?', 'hand-tossed')
|
||||
.option('-c, --cheese [type]', 'optionally specify the type of cheese', 'mozzarella');
|
||||
|
||||
program.parse(['node', 'test']);
|
||||
test('options defaults', function (t) {
|
||||
t.notOk(program.anchovies);
|
||||
t.notOk(program.onions);
|
||||
t.notOk(program.olives);
|
||||
t.equals(program.sauce, true);
|
||||
t.equals(program.crust, 'hand-tossed');
|
||||
t.equals(program.cheese, 'mozzarella');
|
||||
t.end();
|
||||
});
|
||||
21
node_modules/ltcdr/test/test.options.equals.js
generated
vendored
Normal file
21
node_modules/ltcdr/test/test.options.equals.js
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('--string <n>', 'pass a string')
|
||||
.option('--string2 <n>', 'pass another string')
|
||||
.option('--num <n>', 'pass a number', Number);
|
||||
|
||||
program.parse('node test --string=Hello --string2 Hello=World --num=5.5'.split(' '));
|
||||
test('options equals', function (t) {
|
||||
t.equals(program.string, 'Hello');
|
||||
t.equals(program.string2, 'Hello=World');
|
||||
t.equals(program.num, 5.5);
|
||||
t.end();
|
||||
});
|
||||
27
node_modules/ltcdr/test/test.options.hyphen.js
generated
vendored
Normal file
27
node_modules/ltcdr/test/test.options.hyphen.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
function parseRange(str) {
|
||||
return str.split('..').map(Number);
|
||||
}
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-a, --alpha <a>', 'hyphen')
|
||||
.option('-b, --bravo <b>', 'hyphen')
|
||||
.option('-c, --charlie <c>', 'hyphen');
|
||||
|
||||
program.parse('node test -a - --bravo - --charlie=- - -- -'.split(' '));
|
||||
test('options hyphen', function(t) {
|
||||
t.equals(program.alpha, '-', 'alpha is hyphen');
|
||||
t.equals(program.bravo, '-', 'bravo is hyphen');
|
||||
t.equals(program.charlie, '-', 'charlie is hyphen');
|
||||
t.equals(program.args[0], '-', 'args[0] is hypthen');
|
||||
t.equals(program.args[1], '-', 'args[1] is hyphen');
|
||||
t.end();
|
||||
});
|
||||
17
node_modules/ltcdr/test/test.options.large-only-with-value.js
generated
vendored
Normal file
17
node_modules/ltcdr/test/test.options.large-only-with-value.js
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('--longflag [value]', 'A long only flag with a value');
|
||||
|
||||
program.parse(['node', 'test', '--longflag', 'something']);
|
||||
test('option large only with value', function (t) {
|
||||
t.equals(program.longflag, 'something');
|
||||
t.end();
|
||||
});
|
||||
17
node_modules/ltcdr/test/test.options.large-only.js
generated
vendored
Normal file
17
node_modules/ltcdr/test/test.options.large-only.js
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var program = require('../');
|
||||
var program = new (require('../').Command)();
|
||||
var test = require('tape');
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('--verbose', 'do stuff');
|
||||
|
||||
program.parse(['node', 'test', '--verbose']);
|
||||
test('options large only', function (t) {
|
||||
t.equals(program.verbose, true);
|
||||
t.end();
|
||||
});
|
||||
Reference in New Issue
Block a user