mirror of
https://github.com/lucide-icons/lucide.git
synced 2025-12-19 18:49:23 +01:00
38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
|
|
import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
|
||
|
|
import { renderToString, renderToStaticMarkup } from 'react-dom/server';
|
||
|
|
import { createElement } from 'react';
|
||
|
|
import Diff from '../../../lib/SvgPreview/Diff.tsx';
|
||
|
|
import iconNodes from '../../../data/iconNodes';
|
||
|
|
import createLucideIcon from 'lucide-react/src/createLucideIcon';
|
||
|
|
|
||
|
|
export default eventHandler((event) => {
|
||
|
|
const { params } = event.context;
|
||
|
|
|
||
|
|
const pathData = params.data.split('/');
|
||
|
|
const data = pathData.at(-1).slice(0, -4);
|
||
|
|
const [name] = pathData;
|
||
|
|
|
||
|
|
const newSrc = Buffer.from(data, 'base64')
|
||
|
|
.toString('utf8')
|
||
|
|
.replaceAll('\n', '')
|
||
|
|
.replace(/<svg[^>]*>|<\/svg>/g, '');
|
||
|
|
|
||
|
|
const children = [];
|
||
|
|
|
||
|
|
const oldSrc = iconNodes[name]
|
||
|
|
? renderToStaticMarkup(createElement(createLucideIcon(name, iconNodes[name])))
|
||
|
|
.replaceAll('\n', '')
|
||
|
|
.replace(/<svg[^>]*>|<\/svg>/g, '')
|
||
|
|
: '';
|
||
|
|
|
||
|
|
const svg = Buffer.from(
|
||
|
|
// We can't use jsx here, is not supported here by nitro.
|
||
|
|
renderToString(createElement(Diff, { oldSrc, newSrc, showGrid: true }, children)),
|
||
|
|
).toString('utf8');
|
||
|
|
|
||
|
|
defaultContentType(event, 'image/svg+xml');
|
||
|
|
setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000');
|
||
|
|
|
||
|
|
return svg;
|
||
|
|
});
|