← 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));
}