You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
968 B
46 lines
968 B
'use strict'; |
|
const path = require('path'); |
|
const locatePath = require('locate-path'); |
|
|
|
module.exports = (filename, opts = {}) => { |
|
const startDir = path.resolve(opts.cwd || ''); |
|
const {root} = path.parse(startDir); |
|
|
|
const filenames = [].concat(filename); |
|
|
|
return new Promise(resolve => { |
|
(function find(dir) { |
|
locatePath(filenames, {cwd: dir}).then(file => { |
|
if (file) { |
|
resolve(path.join(dir, file)); |
|
} else if (dir === root) { |
|
resolve(null); |
|
} else { |
|
find(path.dirname(dir)); |
|
} |
|
}); |
|
})(startDir); |
|
}); |
|
}; |
|
|
|
module.exports.sync = (filename, opts = {}) => { |
|
let dir = path.resolve(opts.cwd || ''); |
|
const {root} = path.parse(dir); |
|
|
|
const filenames = [].concat(filename); |
|
|
|
// eslint-disable-next-line no-constant-condition |
|
while (true) { |
|
const file = locatePath.sync(filenames, {cwd: dir}); |
|
|
|
if (file) { |
|
return path.join(dir, file); |
|
} |
|
|
|
if (dir === root) { |
|
return null; |
|
} |
|
|
|
dir = path.dirname(dir); |
|
} |
|
};
|
|
|