| '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); | 
|     } | 
| }; |