find-file-up
Version:
Find a file fast, by starting at the given cwd and recursing up one directory until the file is found or we run out of directories.
78 lines (60 loc) • 1.57 kB
JavaScript
const fs = require('fs');
const path = require('path');
const util = require('util');
const resolve = require('resolve-dir');
function find(filename, cwd, limit = Infinity, callback) {
if (typeof cwd === 'function') {
callback = cwd;
cwd = null;
}
if (typeof limit === 'function') {
callback = limit;
limit = Infinity;
}
if (typeof callback !== 'function') {
return find.promise(filename, cwd, limit);
}
const dirname = path.resolve(cwd ? resolve(cwd) : '.');
let depth = 0;
let prev;
function recurse(dirname, next) {
const filepath = path.join(dirname, filename);
fs.stat(filepath, function(err, stat) {
if (err && err.code !== 'ENOENT') {
next(err);
return;
}
if (stat) {
next(null, filepath);
return;
}
if (prev !== dirname && depth < limit) {
prev = dirname;
depth++;
recurse(path.dirname(dirname), next);
return;
}
next();
});
}
recurse(dirname, callback);
}
find.promise = function(filename, cwd, limit) {
return util.promisify(find)(filename, cwd, limit);
};
find.sync = function(filename, cwd, limit = Infinity) {
let dirname = path.resolve(cwd ? resolve(cwd) : '.');
let depth = 0;
let prev;
do {
const filepath = path.join(dirname, filename);
if (fs.existsSync(filepath)) {
return filepath;
}
depth++;
prev = dirname;
dirname = path.dirname(dirname);
} while (prev !== dirname && depth <= limit);
};
module.exports = find;
;