• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2
3const figgyPudding = require('figgy-pudding')
4const getStream = require('get-stream')
5const npmFetch = require('npm-registry-fetch')
6
7const SearchOpts = figgyPudding({
8  detailed: { default: false },
9  limit: { default: 20 },
10  from: { default: 0 },
11  quality: { default: 0.65 },
12  popularity: { default: 0.98 },
13  maintenance: { default: 0.5 },
14  sortBy: {}
15})
16
17module.exports = search
18function search (query, opts) {
19  return getStream.array(search.stream(query, opts))
20}
21search.stream = searchStream
22function searchStream (query, opts) {
23  opts = SearchOpts(opts)
24  switch (opts.sortBy) {
25    case 'optimal': {
26      opts = opts.concat({
27        quality: 0.65,
28        popularity: 0.98,
29        maintenance: 0.5
30      })
31      break
32    }
33    case 'quality': {
34      opts = opts.concat({
35        quality: 1,
36        popularity: 0,
37        maintenance: 0
38      })
39      break
40    }
41    case 'popularity': {
42      opts = opts.concat({
43        quality: 0,
44        popularity: 1,
45        maintenance: 0
46      })
47      break
48    }
49    case 'maintenance': {
50      opts = opts.concat({
51        quality: 0,
52        popularity: 0,
53        maintenance: 1
54      })
55      break
56    }
57  }
58  return npmFetch.json.stream('/-/v1/search', 'objects.*',
59    opts.concat({
60      query: {
61        text: Array.isArray(query) ? query.join(' ') : query,
62        size: opts.limit,
63        from: opts.from,
64        quality: opts.quality,
65        popularity: opts.popularity,
66        maintenance: opts.maintenance
67      },
68      mapJson (obj) {
69        if (obj.package.date) {
70          obj.package.date = new Date(obj.package.date)
71        }
72        if (opts.detailed) {
73          return obj
74        } else {
75          return obj.package
76        }
77      }
78    })
79  )
80}
81