@svgx/vite-plugin-react
Version:
svgx vite plugin to import SVG files as react components
57 lines (56 loc) • 2.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const core_1 = require("@svgx/core");
function default_1(options) {
const defaultImport = (options === null || options === void 0 ? void 0 : options.defaultImport) || "component";
const virtualModulePrefix = "@svgx-dir:";
const resolvedVirtualModulePrefix = "\0" + virtualModulePrefix;
const svgRegex = /\.svg(\?(raw|component|url))?$/;
return {
name: "@svgx-vite-plugin-react",
enforce: "pre",
resolveId(id) {
if (id.startsWith(virtualModulePrefix)) {
const dirPath = id.replace(virtualModulePrefix, "");
return resolvedVirtualModulePrefix + dirPath;
}
},
async load(id) {
if (id.startsWith(resolvedVirtualModulePrefix)) {
const dirPath = id.split(":", 2)[1];
return `
const modules = import.meta.glob('${dirPath}/*.svg', { eager: true })
export default function (fileName) {
return modules[\`${dirPath}/\${fileName}.svg\`].default
}
`;
}
if (!id.match(svgRegex)) {
return null;
}
const [path, query] = id.split("?", 2);
const importType = query || defaultImport;
if (importType === "url") {
return null; // Use default svg loader
}
let svg;
try {
svg = await fs_1.promises.readFile(path, "utf-8");
}
catch (ex) {
console.warn("\n", `${id} couldn't be loaded by vite-svg-loader, fallback to default loader`);
return;
}
if (importType === "raw") {
return `export default ${JSON.stringify(svg)}`;
}
const component = (0, core_1.toJsComponent)(svg, {
...options,
defaultExport: true,
});
return component;
},
};
}
exports.default = default_1;