wxt
Version:
⚡ Next-gen Web Extension Framework
57 lines (54 loc) • 2 kB
JavaScript
import { parseHTML } from "linkedom";
import { normalizePath } from "../../../utils/paths.mjs";
export function wxtPluginLoader(config) {
const virtualModuleId = "virtual:wxt-plugins";
const resolvedVirtualModuleId = "\0" + virtualModuleId;
const virtualHtmlModuleId = "virtual:wxt-html-plugins";
const resolvedVirtualHtmlModuleId = "\0" + virtualHtmlModuleId;
return {
name: "wxt:plugin-loader",
resolveId(id) {
if (id === virtualModuleId) return resolvedVirtualModuleId;
if (id === virtualHtmlModuleId) return resolvedVirtualHtmlModuleId;
},
load(id) {
if (id === resolvedVirtualModuleId) {
const imports = config.plugins.map(
(plugin, i) => `import initPlugin${i} from '${normalizePath(plugin)}';`
).join("\n");
const initCalls = config.plugins.map((_, i) => ` initPlugin${i}();`).join("\n");
return `${imports}
export function initPlugins() {
${initCalls}
}`;
}
if (id === resolvedVirtualHtmlModuleId) {
return `import { initPlugins } from '${virtualModuleId}';
try {
initPlugins();
} catch (err) {
console.error("[wxt] Failed to initialize plugins", err);
}`;
}
},
transformIndexHtml: {
// Use "pre" so the new script is added before vite bundles all the scripts
order: "pre",
handler(html, _ctx) {
const src = config.command === "serve" ? `${config.dev.server?.origin}/@id/${virtualHtmlModuleId}` : virtualHtmlModuleId;
const { document } = parseHTML(html);
const existing = document.querySelector(`script[src='${src}']`);
if (existing) return;
const script = document.createElement("script");
script.type = "module";
script.src = src;
if (document.head == null) {
const newHead = document.createElement("head");
document.documentElement.prepend(newHead);
}
document.head.prepend(script);
return document.toString();
}
}
};
}