diff options
author | isaacs <i@izs.me> | 2020-08-21 03:38:30 +0300 |
---|---|---|
committer | isaacs <i@izs.me> | 2020-08-21 03:46:01 +0300 |
commit | 1faa5b33dcc6d7e4eba1c0d85ad30cf0c237c9e1 (patch) | |
tree | 8e9cb23bb08334b213600867447c928e0c924085 /lib/utils | |
parent | b44768aace0e9c938ebd6d05a5de1cc4368e2d7d (diff) |
help: show usage when help-search finds no results
Fix https://github.com/npm/cli/issues/1655
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/npm-usage.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/utils/npm-usage.js b/lib/utils/npm-usage.js new file mode 100644 index 000000000..845332915 --- /dev/null +++ b/lib/utils/npm-usage.js @@ -0,0 +1,85 @@ +const npm = require('../npm.js') +const didYouMean = require('./did-you-mean.js') +const { dirname } = require('path') +const output = require('./output.js') +const { cmdList } = require('./cmd-list') + +module.exports = (valid = true) => { + npm.config.set('loglevel', 'silent') + npm.log.level = 'silent' + output(` +Usage: npm <command> + +npm install install all the dependencies in your project +npm install <foo> add the <foo> dependency to your project +npm test run this project's tests +npm run <foo> run the script named <foo> +npm <command> -h quick help on <command> +npm -l display usage info for all commands +npm help <term> search for help on <term> +npm help npm more involved overview + +All commands: +${npm.config.get('long') ? usages() : ('\n ' + wrap(cmdList))} + +Specify configs in the ini-formatted file: + ${npm.config.get('userconfig')} +or on the command line via: npm <command> --key=value + +More configuration info: npm help config +Configuration fields: npm help 7 config + +npm@${npm.version} ${dirname(dirname(__dirname))} +`) + + if (npm.argv.length >= 1) { + output(didYouMean(npm.argv[0], cmdList)) + } + + if (!valid) { + process.exitCode = 1 + } +} + +const wrap = (arr) => { + var out = [''] + var l = 0 + var line + + line = process.stdout.columns + if (!line) { + line = 60 + } else { + line = Math.min(60, Math.max(line - 16, 24)) + } + + arr.sort(function (a, b) { return a < b ? -1 : 1 }) + .forEach(function (c) { + if (out[l].length + c.length + 2 < line) { + out[l] += ', ' + c + } else { + out[l++] += ',' + out[l] = c + } + }) + return out.join('\n ').substr(2) +} + +const usages = () => { + // return a string of <command>: <usage> + var maxLen = 0 + return cmdList.reduce(function (set, c) { + set.push([c, require(`./${npm.deref(c)}.js`).usage || '']) + maxLen = Math.max(maxLen, c.length) + return set + }, []).sort((a, b) => { + return a[0].localeCompare(b[0]) + }).map(function (item) { + var c = item[0] + var usage = item[1] + return '\n ' + + c + (new Array(maxLen - c.length + 2).join(' ')) + + (usage.split('\n').join('\n' + (new Array(maxLen + 6).join(' ')))) + }).join('\n') +} + |