mirror of
https://github.com/nodejs/node.git
synced 2025-05-21 12:25:12 +00:00

PR-URL: https://github.com/nodejs/node/pull/39813 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Rich Trott <rtrott@gmail.com>
34 lines
1.3 KiB
JavaScript
34 lines
1.3 KiB
JavaScript
const { distance } = require('fastest-levenshtein')
|
|
const readJson = require('read-package-json-fast')
|
|
const { cmdList } = require('./cmd-list.js')
|
|
|
|
const didYouMean = async (npm, path, scmd) => {
|
|
const bestCmd = cmdList
|
|
.filter(cmd => distance(scmd, cmd) < scmd.length * 0.4 && scmd !== cmd)
|
|
.map(str => ` npm ${str} # ${npm.commands[str].description}`)
|
|
|
|
const pkg = await readJson(`${path}/package.json`)
|
|
const { scripts } = pkg
|
|
// We would already be suggesting this in `npm x` so omit them here
|
|
const runScripts = ['stop', 'start', 'test', 'restart']
|
|
const bestRun = Object.keys(scripts || {})
|
|
.filter(cmd => distance(scmd, cmd) < scmd.length * 0.4 &&
|
|
!runScripts.includes(cmd))
|
|
.map(str => ` npm run ${str} # run the "${str}" package script`)
|
|
|
|
const { bin } = pkg
|
|
const bestBin = Object.keys(bin || {})
|
|
.filter(cmd => distance(scmd, cmd) < scmd.length * 0.4)
|
|
.map(str => ` npm exec ${str} # run the "${str}" command from either this or a remote npm package`)
|
|
|
|
const best = [...bestCmd, ...bestRun, ...bestBin]
|
|
|
|
if (best.length === 0)
|
|
return ''
|
|
|
|
const suggestion = best.length === 1 ? `\n\nDid you mean this?\n${best[0]}`
|
|
: `\n\nDid you mean one of these?\n${best.slice(0, 3).join('\n')}`
|
|
return suggestion
|
|
}
|
|
module.exports = didYouMean
|