@knide/fs-prober
Version:
fs-prober is a browser-friendly NPM package for extracting file and folder structures from user-selected files or directories.
2 lines (1 loc) • 7.22 kB
JavaScript
;var V=Object.create;var N=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var A=(e,r)=>{for(var t in r)N(e,t,{get:r[t],enumerable:!0})},B=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of q(r))!Q.call(e,o)&&o!==t&&N(e,o,{get:()=>r[o],enumerable:!(n=Y(r,o))||n.enumerable});return e};var L=(e,r,t)=>(t=e!=null?V(J(e)):{},B(r||!e||!e.__esModule?N(t,"default",{value:e,enumerable:!0}):t,e)),X=e=>B(N({},"__esModule",{value:!0}),e);var ae={};A(ae,{addFileProperties:()=>E,convertToFileList:()=>O,default:()=>ie,fsProber:()=>k,getFilesArrFromHierarchyFiles:()=>v,getHierarchyDetailsFromFiles:()=>j,isFolderNode:()=>P});module.exports=X(ae);var R={};A(R,{addFileProperties:()=>E,convertToFileList:()=>O,fsProber:()=>k,getFilesArrFromHierarchyFiles:()=>v,getHierarchyDetailsFromFiles:()=>j,isFolderNode:()=>P});var w=L(require("lodash.flatmap")),D=L(require("lodash.map")),K=require("nanoid");var z=e=>typeof DataTransferItem>"u"?!1:e in DataTransferItem.prototype,b=z("getAsFileSystemHandle"),M=z("webkitGetAsEntry"),m=e=>"kind"in e,S=e=>"kind"in e?e.kind==="directory":!!e.isDirectory,T=e=>"kind"in e?e.kind==="file":!!e.isFile,W=()=>{let e="Your browser is not supported. Please use a chromium based browser.";return console.error(e),new Error(e)};var x=e=>{if(M&&!m(e)){if("isFile"in e&&e.isFile)return"file";if("isDirectory"in e&&e.isDirectory)return"directory";throw new Error("Unknown handle kind")}else if(b){if(m(e))return e.kind;throw new Error("Invalid FileSystemHandle")}throw W()},U=async e=>{let r="Passed handle is not a directory";if(M&&!m(e)){if(!e.isDirectory)throw Error(r);let t=e.createReader();return await(async()=>{let o=[],d=async()=>new Promise((s,i)=>{t.readEntries(a=>{a.length>0?(a.forEach(l=>{o.push([l.name,l])}),d().then(s).catch(i)):s(o)},a=>i(a))});return d()})()}else if(b&&m(e)){if(e.kind!=="directory")throw Error(r);let t=[];for await(let n of e.entries())t.push(n);return t}throw W()},$=async e=>{if(M&&!m(e))return await(async t=>new Promise((n,o)=>t.file(n,o)))(e);if(b&&m(e))return await e.getFile();throw W()};var u=(e,r)=>{let t=(0,K.nanoid)();return r.set(t,e),t};async function k(e,r=!0){if(!e)return null;let t=new Map,n=new Map,o={emptyFolders:[],allFolders:[],allFiles:[],rootHandle:e,rootFolder:void 0,rootFile:void 0,nameMap:n,objectMap:t},d=e.name;if(S(e))await C(e,d,o,{objectMap:t,nameMap:n}),o.rootFolder=o.allFolders[o.allFolders.length-1],o.allFolders.length===1&&o.allFolders[0]?.children.length===0&&o.allFolders[0]&&o.emptyFolders.push(o.allFolders[0]);else if(T(e)){let s=u(e.name,n),i={name:e.name,nameId:s,pathIds:[s],kind:"file",isBranch:!1,path:d,handle:e};t.set(s,i),o.allFiles.push(i),o.rootFile=i}return o.nameMap=n,o.objectMap=t,r?Z([o]):o}var C=async(e,r,t,n,o=[])=>{let d=x(e);if(d!=="directory")return;let{objectMap:s,nameMap:i}=n,a=u(e.name,i),l={name:e.name,nameId:a,pathIds:[...o,a],kind:d,isBranch:!0,path:r,children:[],handle:e};s.set(a,l);let p=await U(e);for(let[F,c]of p){let h=`${r}/${F}`,y=x(c);if(y==="file"&&T(c)){let f=u(c.name,i),g={path:h,pathIds:[...o,a,f],name:c.name,nameId:f,kind:y,isBranch:!1,handle:c};s.set(f,g),t.allFiles.push(g),l.children.push(g)}else if(S(c)){let f=[...o,a],H=await C(c,h,t,{objectMap:s,nameMap:i},f);H&&(H.children.length===0&&t.emptyFolders.push(H),l.children.push(H))}}return t.allFolders.push(l),l},Z=e=>{if(!e||e.length===0)return null;let r=[];e.forEach(o=>{r=[...r,...o.nameMap]});let t=[];return e.forEach(o=>{t=[...t,...o.objectMap]}),{emptyFolders:(0,w.default)(e,"emptyFolders"),allFolders:(0,w.default)(e,"allFolders"),allFiles:(0,w.default)(e,"allFiles"),rootHandles:(0,D.default)(e,"rootHandle"),rootFolders:(0,D.default)(e,"rootFolder").filter(Boolean),rootFiles:(0,D.default)(e,"rootFile").filter(Boolean),nameMap:new Map(r),objectMap:new Map(t)}};var P=e=>e.kind==="directory";var I=e=>e?.replace(/\/+$/,"").replace(/\/+/g,"/")||"/";var v=async e=>{if(!e)return null;let r=[];for(let t of e){let n=await $(t.handle);Object.defineProperty(n,"path",{value:t.path}),r.push(n)}return r},G=e=>{try{if(!e.path)throw new Error("isRootFile: no path in file");let r=e.path.replace("/",""),t=e.name.replace("/","");return r===t}catch(r){throw console.error(r),console.warn("isRootFile: ",e),r}},_=(e,r,t)=>{let n=[],o=[],d=new Map,s=(i,a)=>{if(!i.length)return{pathIds:[]};let l=i.join("/");if(d.has(l)){let h=d.get(l);if(h){let y=t.get(h);return a&&y&&P(y)&&y.children.push(a),{pathIds:[h]}}else throw new Error(`Unreachable code: nameId not found for path: ${l}`)}let p=i[i.length-1]||"",F=u(p,r),c={name:p,nameId:F,kind:"directory",isBranch:!0,path:l,children:a?[a]:[],pathIds:[]};if(t.set(F,c),o.push(c),d.set(l,F),i.length>1){let h=i.slice(0,-1),{pathIds:y}=s(h,c);return c.pathIds=[...y,F],{pathIds:c.pathIds}}else return n.push(c),c.pathIds=[F],{pathIds:c.pathIds}};for(let i of e){if(G(i))continue;let l=I(i.path).split("/").filter(Boolean).slice(0,-1),{pathIds:p}=s(l,i);i.pathIds=[...p,i.nameId]}return[o,n]},j=e=>{if(!e)return null;let r=new Map,t=new Map,n=[],o=e.map(a=>{let l=u(a.name,r),p=I(a.webkitRelativePath||a.path),F={path:p,name:p.split("/").pop()||a.name,kind:"file",isBranch:!1,pathIds:[l],nameId:l};return G(a)&&n.push(F),t.set(l,F),F}),[d,s]=_(o,r,t);return{emptyFolders:[],allFolders:d,rootFolders:s,allFiles:o,rootFiles:n,nameMap:r,objectMap:t}};var ee=e=>"kind"in e?e.kind==="directory"&&e.children.length===0:!1,te=e=>"path"in e,O=e=>{let r=new DataTransfer;return e.forEach(n=>{let o=new File([],n.name);if(!(n instanceof File)&&ee(n)){let d=new File([],n.name);for(let s in n)n[s]&&!d[s]&&s!=="name"&&(d[s]=n[s]);o=d}if(te(n)&&n.path!==""&&n.webkitRelativePath===""){let d=re(n.path);o=ne(n,d)}r.items.add(o)}),r.files},re=e=>{if(!e)return"";let r=e.startsWith("/")?e.substring(1):e;return!r.includes("/")?"":r},oe=(e,r)=>{let t=r.split("/").filter(Boolean);return t[t.length-1]=e.name,t.join("/")},ne=(e,r)=>{let t=oe(e,r);try{return Object.defineProperty(e,"webkitRelativePath",{value:r}),e.path===void 0&&Object.defineProperty(e,"path",{value:t}),e}catch(n){if(n instanceof TypeError&&n.message.includes("Cannot redefine property"))return E(e,{webkitRelativePath:r,path:t});throw console.error("Unexpected error: ",n),n}},E=(e,r)=>{try{for(let[t,n]of Object.entries(r))Object.defineProperty(e,t,{value:n});return e}catch(t){if(t instanceof TypeError&&(t.message.includes("Cannot redefine property")||t.message.includes("can't redefine non-configurable property")||t.message.includes("Attempting to change value of a readonly property"))){let o=new File([e],e.name,{type:e.type,lastModified:e.lastModified}),d=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertyNames(Object.getPrototypeOf(e))],s={};for(let a of d){let l=e[a];typeof l=="function"||l===void 0||(s[a]=l)}let i={...s,path:e.path,webkitRelativePath:e.webkitRelativePath,...r};for(let[a,l]of Object.entries(i))Object.defineProperty(o,a,{value:l});return o}else throw console.error("Unexpected error: ",t),t}};var ie=R;0&&(module.exports={addFileProperties,convertToFileList,fsProber,getFilesArrFromHierarchyFiles,getHierarchyDetailsFromFiles,isFolderNode});