123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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.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(filePath);
- pending -= 1;
- if (!pending) {
- return callback(null, list);
- }
- }
- });
- });
- });
- }
- module.exports = readdir;
|