67 строки
1.2 KiB
JavaScript
67 строки
1.2 KiB
JavaScript
import process from 'node:process';
|
|
import path from 'node:path';
|
|
import fs, {promises as fsPromises} from 'node:fs';
|
|
import pLocate from 'p-locate';
|
|
|
|
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]]();
|
|
|
|
export async function locatePath(
|
|
paths,
|
|
{
|
|
cwd = process.cwd(),
|
|
type = 'file',
|
|
allowSymlinks = true,
|
|
concurrency,
|
|
preserveOrder,
|
|
} = {},
|
|
) {
|
|
checkType(type);
|
|
|
|
const statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;
|
|
|
|
return pLocate(paths, async path_ => {
|
|
try {
|
|
const stat = await statFunction(path.resolve(cwd, path_));
|
|
return matchType(type, stat);
|
|
} catch {
|
|
return false;
|
|
}
|
|
}, {concurrency, preserveOrder});
|
|
}
|
|
|
|
export function locatePathSync(
|
|
paths,
|
|
{
|
|
cwd = process.cwd(),
|
|
type = 'file',
|
|
allowSymlinks = true,
|
|
} = {},
|
|
) {
|
|
checkType(type);
|
|
|
|
const statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;
|
|
|
|
for (const path_ of paths) {
|
|
try {
|
|
const stat = statFunction(path.resolve(cwd, path_));
|
|
|
|
if (matchType(type, stat)) {
|
|
return path_;
|
|
}
|
|
} catch {}
|
|
}
|
|
}
|