@nathanfaucett/file_utils
Version:
file utils for node.js
86 lines (72 loc) • 2.67 kB
JavaScript
var fs = require("fs"),
arrayForEach = require("@nathanfaucett/array-for_each"),
isObject = require("@nathanfaucett/is_object"),
isFunction = require("@nathanfaucett/is_function"),
mixin = require("@nathanfaucett/mixin"),
filePath = require("@nathanfaucett/file_path"),
fileUtils = require("./");
module.exports = readDir;
function readDir(directory, options, callback) {
var out = [],
todo = 1;
if (isObject(directory)) {
callback = options;
options = directory;
directory = process.cwd();
}
if (isFunction(options)) {
callback = options;
options = {};
}
options = mixin(options || {}, fileUtils.defaults);
(function doDive(directory) {
fs.readdir(directory, function onReadDir(error, files) {
todo--;
if (error) {
callback(error);
} else {
arrayForEach(files, function eachFile(file) {
var fullPath, stat;
if (options.all || file[0] !== ".") {
fullPath = filePath.resolve(directory, file);
todo++;
try {
stat = fs.statSync(fullPath);
} catch (error) {
todo--;
callback(error);
return false;
}
if (stat && stat.isDirectory()) {
if (options.directories) {
todo--;
stat.path = fullPath;
out.push(stat);
return true;
}
if (options.recursive) {
doDive(fullPath);
}
} else {
if (options.files) {
todo--;
stat.path = fullPath;
out.push(stat);
return true;
}
if (!--todo) {
callback(undefined, out);
return false;
}
}
return true;
}
return true;
});
if (!todo) {
callback(undefined, out);
}
}
});
})(directory);
}