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