walkdirp
Version:
Promise based directory walking, for node.js/npm
85 lines (75 loc) • 2.25 kB
JavaScript
const fs = require('fs')
, path = require('path')
, util = require('util');
const oTree = ({
dir,
ignore = new Set(['node_modules']),
dotfiles = false,
depth = Infinity,
child = false,
filter, map
}) => new Promise((resolve, reject) => {
var results = {
path: dir,
children: []// Some set up
};
if (!child && !(ignore instanceof Set || ignore.has('node_modules')))
ignore = new Set([...ignore, 'node_modules']);
fs.readdir(dir, (err, list) => {
if (err) return reject(err);
if (typeof filter === 'function')
list = list.filter(filter);
var pending = list.length;
if (!pending)
return resolve(results);
list.forEach(file => {
if (!dotfiles && file.charAt(0)=='.') {
if (!--pending)
resolve(results);
return;
} else if (ignore.has(file)) {
if (!--pending)
resolve(results);
return;
} else {
fs.stat(path.join(dir, file), (err, stat) => {
if (err) return reject(err);
if (stat && stat.isDirectory()) {
if (depth > 0) {
oTree({
dir: path.join(dir, file),
depth: depth-1,
child: true,
ignore,
dotfiles,
filter, map
}).then(res => {
results.children.push(res);
if (!--pending)
resolve(typeof map === 'function' ? map(results) : results);
return;
}, reject);
} else {
results.children.push({
path: path.join(dir, file),
isDir: true
})
if (!--pending)
resolve(typeof map === 'function' ? map(results) : results);
return;
}
return;
} else {
results.children.push({
path: path.join(dir, file)
})
if (!--pending)
resolve(typeof map === 'function' ? map(results) : results);
return;
}
});
}
});
});
});
module.exports = require('util').deprecate(oTree, 'walkdirp/walkdir-promise has been deprecated in favour of ewalkdir')