import { walk } from "jsr:@std/fs"; const targetDir = "./src"; let hasErrors = false; async function checkFile(path: string) { const content = await Deno.readTextFile(path); const lines = content.split("\n"); lines.forEach((line, index) => { // 1. Block banned DOM APIs if ( line.includes("document.getElementById") || line.includes("document.querySelector") || line.includes("document.createElement") ) { console.error( `[Arch Lint] ❌ Banned DOM API used in ${path}:${index + 1}`, ); console.error(` ${line.trim()}`); console.error( ` -> Use Datastar reactive attributes or SSE morphs instead.`, ); hasErrors = true; } // 2. Block unescaped HTML in raw strings (basic heuristic for dangerouslySetInnerHTML) if ( line.includes("dangerouslySetInnerHTML") && !path.includes("error_fragments.tsx") ) { console.error( `[Arch Lint] ❌ dangerouslySetInnerHTML used in ${path}:${index + 1}`, ); console.error(` ${line.trim()}`); console.error( ` -> Native JSX HTML escaping should be used unless in explicit core fragments.`, ); hasErrors = true; } }); } for await (const entry of walk(targetDir, { exts: [".ts", ".tsx"] })) { if (entry.isFile) { await checkFile(entry.path); } } if (hasErrors) { Deno.exit(1); } else { console.log("✅ Architecture lint passed."); }