import express from 'express'; import * as icons from 'simple-icons'; import sharp from 'sharp'; const app = express(); const port = process.env.PORT || 3000; // Helper: convert 'nextcloud' → 'siNextcloud' function getExportName(slug) { return 'si' + slug .split('-') .map(part => part[0].toUpperCase() + part.slice(1)) .join(''); } // Root: redirect to your documentation app.get('/', (req, res) => { res.redirect('https://docs.cymais.cloud/roles/docker-{{ application_id }}/README.html'); }); // GET /:slug.svg app.get('/:slug.svg', (req, res) => { const slug = req.params.slug.toLowerCase(); const exportName = getExportName(slug); const icon = icons[exportName]; if (!icon) { return res.status(404).send('Icon not found'); } res.type('image/svg+xml'); res.send(icon.svg); }); // GET /:slug.png?size=... app.get('/:slug.png', async (req, res) => { const slug = req.params.slug.toLowerCase(); const size = parseInt(req.query.size, 10) || 128; const exportName = getExportName(slug); const icon = icons[exportName]; if (!icon) { return res.status(404).send('Icon not found'); } try { const pngBuffer = await sharp(Buffer.from(icon.svg)) .resize(size, size) .png() .toBuffer(); res.type('image/png'); res.send(pngBuffer); } catch (err) { console.error('PNG generation error:', err); res.status(500).send('PNG generation error'); } }); app.listen(port, () => { console.log(`Simple-Icons server listening at http://0.0.0.0:${port}`); });