@stephansama/astro-iconify-svgmap
Version:
Astro integration for generating iconify svgmaps for ssg sites
60 lines (59 loc) • 2.23 kB
JavaScript
import { i as defaultConfig, n as LOADED_ICONS_FILENAME, t as CONFIG_FILENAME } from "./const-BOIMW1to.mjs";
import { n as generateSprite, r as loadIcons, t as buildEnd } from "./utilities-C4Go8fep.mjs";
import fs from "node:fs";
import path from "node:path";
//#endregion
//#region src/index.ts
const PLUGIN_NAME = "@stephansama/astro-iconify-svgmap";
const virtualModuleId = "virtual:iconify-svgmap";
const resolvedVirtualModuleId = "\0" + virtualModuleId;
const js = String.raw;
function createIntegration(options_ = {}) {
return {
name: "astro-icon",
hooks: {
async "astro:build:done"(_) {
console.info("starting build done");
const configFile = fs.readFileSync(path.resolve(CONFIG_FILENAME), { encoding: "utf8" });
const options = JSON.parse(configFile || "false") || defaultConfig;
const usage = JSON.parse(fs.readFileSync(path.resolve(LOADED_ICONS_FILENAME), { encoding: "utf8" }) || "{}");
buildEnd(await loadIcons(options_), usage, options);
},
"astro:config:setup"({ updateConfig }) {
updateConfig({ vite: { plugins: [createPlugin(options_)] } });
}
}
};
}
function createPlugin(options) {
let inMemoryCollections = {};
fs.writeFileSync(path.resolve(CONFIG_FILENAME), JSON.stringify(options));
return {
configResolved(resolvedConfig) {},
configureServer(server) {
server.middlewares.use(function(request, response, next) {
for (const pack of Object.keys(inMemoryCollections)) if (request.url === `/${pack}.svg`) {
const loaded = JSON.parse(fs.readFileSync(path.resolve(LOADED_ICONS_FILENAME), {
encoding: "utf8",
flag: "as+"
}) || "{}");
response.setHeader("Content-Type", "image/svg+xml");
const sprite = generateSprite(inMemoryCollections[pack], loaded[pack] || []);
return response.end(sprite);
}
return next();
});
},
async load(id) {
if (id !== resolvedVirtualModuleId) return;
inMemoryCollections = await loadIcons(options || defaultConfig) || {};
return js`export default ${JSON.stringify(inMemoryCollections)};`;
},
name: PLUGIN_NAME,
resolveId(id) {
if (id === virtualModuleId) return resolvedVirtualModuleId;
}
};
}
//#endregion
export { createIntegration, createPlugin as default };