depending
Version:
Find out which modules depend on a given module
69 lines (55 loc) • 1.49 kB
JavaScript
var slice = Array.prototype.slice;
var fs = require('fs');
var path = require('path');
exports.scan =
function scan(dirs) {
var d = depending;
if (! arguments.length) throw new Error('Nothing to scan');
dirs = slice.call(arguments);
dirs = reduce(dirs, []);
d.dirs = dirs;
d.packages = [];
var dependings = {}; // reverse dependence tree
scan(dirs);
function depending(package) {
return dependings[package] || [];
}
function addDependency(from, to) {
if (! dependings[to]) dependings[to] = [];
dependings[to].push(from);
}
function scanPackage(packagePath) {
var package = require(packagePath);
d.packages.push(package);
var name = package.name
if (name && package.dependencies) {
Object.keys(package.dependencies).forEach(function(dep) {
addDependency(name, dep);
});
}
}
function scanDir(dir) {
var packagePath = path.join(dir, 'package.json');
if (fs.existsSync(packagePath)) {
scanPackage(packagePath);
} else {
if (fs.statSync(dir).isDirectory()) {
var files = fs.readdirSync(dir);
files.forEach(function(f) {
scanDir(path.join(dir, f));
});
}
}
}
function scan(dirs) {
dirs.forEach(scanDir);
}
return d;
}
function reduce(dirs, previous) {
return dirs.reduce(function(previous, dir) {
if (Array.isArray(dir)) previous = reduce(dir, previous);
else previous.push(dir);
return previous;
}, []);
}