vite-plugin-svg-spritemap
Version:
Generates a SVG spritemap from multiple .svg files
1 lines • 3.87 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../src/index.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport path from 'node:path';\nimport type { Plugin, ResolvedConfig } from 'vite';\nimport chokidar, { FSWatcher } from 'chokidar';\nimport type { Config as SVGOConfig } from 'svgo';\n\nimport { getSpriteContent } from './getSpriteContent';\n\nexport interface SvgSpritemapOptions {\n pattern: string;\n prefix?: string;\n filename?: string;\n svgo?: SVGOConfig | boolean;\n currentColor?: boolean;\n emit?: boolean;\n}\n\nconst PLUGIN_NAME = 'vite-plugin-svg-spritemap';\n\nexport function svgSpritemap({\n pattern,\n prefix,\n filename = 'spritemap.svg',\n svgo = true,\n currentColor = false,\n emit = false,\n}: SvgSpritemapOptions): Plugin[] {\n let config: ResolvedConfig;\n let watcher: FSWatcher;\n\n return [\n {\n name: `${PLUGIN_NAME}:build`,\n apply: 'build',\n async configResolved(_config) {\n config = _config;\n },\n writeBundle() {\n const sprite = getSpriteContent({ pattern, prefix, svgo, currentColor });\n const filePath = path.resolve(config.root, config.build.outDir, filename);\n fs.ensureFileSync(filePath);\n fs.writeFileSync(filePath, sprite);\n\n if (emit) {\n this.emitFile({\n type: 'asset',\n fileName: filename,\n source: sprite,\n });\n }\n },\n },\n {\n name: `${PLUGIN_NAME}:serve`,\n apply: 'serve',\n async configResolved(_config) {\n config = _config;\n },\n configureServer(server) {\n function reloadPage() {\n server.ws.send({ type: 'full-reload', path: '*' });\n }\n\n watcher = chokidar\n .watch(pattern, {\n cwd: config.root,\n ignoreInitial: true,\n })\n .on('add', reloadPage)\n .on('change', reloadPage)\n .on('unlink', reloadPage);\n\n return () => {\n server.middlewares.use(async (req, res, next) => {\n if (!req.originalUrl?.endsWith('/' + filename)) {\n return next();\n }\n const sprite = getSpriteContent({ pattern, prefix, svgo, currentColor });\n res.writeHead(200, {\n 'Content-Type': 'image/svg+xml, charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(sprite);\n });\n };\n },\n async closeBundle() {\n await watcher.close();\n },\n },\n ];\n}\n"],"names":[],"mappings":";;;;AAiBA,MAAM,cAAc;AAEb,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,eAAe;AAAA,EACf,OAAO;AACT,GAAkC;AAC5B,MAAA;AACA,MAAA;AAEG,SAAA;AAAA,IACL;AAAA,MACE,MAAM,GAAG,WAAW;AAAA,MACpB,OAAO;AAAA,MACP,MAAM,eAAe,SAAS;AACnB,iBAAA;AAAA,MACX;AAAA,MACA,cAAc;AACZ,cAAM,SAAS,iBAAiB,EAAE,SAAS,QAAQ,MAAM,cAAc;AACjE,cAAA,WAAW,KAAK,QAAQ,OAAO,MAAM,OAAO,MAAM,QAAQ,QAAQ;AACxE,WAAG,eAAe,QAAQ;AACvB,WAAA,cAAc,UAAU,MAAM;AAEjC,YAAI,MAAM;AACR,eAAK,SAAS;AAAA,YACZ,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQ;AAAA,UAAA,CACT;AAAA,QAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,MAAM,GAAG,WAAW;AAAA,MACpB,OAAO;AAAA,MACP,MAAM,eAAe,SAAS;AACnB,iBAAA;AAAA,MACX;AAAA,MACA,gBAAgB,QAAQ;AACtB,iBAAS,aAAa;AACpB,iBAAO,GAAG,KAAK,EAAE,MAAM,eAAe,MAAM,KAAK;AAAA,QAAA;AAGzC,kBAAA,SACP,MAAM,SAAS;AAAA,UACd,KAAK,OAAO;AAAA,UACZ,eAAe;AAAA,QAChB,CAAA,EACA,GAAG,OAAO,UAAU,EACpB,GAAG,UAAU,UAAU,EACvB,GAAG,UAAU,UAAU;AAE1B,eAAO,MAAM;AACX,iBAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;;AAC/C,gBAAI,GAAC,SAAI,gBAAJ,mBAAiB,SAAS,MAAM,YAAW;AAC9C,qBAAO,KAAK;AAAA,YAAA;AAEd,kBAAM,SAAS,iBAAiB,EAAE,SAAS,QAAQ,MAAM,cAAc;AACvE,gBAAI,UAAU,KAAK;AAAA,cACjB,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,YAAA,CAClB;AACD,gBAAI,IAAI,MAAM;AAAA,UAAA,CACf;AAAA,QACH;AAAA,MACF;AAAA,MACA,MAAM,cAAc;AAClB,cAAM,QAAQ,MAAM;AAAA,MAAA;AAAA,IACtB;AAAA,EAEJ;AACF;"}