Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /usr/lib/node_modules/npm/lib/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/lib/node_modules/npm/lib/help-search.js
module.exports = helpSearch

var fs = require('graceful-fs')
var path = require('path')
var asyncMap = require('slide').asyncMap
var npm = require('./npm.js')
var glob = require('glob')
var color = require('ansicolors')
var output = require('./utils/output.js')

helpSearch.usage = 'npm help-search <text>'

function helpSearch (args, silent, cb) {
  if (typeof cb !== 'function') {
    cb = silent
    silent = false
  }
  if (!args.length) return cb(helpSearch.usage)

  var docPath = path.resolve(__dirname, '..', 'doc')
  return glob(docPath + '/*/*.md', function (er, files) {
    if (er) return cb(er)
    readFiles(files, function (er, data) {
      if (er) return cb(er)
      searchFiles(args, data, function (er, results) {
        if (er) return cb(er)
        formatResults(args, results, cb)
      })
    })
  })
}

function readFiles (files, cb) {
  var res = {}
  asyncMap(files, function (file, cb) {
    fs.readFile(file, 'utf8', function (er, data) {
      res[file] = data
      return cb(er)
    })
  }, function (er) {
    return cb(er, res)
  })
}

function searchFiles (args, files, cb) {
  var results = []
  Object.keys(files).forEach(function (file) {
    var data = files[file]

    // skip if no matches at all
    var match
    for (var a = 0, l = args.length; a < l && !match; a++) {
      match = data.toLowerCase().indexOf(args[a].toLowerCase()) !== -1
    }
    if (!match) return

    var lines = data.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.
    l = lines.length
    for (var i = 0; i < l; i++) {
      var line = lines[i]
      var nextLine = lines[i + 1]
      var ll

      match = false
      if (nextLine) {
        for (a = 0, ll = args.length; a < ll && !match; a++) {
          match = nextLine.toLowerCase()
            .indexOf(args[a].toLowerCase()) !== -1
        }
        if (match) {
          // skip over the next line, and the line after it.
          i += 2
          continue
        }
      }

      match = false
      for (a = 0, ll = args.length; a < ll && !match; a++) {
        match = line.toLowerCase().indexOf(args[a].toLowerCase()) !== -1
      }
      if (match) {
        // skip over the next line
        i++
        continue
      }

      lines[i] = null
    }

    // now squish any string of nulls into a single null
    lines = lines.reduce(function (l, r) {
      if (!(r === null && l[l.length - 1] === null)) l.push(r)
      return l
    }, [])

    if (lines[lines.length - 1] === null) lines.pop()
    if (lines[0] === null) lines.shift()

    // now see how many args were found at all.
    var found = {}
    var totalHits = 0
    lines.forEach(function (line) {
      args.forEach(function (arg) {
        var hit = (line || '').toLowerCase()
          .split(arg.toLowerCase()).length - 1
        if (hit > 0) {
          found[arg] = (found[arg] || 0) + hit
          totalHits += hit
        }
      })
    })

    var cmd = 'npm help '
    if (path.basename(path.dirname(file)) === 'api') {
      cmd = 'npm apihelp '
    }
    cmd += path.basename(file, '.md').replace(/^npm-/, '')
    results.push({
      file: file,
      cmd: cmd,
      lines: lines,
      found: Object.keys(found),
      hits: found,
      totalHits: totalHits
    })
  })

  // if only one result, then just show that help section.
  if (results.length === 1) {
    return npm.commands.help([results[0].file.replace(/\.md$/, '')], cb)
  }

  if (results.length === 0) {
    output('No results for ' + args.map(JSON.stringify).join(' '))
    return cb()
  }

  // sort results by number of results found, then by number of hits
  // then by number of matching lines
  results = results.sort(function (a, b) {
    return 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
  })

  cb(null, results)
}

function formatResults (args, results, cb) {
  if (!results) return cb(null)

  var cols = Math.min(process.stdout.columns || Infinity, 80) + 1

  var out = results.map(function (res) {
    var out = res.cmd
    var r = Object.keys(res.hits)
      .map(function (k) {
        return k + ':' + res.hits[k]
      }).sort(function (a, b) {
        return a > b ? 1 : -1
      }).join(' ')

    out += ((new Array(Math.max(1, cols - out.length - r.length)))
      .join(' ')) + r

    if (!npm.config.get('long')) return out

    out = '\n\n' + out + '\n' +
      (new Array(cols)).join('—') + '\n' +
      res.lines.map(function (line, i) {
        if (line === null || i > 3) return ''
        for (var out = line, a = 0, l = args.length; a < l; a++) {
          var finder = out.toLowerCase().split(args[a].toLowerCase())
          var newOut = ''
          var p = 0

          finder.forEach(function (f) {
            newOut += out.substr(p, f.length)

            var hilit = out.substr(p + f.length, args[a].length)
            if (npm.color) hilit = color.bgBlack(color.red(hilit))
            newOut += hilit

            p += f.length + args[a].length
          })
        }

        return newOut
      }).join('\n').trim()
    return out
  }).join('\n')

  if (results.length && !npm.config.get('long')) {
    out = 'Top hits for ' + (args.map(JSON.stringify).join(' ')) + '\n' +
          (new Array(cols)).join('—') + '\n' +
          out + '\n' +
          (new Array(cols)).join('—') + '\n' +
          '(run with -l or --long to see more context)'
  }

  output(out.trim())
  cb(null, results)
}
Name
Size
Permissions
Options
auth
--
drwxr-xr-x
config
--
drwxr-xr-x
doctor
--
drwxr-xr-x
install
--
drwxr-xr-x
search
--
drwxr-xr-x
utils
--
drwxr-xr-x
access.js
5.539 KB
-rw-r--r--
adduser.js
1.306 KB
-rw-r--r--
audit.js
10.558 KB
-rw-r--r--
bin.js
0.503 KB
-rw-r--r--
bugs.js
0.844 KB
-rw-r--r--
build.js
4.438 KB
-rw-r--r--
cache.js
4.661 KB
-rw-r--r--
ci.js
1.31 KB
-rw-r--r--
completion.js
7.107 KB
-rw-r--r--
config.js
7.434 KB
-rw-r--r--
dedupe.js
4.882 KB
-rw-r--r--
deprecate.js
2.106 KB
-rw-r--r--
dist-tag.js
4.105 KB
-rw-r--r--
docs.js
1.038 KB
-rw-r--r--
doctor.js
3.979 KB
-rw-r--r--
edit.js
1.374 KB
-rw-r--r--
explore.js
1.669 KB
-rw-r--r--
fetch-package-metadata.js
3.969 KB
-rw-r--r--
fetch-package-metadata.md
1.769 KB
-rw-r--r--
fund.js
4.908 KB
-rw-r--r--
get.js
0.229 KB
-rw-r--r--
help-search.js
5.642 KB
-rw-r--r--
help.js
6.354 KB
-rw-r--r--
hook.js
4.616 KB
-rw-r--r--
init.js
2.739 KB
-rw-r--r--
install-ci-test.js
0.475 KB
-rw-r--r--
install-test.js
0.495 KB
-rw-r--r--
install.js
36.47 KB
-rw-r--r--
link.js
5.604 KB
-rw-r--r--
logout.js
1.259 KB
-rw-r--r--
ls.js
16.094 KB
-rw-r--r--
npm.js
14.374 KB
-rw-r--r--
org.js
4.176 KB
-rw-r--r--
outdated.js
12.277 KB
-rw-r--r--
owner.js
6.596 KB
-rw-r--r--
pack.js
11.785 KB
-rw-r--r--
ping.js
1.114 KB
-rw-r--r--
prefix.js
0.322 KB
-rw-r--r--
profile.js
11.134 KB
-rw-r--r--
prune.js
2.228 KB
-rw-r--r--
publish.js
5.141 KB
-rw-r--r--
rebuild.js
2.093 KB
-rw-r--r--
repo.js
1.437 KB
-rw-r--r--
restart.js
0.063 KB
-rw-r--r--
root.js
0.313 KB
-rw-r--r--
run-script.js
5.41 KB
-rw-r--r--
search.js
3.361 KB
-rw-r--r--
set.js
0.27 KB
-rw-r--r--
shrinkwrap.js
9.82 KB
-rw-r--r--
star.js
2.106 KB
-rw-r--r--
stars.js
1.029 KB
-rw-r--r--
start.js
0.061 KB
-rw-r--r--
stop.js
0.06 KB
-rw-r--r--
substack.js
0.497 KB
-rw-r--r--
team.js
4.613 KB
-rw-r--r--
test.js
0.365 KB
-rw-r--r--
token.js
6.658 KB
-rw-r--r--
unbuild.js
4.271 KB
-rw-r--r--
uninstall.js
2.208 KB
-rw-r--r--
unpublish.js
3.51 KB
-rw-r--r--
update.js
2.161 KB
-rw-r--r--
version.js
9.794 KB
-rw-r--r--
view.js
15.11 KB
-rw-r--r--
visnup.js
4.008 KB
-rw-r--r--
whoami.js
1.767 KB
-rw-r--r--
xmas.js
1.624 KB
-rw-r--r--