11 lines
2.1 KiB
JavaScript
11 lines
2.1 KiB
JavaScript
// Run from repository root: node scripts/audit/video-canvas-controls.cjs [output.json]
|
|
const fs=require('fs'),ts=require('typescript');
|
|
const file='components/canvas/LiblibVideoCanvasReplica.tsx';
|
|
const source=ts.createSourceFile(file,fs.readFileSync(file,'utf8'),ts.ScriptTarget.Latest,true,ts.ScriptKind.TSX);
|
|
const decls=new Map();
|
|
for(const s of source.statements){if(ts.isFunctionDeclaration(s)&&s.name)decls.set(s.name.text,s);if(ts.isVariableStatement(s))for(const d of s.declarationList.declarations)if(ts.isIdentifier(d.name))decls.set(d.name.text,d);}
|
|
const live=new Set();function visitName(name){if(live.has(name)||!decls.has(name))return;live.add(name);function walk(n){if(ts.isIdentifier(n)&&n!==decls.get(name).name)visitName(n.text);ts.forEachChild(n,walk);}walk(decls.get(name));}visitName('LiblibVideoCanvasReplica');
|
|
const findings=[];for(const[name,node]of decls){if(!live.has(name))continue;function walk(n){if(ts.isJsxOpeningElement(n)||ts.isJsxSelfClosingElement(n)){const tag=n.tagName.getText(source);if(tag==='button'||tag.includes('Button')||tag.includes('Control')){const attrs=n.attributes.properties.filter(ts.isJsxAttribute);const click=attrs.find(a=>a.name.text==='onClick');const txt=n.parent.getText(source); if(!click&&!attrs.some(a=>['disabled','onPointerDown','onMouseDown'].includes(a.name.text))||click&&/toast\.(info|success)/.test(click.getText(source)))findings.push({owner:name,line:source.getLineAndCharacterOfPosition(n.getStart(source)).line+1,tag,handler:click?.getText(source)||'',snippet:txt.slice(0,650)});}}ts.forEachChild(n,walk);}walk(node);}
|
|
const out={file,root:'LiblibVideoCanvasReplica',method:'Conservative identifier reachability; candidates need manual review, not runtime coverage.',reachableDeclarations:[...live],unreachableFunctions:[...decls].filter(([n,d])=>ts.isFunctionDeclaration(d)&&!live.has(n)).map(([name])=>name),candidates:findings};if(process.argv[2]) fs.writeFileSync(process.argv[2],JSON.stringify(out,null,2));
|
|
console.log(JSON.stringify({reachable:live.size,deadFunctions:out.unreachableFunctions.length,candidateCount:findings.length},null,2));
|