X7ROOT File Manager
Current Path:
/opt/alt/alt-nodejs20/root/usr/lib/node_modules/npm/lib/commands
opt
/
alt
/
alt-nodejs20
/
root
/
usr
/
lib
/
node_modules
/
npm
/
lib
/
commands
/
??
..
??
access.js
(6.04 KB)
??
adduser.js
(1.29 KB)
??
audit.js
(3.15 KB)
??
bugs.js
(847 B)
??
cache.js
(7.12 KB)
??
ci.js
(4.22 KB)
??
completion.js
(8.9 KB)
??
config.js
(11.18 KB)
??
dedupe.js
(1.41 KB)
??
deprecate.js
(2.13 KB)
??
diff.js
(8.14 KB)
??
dist-tag.js
(5.52 KB)
??
docs.js
(449 B)
??
doctor.js
(10.1 KB)
??
edit.js
(1.76 KB)
??
exec.js
(3.42 KB)
??
explain.js
(3.58 KB)
??
explore.js
(2.16 KB)
??
find-dupes.js
(634 B)
??
fund.js
(6.46 KB)
??
get.js
(577 B)
??
help-search.js
(5.52 KB)
??
help.js
(3.66 KB)
??
hook.js
(3.37 KB)
??
init.js
(6.85 KB)
??
install-ci-test.js
(373 B)
??
install-test.js
(370 B)
??
install.js
(5.15 KB)
??
link.js
(5.3 KB)
??
ll.js
(234 B)
??
login.js
(1.29 KB)
??
logout.js
(1.42 KB)
??
ls.js
(16.81 KB)
??
org.js
(4.02 KB)
??
outdated.js
(7.7 KB)
??
owner.js
(5.85 KB)
??
pack.js
(2.6 KB)
??
ping.js
(873 B)
??
pkg.js
(3.56 KB)
??
prefix.js
(335 B)
??
profile.js
(10.57 KB)
??
prune.js
(799 B)
??
publish.js
(7.19 KB)
??
query.js
(3.51 KB)
??
rebuild.js
(2.19 KB)
??
repo.js
(1.25 KB)
??
restart.js
(310 B)
??
root.js
(295 B)
??
run-script.js
(6.04 KB)
??
sbom.js
(4.51 KB)
??
search.js
(1.83 KB)
??
set.js
(671 B)
??
shrinkwrap.js
(2.65 KB)
??
star.js
(1.87 KB)
??
stars.js
(1.03 KB)
??
start.js
(300 B)
??
stop.js
(295 B)
??
team.js
(4.36 KB)
??
test.js
(295 B)
??
token.js
(6.02 KB)
??
uninstall.js
(1.52 KB)
??
unpublish.js
(5.27 KB)
??
unstar.js
(183 B)
??
update.js
(1.72 KB)
??
version.js
(3.54 KB)
??
view.js
(12.8 KB)
??
whoami.js
(527 B)
Editing: help-search.js
const { readFile } = require('node:fs/promises') const path = require('node:path') const { glob } = require('glob') const { output } = require('proc-log') const BaseCommand = require('../base-cmd.js') const globify = pattern => pattern.split('\\').join('/') class HelpSearch extends BaseCommand { static description = 'Search npm help documentation' static name = 'help-search' static usage = ['<text>'] static params = ['long'] async exec (args) { if (!args.length) { throw this.usageError() } const docPath = path.resolve(this.npm.npmRoot, 'docs/content') let files = await glob(`${globify(docPath)}/*/*.md`) // preserve glob@8 behavior files = files.sort((a, b) => a.localeCompare(b, 'en')) const data = await this.readFiles(files) const results = await this.searchFiles(args, data) const formatted = this.formatResults(args, results) if (!formatted.trim()) { output.standard(`No matches in help for: ${args.join(' ')}\n`) } else { output.standard(formatted) } } async readFiles (files) { const res = {} await Promise.all(files.map(async file => { res[file] = (await readFile(file, 'utf8')) .replace(/^---\n(.*\n)*?---\n/, '').trim() })) return res } async searchFiles (args, data) { const results = [] for (const [file, content] of Object.entries(data)) { const lowerCase = content.toLowerCase() // skip if no matches at all if (!args.some(a => lowerCase.includes(a.toLowerCase()))) { continue } const lines = content.split(/\n+/) // if a line has a search term, then skip it and the next line. // if the next line has a search term, then skip all 3 // otherwise, set the line to null. then remove the nulls. for (let i = 0; i < lines.length; i++) { const line = lines[i] const nextLine = lines[i + 1] let match = false if (nextLine) { match = args.some(a => nextLine.toLowerCase().includes(a.toLowerCase())) if (match) { // skip over the next line, and the line after it. i += 2 continue } } match = args.some(a => line.toLowerCase().includes(a.toLowerCase())) if (match) { // skip over the next line i++ continue } lines[i] = null } // now squish any string of nulls into a single null const pruned = lines.reduce((l, r) => { if (!(r === null && l[l.length - 1] === null)) { l.push(r) } return l }, []) if (pruned[pruned.length - 1] === null) { pruned.pop() } if (pruned[0] === null) { pruned.shift() } // now count how many args were found const found = {} let totalHits = 0 for (const line of pruned) { for (const arg of args) { const hit = (line || '').toLowerCase() .split(arg.toLowerCase()).length - 1 if (hit > 0) { found[arg] = (found[arg] || 0) + hit totalHits += hit } } } const cmd = 'npm help ' + path.basename(file, '.md').replace(/^npm-/, '') results.push({ file, cmd, lines: pruned, found: Object.keys(found), hits: found, totalHits, }) } // sort results by number of results found, then by number of hits // then by number of matching lines // coverage is ignored here because the contents of results are // nondeterministic due to either glob or readFiles or Object.entries return results.sort(/* istanbul ignore next */ (a, b) => a.found.length > b.found.length ? -1 : a.found.length < b.found.length ? 1 : a.totalHits > b.totalHits ? -1 : a.totalHits < b.totalHits ? 1 : a.lines.length > b.lines.length ? -1 : a.lines.length < b.lines.length ? 1 : 0).slice(0, 10) } formatResults (args, results) { const cols = Math.min(process.stdout.columns || Infinity, 80) + 1 const formattedOutput = results.map(res => { const out = [res.cmd] const r = Object.keys(res.hits) .map(k => `${k}:${res.hits[k]}`) .sort((a, b) => a > b ? 1 : -1) .join(' ') out.push(' '.repeat((Math.max(1, cols - out.join(' ').length - r.length - 1)))) out.push(r) if (!this.npm.config.get('long')) { return out.join('') } out.unshift('\n\n') out.push('\n') out.push('-'.repeat(cols - 1) + '\n') res.lines.forEach((line, i) => { if (line === null || i > 3) { return } const hilitLine = [] for (const arg of args) { const finder = line.toLowerCase().split(arg.toLowerCase()) let p = 0 for (const f of finder) { hilitLine.push(line.slice(p, p + f.length)) const word = line.slice(p + f.length, p + f.length + arg.length) hilitLine.push(this.npm.chalk.blue(word)) p += f.length + arg.length } } out.push(hilitLine.join('') + '\n') }) return out.join('') }).join('\n') const finalOut = results.length && !this.npm.config.get('long') ? 'Top hits for ' + (args.map(JSON.stringify).join(' ')) + '\n' + '—'.repeat(cols - 1) + '\n' + formattedOutput + '\n' + '—'.repeat(cols - 1) + '\n' + '(run with -l or --long to see more context)' : formattedOutput return finalOut.trim() } } module.exports = HelpSearch
Upload File
Create Folder