66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | const path = require('path'); | ||
|  | const fs = require('fs'); | ||
|  | const {promisify} = require('util'); | ||
|  | const pLocate = require('p-locate'); | ||
|  | 
 | ||
|  | const fsStat = promisify(fs.stat); | ||
|  | const fsLStat = promisify(fs.lstat); | ||
|  | 
 | ||
|  | const typeMappings = { | ||
|  | 	directory: 'isDirectory', | ||
|  | 	file: 'isFile' | ||
|  | }; | ||
|  | 
 | ||
|  | function checkType({type}) { | ||
|  | 	if (type in typeMappings) { | ||
|  | 		return; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	throw new Error(`Invalid type specified: ${type}`); | ||
|  | } | ||
|  | 
 | ||
|  | const matchType = (type, stat) => type === undefined || stat[typeMappings[type]](); | ||
|  | 
 | ||
|  | module.exports = async (paths, options) => { | ||
|  | 	options = { | ||
|  | 		cwd: process.cwd(), | ||
|  | 		type: 'file', | ||
|  | 		allowSymlinks: true, | ||
|  | 		...options | ||
|  | 	}; | ||
|  | 	checkType(options); | ||
|  | 	const statFn = options.allowSymlinks ? fsStat : fsLStat; | ||
|  | 
 | ||
|  | 	return pLocate(paths, async path_ => { | ||
|  | 		try { | ||
|  | 			const stat = await statFn(path.resolve(options.cwd, path_)); | ||
|  | 			return matchType(options.type, stat); | ||
|  | 		} catch (_) { | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	}, options); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports.sync = (paths, options) => { | ||
|  | 	options = { | ||
|  | 		cwd: process.cwd(), | ||
|  | 		allowSymlinks: true, | ||
|  | 		type: 'file', | ||
|  | 		...options | ||
|  | 	}; | ||
|  | 	checkType(options); | ||
|  | 	const statFn = options.allowSymlinks ? fs.statSync : fs.lstatSync; | ||
|  | 
 | ||
|  | 	for (const path_ of paths) { | ||
|  | 		try { | ||
|  | 			const stat = statFn(path.resolve(options.cwd, path_)); | ||
|  | 
 | ||
|  | 			if (matchType(options.type, stat)) { | ||
|  | 				return path_; | ||
|  | 			} | ||
|  | 		} catch (_) { | ||
|  | 		} | ||
|  | 	} | ||
|  | }; |