1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- '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 (_) {
- }
- }
- };
|