/
findFilesDependingOn.js
64 lines (58 loc) · 1.68 KB
/
findFilesDependingOn.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
var required = require('./xlib/required');
var path = require("path");
var _cache = {};
var walk = function(root, collector, callback, list, walkData){
walkData = walkData || {counter: 0};
list = list || [];
if(root.type == "folder") {
for(var i = 0; i<root.children.length; i++)
if(root.children[i].type == "file")
walkData.counter += 1;
for(var i = 0; i<root.children.length; i++)
walk(root.children[i], collector, callback, list, walkData)
} else { // file
collector(root.path, function(err, result){
walkData.counter -= 1;
if(result) list.push(result);
if(walkData.counter == 0)
callback(err, list);
})
}
}
var dependingFilesCollector = function(from){
return function(file, next){
if(path.extname(file) != ".js") return next();
if(_cache[file]) {
var deps = _cache[file];
for(var i = 0; i<deps.length; i++)
if(deps[i].filename == from) {
var data = {
path: file,
filename: deps[i].filename,
id: deps[i].id
}
return next(null, data);
}
return next();
}
required(file, {ignoreMissing: true}, function(err, deps){
if(!deps || err) return next(null);
_cache[file] = deps;
for(var i = 0; i<deps.length; i++)
if(deps[i].filename == from) {
var data = {
path: file,
filename: deps[i].filename,
id: deps[i].id
}
return next(null, data);
}
next();
})
}
}
process.on("message", function(msg){
walk(msg.tree, dependingFilesCollector(msg.from), function(err, list){
process.send({err: err, list: list});
});
});