UNPKG

folder-validator

Version:

A powerful tool to validate and maintain consistent folder structures across your projects

4 lines 2.54 kB
import $ from"fs";import p from"path";var w=[{name:"dist",required:!1},{name:"build",required:!1},{name:"node_modules",required:!1},{name:".git",required:!1},{name:".next",required:!1},{name:".husky",required:!1},{name:".vscode",required:!1},{name:"coverage",required:!1},{name:".nixpacks",required:!1}];var F=s=>s.map(i=>({...i,required:i.required??!1,children:i.children?F(i.children):void 0})),V=async s=>{if(!$.existsSync(s))return console.warn(`Config file not found: ${s}. Using default folders only.`),[];let i=p.extname(s);try{if(i===".ts"||i===".js"){let{default:n}=await import(`file://${p.resolve(s)}`);return F(n)}else throw new Error("Unsupported config file format. Use .ts or .js")}catch(n){return console.error("Error loading config:",n),[]}},D=async s=>{try{return(await $.promises.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch(i){return console.error("Error reading directory:",i),[]}},g=(s,i,n)=>{let a=n.ignoreCase?(r,t)=>r.toLowerCase()===t.toLowerCase():(r,t)=>r===t;return i.some(r=>a(s,r.name))};async function h(s,i,n,a,r="",t){let d=await D(s),c=d.filter(e=>!g(e,i,n));if(c.length>0){if(n.strict){a.isValid=!1;let e=r?`${r}/`:"";a.errors.push(`Disallowed folders found in ${e}: ${c.join(", ")}`)}else if(!n.allowUnknown){let e=r?`${r}/`:"";a.warnings.push(`Unknown folders found in ${e}: ${c.join(", ")}`)}}let u=i.filter(e=>e.required).filter(e=>!d.some(o=>g(o,[e],n)));if(u.length>0){a.isValid=!1;let e=r?`${r}/`:"";a.errors.push(`Missing required folders in ${e}: ${u.map(o=>o.name).join(", ")}`)}let m=i.filter(e=>!e.required).filter(e=>{if(!t)return!0;let o=r?`${r}/${e.name}`:e.name;return t.has(o)}).filter(e=>!d.some(o=>g(o,[e],n)));if(m.length>0){let e=r?`${r}/`:"",o=m.map(l=>{let f=[];return f.push(l.name),l.description&&f.push(l.description),f.join(" - ")}).join(` \u2022 `);a.warnings.push(`Optional folders that could be added in ${e}: \u2022 ${o}`)}for(let e of d){let o=i.find(l=>g(e,[l],n));if(o!=null&&o.children){let l=p.join(s,e),f=r?`${r}/${e}`:e;await h(l,o.children,n,a,f,t)}}}var k=async(s,i,n={})=>{let r={...{strict:!1,allowUnknown:!0,ignoreCase:!1},...n},t={isValid:!0,errors:[],warnings:[]};try{let d=typeof i=="string"?await V(i):i,c=[...d,...w],u=new Set,m=(e,o="")=>{for(let l of e){let f=o?`${o}/${l.name}`:l.name;u.add(f),l.children&&m(l.children,f)}};return m(d),await h(s,c,r,t,"",u),t}catch(d){return t.isValid=!1,t.errors.push(`Error checking folder structure: ${d}`),t}};export{F as a,k as b}; //# sourceMappingURL=chunk-FPPRYSIY.js.map