UNPKG

npm-analyze

Version:

CLI tool to analyze the dependencies of your project. Size, count, and overhead in modules

97 lines (83 loc) 2.12 kB
var fs = require('fs') var p = require('path') var minimatch = require('minimatch') function patternMatcher (pattern) { return function (path, stats) { var minimatcher = new minimatch.Minimatch(pattern, { matchBase: true }) return (!minimatcher.negate || stats.isFile()) && minimatcher.match(path) } } function toMatcherFunction (ignoreEntry) { if (typeof ignoreEntry === 'function') { return ignoreEntry } else { return patternMatcher(ignoreEntry) } } function readdir (path, ignores, callback) { if (typeof ignores === 'function') { callback = ignores ignores = [] } if (!callback) { return new Promise(function (resolve, reject) { readdir(path, ignores || [], function (err, data) { if (err) { reject(err) } else { resolve(data) } }) }) } ignores = ignores.map(toMatcherFunction) var list = [] fs.readdir(path, function (err, files) { if (err) { return callback(err) } var pending = files.length if (!pending) { // we are done, woop woop return callback(null, list) } files.forEach(function (file) { var filePath = p.join(path, file) fs.lstat(filePath, function (_err, stats) { if (_err) { return callback(_err) } if ( ignores.some(function (matcher) { return matcher(filePath, stats) }) ) { pending -= 1 if (!pending) { return callback(null, list) } return null } if (stats.isDirectory()) { readdir(filePath, ignores, function (__err, res) { if (__err) { return callback(__err) } list = list.concat(res) pending -= 1 if (!pending) { return callback(null, list) } }) } else { list.push(filePath) pending -= 1 if (!pending) { return callback(null, list) } } }) }) }) } module.exports = readdir