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