lsr
Version:
Recursive readdir (`ls -R`)
138 lines (137 loc) • 4.4 kB
JavaScript
exports.__esModule = true;
var fs_1 = require("fs");
var path_1 = require("path");
var Promise = require("promise");
var barrage = require('barrage');
function addFileSystemInfo(stat, info) {
stat.name = info.name;
stat.fullPath = info.fullPath;
stat.path = info.path;
return stat;
}
function tryStatSync(filename) {
try {
return fs_1.statSync(filename);
}
catch (ex) {
return null;
}
}
function lsrSync(dir, options) {
if (options === void 0) { options = {}; }
var directories = [''];
var result = [];
var _loop_1 = function () {
var subdir = directories.shift();
fs_1.readdirSync(path_1.join(dir, subdir))
.forEach(function (entry) {
if (options.filterPath && !options.filterPath('.' + subdir + '/' + entry))
return;
var fullPath = path_1.join(dir, subdir, entry);
var stat = (options.ignoreErrors
? tryStatSync(fullPath)
: fs_1.statSync(fullPath));
if (!stat) {
return;
}
var fsEntry = addFileSystemInfo(stat, {
path: '.' + subdir + '/' + entry,
fullPath: fullPath,
name: entry
});
if (options.filter && !options.filter(fsEntry))
return;
if (fsEntry.isDirectory()) {
directories.push(subdir + '/' + entry);
}
result.push(fsEntry);
});
};
while (directories.length) {
_loop_1();
}
return result;
}
exports.lsrSync = lsrSync;
function lsrAsyncBase(dir, options, push, end, reject, lazy) {
var directories = [''];
function rec1() {
if (directories.length === 0)
return end();
var subdir = directories.shift();
fs_1.readdir(path_1.join(dir, subdir), function (err, entries) {
if (err)
return reject(err);
entries.reverse();
function rec2() {
if (entries.length === 0)
return rec1();
var entry = entries.pop();
if (options.filterPath && !options.filterPath('.' + subdir + '/' + entry))
return rec2();
fs_1.stat(path_1.join(dir, subdir, entry), function (err, stat) {
if (err && options.ignoreErrors)
return rec2();
if (err)
return reject(err);
var fsEntry = addFileSystemInfo(stat, {
path: '.' + subdir + '/' + entry,
fullPath: path_1.join(dir, subdir, entry),
name: entry
});
if (options.filter && !options.filter(fsEntry))
return rec2();
if (stat.isDirectory()) {
directories.push(subdir + '/' + entry);
}
push(fsEntry);
lazy(rec2);
});
}
lazy(rec2);
});
}
rec1();
}
exports["default"] = lsrAsync;
function lsrAsync(dir, options, callback) {
if (typeof options === 'function') {
callback = options;
options = undefined;
}
var opts = (options || {});
return new Promise(function (resolve, reject) {
var result = [];
lsrAsyncBase(dir, opts, result.push.bind(result), resolve.bind(null, result), reject, function (fn) { fn(); });
}).nodeify(callback);
}
exports.lsrAsync = lsrAsync;
function lsrStream(dir, options) {
options = options || {};
var result = new barrage.Readable({ objectMode: true, highWaterMark: options.highWaterMark });
var cont = true;
var lazy;
lazy = function () {
lsrAsyncBase(dir, options, function (entry) {
cont = result.push(entry);
}, function () {
result.push(null);
}, result.emit.bind(result, 'error'), function (fn) {
if (cont)
fn();
else
lazy = fn;
});
};
result._read = function () {
cont = true;
if (lazy) {
var fn = lazy;
lazy = null;
fn();
}
};
return result;
}
exports.lsrStream = lsrStream;
;