| 'use strict'; |
| const path = require('path'); |
| const locatePath = require('locate-path'); |
| |
| module.exports = (filename, opts) => { |
| opts = opts || {}; |
| |
| const startDir = path.resolve(opts.cwd || ''); |
| const root = path.parse(startDir).root; |
| |
| 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) => { |
| opts = opts || {}; |
| |
| let dir = path.resolve(opts.cwd || ''); |
| const root = path.parse(dir).root; |
| |
| 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); |
| } else if (dir === root) { |
| return null; |
| } |
| |
| dir = path.dirname(dir); |
| } |
| }; |