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.
		
		
		
		
		
			
		
			
				
					47 lines
				
				968 B
			
		
		
			
		
	
	
					47 lines
				
				968 B
			| 
											3 years ago
										 | '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); | ||
|  | 	} | ||
|  | }; |