-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
118 lines (109 loc) · 3.79 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
"use strict";
var esprima = require('esprima'),
request = require('request'),
when = require('when'),
fs = require('fs');
var modules = [],
requiredModules = {},
builtins = ["assert", "buffer", "addons", "child_process",
"cluster", "crypto", "debugger", "dns", "domain",
"events", "fs", "globals", "http", "https",
"modules", "net", "os", "path",
"process", "punycode", "querystring", "readline",
"repl", "stdio", "stream", "string_decoder",
"timers", "tls", "tty", "dgram", "url", "util",
"vm", "zlib"];
function walk(dir, done) {
var results = [];
fs.readdir(dir, function (err, list) {
if (err) {
return done(err);
}
var i = 0;
(function next() {
var file = list[i++];
if (!file) {
return done(null, results);
}
file = dir + '/' + file;
fs.stat(file, function (err, stat) {
if (stat && stat.isDirectory()){
if(file.indexOf('node_modules') > -1){
return next();
}
walk(file, function (err, res) {
results = results.concat(res);
next();
});
} else {
if(file.slice(-3) === '.js'){
results.push(file);
}
next();
}
});
}());
});
}
function parseFile(filename){
var d = when.defer(),
tree;
fs.readFile(filename, 'utf-8', function(err, data){
try{
tree = esprima.parse(data.toString());
requiredModules[filename] = [];
tree.body.forEach(function(node){
if(node.type === "VariableDeclaration"){
node.declarations.forEach(function(decl){
if(decl.init && decl.init.type === "CallExpression" &&
decl.init.callee.name === "require" &&
decl.init['arguments'][0].value.indexOf('/') === -1){
requiredModules[filename].push(decl.init['arguments'][0].value);
}
});
}
});
}
catch(e){
console.error("Error in `" + filename + "`: "+ e);
}
d.resolve(filename);
});
return d.promise;
}
module.exports = function(where){
var d = when.defer();
walk(where, function(err, results){
when.all(results.map(parseFile), function(){
Object.keys(requiredModules).forEach(function(filename){
requiredModules[filename].forEach(function(mod){
if(modules.indexOf(mod) === -1){
modules.push({'name': mod});
}
});
});
when.all(modules.map(function(mod, index){
var d = when.defer();
request.get('http://registry.npmjs.org/' + mod.name, function (error, response, body){
if (!error && response.statusCode === 200) {
modules[index].version = JSON.parse(body)['dist-tags'].latest;
d.resolve(modules[index]);
}
else{
d.resolve(null);
}
});
return d.promise;
}), function(){
var fin = {};
modules.filter(function(mod){
return mod.hasOwnProperty('version') && builtins.indexOf(mod.name) === -1;
}).forEach(function(mod){
fin[mod.name] = mod.version;
});
d.resolve(fin);
});
});
});
return d.promise;
};