const sharp = require('sharp'); const path = require('path'); const fs = require('fs'); const svgPath = path.resolve(__dirname, '../client/public/favicon.svg'); const iconsDir = path.resolve(__dirname, '../client/public/icons'); // Standard icon sizes for web/electron apps const iconSizes = [16, 24, 32, 48, 64, 128, 256, 512]; // Tray icon sizes (simpler variant needed at 16 and 32) const traySizes = [ { name: 'tray-icon.png', size: 16 }, { name: 'tray-icon@2x.png', size: 32 }, ]; // Logo (512px) const logoSize = { name: 'logo.png', size: 512 }; async function generate() { if (!fs.existsSync(svgPath)) { console.error(`SVG not found: ${svgPath}`); process.exit(1); } fs.mkdirSync(iconsDir, { recursive: true }); const svgBuffer = fs.readFileSync(svgPath); // Generate standard icon sizes for (const size of iconSizes) { const outPath = path.join(iconsDir, `icon-${size}.png`); await sharp(svgBuffer) .resize(size, size) .png() .toFile(outPath); console.log(` ✓ icon-${size}.png (${size}x${size})`); } // Generate tray icons (smaller, may need simplification - use same source) for (const { name, size } of traySizes) { const outPath = path.join(iconsDir, name); await sharp(svgBuffer) .resize(size, size) .png() .toFile(outPath); console.log(` ✓ ${name} (${size}x${size})`); } // Generate logo const logoPath = path.join(iconsDir, logoSize.name); await sharp(svgBuffer) .resize(logoSize.size, logoSize.size) .png() .toFile(logoPath); console.log(` ✓ ${logoSize.name} (${logoSize.size}x${logoSize.size})`); console.log(`\nDone! All icons generated in ${iconsDir}`); } generate().catch(err => { console.error('Failed:', err); process.exit(1); });