UNPKG

@visual-framework/vf-core

Version:

Common dependencies for the Visual Framework.

87 lines (71 loc) 1.95 kB
import fs from "fs"; import p from "path"; import minimatch from "minimatch"; /* Forked from: https://github.com/jergason/recursive-readdir */ 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 = []; } 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.stat(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({dir: path, file: file, file_path: filePath}); pending -= 1; if (!pending) { return callback(null, list); } } }); }); }); } export default readdir;