import fs from "fs"; import path from "path"; import yaml from "js-yaml"; const ROOT = "src/content/glossaire"; const files = fs.readdirSync(ROOT).filter(f => f.endsWith(".md")); const slugs = new Set(files.map(f => f.replace(".md", ""))); let missingNavigation = []; let edges = {}; let incoming = {}; for (const file of files) { const full = path.join(ROOT, file); const raw = fs.readFileSync(full, "utf-8"); if (!raw.startsWith("---")) continue; const data = yaml.load(raw.split("---")[1]) || {}; const slug = file.replace(".md", ""); if (!data.navigation) { missingNavigation.push(slug); } const next = data?.navigation?.primaryNext; if (next) { edges[slug] = next; incoming[next] = (incoming[next] || 0) + 1; } } // šŸ” 1. Fiches sans navigation if (missingNavigation.length > 0) { console.log("\nāŒ Missing navigation:"); missingNavigation.forEach(s => console.log(" -", s)); } // šŸ” 2. Cycles directs console.log("\nšŸ” Direct cycles:"); for (const [a, b] of Object.entries(edges)) { if (edges[b] === a) { console.log(` - ${a} <-> ${b}`); } } // šŸ” 3. Hubs console.log("\nšŸ“Š Top hubs:"); Object.entries(incoming) .sort((a,b) => b[1]-a[1]) .slice(0,10) .forEach(([slug, n]) => { if (n > 5) console.log(`āš ļø ${slug}: ${n}`); else console.log(` ${slug}: ${n}`); }); // šŸ” 4. Slugs morts console.log("\nšŸ”— Checking dead primaryNext:"); for (const [a,b] of Object.entries(edges)) { if (!slugs.has(b)) { console.log(`āŒ ${a} → ${b} (missing)`); } } console.log("\nāœ… Audit done");