aboutsummaryrefslogtreecommitdiff
path: root/node_modules/coa/lib/completion.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/coa/lib/completion.js')
-rw-r--r--node_modules/coa/lib/completion.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/node_modules/coa/lib/completion.js b/node_modules/coa/lib/completion.js
new file mode 100644
index 00000000..a4b1edcb
--- /dev/null
+++ b/node_modules/coa/lib/completion.js
@@ -0,0 +1,134 @@
+// Generated by CoffeeScript 1.6.3
+/**
+Most of the code adopted from the npm package shell completion code.
+See https://github.com/isaacs/npm/blob/master/lib/completion.js
+*/
+
+var Q, complete, dumpScript, escape, getOpts, unescape;
+
+Q = require('q');
+
+escape = require('./shell').escape;
+
+unescape = require('./shell').unescape;
+
+module.exports = function() {
+ return this.title('Shell completion').helpful().arg().name('raw').title('Completion words').arr().end().act(function(opts, args) {
+ var argv, cmd, e, _ref;
+ if (process.platform === 'win32') {
+ e = new Error('shell completion not supported on windows');
+ e.code = 'ENOTSUP';
+ e.errno = require('constants').ENOTSUP;
+ return this.reject(e);
+ }
+ if ((process.env.COMP_CWORD == null) || (process.env.COMP_LINE == null) || (process.env.COMP_POINT == null)) {
+ return dumpScript(this._cmd._name);
+ }
+ console.error('COMP_LINE: %s', process.env.COMP_LINE);
+ console.error('COMP_CWORD: %s', process.env.COMP_CWORD);
+ console.error('COMP_POINT: %s', process.env.COMP_POINT);
+ console.error('args: %j', args.raw);
+ opts = getOpts(args.raw);
+ _ref = this._cmd._parseCmd(opts.partialWords), cmd = _ref.cmd, argv = _ref.argv;
+ return Q.when(complete(cmd, opts), function(compls) {
+ console.error('filtered: %j', compls);
+ return console.log(compls.map(escape).join('\n'));
+ });
+ });
+};
+
+dumpScript = function(name) {
+ var defer, fs, path;
+ fs = require('fs');
+ path = require('path');
+ defer = Q.defer();
+ fs.readFile(path.resolve(__dirname, 'completion.sh'), 'utf8', function(err, d) {
+ var onError;
+ if (err) {
+ return defer.reject(err);
+ }
+ d = d.replace(/{{cmd}}/g, path.basename(name)).replace(/^\#\!.*?\n/, '');
+ onError = function(err) {
+ if (err.errno === require('constants').EPIPE) {
+ process.stdout.removeListener('error', onError);
+ return defer.resolve();
+ } else {
+ return defer.reject(err);
+ }
+ };
+ process.stdout.on('error', onError);
+ return process.stdout.write(d, function() {
+ return defer.resolve();
+ });
+ });
+ return defer.promise;
+};
+
+getOpts = function(argv) {
+ var i, line, partialLine, partialWord, partialWords, point, w, word, words;
+ line = process.env.COMP_LINE;
+ w = +process.env.COMP_CWORD;
+ point = +process.env.COMP_POINT;
+ words = argv.map(unescape);
+ word = words[w];
+ partialLine = line.substr(0, point);
+ partialWords = words.slice(0, w);
+ partialWord = argv[w] || '';
+ i = partialWord.length;
+ while (partialWord.substr(0, i) !== partialLine.substr(-1 * i) && i > 0) {
+ i--;
+ }
+ partialWord = unescape(partialWord.substr(0, i));
+ if (partialWord) {
+ partialWords.push(partialWord);
+ }
+ return {
+ line: line,
+ w: w,
+ point: point,
+ words: words,
+ word: word,
+ partialLine: partialLine,
+ partialWords: partialWords,
+ partialWord: partialWord
+ };
+};
+
+complete = function(cmd, opts) {
+ var compls, m, o, opt, optPrefix, optWord;
+ compls = [];
+ if (opts.partialWord.indexOf('-')) {
+ compls = Object.keys(cmd._cmdsByName);
+ } else {
+ if (m = opts.partialWord.match(/^(--\w[\w-_]*)=(.*)$/)) {
+ optWord = m[1];
+ optPrefix = optWord + '=';
+ } else {
+ compls = Object.keys(cmd._optsByKey);
+ }
+ }
+ if (!(o = opts.partialWords[opts.w - 1]).indexOf('-')) {
+ optWord = o;
+ }
+ if (optWord && (opt = cmd._optsByKey[optWord])) {
+ if (!opt._flag && opt._comp) {
+ compls = Q.join(compls, Q.when(opt._comp(opts), function(c, o) {
+ return c.concat(o.map(function(v) {
+ return (optPrefix || '') + v;
+ }));
+ }));
+ }
+ }
+ if (cmd._comp) {
+ compls = Q.join(compls, Q.when(cmd._comp(opts)), function(c, o) {
+ return c.concat(o);
+ });
+ }
+ return Q.when(compls, function(compls) {
+ console.error('partialWord: %s', opts.partialWord);
+ console.error('compls: %j', compls);
+ return compls.filter(function(c) {
+ return c.indexOf(opts.partialWord) === 0;
+ });
+ });
+};