UNPKG

nimiq-vitepress-theme

Version:

Nimiq UI theme for VitePress

57 lines (56 loc) 1.55 kB
import { createFilter } from "vite"; import { generateCSS } from "./codegen.mjs"; const filter = createFilter([/\.md$/, /\.md\?vue/, /\.md\?v=/]); export function groupIconVitePlugin() { const virtualCssId = "virtual:group-icons.css"; const resolvedVirtualCssId = `\0${virtualCssId}`; const combinedRegex = /```\S+\s+\[(?:[^\]]*\.)?([^\]]+)\]/g; const matches = /* @__PURE__ */ new Set(); let oldMatches = /* @__PURE__ */ new Set(); let server; function handleUpdateModule() { const mod = server?.moduleGraph.getModuleById(resolvedVirtualCssId); if (mod) { server.moduleGraph.invalidateModule(mod); server.reloadModule(mod); } } return { name: "vitepress-forked-plugin-group-icons", resolveId(id) { if (id === virtualCssId) return resolvedVirtualCssId; }, configureServer(_server) { server = _server; }, async load(id) { if (id === resolvedVirtualCssId) { const { css } = await generateCSS(matches); oldMatches = new Set(matches); return css; } }, transform(code, id) { if (!filter(id)) return; while (true) { const match = combinedRegex.exec(code); if (!match) break; matches.add(match[1]); } if (!isSetEqual(matches, oldMatches)) handleUpdateModule(); } }; } function isSetEqual(set1, set2) { if (set1.size !== set2.size) return false; for (const item of set1) { if (!set2.has(item)) return false; } return true; }