← back to Dw Color Image Audit
scripts/aggregate.js
40 lines
'use strict';
const fs = require('fs');
const path = require('path');
const dir = path.join(__dirname,'..','out');
const files = fs.readdirSync(dir).filter(f=>f.endsWith('.json') && f!=='AGGREGATE.json');
const perVendor = {}; const allFindings = [];
let tot = { OK:0, REVIEW:0, HIGH:0, UNKNOWN:0 };
for(const f of files){
let j; try{ j = JSON.parse(fs.readFileSync(path.join(dir,f),'utf8')); }catch{ continue; }
for(const k of Object.keys(j.counts||{})) tot[k]=(tot[k]||0)+j.counts[k];
for(const x of (j.findings||[])){
const v = x.vendor||'(none)';
perVendor[v] = perVendor[v] || { vendor:v, total:0, HIGH:0, REVIEW:0, examples:[] };
perVendor[v].total++; perVendor[v][x.verdict]++;
if(x.verdict==='HIGH' && perVendor[v].examples.length<5) perVendor[v].examples.push(x);
allFindings.push(x);
}
// add scanned totals per vendor (OK too) for rate context
}
// scanned counts per vendor from raw dataset
const ds = fs.readFileSync(path.join(dir,'fresh_dataset.tsv'),'utf8').split('\n').filter(Boolean);
const scanned = {};
for(const line of ds){ const v=line.split('\t')[0]||'(none)'; scanned[v]=(scanned[v]||0)+1; }
const ranked = Object.values(perVendor).map(v=>({
...v, scanned: scanned[v.vendor]||0,
highRate: scanned[v.vendor]? +(v.HIGH/scanned[v.vendor]*100).toFixed(1):0
})).sort((a,b)=> b.HIGH - a.HIGH || b.REVIEW - a.REVIEW);
const result = { generatedAt:new Date().toISOString(), totals:tot, totalScanned: ds.length,
vendorsRanked: ranked, highFindings: allFindings.filter(f=>f.verdict==='HIGH') };
fs.writeFileSync(path.join(dir,'AGGREGATE.json'), JSON.stringify(result,null,2));
// print summary
console.log('TOTALS', JSON.stringify(tot), 'scanned', ds.length);
console.log('\nTop vendors by HIGH-severity mismatches:');
console.log('VENDOR'.padEnd(32),'HIGH'.padStart(6),'REVIEW'.padStart(7),'SCAN'.padStart(6),'HIGH%'.padStart(7));
for(const v of ranked.slice(0,25)){
console.log(v.vendor.slice(0,31).padEnd(32), String(v.HIGH).padStart(6), String(v.REVIEW).padStart(7), String(v.scanned).padStart(6), String(v.highRate).padStart(7));
}