dree
Version:
A nodejs module wich helps you handle a directory tree providing you its abstraction through tested functions and a custom configuration.
6 lines (5 loc) • 12.4 kB
JavaScript
import{resolve as L,basename as T,extname as P,relative as R}from"node:path";import{homedir as X}from"node:os";import{createHash as M}from"node:crypto";import{statSync as O,readdirSync as N,readFileSync as Z,lstatSync as v}from"node:fs";import{stat as F,readdir as _,readFile as ee,lstat as H}from"node:fs/promises";import{makeRe as te}from"minimatch";var re=(n=>(n.DIRECTORY="directory",n.FILE="file",n))(re||{}),ne=(l=>(l.ALPHABETICAL="alpha",l.ALPHABETICAL_REVERSE="antialpha",l.ALPHABETICAL_INSENSITIVE="alpha-insensitive",l.ALPHABETICAL_INSENSITIVE_REVERSE="antialpha-insensitive",l))(ne||{}),se=(a=>(a.ALPHABETICAL="alpha",a.ALPHABETICAL_REVERSE="antialpha",a.ALPHABETICAL_INSENSITIVE="alpha-insensitive",a.ALPHABETICAL_INSENSITIVE_REVERSE="antialpha-insensitive",a.FOLDERS_FIRST="folders-first",a.FILES_FIRST="files-first",a))(se||{}),p={stat:!1,normalize:!1,symbolicLinks:!0,followLinks:!1,sizeInBytes:!0,size:!0,hash:!0,hashAlgorithm:"md5",hashEncoding:"hex",showHidden:!0,depth:void 0,exclude:void 0,matches:void 0,extensions:void 0,emptyDirectory:!1,excludeEmptyDirectories:!1,descendants:!1,descendantsIgnoreDirectories:!1,sorted:!1,postSorted:!1,homeShortcut:!1,skipErrors:!0},ie={dirChild:"\u2500> ",fileChild:"\u2500\u2500 ",forkChild:"\u251C",lastChild:"\u2514",linkChild:">>",tabIndent:" ",pipeIndent:"\u2502 "},be={dirChild:"-\\ ",fileChild:"-- ",forkChild:"|",lastChild:"`",linkChild:"->",tabIndent:" ",pipeIndent:"| "},B={symbolicLinks:!0,followLinks:!1,showHidden:!0,depth:void 0,exclude:void 0,extensions:void 0,sorted:!1,postSorted:!1,homeShortcut:!1,symbols:ie,skipErrors:!0};function w(r,t){return L(t.homeShortcut?r.replace(/^~($|\/|\\)/,X()+"$1"):r)}function S(r){return(Array.isArray(r)?r:[r]).map(t=>t instanceof RegExp?t:te(t,{dot:!0})).filter(t=>t instanceof RegExp)}function V(r){let t={};if(r){for(let n in p)t[n]=r[n]!==void 0?r[n]:p[n];t.depth<0&&(t.depth=0)}else t=p;return t}function D(r){let t={};if(r){for(let n in B)t[n]=r[n]!==void 0?r[n]:B[n];t.depth<0&&(t.depth=0)}else t=B;return t}function C(r){let t=["B","KB","MB","GB","TB"],n;for(n=0;n<t.length&&r>1e3;n++)r/=1e3;return Math.round(r*100)/100+" "+t[n]}function x(r,t){return r.localeCompare(t)}function A(r,t){return r.toLowerCase().localeCompare(t.toLowerCase())}function k(r,t){if(!t)return r;if(t===!0)return r.sort(x);if(typeof t=="string")switch(t){case"alpha":return r.sort(x);case"antialpha":return r.sort(x).reverse();case"alpha-insensitive":return r.sort(A);case"antialpha-insensitive":return r.sort(A).reverse();default:return r}else if(typeof t=="function")return r.sort(t)}function z(r,t){return x(r.name,t.name)}function Y(r,t){return A(r.name,t.name)}function le(r,t){return r.type==="directory"&&t.type==="file"?-1:r.type==="file"&&t.type==="directory"?1:0}function ae(r,t){return r.type==="file"&&t.type==="directory"?-1:r.type==="directory"&&t.type==="file"?1:0}function $(r,t){if(!t)return r;if(t===!0)return r.sort(z);if(typeof t=="string")switch(t){case"alpha":return r.sort(z);case"antialpha":return r.sort(z).reverse();case"alpha-insensitive":return r.sort(Y);case"antialpha-insensitive":return r.sort(Y).reverse();case"folders-first":return r.sort(le);case"files-first":return r.sort(ae);default:return r}else if(typeof t=="function")return r.sort(t)}function U(r,t){if(!t)return r;if(t===!0)return r.sort((n,e)=>x(n.relativePath,e.relativePath));if(typeof t=="string")switch(t){case"alpha":return r.sort((n,e)=>x(n.relativePath,e.relativePath));case"antialpha":return r.sort((n,e)=>x(n.relativePath,e.relativePath)).reverse();case"alpha-insensitive":return r.sort((n,e)=>A(n.relativePath,e.relativePath));case"antialpha-insensitive":return r.sort((n,e)=>A(n.relativePath,e.relativePath)).reverse();default:return r}else if(typeof t=="function")return r.sort((n,e)=>t(n.relativePath,e.relativePath))}function q(r,t,n,e,l,o){if(e.depth!==void 0&&n>e.depth)return null;let a=r===t?".":R(r,t);if(e.exclude&&r!==t&&S(e.exclude).some(b=>b.test(`/${a}`)))return null;let s=T(t),h;try{h=O(t)}catch(c){if(e.skipErrors)return null;throw c}let i;try{i=v(t)}catch(c){if(e.skipErrors)return null;throw c}let m=i.isSymbolicLink(),g=h.isFile()?"file":"directory";if(!e.showHidden&&s.charAt(0)==="."||!e.symbolicLinks&&m)return null;let E;if(e.hash){let c=e.hashAlgorithm;E=M(c),E.update(s)}let u={name:s,path:e.normalize?t.replace(/\\/g,"/"):t,relativePath:e.normalize?a.replace(/\\/g,"/"):a,type:g,isSymbolicLink:m,stat:e.followLinks?h:i};switch(e.stat||delete u.stat,g){case"directory":let c=[],b;if(e.followLinks||!m){try{b=N(t),b=k(b,e.sorted)}catch(d){if(e.skipErrors)return null;throw d}if(e.emptyDirectory&&(u.isEmpty=!b.length),b.forEach(d=>{let f=q(r,L(t,d),n+1,e,l,o);f!==null&&c.push(f)}),e.excludeEmptyDirectories&&!c.length)return null}if(e.matches&&r!==t){let d=S(e.matches);if(!c.length&&d.some(f=>!f.test(`/${a}`)))return null}if(e.sizeInBytes||e.size){let d=c.reduce((f,y)=>f+y.sizeInBytes,0);u.sizeInBytes=d,u.size=e.size?C(d):void 0,e.sizeInBytes||c.forEach(f=>f.sizeInBytes=void 0)}if(e.hash){c.forEach(f=>{E.update(f.hash)});let d=e.hashEncoding;u.hash=E.digest(d)}e.descendants&&(u.descendants=c.reduce((d,f)=>d+(f.type==="directory"&&e.descendantsIgnoreDirectories?0:1)+(f.descendants??0),0)),c.length&&(u.children=e.postSorted?$(c,e.postSorted):c);break;case"file":if(u.extension=P(t).replace(".",""),e.extensions&&e.extensions.indexOf(u.extension)===-1||e.matches&&r!==t&&S(e.matches).some(f=>!f.test(`/${a}`)))return null;if(e.sizeInBytes||e.size){let d=e.followLinks?h.size:i.size;u.sizeInBytes=d,u.size=e.size?C(d):void 0}if(e.hash){let d;try{d=Z(t)}catch(y){if(e.skipErrors)return null;throw y}E.update(d);let f=e.hashEncoding;u.hash=E.digest(f)}break;default:return null}return l&&g==="file"?l(u,e.followLinks?h:i):o&&g==="directory"&&o(u,e.followLinks?h:i),u}async function G(r,t,n,e,l,o){if(e.depth!==void 0&&n>e.depth)return null;let a=r===t?".":R(r,t);if(e.exclude&&r!==t&&S(e.exclude).some(b=>b.test(`/${a}`)))return null;let s=T(t),h;try{h=await F(t)}catch(c){if(e.skipErrors)return null;throw c}let i;try{i=await H(t)}catch(c){if(e.skipErrors)return null;throw c}let m=i.isSymbolicLink(),g=h.isFile()?"file":"directory";if(!e.showHidden&&s.charAt(0)==="."||!e.symbolicLinks&&m)return null;let E;if(e.hash){let c=e.hashAlgorithm;E=M(c),E.update(s)}let u={name:s,path:e.normalize?t.replace(/\\/g,"/"):t,relativePath:e.normalize?a.replace(/\\/g,"/"):a,type:g,isSymbolicLink:m,stat:e.followLinks?h:i};switch(e.stat||delete u.stat,g){case"directory":let c=[],b;if(e.followLinks||!m){try{b=await _(t),b=k(b,e.sorted)}catch(d){if(e.skipErrors)return null;throw d}if(e.emptyDirectory&&(u.isEmpty=!b.length),c=await Promise.all(b.map(async d=>await G(r,L(t,d),n+1,e,l,o))),c=c.filter(d=>d!==null),e.excludeEmptyDirectories&&!c.length)return null}if(e.matches&&r!==t){let d=S(e.matches);if(!c.length&&d.some(f=>!f.test(`/${a}`)))return null}if(e.sizeInBytes||e.size){let d=c.reduce((f,y)=>f+y.sizeInBytes,0);u.sizeInBytes=d,u.size=e.size?C(d):void 0,e.sizeInBytes||c.forEach(f=>f.sizeInBytes=void 0)}if(e.hash){c.forEach(f=>{E.update(f.hash)});let d=e.hashEncoding;u.hash=E.digest(d)}e.descendants&&(u.descendants=c.reduce((d,f)=>d+(f.type==="directory"&&e.descendantsIgnoreDirectories?0:1)+(f.descendants??0),0)),c.length&&(u.children=e.postSorted?$(c,e.postSorted):c);break;case"file":if(u.extension=P(t).replace(".",""),e.extensions&&e.extensions.indexOf(u.extension)===-1||e.matches&&r!==t&&S(e.matches).some(f=>!f.test(`/${a}`)))return null;if(e.sizeInBytes||e.size){let d=e.followLinks?h.size:i.size;u.sizeInBytes=d,u.size=e.size?C(d):void 0}if(e.hash){let d;try{d=await ee(t)}catch(y){if(e.skipErrors)return null;throw y}E.update(d);let f=e.hashEncoding;u.hash=E.digest(f)}break;default:return null}return l&&g==="file"?await l(u,e.followLinks?h:i):o&&g==="directory"&&await o(u,e.followLinks?h:i),u}function K(r,t,n){return!t.symbolicLinks&&r.isSymbolicLink||!t.showHidden&&r.name.charAt(0)==="."||t.extensions!==void 0&&r.type==="file"&&t.extensions.indexOf(r.extension)===-1||t.exclude&&S(t.exclude).some(e=>e.test(`/${r.relativePath}`))||t.depth!==void 0&&n>t.depth}function j(r,t,n,e,l){let o="";return t.map((s,h)=>{let i="";if(e.depth!==void 0&&l>e.depth||e.exclude&&S(e.exclude).some(I=>I.test(`/${R(r,s)}`)))return"";let m=T(s),g;try{g=O(s)}catch(y){if(e.skipErrors)return null;throw y}let E;try{E=v(s)}catch(y){if(e.skipErrors)return null;throw y}let u=E.isSymbolicLink(),c=g.isFile()?"file":"directory";if(!e.showHidden&&m.charAt(0)==="."||!e.symbolicLinks&&u)return"";let b=P(s).replace(".","");if(e.extensions&&c==="file"&&e.extensions.indexOf(b)===-1)return"";let d=u?e.symbols.linkChild:c==="directory"?e.symbols.dirChild:e.symbols.fileChild,f=n+(h===t.length-1?e.symbols.tabIndent:e.symbols.pipeIndent);if(i+=d+m,(e.followLinks||!u)&&c==="directory"){let y;try{y=N(s).map(I=>L(s,I)),y=k(y,e.sorted)}catch(I){if(e.skipErrors)return null;throw I}i+=y.length?j(r,y,f,e,l+1):""}return i}).filter(s=>!!s).forEach((s,h,i)=>{o+=n+(h===i.length-1?e.symbols.lastChild+s:e.symbols.forkChild+s)}),o}async function J(r,t,n,e,l){let o="";return(await Promise.all(t.map(async(s,h)=>{let i="";if(e.depth!==void 0&&l>e.depth||e.exclude&&S(e.exclude).some(I=>I.test(`/${R(r,s)}`)))return"";let m=T(s),g;try{g=await F(s)}catch(y){if(e.skipErrors)return null;throw y}let E;try{E=await H(s)}catch(y){if(e.skipErrors)return null;throw y}let u=E.isSymbolicLink(),c=g.isFile()?"file":"directory";if(!e.showHidden&&m.charAt(0)==="."||!e.symbolicLinks&&u)return"";let b=P(s).replace(".","");if(e.extensions&&c==="file"&&e.extensions.indexOf(b)===-1)return"";let d=u?e.symbols.linkChild:c==="directory"?e.symbols.dirChild:e.symbols.fileChild,f=n+(h===t.length-1?e.symbols.tabIndent:e.symbols.pipeIndent);if(i+=d+m,(e.followLinks||!u)&&c==="directory"){let y;try{y=(await _(s)).map(I=>L(s,I)),y=k(y,e.sorted)}catch(I){if(e.skipErrors)return null;throw I}i+=y.length?await J(r,y,f,e,l+1):""}return i}))).filter(s=>!!s).forEach((s,h,i)=>{o+=n+(h===i.length-1?e.symbols.lastChild+s:e.symbols.forkChild+s)}),o}function Q(r,t,n,e){let l="";return r=U(r,n.sorted),r.filter(o=>!K(o,n,e)).forEach((o,a,s)=>{let h=o.isSymbolicLink?n.symbols.linkChild:o.type==="directory"?n.symbols.dirChild:n.symbols.fileChild,i=a===s.length-1?n.symbols.lastChild+h:n.symbols.forkChild+h,m=t+(a===s.length-1?n.symbols.tabIndent:n.symbols.pipeIndent);l+=t+i+o.name,l+=o.children&&(n.followLinks||!o.isSymbolicLink)?Q(o.children,m,n,e+1):""}),l}async function W(r,t,n,e){let l="";r=U(r,n.sorted);let o=r.filter(a=>!K(a,n,e));for(let a=0;a<o.length;a++){let s=o[a],h=s.isSymbolicLink?n.symbols.linkChild:s.type==="directory"?n.symbols.dirChild:n.symbols.fileChild,i=a===o.length-1?n.symbols.lastChild+h:n.symbols.forkChild+h,m=t+(a===o.length-1?n.symbols.tabIndent:n.symbols.pipeIndent);l+=t+i+s.name,l+=s.children&&(n.followLinks||!s.isSymbolicLink)?await W(s.children,m,n,e+1):""}return l}function ge(r,t,n,e){let l=V(t),o=w(r,l),a=q(o,o,0,l,n,e);return a&&(a.sizeInBytes=l.sizeInBytes?a.sizeInBytes:void 0),a}async function Ie(r,t,n,e){let l=V(t),o=w(r,l),a=await G(o,o,0,l,n,e);return a&&(a.sizeInBytes=l.sizeInBytes?a.sizeInBytes:void 0),a}function Se(r,t){let n="",e=D(t),l=w(r,e),o=T(l);n+=o;let a;try{a=O(l)}catch(i){if(e.skipErrors)return null;throw i}let s;try{s=v(l)}catch(i){if(e.skipErrors)return null;throw i}let h=s.isSymbolicLink();if((e.followLinks||!h)&&a.isDirectory()){let i;try{i=N(l).map(m=>L(l,m)),i=k(i,e.sorted)}catch(m){if(e.skipErrors)return null;throw m}n+=i.length?j(l,i,`
`,e,1):""}return n}async function xe(r,t){let n="",e=D(t),l=w(r,e),o=T(l);n+=o;let a;try{a=await F(l)}catch(i){if(e.skipErrors)return null;throw i}let s;try{s=await H(l)}catch(i){if(e.skipErrors)return null;throw i}let h=s.isSymbolicLink();if((e.followLinks||!h)&&a.isDirectory()){let i;try{i=(await _(l)).map(m=>L(l,m)),i=k(i,e.sorted)}catch(m){if(e.skipErrors)return null;throw m}n+=i.length?await J(l,i,`
`,e,1):""}return n}function Le(r,t){let n="",e=D(t);return n+=r?r.name:"",n+=r.children?Q(r.children,`
`,e,1):"",n}async function Te(r,t){let n="",e=D(t);return n+=r?r.name:"",n+=r.children?await W(r.children,`
`,e,1):"",n}export{be as ASCII_SYMBOLS,ie as DEFAULT_SYMBOLS,se as PostSortMethodPredefined,ne as SortMethodPredefined,re as Type,Se as parse,xe as parseAsync,Le as parseTree,Te as parseTreeAsync,ge as scan,Ie as scanAsync};