nimiq-vitepress-theme
Version:
Nimiq UI theme for VitePress
60 lines (59 loc) • 1.62 kB
JavaScript
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 (match[2]) {
matches.add(match[2]);
}
}
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;
}