1'use strict' 2 3const npmFetch = require('npm-registry-fetch') 4 5module.exports = search 6function search (query, opts) { 7 return search.stream(query, opts).collect() 8} 9search.stream = searchStream 10function searchStream (query, opts = {}) { 11 opts = { 12 detailed: false, 13 limit: 20, 14 from: 0, 15 quality: 0.65, 16 popularity: 0.98, 17 maintenance: 0.5, 18 ...opts.opts, // this is to support the cli's --searchopts parameter 19 ...opts, 20 } 21 22 switch (opts.sortBy) { 23 case 'optimal': { 24 opts.quality = 0.65 25 opts.popularity = 0.98 26 opts.maintenance = 0.5 27 break 28 } 29 case 'quality': { 30 opts.quality = 1 31 opts.popularity = 0 32 opts.maintenance = 0 33 break 34 } 35 case 'popularity': { 36 opts.quality = 0 37 opts.popularity = 1 38 opts.maintenance = 0 39 break 40 } 41 case 'maintenance': { 42 opts.quality = 0 43 opts.popularity = 0 44 opts.maintenance = 1 45 break 46 } 47 } 48 return npmFetch.json.stream('/-/v1/search', 'objects.*', 49 { 50 ...opts, 51 query: { 52 text: Array.isArray(query) ? query.join(' ') : query, 53 size: opts.limit, 54 from: opts.from, 55 quality: opts.quality, 56 popularity: opts.popularity, 57 maintenance: opts.maintenance, 58 }, 59 mapJSON: (obj) => { 60 if (obj.package.date) { 61 obj.package.date = new Date(obj.package.date) 62 } 63 if (opts.detailed) { 64 return obj 65 } else { 66 return obj.package 67 } 68 }, 69 } 70 ) 71} 72