Skip to content

Instantly share code, notes, and snippets.

@u-rogel
Last active November 27, 2017 09:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save u-rogel/aa30d537e07bc878056adb4adeaebb5d to your computer and use it in GitHub Desktop.
Save u-rogel/aa30d537e07bc878056adb4adeaebb5d to your computer and use it in GitHub Desktop.
Learn which node module is required/used by which
'use strict'
////////////////////////////////////////////////////////
//// written by cowCrazy
//// place in your project root folder
//// use like so 'node index <module to search>'
////////////////////////////////////////////////////////
var fs = require("fs");
var query, requireRegEx, usedByRegEx, requiredBy = [], usedBy = [];
process.argv.forEach(function (val, idx, array) {
if(idx === 2){
query = val
}
if(idx === 3){
throw "Can search for one module at a time"
}
});
if(!query){
throw "Must supply a module to search, use this form 'node index <module to search>'"
}
// search for module required as "require(module)" or "from 'module'"
requireRegEx = new RegExp(`require *\\(["']${query}["']\\)|from *["']${query}['"]`, 'i');
// search for module used as "typeof module === 'undefined'"
usedByRegEx = new RegExp(``(typeof +${query} *={2,3} *["\`']undefined['"\`])|(["\`']undefined['"\`] *={2,3} *typeof +${query})|(if *\\( *!(window\\.)?${query} *\\))``, 'i');
// main function
function searchDir(dir){
// get all files&dirs, ignore directories with the searched library name
var dirLs, queryIdx
dirLs = fs.readdirSync(dir);
queryIdx = dirLs.indexOf(query);
if(queryIdx > -1){
dirLs.splice(queryIdx, 1);
}
for (var d = 0; d < dirLs.length; d++){
var fileName = dirLs[d];
if(fileName.indexOf(".js") !== -1){
if(fs.lstatSync(dir + "/" + fileName).isFile()){
var file = fs.readFileSync(dir + "/" + fileName, "utf8");
file = file.replace(/\n(?!\n)/g, "");
if(file.match(requireRegEx)){
var moduleName = filterModuleName(dir);
if(requiredBy.indexOf(moduleName) === -1){
requiredBy.push(moduleName);
return;
}
return;
}
if(file.match(usedByRegEx)){
var moduleName = filterModuleName(dir);
if(usedBy.indexOf(moduleName) === -1){
usedBy.push(moduleName);
return;
}
return;
}
}
}
else{
if(fs.lstatSync(dir + "/" + fileName).isDirectory()){
searchDir(dir + "/" + fileName);
}
}
}
}
// filter module name from path
function filterModuleName(path){
path = path.slice(15);
return path.replace(/\/.*$/, "");
}
searchDir("./node_modules");
console.log("required by:", requiredBy);
console.log("used by:", usedBy);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment