const Minipass = require('minipass')
const Pipeline = require('minipass-pipeline')
const libSearch = require('libnpmsearch')
const log = require('../utils/log-shim.js')
const formatSearchStream = require('../utils/format-search-stream.js')
function filter (data, include, exclude) {
const words = [data.name]
.concat(data.maintainers.map(m => `=${m.username}`))
.concat(data.keywords || [])
.map(f => f && f.trim && f.trim())
.filter(f => f)
.join(' ')
.toLowerCase()
if (exclude.find(e => match(words, e))) {
return false
}
return true
}
function match (words, pattern) {
if (pattern.startsWith('/')) {
if (pattern.endsWith('/')) {
pattern = pattern.slice(0, -1)
}
pattern = new RegExp(pattern.slice(1))
return words.match(pattern)
}
return words.indexOf(pattern) !== -1
}
const BaseCommand = require('../base-command.js')
class Search extends BaseCommand {
static description = 'Search for packages'
static name = 'search'
static params = [
'long',
'json',
'color',
'parseable',
'description',
'searchopts',
'searchexclude',
'registry',
'prefer-online',
'prefer-offline',
'offline',
]
static usage = ['[search terms ...]']
async exec (args) {
const opts = {
...this.npm.flatOptions,
...this.npm.flatOptions.search,
include: args.map(s => s.toLowerCase()).filter(s => s),
exclude: this.npm.flatOptions.search.exclude.split(/\s+/),
}
if (opts.include.length === 0) {
throw new Error('search must be called with arguments')
}
// Used later to figure out whether we had any packages go out
let anyOutput = false
class FilterStream extends Minipass {
write (pkg) {
if (filter(pkg, opts.include, opts.exclude)) {
super.write(pkg)
}
}
}
const filterStream = new FilterStream()
// Grab a configured output stream that will spit out packages in the
// desired format.
const outputStream = formatSearchStream({
args, // --searchinclude options are not highlighted
...opts,
})
log.silly('search', 'searching packages')
const p = new Pipeline(
libSearch.stream(opts.include, opts),
filterStream,
outputStream
)
p.on('data', chunk => {
if (!anyOutput) {
anyOutput = true
}
this.npm.output(chunk.toString('utf8'))
})
await p.promise()
if (!anyOutput && !this.npm.config.get('json') && !this.npm.config.get('parseable')) {
this.npm.output('No matches found for ' + (args.map(JSON.stringify).join(' ')))
}
log.silly('search', 'search completed')
log.clearProgress()
}
}
module.exports = Search
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| access.js | File | 6.08 KB | 0644 |
|
| adduser.js | File | 1.32 KB | 0644 |
|
| audit.js | File | 13.86 KB | 0644 |
|
| bugs.js | File | 815 B | 0644 |
|
| cache.js | File | 7.07 KB | 0644 |
|
| ci.js | File | 3.51 KB | 0644 |
|
| completion.js | File | 8.73 KB | 0644 |
|
| config.js | File | 10.04 KB | 0644 |
|
| dedupe.js | File | 1.4 KB | 0644 |
|
| deprecate.js | File | 2.03 KB | 0644 |
|
| diff.js | File | 8.12 KB | 0644 |
|
| dist-tag.js | File | 5.45 KB | 0644 |
|
| docs.js | File | 447 B | 0644 |
|
| doctor.js | File | 11.51 KB | 0644 |
|
| edit.js | File | 2 KB | 0644 |
|
| exec.js | File | 2.54 KB | 0644 |
|
| explain.js | File | 3.55 KB | 0644 |
|
| explore.js | File | 2.3 KB | 0644 |
|
| find-dupes.js | File | 622 B | 0644 |
|
| fund.js | File | 6.51 KB | 0644 |
|
| get.js | File | 524 B | 0644 |
|
| help-search.js | File | 5.49 KB | 0644 |
|
| help.js | File | 3.54 KB | 0644 |
|
| hook.js | File | 3.77 KB | 0644 |
|
| init.js | File | 6.9 KB | 0644 |
|
| install-ci-test.js | File | 373 B | 0644 |
|
| install-test.js | File | 370 B | 0644 |
|
| install.js | File | 5.11 KB | 0644 |
|
| link.js | File | 5.15 KB | 0644 |
|
| ll.js | File | 234 B | 0644 |
|
| login.js | File | 1.32 KB | 0644 |
|
| logout.js | File | 1.3 KB | 0644 |
|
| ls.js | File | 16.73 KB | 0644 |
|
| org.js | File | 4.14 KB | 0644 |
|
| outdated.js | File | 8.76 KB | 0644 |
|
| owner.js | File | 5.91 KB | 0644 |
|
| pack.js | File | 2.37 KB | 0644 |
|
| ping.js | File | 917 B | 0644 |
|
| pkg.js | File | 3.5 KB | 0644 |
|
| prefix.js | File | 303 B | 0644 |
|
| profile.js | File | 11.19 KB | 0644 |
|
| prune.js | File | 779 B | 0644 |
|
| publish.js | File | 6.5 KB | 0644 |
|
| query.js | File | 2.9 KB | 0644 |
|
| rebuild.js | File | 2.14 KB | 0644 |
|
| repo.js | File | 1.24 KB | 0644 |
|
| restart.js | File | 310 B | 0644 |
|
| root.js | File | 258 B | 0644 |
|
| run-script.js | File | 6.81 KB | 0644 |
|
| search.js | File | 2.68 KB | 0644 |
|
| set.js | File | 572 B | 0644 |
|
| shrinkwrap.js | File | 2.64 KB | 0644 |
|
| star.js | File | 1.87 KB | 0644 |
|
| stars.js | File | 1.03 KB | 0644 |
|
| start.js | File | 300 B | 0644 |
|
| stop.js | File | 295 B | 0644 |
|
| team.js | File | 4.44 KB | 0644 |
|
| test.js | File | 295 B | 0644 |
|
| token.js | File | 6.64 KB | 0644 |
|
| uninstall.js | File | 1.51 KB | 0644 |
|
| unpublish.js | File | 4.54 KB | 0644 |
|
| unstar.js | File | 182 B | 0644 |
|
| update.js | File | 1.71 KB | 0644 |
|
| version.js | File | 3.58 KB | 0644 |
|
| view.js | File | 14.38 KB | 0644 |
|
| whoami.js | File | 474 B | 0644 |
|