forked from yeoman/yeoman-generator-list
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathyeoman-generators.js
114 lines (104 loc) · 3.5 KB
/
yeoman-generators.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
var request = require('request');
var _ = require('lodash');
var Q = require('q');
function createComponentData(name, author, data) {
return {
name: name,
description: data.description,
owner: author && author.name || data.owner.login,
ownerWebsite: author.url || data.owner.html_url,
website: data.html_url,
forks: data.forks,
stars: data.watchers,
created: data.created_at,
updated: data.updated_at
};
}
function condensePlugin(plugin) {
return {
name: plugin.name,
author: plugin.author ? plugin.author : '',
gitURL: plugin.repository ? plugin.repository.url : '',
};
}
function fetchPluginList() {
return Q.fcall(function fetchPluginList() {
var deferred = Q.defer();
var keyword = 'hubot-scripts';
var url = 'https://skimdb.npmjs.com/registry/_design/app/_view/byKeyword?startkey=[%22' +
keyword + '%22]&endkey=[%22' + keyword + '%22,{}]&group_level=3';
request({url: url, json: true}, function handlePluginList(error, response, body) {
if(!error && response.statusCode == 200) {
deferred.resolve(body.rows);
} else {
deferred.reject(new Error(error));
}
});
return deferred.promise;
}).then(function getPlugin(list) {
var results = _.map(list, function (item) {
var deferred = Q.defer();
var name = item.key[1];
var url = 'https://skimdb.npmjs.com/registry/' + name;
request({url: url, json: true}, function handlePlugin(error, response, body) {
if (!error && response.statusCode == 200) {
deferred.resolve(condensePlugin(body));
} else {
deferred.reject(new Error(error));
}
});
return deferred.promise;
});
return Q.all(results);
}).then(function getGithubStats(list) {
// Make sure we have a gitURL.
var results = _.map(list, function (item) {
var deferred = Q.defer();
var re = /github\.com\/([\w\-\.]+)\/([\w\-\.]+)/i;
if (!item.gitURL) {
console.log('getGithubStats:', 'No gitURL', item);
}
var parsedUrl = re.exec(item.gitURL && item.gitURL.replace(/\.git$/, ''));
// only return components from github
if (!parsedUrl) {
deferred.resolve();
return deferred.promise;
}
var user = parsedUrl[1];
var repo = parsedUrl[2];
var apiUrl = 'https://api.github.com/repos/' + user + '/' + repo;
request.get(apiUrl, {
json: true,
qs: {
client_id: process.env.GITHUB_CLIENT_ID,
client_secret: process.env.GITHUB_CLIENT_SECRET
},
headers: {
'User-Agent': 'Node.js'
}
}, function (err, response, body) {
if (!err && response.statusCode === 200) {
deferred.resolve(createComponentData(item.name, item.author, body));
} else {
if (response.statusCode === 404) {
// don't fail just because the repo doesnt exist
// instead just return `undefined` and filter it out later
deferred.resolve();
} else {
deferred.reject(new Error('GitHub fetch failed\n' + err + '\n' + body));
}
}
return deferred.promise;
});
return deferred.promise;
});
return Q.all(results);
}).then(function filterInvalidValues(generators) {
// Filter our all null values.
var results = _.reject(generators, function(val) {
return val == null;
});
return Q.all(results);
});
}
exports.fetchPluginList = fetchPluginList;