UNPKG

rollup-plugin-svg-sprite-deterministic

Version:

Create deterministic external svg sprite from your bundle using Rollup

99 lines (79 loc) 2.33 kB
'use strict'; var path = require('path'); var fs = require('fs-extra'); var cheerio = require('cheerio'); var svgo = require('svgo'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var path__default = /*#__PURE__*/_interopDefaultLegacy(path); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); var cheerio__default = /*#__PURE__*/_interopDefaultLegacy(cheerio); function createSymbol(code, id) { const markup = cheerio__default['default'].load(code, { xmlMode: true }); const svgMarkup = markup('svg'); const symbolId = svgMarkup.find('title').text() || id; markup('svg').replaceWith('<symbol/>'); markup('symbol') .attr('id', symbolId) .attr('viewBox', svgMarkup.attr('viewBox')) .append(svgMarkup.children()); return markup.xml('symbol') } function createSprite(symbols) { return `<svg xmlns="http://www.w3.org/2000/svg">${symbols.join('')}</svg>` } function svgSprite(options = {}) { const { minify = true, outputFolder } = options; if (!outputFolder) { throw new Error('"outputFolder" must be set') } const svgoConfig = { js2svg: { pretty: !minify, indent: 2 }, plugins: [ { name: 'preset-default', params: { overrides: { cleanupIDs: false, removeViewBox: false } } }, { name: 'removeDimensions' } ] }; const loadedSvgs = new Set(); const convertedSvgs = new Map(); return { name: 'svg-sprite', load(id) { if (id.endsWith('.svg')) { loadedSvgs.add(id); } return null }, transform(code, id) { if (!id.endsWith('.svg')) { return null } const filename = path__default['default'].basename(id, '.svg'); convertedSvgs.set(id, createSymbol(code, filename)); return { code: '' } }, async writeBundle() { if (loadedSvgs.size) { const symbols = [...loadedSvgs.values()].map((id) => convertedSvgs.get(id)).sort(); const { data } = await svgo.optimize(createSprite(symbols), svgoConfig); await fs__default['default'].outputFile(`${outputFolder}/sprites.svg`, data); loadedSvgs.clear(); } } } } module.exports = svgSprite;