← back to Fentucci Naturals
scripts/report.js
24 lines
#!/usr/bin/env node
// Sanity report: patterns/SKUs per category, image coverage, shared-image flags, sample rows.
const fs = require('fs');
const path = require('path');
const ROOT = path.join(__dirname, '..');
const products = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'products.json')));
const audit = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'image-audit.json')));
const perCat = new Map();
for (const p of products) {
const c = perCat.get(p.source_category) || { skus: 0, patterns: new Set() };
c.skus++; c.patterns.add(p.pattern_key);
perCat.set(p.source_category, c);
}
console.log('category skus patterns');
for (const [c, v] of [...perCat].sort()) console.log(c.padEnd(20), String(v.skus).padStart(4), String(v.patterns.size).padStart(6));
console.log('\nTOTAL skus:', products.length, ' patterns:', new Set(products.map(p => p.pattern_key)).size);
console.log('image coverage:', audit.coverage_pct + '%', `(missing ${audit.missing.length}, small ${audit.small.length})`);
console.log('shared-image flagged patterns:', audit.shared_image_patterns.length);
for (const f of audit.shared_image_patterns) console.log(' ', f.pattern, `${f.distinct_images}/${f.colorways} distinct`, f.shared.slice(0, 3));
console.log('\nsample rows:');
for (const p of [products[0], products[100], products[220], products[350], products[503]].filter(Boolean))
console.log(` ${p.mfr_sku} -> ${p.dw_sku} | ${p.pattern_name} ${p.color_name || '(no color)'} | ${p.material} | ${p.source_category}`);