import express from 'express'; import * as icons from 'simple-icons'; import sharp from 'sharp'; const app = express(); const port = {{ container_port }}; // Helper: convert 'nextcloud' → 'siNextcloud' function getExportName(slug) { return 'si' + slug .split('-') .map(part => part[0].toUpperCase() + part.slice(1)) .join(''); } // Root: redirect to documentation (only if web-app-sphinx is available) app.get('/', (req, res) => { {% if 'web-app-sphinx' in group_names %} res.redirect('{{ lookup("tls", "web-app-sphinx", "url.base") }}{{ application_id | rel_role_path_by_application_id }}/README.html'); {% else %} res .status(200) .type('text/plain; charset=utf-8') .send( `simpleicons.org\n` + `provided by {{ ORGANIZATION }}\n` ); {% endif %} }); // 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}`); });