-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathconvertToGraph.js
More file actions
80 lines (69 loc) · 2.22 KB
/
convertToGraph.js
File metadata and controls
80 lines (69 loc) · 2.22 KB
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
/**
* Converts npm registry `byField` response into serialized graph
*/
var fs = require('fs');
var createGraph = require('ngraph.graph');
var tojson = require('ngraph.tojson');
var load = require('./lib/load.js');
var inputFileName = process.argv[2] || './data/graph.in';
console.log('Parsing npm packages file...');
load(inputFileName, function(packages) {
saveGraph('dependencies', './data/dependenciesGraph.out.graph');
saveGraph('devDependencies', './data/devDependencies.out.graph');
saveGraph('allDependencies', './data/allDependencies.out.graph');
console.log('');
// Sometimes different graphs have different number of nodes. Why?
// Turns out some packages declared dependencies on something which already
// does not exist
//
// For example, take a look at https://www.npmjs.com/package/jolokia-client
// It has dependency on package called ` optimist`
// Have you noticed extra whitespace ^ here?
// That is why graph has different number of nodes
console.log("All done.");
return; // public part is done here.
function saveGraph(kind, fileName) {
console.log("Saving `" + kind + '` graph as ' + fileName);
var graph = createGraph({
uniqueLinkId: false
});
packages.forEach(addNode);
fs.writeFileSync(fileName, tojson(graph));
console.log("Done. Saved " + graph.getNodesCount() + ' nodes and ' + graph.getLinksCount() + ' edges');
return;
function addNode(pkg) {
graph.addNode(pkg.id, {
maintainers: pkg.maintainers
});
var deps = getDependencies(pkg, kind);
if (deps) {
Object.keys(deps).forEach(addLink);
}
function addLink(key) {
graph.addLink(pkg.id, key);
}
}
}
function getDependencies(pkg, kind) {
if (kind === 'dependencies') {
return pkg.dependencies;
}
if (kind === 'devDependencies') {
return pkg.devDependencies;
}
var deps = pkg.dependencies || {};
var devDeps = pkg.devDependencies || {};
var result = {};
for (var key in deps) {
if (deps.hasOwnProperty(key)) {
result[key] = 1;
}
}
for (key in devDeps) {
if (devDeps.hasOwnProperty(key)) {
result[key] = 1;
}
}
return result;
}
});