UNPKG

files

Version:

Filesystem API easily usable with Promises and arrays

1 lines 3.37 kB
import fs from"fs";import path from"path";import{homedir,tmpdir}from"os";import{promisify}from"util";import swear from"swear";export{default as swear}from"swear";import run from"atocha";const mac=()=>process.platform==="darwin";const linux=()=>process.platform==="linux";const abs=swear(async(name=".",base=process.cwd())=>{name=await name;base=await base;if(path.isAbsolute(name))return name;if(!base||typeof base!=="string"){base=process.cwd()}return join(base,name)});const readFile=promisify(fs.readFile);const cat=swear(async name=>{name=await abs(name);return readFile(name,"utf-8").catch(err=>"")});const copyAsync=promisify(fs.copyFile);const copy=swear(async(src,dst)=>{src=await abs(src);dst=await abs(dst);await mkdir(dir(dst));await copyAsync(src,dst);return dst});const dir=swear(async name=>{name=await abs(name);return path.dirname(name)});const existsAsync=promisify(fs.exists);const exists=swear(async name=>{name=await abs(name);return existsAsync(name).catch(res=>res)});const home=swear((...args)=>join(homedir(),...args).then(mkdir));const join=swear((...parts)=>abs(path.join(...parts)));const readDir=promisify(fs.readdir);const list=swear(async dir=>{dir=await abs(dir);const files=await readDir(dir);return swear(files).map(file=>abs(file,dir))});const mkdirAsync=promisify(fs.mkdir);const mkdir=swear(async name=>{name=await abs(name);const list=name.split(path.sep).map((part,i,all)=>all.slice(0,i+1).join(path.sep)).filter(Boolean);for(let path of list){if(await exists(path))continue;await mkdirAsync(path).catch(err=>{})}return name});const renameAsync=promisify(fs.rename);const move=swear(async(src,dst)=>{src=await abs(src);dst=await abs(dst);await mkdir(dir(dst));await renameAsync(src,dst);return dst});const name=swear(file=>path.basename(file));const removeDirAsync=promisify(fs.rmdir);const removeFileAsync=promisify(fs.unlink);const remove=swear(async name=>{name=await abs(name);if(name==="/")throw new Error("Cannot remove the root folder `/`");if(!await exists(name))return name;if(await stat(name).isDirectory()){await list(name).map(remove);await removeDirAsync(name).catch(err=>{})}else{await removeFileAsync(name).catch(err=>{})}return name});const sep=path.sep;const statAsync=promisify(fs.lstat);const stat=swear(async name=>{name=await abs(name);return statAsync(name).catch(err=>{})});const tmp=swear(async path=>{path=await abs(path,tmpdir());return mkdir(path)});const rWalk=name=>{const file=abs(name);const deeper=async file=>{if(await stat(file).isDirectory()){return rWalk(file)}return[file]};return list(file).map(deeper).reduce((all,arr)=>all.concat(arr),[])};const walk=swear(async name=>{name=await abs(name);if(!await exists(name))return[];if(linux()||mac()){try{return await run(`find ${name} -type f`).split("\n").filter(Boolean)}catch(error){}}return rWalk(name).filter(Boolean)});const writeFile=promisify(fs.writeFile);const write=swear(async(name,body="")=>{name=await abs(name);await mkdir(dir(name));await writeFile(name,body,"utf-8");return name});const files={abs:abs,cat:cat,copy:copy,dir:dir,exists:exists,home:home,join:join,list:list,ls:list,mkdir:mkdir,move:move,name:name,read:cat,remove:remove,sep:sep,stat:stat,swear:swear,tmp:tmp,walk:walk,write:write};export default files;export{abs,cat,copy,dir,exists,home,join,list,list as ls,mkdir,move,name,cat as read,remove,sep,stat,tmp,walk,write};