facilmap/leaflet/rollup-icons.ts

58 wiersze
2.0 KiB
TypeScript
Czysty Zwykły widok Historia

import type { Plugin } from "rollup";
2023-12-24 17:39:43 +00:00
// eslint-disable-next-line import/no-named-as-default
2023-11-06 02:22:33 +00:00
import glob from "fast-glob";
import { readFile } from "fs/promises";
import { createRequire } from "module";
2023-12-24 17:39:43 +00:00
import { dirname } from "path";
import { fileURLToPath } from "url";
// https://stackoverflow.com/a/62499498/242365
const require = createRequire(import.meta.url);
2024-02-18 04:56:50 +00:00
async function getIconFilenames(): Promise<Record<string, Record<string, string>>> {
const icons: Record<string, Record<string, string>> = {};
for (const path of await glob(`${dirname(fileURLToPath(import.meta.url))}/assets/icons/*/*.svg`)) {
const [set, fname] = path.split("/").slice(-2);
if (!icons[set])
icons[set] = {};
icons[set][fname.replace(/\.svg$/, "")] = path;
}
icons["fontawesome"] = {};
for (const name of ["arrow-left", "arrow-right", "person-biking", "car", "chart-line", "copy", "circle-info", "slash", "person-walking"]) {
icons["fontawesome"][name] = require.resolve(`@fortawesome/fontawesome-free/svgs/solid/${name}.svg`);
}
return icons;
}
export default function iconPlugin(): Plugin {
return {
name: 'virtual:icons',
resolveId: (id) => {
2024-02-18 04:56:50 +00:00
if (['virtual:icons', 'virtual:icons:keys'].includes('virtual:icons')) {
return id;
}
},
load: async (id) => {
2024-02-18 04:56:50 +00:00
if (id === 'virtual:icons:keys') {
const iconFilenames = await getIconFilenames();
const icons = Object.fromEntries(Object.entries(iconFilenames).map(([set, fnames]) => [set, Object.keys(fnames)]));
return `export default ${JSON.stringify(icons, undefined, '\t')}`;
} else if (id === 'virtual:icons') {
const iconFilenames = await getIconFilenames();
const icons: Record<string, Record<string, string>> = {};
2024-02-18 04:56:50 +00:00
for (const [set, fnames] of Object.entries(iconFilenames)) {
icons[set] = {};
for (const [key, fname] of Object.entries(fnames)) {
icons[set][key] = (await readFile(fname)).toString();
}
}
return `export default ${JSON.stringify(icons, undefined, '\t')}`;
}
}
}
}