-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
98 lines (75 loc) · 2.6 KB
/
index.js
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
88
89
90
91
92
93
94
95
96
97
98
const request = require('request');
const util = require('util');
const baseUri = 'https://api.npms.io/v2/search';
const defaultSize = 10;
const defaultCriteria = 'popularity';
const defaultExcludes = ['deprecated', 'unstable', 'insecure'];
function setDefaults(options) {
if (!options.size)
options.size = defaultSize;
if (!options.fullPackageDetail)
options.fullPackageDetail = false;
if (!options.criteria)
options.criteria = defaultCriteria;
if (!options.excludes)
options.excludes = defaultExcludes;
}
//formulate query string
function formulateQuery(options) {
var filter = '';
if ('popularity' === options.criteria)
filter += '+popularity-weight:1+quality-weight:0+maintenance-weight:0';
if ('quality' === options.criteria)
filter += '+popularity-weight:0+quality-weight:1+maintenance-weight:0';
if ('maintenance' === options.criteria)
filter += '+popularity-weight:0+quality-weight:0+maintenance-weight:1';
if ('overall' === options.criteria)
filter += '';
options.excludes.forEach(element => {
filter += '+not:' + element;
});
return util.format('?q=%s+keywords:%s%s&size=%i', options.keyword, options.keyword, filter, options.size);
}
function apiRequest(options, callback) {
request(baseUri + formulateQuery(options), function (error, response, body) {
if (error) {
callback('query failed');
}
var results = JSON.parse(body).results;
var list = [];
if (options.fullPackageDetail) {
for (var entry in results) {
list.push(results[entry].package);
}
} else {
for (var entry in results) {
list.push(results[entry].package.name);
}
}
callback(null, list);
});
}
function search(category, size, options) {
return new Promise((resolve, reject) => {
if (!('string' === typeof category))
throw new error('invalid category: ' + category);
if (!options && 'object' === typeof size)
options = size;
if (options) {
if (!options.size)
options.size = size;
} else {
options = 'object' === typeof size ? size : { 'size': size };
}
options.keyword = category;
//add missing parameters with default value
setDefaults(options);
apiRequest(options, function (error, list) {
if (error)
reject(error);
else
resolve(list);
});
});
}
module.exports = search;