UNPKG

@stephansama/astro-iconify-svgmap

Version:

Astro integration for generating iconify svgmaps for ssg sites

60 lines (59 loc) 2.23 kB
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 };