kv-tube/frontend/scripts/generate-icons.js

63 lines
No EOL
2.1 KiB
JavaScript

const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
const sizes = [72, 96, 128, 144, 152, 192, 384, 512];
const svgPath = path.join(__dirname, '../public/icons/icon.svg');
const outputDir = path.join(__dirname, '../public/icons');
async function generateIcons() {
try {
// Read SVG file
const svgBuffer = fs.readFileSync(svgPath);
// Generate icons for each size
for (const size of sizes) {
await sharp(svgBuffer)
.resize(size, size)
.png()
.toFile(path.join(outputDir, `icon-${size}x${size}.png`));
console.log(`Generated icon-${size}x${size}.png`);
}
// Generate maskable icons (with padding)
const maskableSizes = [192, 512];
for (const size of maskableSizes) {
const padding = Math.floor(size * 0.1); // 10% padding for maskable
await sharp(svgBuffer)
.resize(size - (padding * 2), size - (padding * 2))
.extend({
top: padding,
bottom: padding,
left: padding,
right: padding,
background: { r: 0, g: 0, b: 0, alpha: 0 }
})
.png()
.toFile(path.join(outputDir, `icon-maskable-${size}x${size}.png`));
console.log(`Generated icon-maskable-${size}x${size}.png`);
}
// Copy main icons to public root for backward compatibility
await sharp(svgBuffer)
.resize(192, 192)
.png()
.toFile(path.join(__dirname, '../public/icon-192x192.png'));
await sharp(svgBuffer)
.resize(512, 512)
.png()
.toFile(path.join(__dirname, '../public/icon-512x512.png'));
console.log('All icons generated successfully!');
} catch (error) {
console.error('Error generating icons:', error);
process.exit(1);
}
}
generateIcons();