-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
search.coffee
87 lines (70 loc) · 2.84 KB
/
search.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
_ = require 'underscore-plus'
yargs = require 'yargs'
Command = require './command'
config = require './apm'
request = require './request'
tree = require './tree'
{isDeprecatedPackage} = require './deprecated-packages'
module.exports =
class Search extends Command
@commandNames: ['search']
parseOptions: (argv) ->
options = yargs(argv).wrap(Math.min(100, yargs.terminalWidth()))
options.usage """
Usage: ppm search <package_name>
Search for packages/themes.
"""
options.alias('h', 'help').describe('help', 'Print this usage message')
options.boolean('json').describe('json', 'Output matching packages as JSON array')
options.boolean('packages').describe('packages', 'Search only non-theme packages').alias('p', 'packages')
options.boolean('themes').describe('themes', 'Search only themes').alias('t', 'themes')
searchPackages: (query, opts, callback) ->
qs =
q: query
if opts.packages
qs.filter = 'package'
else if opts.themes
qs.filter = 'theme'
requestSettings =
url: "#{config.getAtomPackagesUrl()}/search"
qs: qs
json: true
request.get requestSettings, (error, response, body={}) ->
if error?
callback(error)
else if response.statusCode is 200
packages = body.filter (pack) -> pack.releases?.latest?
packages = packages.map ({readme, metadata, downloads, stargazers_count}) -> _.extend({}, metadata, {readme, downloads, stargazers_count})
packages = packages.filter ({name, version}) -> not isDeprecatedPackage(name, version)
callback(null, packages)
else
message = request.getErrorMessage(response, body)
callback("Searching packages failed: #{message}")
run: (options) ->
{callback} = options
options = @parseOptions(options.commandArgs)
[query] = options.argv._
unless query
callback("Missing required search query")
return
searchOptions =
packages: options.argv.packages
themes: options.argv.themes
@searchPackages query, searchOptions, (error, packages) ->
if error?
callback(error)
return
if options.argv.json
console.log(JSON.stringify(packages))
else
heading = "Search Results For '#{query}'".cyan
console.log "#{heading} (#{packages.length})"
tree packages, ({name, version, description, downloads, stargazers_count}) ->
label = name.yellow
label += " #{description.replace(/\s+/g, ' ')}" if description
label += " (#{_.pluralize(downloads, 'download')}, #{_.pluralize(stargazers_count, 'star')})".grey if downloads >= 0 and stargazers_count >= 0
label
console.log()
console.log "Use `ppm install` to install them or visit #{'https://web.pulsar-edit.dev'.underline} to read more about them."
console.log()
callback()