import{readFile,writeFile,stat}from'node:fs/promises';import{basename}from'node:path';import{makePatch,renderDiff,LIMIT}from'./core.mjs';import{reportDocument}from'./report.mjs';import createDOMPurify from'dompurify';import{JSDOM}from'jsdom';
const args=process.argv.slice(2);
if(args.length!==3){console.error('Usage: node src/cli.mjs old.txt new.txt report.html');process.exitCode=2;}else{try{for(const p of args.slice(0,2))if((await stat(p)).size>LIMIT)throw Error('Input limit: 128 KiB per file');const [before,after]=await Promise.all(args.slice(0,2).map(p=>readFile(p,'utf8')));const result=renderDiff(makePatch(before,after,basename(args[1])));const window=new JSDOM('').window;let clean;try{clean=createDOMPurify(window).sanitize(result.html,{USE_PROFILES:{html:true,svg:true},FORBID_TAGS:['script','style','iframe','img'],FORBID_ATTR:['style','src','srcset']});}finally{window.close();}const css=await readFile('node_modules/diff2html/bundles/css/diff2html.min.css','utf8');await writeFile(args[2],reportDocument(clean,css),{flag:'wx'});console.log(JSON.stringify({output:args[2],files:result.files,added:result.additions,deleted:result.deletions}));}catch(err){console.error(err.message);process.exitCode=1;}}
