UNPKG

lsr

Version:
138 lines (137 loc) 4.4 kB
'use strict'; 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;