2021-11-21 20:27:15 +01:00
|
|
|
/* eslint-disable import/no-extraneous-dependencies */
|
2025-06-18 15:47:24 +02:00
|
|
|
import { type INode, stringify } from 'svgson';
|
2021-11-21 20:27:15 +01:00
|
|
|
import { format } from 'prettier';
|
2024-06-28 11:24:37 +02:00
|
|
|
import { appendFile } from '@lucide/helpers';
|
2025-06-18 15:47:24 +02:00
|
|
|
import { type SVGFile } from './readSvgs.mts';
|
2021-11-21 20:27:15 +01:00
|
|
|
|
2025-06-18 15:47:24 +02:00
|
|
|
export default async function generateSprite(
|
|
|
|
|
svgs: SVGFile[],
|
|
|
|
|
packageDir: string,
|
|
|
|
|
license: string
|
|
|
|
|
) {
|
|
|
|
|
const symbols = svgs.map<INode>(({ name, parsedSvg }) => ({
|
2021-11-21 20:27:15 +01:00
|
|
|
name: 'symbol',
|
|
|
|
|
type: 'element',
|
2025-06-18 15:47:24 +02:00
|
|
|
value: '',
|
2021-11-21 20:27:15 +01:00
|
|
|
attributes: {
|
|
|
|
|
id: name,
|
|
|
|
|
},
|
|
|
|
|
children: parsedSvg.children,
|
|
|
|
|
}));
|
|
|
|
|
|
2025-06-18 15:47:24 +02:00
|
|
|
const spriteSvgObject: INode = {
|
2021-11-21 20:27:15 +01:00
|
|
|
name: 'svg',
|
|
|
|
|
type: 'element',
|
|
|
|
|
attributes: {
|
|
|
|
|
xmlns: 'http://www.w3.org/2000/svg',
|
|
|
|
|
version: '1.1',
|
|
|
|
|
},
|
2025-06-18 15:47:24 +02:00
|
|
|
value: '',
|
2021-11-21 20:27:15 +01:00
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
name: 'defs',
|
|
|
|
|
type: 'element',
|
|
|
|
|
children: symbols,
|
2025-06-18 15:47:24 +02:00
|
|
|
value: '',
|
|
|
|
|
} as INode,
|
2021-11-21 20:27:15 +01:00
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const spriteSvg = stringify(spriteSvgObject);
|
2025-06-18 15:47:24 +02:00
|
|
|
const prettifiedSprite = (await format(spriteSvg, { parser: 'babel' })).replace(/;/g, '');
|
2021-11-21 20:27:15 +01:00
|
|
|
|
2023-11-17 11:12:31 +01:00
|
|
|
const xmlMeta = `<?xml version="1.0" encoding="utf-8"?>\n<!-- ${license} -->\n`;
|
2021-11-21 20:27:15 +01:00
|
|
|
|
2025-02-10 14:13:52 +01:00
|
|
|
await appendFile(xmlMeta, `sprite.svg`, packageDir);
|
|
|
|
|
await appendFile(prettifiedSprite, `sprite.svg`, packageDir);
|
2021-11-21 20:27:15 +01:00
|
|
|
}
|