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