summaryrefslogtreecommitdiff
path: root/deps/npm/lib/search/package-filter.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/search/package-filter.js')
-rw-r--r--deps/npm/lib/search/package-filter.js41
1 files changed, 41 insertions, 0 deletions
diff --git a/deps/npm/lib/search/package-filter.js b/deps/npm/lib/search/package-filter.js
new file mode 100644
index 0000000000..ac2950f46b
--- /dev/null
+++ b/deps/npm/lib/search/package-filter.js
@@ -0,0 +1,41 @@
+'use strict'
+
+module.exports = filter
+function filter (data, include, exclude, opts) {
+ return typeof data === 'object' &&
+ filterWords(data, include, exclude, opts)
+}
+
+function getWords (data, opts) {
+ return [ data.name ]
+ .concat((opts && opts.description) ? data.description : [])
+ .concat((data.maintainers || []).map(function (m) {
+ return '=' + m.name
+ }))
+ .concat(data.versions && data.versions.length && data.url && ('<' + data.url + '>'))
+ .concat(data.keywords || [])
+ .map(function (f) { return f && f.trim && f.trim() })
+ .filter(function (f) { return f })
+ .join(' ')
+ .toLowerCase()
+}
+
+function filterWords (data, include, exclude, opts) {
+ var words = getWords(data, opts)
+ for (var i = 0, l = include.length; i < l; i++) {
+ if (!match(words, include[i])) return false
+ }
+ for (i = 0, l = exclude.length; i < l; i++) {
+ if (match(words, exclude[i])) return false
+ }
+ return true
+}
+
+function match (words, pattern) {
+ if (pattern.charAt(0) === '/') {
+ pattern = pattern.replace(/\/$/, '')
+ pattern = new RegExp(pattern.substr(1, pattern.length - 1))
+ return words.match(pattern)
+ }
+ return words.indexOf(pattern) !== -1
+}