folder-validator
Version:
A powerful tool to validate and maintain consistent folder structures across your projects
4 lines • 3.24 kB
JavaScript
;var D=Object.create;var p=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var v=(i,e)=>{for(var r in e)p(i,r,{get:e[r],enumerable:!0})},y=(i,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of b(e))!U.call(i,o)&&o!==r&&p(i,o,{get:()=>e[o],enumerable:!(s=O(e,o))||s.enumerable});return i};var V=(i,e,r)=>(r=i!=null?D(j(i)):{},y(e||!i||!i.__esModule?p(r,"default",{value:i,enumerable:!0}):r,i)),R=i=>y(p({},"__esModule",{value:!0}),i);var E={};v(E,{defineFolders:()=>h,validateFolderStructure:()=>S});module.exports=R(E);var F=V(require("fs"),1),$=V(require("path"),1);var q=[{name:"node_modules",required:!1},{name:".next",required:!1},{name:".git",required:!1},{name:"dist",required:!1},{name:"build",required:!1},{name:"coverage",required:!1},{name:".husky",required:!1},{name:".vscode",required:!1}];var h=i=>i.map(e=>({...e,required:e.required??!1,children:e.children?h(e.children):void 0})),k=async i=>{if(!F.default.existsSync(i))return console.warn(`Config file not found: ${i}. Using default folders only.`),[];let e=$.default.extname(i);try{if(e===".ts"||e===".js"){let{default:r}=await import(`file://${$.default.resolve(i)}`);return h(r)}else throw new Error("Unsupported config file format. Use .ts or .js")}catch(r){return console.error("Error loading config:",r),[]}},C=async i=>{try{return(await F.default.promises.readdir(i,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch(e){return console.error("Error reading directory:",e),[]}},w=(i,e,r)=>{let s=r.ignoreCase?(o,l)=>o.toLowerCase()===l.toLowerCase():(o,l)=>o===l;return e.some(o=>s(i,o.name))};async function x(i,e,r,s,o="",l){let d=await C(i),c=d.filter(n=>!w(n,e,r));if(c.length>0){if(r.strict){s.isValid=!1;let n=o?`${o}/`:"";s.errors.push(`Disallowed folders found in ${n}: ${c.join(", ")}`)}else if(!r.allowUnknown){let n=o?`${o}/`:"";s.warnings.push(`Unknown folders found in ${n}: ${c.join(", ")}`)}}let u=e.filter(n=>n.required).filter(n=>!d.some(t=>w(t,[n],r)));if(u.length>0){s.isValid=!1;let n=o?`${o}/`:"";s.errors.push(`Missing required folders in ${n}: ${u.map(t=>t.name).join(", ")}`)}let m=e.filter(n=>!n.required).filter(n=>{if(!l)return!0;let t=o?`${o}/${n.name}`:n.name;return l.has(t)}).filter(n=>!d.some(t=>w(t,[n],r)));if(m.length>0){let n=o?`${o}/`:"",t=m.map(a=>{let f=[];return f.push(a.name),a.description&&f.push(a.description),f.join(" - ")}).join(`
\u2022 `);s.warnings.push(`Optional folders that could be added in ${n}:
\u2022 ${t}`)}for(let n of d){let t=e.find(a=>w(n,[a],r));if(t!=null&&t.children){let a=$.default.join(i,n),f=o?`${o}/${n}`:n;await x(a,t.children,r,s,f,l)}}}var S=async(i,e,r={})=>{let o={...{strict:!1,allowUnknown:!0,ignoreCase:!1},...r},l={isValid:!0,errors:[],warnings:[]};try{let d=typeof e=="string"?await k(e):e,c=[...d,...q],u=new Set,m=(n,t="")=>{for(let a of n){let f=t?`${t}/${a.name}`:a.name;u.add(f),a.children&&m(a.children,f)}};return m(d),await x(i,c,o,l,"",u),l}catch(d){return l.isValid=!1,l.errors.push(`Error checking folder structure: ${d}`),l}};0&&(module.exports={defineFolders,validateFolderStructure});
//# sourceMappingURL=index.cjs.map