UNPKG

@freik/node-utils

Version:

My personal set of utilities for NodeJS

2 lines (1 loc) 3.82 kB
import{MakeQueue as A,MakeStack as L}from"@freik/containers";import{isHiddenFile as j}from"@freik/is-hidden-file";import{isBoolean as N,isString as P,isUndefined as U}from"@freik/typechk";import*as x from"fs";import{promises as y}from"fs";import*as M from"path";import*as h from"./PathUtil.js";import{MakeLog as R}from"@freik/logger";const{err:m}=R("node-utils:forFiles");function W(i){const l=h.trailingSlash(i),e=l.substring(0,l.length-1);let a=e.lastIndexOf("/");return a<0&&M.sep==="\\"&&(a=e.lastIndexOf("\\")),i[a<0?0:a+1]==="."}function O(i,l,e){return l?e&&W(i)?!0:j(i):!1}function C(i){return!0}function G(i){return!1}function T(i){return U(i)||U(i.recurse)?C:N(i.recurse)?i.recurse?C:G:i.recurse}async function g(i,l){const e=i(l);return N(e)?e:await e}async function E(i,l,e){const a=T(e),k=e&&e.keepGoing,f=e&&e.fileTypes,w=e&&e.order==="depth",D=e?!!e.skipHiddenFiles:!0,S=e?!!e.skipHiddenFolders:!0,p=e?!e.dontAssumeDotsAreHidden:!0,F=e?e.dontFollowSymlinks:!0,b=f?n=>{const r=n.toLocaleUpperCase();if(P(f))return r.endsWith(f.toLocaleUpperCase());const o=f.map(t=>t.toLocaleUpperCase());for(const t of o)if(r.endsWith(t))return!0;return!1}:()=>!0,c=P(i)?[i]:i,u=w?L(c):A(c);let d=!0;for(;!u.empty();){const n=u.pop();if(!n)continue;const r=await y.stat(n);if(r.isFile()&&!O(n,D,p)&&b(n)){if(await g(l,n)!==!0&&(d=!1,!k))return!1}else if(r.isDirectory()&&!O(n,S,p)){let o=null;try{o=await y.readdir(n,{withFileTypes:!0})}catch{m(`Unable to read ${n||"<unknown>"}`);continue}if(!o)continue;for(const t of o)try{if(t.isSymbolicLink()&&F){const s=await y.realpath(h.join(n,t.name)),H=await y.stat(s);(H.isFile()||H.isDirectory()&&await g(a,s))&&u.push(s)}else if(t.isDirectory()||t.isFile()){const s=h.join(n,t.name);t.isDirectory()?await g(a,s)&&u.push(s):u.push(s)}}catch{m("Unable to process dirent:"),m(t);continue}}}return d}function v(i){return U(i)||U(i.recurse)?C:N(i.recurse)?i.recurse?C:G:i.recurse}function J(i,l,e){const a=v(e),k=e&&e.keepGoing,f=e&&e.fileTypes,w=e&&e.order==="depth",D=e?!!e.skipHiddenFiles:!0,S=e?!!e.skipHiddenFolders:!0,p=e?!e.dontAssumeDotsAreHidden:!0,F=e?e.dontFollowSymlinks:!0,b=f?n=>{const r=n.toLocaleUpperCase();if(P(f))return r.endsWith(f.toLocaleUpperCase());const o=f.map(t=>t.toLocaleUpperCase());for(const t of o)if(r.endsWith(t))return!0;return!1}:()=>!0,c=P(i)?[i]:i,u=w?L(c):A(c);let d=!0;for(;!u.empty();){const n=u.pop();if(!n)continue;const r=x.statSync(n);if(r.isFile()&&!O(n,D,p)&&b(n)){if(!l(n)&&(d=!1,!k))return!1}else if(r.isDirectory()&&!O(n,S,p)){let o=null;try{o=x.readdirSync(n,{withFileTypes:!0})}catch{m(`Unable to read ${n||"<unknown>"}`);continue}if(!o)continue;for(const t of o)try{if(t.isSymbolicLink()&&F){const s=x.realpathSync(h.join(n,t.name)),H=x.statSync(s);(H.isDirectory()&&a(s)||H.isFile())&&u.push(s)}else if(t.isDirectory()||t.isFile()){const s=h.join(n,t.name);(t.isFile()||a(s))&&u.push(s)}}catch{m("Unable to process dirent:"),m(t);continue}}}return d}async function K(i,l,e){const a=T(e),k=e&&e.keepGoing,f=e&&e.order==="depth",w=e?!!e.skipHiddenFolders:!0,D=e?!e.dontAssumeDotsAreHidden:!0,S=e?e.dontFollowSymlinks:!0,p=P(i)?[i]:i,F=f?L(p):A(p);let b=!0;for(;!F.empty();){const c=F.pop();if(!c)continue;if((await y.stat(c)).isDirectory()&&!O(c,w,D)){let d=null;try{d=await y.readdir(c,{withFileTypes:!0})}catch{m(`Unable to read ${c||"<unknown>"}`);continue}if(!d)continue;for(const n of d)try{if(n.isSymbolicLink()&&S){const r=h.join(c,n.name),o=await y.realpath(r);if((await y.stat(o)).isDirectory())if(await g(l,r)!==!0){if(b=!1,!k)return!1}else await g(a,o)&&F.push(o)}else if(n.isDirectory()){const r=h.join(c,n.name);if(n.isDirectory())if(await g(l,r)!==!0){if(b=!1,!k)return!1}else await g(a,r)&&F.push(r)}}catch{m("Unable to process dirent:"),m(n);continue}}}return b}export{K as ForDirs,E as ForFiles,J as ForFilesSync};