Skip to content

Commit

Permalink
help: show usage when help-search finds no results
Browse files Browse the repository at this point in the history
Fix #1655
  • Loading branch information
isaacs committed Aug 21, 2020
1 parent b44768a commit 1faa5b3
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 82 deletions.
12 changes: 11 additions & 1 deletion lib/help-search.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ const output = require('./utils/output.js')
const usageUtil = require('./utils/usage.js')
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
const didYouMean = require('./utils/did-you-mean.js')
const { cmdList } = require('./utils/cmd-list.js')

const usage = usageUtil('help-search', 'npm help-search <text>')
const completion = require('./utils/completion/none.js')

const npmUsage = require('./utils/npm-usage.js')

const cmd = (args, cb) => helpSearch(args).then(() => cb()).catch(cb)

const helpSearch = async args => {
Expand All @@ -26,7 +30,13 @@ const helpSearch = async args => {

const data = await readFiles(files)
const results = await searchFiles(args, data, files)
output(formatResults(args, results))
const formatted = formatResults(args, results)
if (!formatted.trim()) {
npmUsage(false)
} else {
output(formatted)
output(didYouMean(args[0], cmdList))
}
}

const readFiles = async files => {
Expand Down
84 changes: 3 additions & 81 deletions lib/help.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@ help.completion = function (opts, cb) {
getSections(cb)
}

const npmUsage = require('./utils/npm-usage.js')
var path = require('path')
var spawn = require('./utils/spawn')
var npm = require('./npm.js')
var log = require('npmlog')
var openUrl = require('./utils/open-url')
var glob = require('glob')
var didYouMean = require('./utils/did-you-mean')
var cmdList = require('./utils/cmd-list').cmdList
var commands = cmdList
var output = require('./utils/output.js')

const usage = require('./utils/usage.js')
Expand Down Expand Up @@ -42,7 +40,8 @@ function help (args, cb) {
// npm help <noargs>: show basic usage
if (!section) {
var valid = argv[0] === 'help' ? 0 : 1
return npmUsage(valid, cb)
npmUsage(argv[0] === 'help')
return cb()
}

// npm <command> -h: show command usage
Expand Down Expand Up @@ -161,83 +160,6 @@ function htmlMan (man) {
return 'file://' + path.resolve(__dirname, '..', 'docs', 'public', sect, f, 'index.html')
}

function npmUsage (valid, cb) {
npm.config.set('loglevel', 'silent')
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(commands))}
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} ${path.dirname(__dirname)}
`)

if (npm.argv.length > 1) {
output(didYouMean(npm.argv[1], commands))
}

cb(valid)
}

function usages () {
// return a string of <command>: <usage>
var maxLen = 0
return commands.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')
}

function 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)
}

function getSections (cb) {
var g = path.resolve(__dirname, '../man/man[0-9]/*.[0-9]')
glob(g, function (er, files) {
Expand Down
85 changes: 85 additions & 0 deletions lib/utils/npm-usage.js
Original file line number Diff line number Diff line change
@@ -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')
}

0 comments on commit 1faa5b3

Please sign in to comment.