1*082815dcSEvan Baconimport fs from 'fs';
2*082815dcSEvan Bacon
3*082815dcSEvan Bacon/**
4*082815dcSEvan Bacon * A non-failing version of async FS stat.
5*082815dcSEvan Bacon *
6*082815dcSEvan Bacon * @param file
7*082815dcSEvan Bacon */
8*082815dcSEvan Baconasync function statAsync(file: string): Promise<fs.Stats | null> {
9*082815dcSEvan Bacon  try {
10*082815dcSEvan Bacon    return await fs.promises.stat(file);
11*082815dcSEvan Bacon  } catch {
12*082815dcSEvan Bacon    return null;
13*082815dcSEvan Bacon  }
14*082815dcSEvan Bacon}
15*082815dcSEvan Bacon
16*082815dcSEvan Baconexport async function fileExistsAsync(file: string): Promise<boolean> {
17*082815dcSEvan Bacon  return (await statAsync(file))?.isFile() ?? false;
18*082815dcSEvan Bacon}
19*082815dcSEvan Bacon
20*082815dcSEvan Baconexport async function directoryExistsAsync(file: string): Promise<boolean> {
21*082815dcSEvan Bacon  return (await statAsync(file))?.isDirectory() ?? false;
22*082815dcSEvan Bacon}
23*082815dcSEvan Bacon
24*082815dcSEvan Baconexport function fileExists(file: string): boolean {
25*082815dcSEvan Bacon  try {
26*082815dcSEvan Bacon    return fs.statSync(file).isFile();
27*082815dcSEvan Bacon  } catch {
28*082815dcSEvan Bacon    return false;
29*082815dcSEvan Bacon  }
30*082815dcSEvan Bacon}
31