diff options
-rw-r--r-- | lib/activate.js | 5 | ||||
-rw-r--r-- | lib/cache.js | 13 | ||||
-rw-r--r-- | lib/completion.js | 41 | ||||
-rw-r--r-- | lib/config.js | 14 | ||||
-rw-r--r-- | lib/deactivate.js | 13 | ||||
-rw-r--r-- | lib/deprecate.js | 5 | ||||
-rw-r--r-- | lib/edit.js | 5 | ||||
-rw-r--r-- | lib/help.js | 16 | ||||
-rw-r--r-- | lib/install.js | 5 | ||||
-rw-r--r-- | lib/outdated.js | 5 | ||||
-rw-r--r-- | lib/owner.js | 15 | ||||
-rw-r--r-- | lib/rebuild.js | 5 | ||||
-rw-r--r-- | lib/restart.js | 5 | ||||
-rw-r--r-- | lib/start.js | 6 | ||||
-rw-r--r-- | lib/stop.js | 4 | ||||
-rw-r--r-- | lib/tag.js | 5 | ||||
-rw-r--r-- | lib/test.js | 4 | ||||
-rw-r--r-- | lib/uninstall.js | 6 | ||||
-rw-r--r-- | lib/unpublish.js | 5 | ||||
-rw-r--r-- | lib/update.js | 5 | ||||
-rw-r--r-- | lib/view.js | 29 |
21 files changed, 184 insertions, 27 deletions
diff --git a/lib/activate.js b/lib/activate.js index ff175723d..2605f3e53 100644 --- a/lib/activate.js +++ b/lib/activate.js @@ -25,6 +25,11 @@ module.exports = activate activate.usage = "npm activate <name>@<version> [<name>@<version> ...]" +activate.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +} + function activate (args, cb) { // make sure package and version exists. // If there's already an active version, then deactivate it. diff --git a/lib/cache.js b/lib/cache.js index 6b0b574b2..9d40c51ec 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -55,6 +55,19 @@ cache.usage = "npm cache add <tarball file>" + "\nnpm cache ls [<path>]" + "\nnpm cache clean [<pkg>[@<version>]]" +cache.completion = function(args, index, cb) { + var remotePkgs = require("./utils/completion/remote-packages") + , getCompletions = require("./utils/completion/get-completions") + , subcmdList = ["add", "clean", "ls"] + , subcmd = args[0] || "" + + if (subcmdList.indexOf(subcmd) !== -1) { + if (subcmd === "add") { + remotePkgs(args.slice(1), index - 1, true, false, false, cb) + } + } else cb(null, getCompletions(subcmd, subcmdList)) +} + function cache (args, cb) { var cmd = args.shift() switch (cmd) { diff --git a/lib/completion.js b/lib/completion.js index 5bca58c91..2217a4304 100644 --- a/lib/completion.js +++ b/lib/completion.js @@ -2,31 +2,34 @@ module.exports = completion completion.usage = "Not intended to be used directly.\n" - + "See the npm-completion.sh script in the npm source directory" + + "See the npm-completion.sh script in the npm " + + "source directory" var npm = require("../npm") + , getCompletions = require("./utils/completion/get-completions") + , containsSingleMatch = require("./utils/completion/contains-single-match") , output = require("./utils/output") + , index = npm.config.get("comp-cword") || process.env.COMP_CWORD function completion (args, cb_) { - var index = npm.config.get("comp-cword") || process.env.COMP_CWORD || args.length - 1 - , c = args[index] || "" - , p = args[index - 1] - , outfd = npm.config.get("outfd") - , m = [] + var cmd = args[1] || "" + , complFullList = getCompletions(cmd, npm.fullList, true) - // TODO: Need to have command-specific functions or something for completion. - // so, if you do "npm install <TAB>", then it should show a list of the package - // names in the registry, and "npm install foo<TAB>" should show all the install - // targets for foo. - // Especially, stuff like "npm config" that have sub-commands should get - // completion love. + function cb (er, list) { + if (er) return cb_(er) + outputCompletions(list, cb_) + } - npm.fullList.forEach(function (f) { - // console.error(f) - var a = npm.deref(f) - if (m.indexOf(a) === -1 && f.indexOf(c) === 0) m.push(a) - }) - function cb () { cb_(m.length ? null : "no match for "+JSON.stringify(c), m) } - output.write(outfd, m, false, cb) + if (index > 1 || (complFullList.indexOf(cmd) !== -1 && + containsSingleMatch(cmd, complFullList))) { + var subargs = args.slice(2) + // TODO: bundle + npm.commands[npm.deref(cmd)].completion(subargs, index, cb) + } else cb(null, complFullList) } +function outputCompletions (list, cb_) { + var outfd = npm.config.get("outfd") + function cb () { cb_(list.length ? null : "no match found", list) } + output.write(outfd, list, false, cb) +} diff --git a/lib/config.js b/lib/config.js index c528697bc..8e47e017f 100644 --- a/lib/config.js +++ b/lib/config.js @@ -7,6 +7,20 @@ config.usage = "npm config set <key> <value>" + "\nnpm config list" + "\nnpm config edit" +config.completion = function(args, index, cb) { + var getCompletions = require("./utils/completion/get-completions") + , subcmdList = ["set", "get", "ls", "delete", "edit"] + , takeKeys = ["set", "get", "delete"] + , subcmd = args[0] || "" + , key = args[1] || "" + + if (subcmdList.indexOf(subcmd) !== -1) { + if (takeKeys.indexOf(subcmd) !== -1 && ini.keys.indexOf(key) === -1) { + cb(null, getCompletions(key, ini.keys)) + } + } else cb(null, getCompletions(subcmd, subcmdList)) +} + var ini = require("./utils/ini") , log = require("./utils/log") , npm = require("../npm") diff --git a/lib/deactivate.js b/lib/deactivate.js index 6b9643f84..58efc1465 100644 --- a/lib/deactivate.js +++ b/lib/deactivate.js @@ -1,4 +1,13 @@ +module.exports = deactivate + +deactivate.usage = "npm deactivate <pkg>" + +deactivate.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, false, false, cb) +} + var mkdir = require("./utils/mkdir-p") , npm = require("../npm") , fs = require("./utils/graceful-fs") @@ -11,10 +20,6 @@ var mkdir = require("./utils/mkdir-p") , asyncMap = require("./utils/async-map") , loadPackageDefaults = require("./utils/load-package-defaults") -module.exports = deactivate - -deactivate.usage = "npm deactivate <pkg>" - function deactivate (args, cb) { var rb = npm.ROLLBACK npm.ROLLBACK = true diff --git a/lib/deprecate.js b/lib/deprecate.js index b42d2c012..bceb95451 100644 --- a/lib/deprecate.js +++ b/lib/deprecate.js @@ -3,6 +3,11 @@ module.exports = deprecate deprecate.usage = "npm deprecate <pkg>[@<version>] <message>" +deprecate.completion = function (args, index, cb) { + var remotePkgs = require("./utils/completion/remote-packages") + remotePkgs(args, index, true, false, false, cb) +} + var registry = require("./utils/registry") , semver = require("./utils/semver") , log = require("./utils/log") diff --git a/lib/edit.js b/lib/edit.js index 27b862c75..6c978d12f 100644 --- a/lib/edit.js +++ b/lib/edit.js @@ -4,6 +4,11 @@ module.exports = edit edit.usage = "npm edit <pkg>[@<version>]" +edit.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, false, cb) +} + var npm = require("../npm") , exec = require("./utils/exec") , path = require("path") diff --git a/lib/help.js b/lib/help.js index db166b1b5..c554bed69 100644 --- a/lib/help.js +++ b/lib/help.js @@ -1,12 +1,24 @@ +module.exports = help + +help.completion = function (args, index, cb) { + if (index < 3) { + var getCompletions = require("./utils/completion/get-completions") + , section = args[0] || "" + + getSections(function (er, sectionList) { + if (er) return cb(er) + cb(null, getCompletions(section, sectionList)) + }) + } +} + var fs = require("./utils/graceful-fs") , path = require("path") , exec = require("./utils/exec") , npm = require("../npm") , output = require("./utils/output") -module.exports = help - function help (args, cb) { var section = args.shift() if (section === "help") { diff --git a/lib/install.js b/lib/install.js index bed5dcce8..e803d8959 100644 --- a/lib/install.js +++ b/lib/install.js @@ -23,6 +23,11 @@ install.usage = "npm install <tarball file>" + "\n\nCan specify one or more: npm install ./foo.tgz bar@stable /some/folder" + "\nInstalls '.' if no argument supplied" +install.completion = function (args, index, cb) { + var remotePkgs = require("./utils/completion/remote-packages") + remotePkgs(args, index, true, true, false, cb) +} + var registry = require("./utils/registry") , npm = require("../npm") , readInstalled = require("./utils/read-installed") diff --git a/lib/outdated.js b/lib/outdated.js index 7d421ab63..dcf5b721a 100644 --- a/lib/outdated.js +++ b/lib/outdated.js @@ -15,6 +15,11 @@ module.exports = outdated outdated.usage = "npm outdated [<pkg> [<pkg> ...]]" +outdated.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, false, true, cb) +} + var readInstalled = require("./utils/read-installed") , chain = require("./utils/chain") , log = require("./utils/log") diff --git a/lib/owner.js b/lib/owner.js index 2c73bb341..92939bc49 100644 --- a/lib/owner.js +++ b/lib/owner.js @@ -5,6 +5,21 @@ owner.usage = "npm owner add <username> <pkg>" + "\nnpm owner rm <username> <pkg>" + "\nnpm owner ls <pkg>" +owner.completion = function(args, index, cb) { + var remotePkgs = require("./utils/completion/remote-packages") + , getCompletions = require("./utils/completion/get-completions") + , subcmdList = ["add", "ls", "rm"] + , subcmd = args[0] || "" + + if (subcmdList.indexOf(subcmd) !== -1) { + if (subcmd === "ls") { + remotePkgs(args.slice(1), index - 1, false, false, false, cb) + } else if (index == 4 && (subcmd === "add" || subcmd === "rm")) { + remotePkgs(args.slice(2), index - 2, false, false, false, cb) + } + } else cb(null, getCompletions(subcmd, subcmdList)) +} + var registry = require("./utils/registry") , get = registry.request.GET , put = registry.request.PUT diff --git a/lib/rebuild.js b/lib/rebuild.js index 9e7a6e92d..a0d26d95d 100644 --- a/lib/rebuild.js +++ b/lib/rebuild.js @@ -14,6 +14,11 @@ var readInstalled = require("./utils/read-installed") rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]" +rebuild.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +} + function rebuild (args, cb) { log.verbose(args, "rebuild") lookupArgs(args, function (er, args) { diff --git a/lib/restart.js b/lib/restart.js index 426e5789b..eec0cbc3c 100644 --- a/lib/restart.js +++ b/lib/restart.js @@ -9,6 +9,11 @@ var lifecycle = require("./utils/lifecycle") restart.usage = "npm restart <name>[@<version>] [<name>[@<version>] ...]" +restart.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +} + function restart (args, cb) { restartCmd(args, function (er) { if (!er) return cb() diff --git a/lib/start.js b/lib/start.js index 070a1ad51..4ca56f411 100644 --- a/lib/start.js +++ b/lib/start.js @@ -1,4 +1,8 @@ module.exports = require("./utils/lifecycle").cmd("start") -module.exports.usage = "npm start <name>[@<version>] [<name>[@<version>] ...]"
\ No newline at end of file +module.exports.usage = "npm start <name>[@<version>] [<name>[@<version>] ...]" +module.exports.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +}
\ No newline at end of file diff --git a/lib/stop.js b/lib/stop.js index 2e3a42e4a..915b5b514 100644 --- a/lib/stop.js +++ b/lib/stop.js @@ -1,3 +1,7 @@ module.exports = require("./utils/lifecycle").cmd("stop") module.exports.usage = "npm stop <name>[@<version>] [<name>[@<version>] ...]" +module.exports.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +}
\ No newline at end of file diff --git a/lib/tag.js b/lib/tag.js index e50b97092..850760693 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -5,6 +5,11 @@ module.exports = tag tag.usage = "npm tag <project>@<version> <tag>" +tag.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, false, cb) +} + function tag (args, cb) { var thing = (args.shift() || "").split("@") , project = thing.shift() diff --git a/lib/test.js b/lib/test.js index 20a0e6070..572196ffc 100644 --- a/lib/test.js +++ b/lib/test.js @@ -1,3 +1,7 @@ module.exports = require("./utils/lifecycle").cmd("test") module.exports.usage = "npm test <name>[@<version>] [<name>[@<version>] ...]" +module.exports.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +}
\ No newline at end of file diff --git a/lib/uninstall.js b/lib/uninstall.js index 9ac19670d..7fe64b961 100644 --- a/lib/uninstall.js +++ b/lib/uninstall.js @@ -8,6 +8,11 @@ module.exports = uninstall uninstall.usage = "npm uninstall <name>[@<version> [<name>[@<version>] ...]" + "\nnpm rm <name>[@<version> [<name>[@<version>] ...]" +uninstall.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, true, true, cb) +} + var rm = require("./utils/rm-rf") , fs = require("./utils/graceful-fs") , log = require("./utils/log") @@ -17,7 +22,6 @@ var rm = require("./utils/rm-rf") , chain = require("./utils/chain") , lifecycle = require("./utils/lifecycle") , semver = require("./utils/semver") - , readInstalled = require("./utils/read-installed") , mkdir = require("./utils/mkdir-p") , asyncMap = require("./utils/async-map") , loadPackageDefaults = require("./utils/load-package-defaults") diff --git a/lib/unpublish.js b/lib/unpublish.js index 0ef916e21..aa7b025a7 100644 --- a/lib/unpublish.js +++ b/lib/unpublish.js @@ -7,6 +7,11 @@ var registry = require("./utils/registry") unpublish.usage = "npm unpublish <project>[@<version>]" +unpublish.completion = function (args, index, cb) { + var remotePkgs = require("./utils/completion/remote-packages") + remotePkgs(args, index, true, false, false, cb) +} + function unpublish (args, cb) { var thing = args.shift().split("@") , project = thing.shift() diff --git a/lib/update.js b/lib/update.js index 6b7895f3a..f9102416f 100644 --- a/lib/update.js +++ b/lib/update.js @@ -35,6 +35,11 @@ module.exports = update update.usage = "npm update [pkg]" +update.completion = function (args, index, cb) { + var installedPkgs = require("./utils/completion/installed-packages") + installedPkgs(args, index, false, true, cb) +} + var chain = require("./utils/chain") , log = require("./utils/log") , npm = require("../npm") diff --git a/lib/view.js b/lib/view.js index 3b3410834..1aabd0f90 100644 --- a/lib/view.js +++ b/lib/view.js @@ -3,6 +3,35 @@ module.exports = view view.usage = "npm view pkg[@version] [<field>[.subfield]...]" +view.completion = function (args, index, cb) { + var registry = require("./utils/registry") + , getCompletions = require("./utils/completion/get-completions") + , remotePkgs = require("./utils/completion/remote-packages") + , name = args[0] || "" + , key = args[1] || "" + + if (index < 3) remotePkgs(args, index, true, false, false, cb) + else if (index == 3) { + var pieces = name.split("@") + registry.get(pieces[0], pieces[1], function (er, d) { + var cur = d.versions ? d.versions[d["dist-tags"].latest] : d + , path = key.split(".") + , options + if (path.length > 1) { + for (var i = 0; i < path.length; i++) { + if (!cur) return cb() + if (!cur[path[i]]) break + else cur = cur[path[i]] + } + options = Object.keys(cur).map(function (e) { + return path.slice(0, path.length - 1).join(".") + "." + e + }) + } else options = Object.keys(cur).concat(["ctime","mtime","maintainers"]) + cb(null, getCompletions(key, options)) + }) + } +} + var registry = require("./utils/registry") , ini = require("./utils/ini-parser") , log = require("./utils/log") |