| 'use strict'; | 
| const path = require('path'); | 
| const locatePath = require('locate-path'); | 
| const pathExists = require('path-exists'); | 
|   | 
| const stop = Symbol('findUp.stop'); | 
|   | 
| module.exports = async (name, options = {}) => { | 
|     let directory = path.resolve(options.cwd || ''); | 
|     const {root} = path.parse(directory); | 
|     const paths = [].concat(name); | 
|   | 
|     const runMatcher = async locateOptions => { | 
|         if (typeof name !== 'function') { | 
|             return locatePath(paths, locateOptions); | 
|         } | 
|   | 
|         const foundPath = await name(locateOptions.cwd); | 
|         if (typeof foundPath === 'string') { | 
|             return locatePath([foundPath], locateOptions); | 
|         } | 
|   | 
|         return foundPath; | 
|     }; | 
|   | 
|     // eslint-disable-next-line no-constant-condition | 
|     while (true) { | 
|         // eslint-disable-next-line no-await-in-loop | 
|         const foundPath = await runMatcher({...options, cwd: directory}); | 
|   | 
|         if (foundPath === stop) { | 
|             return; | 
|         } | 
|   | 
|         if (foundPath) { | 
|             return path.resolve(directory, foundPath); | 
|         } | 
|   | 
|         if (directory === root) { | 
|             return; | 
|         } | 
|   | 
|         directory = path.dirname(directory); | 
|     } | 
| }; | 
|   | 
| module.exports.sync = (name, options = {}) => { | 
|     let directory = path.resolve(options.cwd || ''); | 
|     const {root} = path.parse(directory); | 
|     const paths = [].concat(name); | 
|   | 
|     const runMatcher = locateOptions => { | 
|         if (typeof name !== 'function') { | 
|             return locatePath.sync(paths, locateOptions); | 
|         } | 
|   | 
|         const foundPath = name(locateOptions.cwd); | 
|         if (typeof foundPath === 'string') { | 
|             return locatePath.sync([foundPath], locateOptions); | 
|         } | 
|   | 
|         return foundPath; | 
|     }; | 
|   | 
|     // eslint-disable-next-line no-constant-condition | 
|     while (true) { | 
|         const foundPath = runMatcher({...options, cwd: directory}); | 
|   | 
|         if (foundPath === stop) { | 
|             return; | 
|         } | 
|   | 
|         if (foundPath) { | 
|             return path.resolve(directory, foundPath); | 
|         } | 
|   | 
|         if (directory === root) { | 
|             return; | 
|         } | 
|   | 
|         directory = path.dirname(directory); | 
|     } | 
| }; | 
|   | 
| module.exports.exists = pathExists; | 
|   | 
| module.exports.sync.exists = pathExists.sync; | 
|   | 
| module.exports.stop = stop; |