UNPKG

vite-plugin-svg-spriter

Version:

Build a svg sprite from individual svgs and inject it in your root html with vite

41 lines (40 loc) 1.52 kB
import fs from 'fs'; import path from 'path'; import SVGSprite from 'svg-sprite'; const defaultSpriterConfig = { // @ts-expect-error types definition have an issue https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/65401 mode: { symbol: { inline: true } }, shape: { transform: [] }, // remove default svgo }; const defaultTag = { tag: 'div', attrs: { 'aria-hidden': true }, injectTo: 'body-prepend', }; let symbolList = []; function createSVGSpritePlugin({ svgFolder, svgSpriteConfig = {}, transformIndexHtmlTag = {}, }) { return { name: 'svg-sprite', async transformIndexHtml() { const files = fs.readdirSync(svgFolder); const spriter = new SVGSprite({ ...defaultSpriterConfig, ...svgSpriteConfig }); symbolList = []; for (const file of files) { const filePath = path.resolve(svgFolder, file); const svg = fs.readFileSync(filePath, 'utf-8'); spriter.add(filePath, null, svg); const symbolName = file.replace('.svg', ''); symbolList.push(symbolName); } const { result } = await spriter.compileAsync(); const sprite = result.symbol.sprite.contents.toString(); const spriteTag = { ...defaultTag, ...transformIndexHtmlTag, children: sprite, }; return [spriteTag]; }, }; } export default createSVGSpritePlugin;