rollup-plugin-svg-sprite-deterministic
Version:
Create deterministic external svg sprite from your bundle using Rollup
99 lines (79 loc) • 2.33 kB
JavaScript
;
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;