52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
|
|
const sharp = require('sharp');
|
||
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
|
||
|
|
const svgPath = path.join(__dirname, '../public/icons/icon.svg');
|
||
|
|
const outDir = path.join(__dirname, '../public/icons');
|
||
|
|
|
||
|
|
async function generateIcons() {
|
||
|
|
const svgBuffer = fs.readFileSync(svgPath);
|
||
|
|
|
||
|
|
const sizes = [
|
||
|
|
{ name: 'icon-72.png', size: 72 },
|
||
|
|
{ name: 'icon-96.png', size: 96 },
|
||
|
|
{ name: 'icon-128.png', size: 128 },
|
||
|
|
{ name: 'icon-144.png', size: 144 },
|
||
|
|
{ name: 'icon-152.png', size: 152 },
|
||
|
|
{ name: 'icon-192.png', size: 192 },
|
||
|
|
{ name: 'icon-384.png', size: 384 },
|
||
|
|
{ name: 'icon-512.png', size: 512 },
|
||
|
|
{ name: 'icon-maskable-192.png', size: 192 },
|
||
|
|
{ name: 'icon-maskable-512.png', size: 512 },
|
||
|
|
];
|
||
|
|
|
||
|
|
for (const { name, size } of sizes) {
|
||
|
|
const isMaskable = name.includes('maskable');
|
||
|
|
const padding = isMaskable ? Math.round(size * 0.1) : 0;
|
||
|
|
const innerSize = size - padding * 2;
|
||
|
|
|
||
|
|
await sharp(svgBuffer)
|
||
|
|
.resize(innerSize, innerSize)
|
||
|
|
.extend({
|
||
|
|
top: padding,
|
||
|
|
bottom: padding,
|
||
|
|
left: padding,
|
||
|
|
right: padding,
|
||
|
|
background: { r: 234, g: 88, b: 12, alpha: 1 },
|
||
|
|
})
|
||
|
|
.png()
|
||
|
|
.toFile(path.join(outDir, name));
|
||
|
|
|
||
|
|
console.log(`Generated ${name} (${size}x${size})`);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Apple touch icon (180x180)
|
||
|
|
await sharp(svgBuffer)
|
||
|
|
.resize(180, 180)
|
||
|
|
.png()
|
||
|
|
.toFile(path.join(outDir, 'apple-touch-icon.png'));
|
||
|
|
console.log('Generated apple-touch-icon.png (180x180)');
|
||
|
|
}
|
||
|
|
|
||
|
|
generateIcons().catch(console.error);
|