wxt
Version:
⚡ Next-gen Web Extension Framework
98 lines (96 loc) • 3.03 kB
JavaScript
import { addViteConfig, defineWxtModule } from "../modules.mjs";
import { createUnimport, toExports } from "unimport";
import UnimportPlugin from "unimport/unplugin";
export default defineWxtModule({
name: "wxt:built-in:unimport",
setup(wxt) {
let unimport;
const isEnabled = () => !wxt.config.imports.disabled;
wxt.hooks.hook("config:resolved", () => {
const addModuleImports = (module) => {
if (!module.imports) return;
wxt.config.imports.imports ??= [];
wxt.config.imports.imports.push(...module.imports);
};
wxt.config.builtinModules.forEach(addModuleImports);
wxt.config.userModules.forEach(addModuleImports);
});
wxt.hooks.afterEach((event) => {
if (event.name === "config:resolved") {
unimport = createUnimport(wxt.config.imports);
}
});
wxt.hooks.hook("prepare:types", async (_, entries) => {
await unimport.init();
entries.push(await getImportsModuleEntry(wxt, unimport));
if (!isEnabled()) return;
entries.push(await getImportsDeclarationEntry(unimport));
if (wxt.config.imports.eslintrc.enabled === false) return;
entries.push(
await getEslintConfigEntry(
unimport,
wxt.config.imports.eslintrc.enabled,
wxt.config.imports
)
);
});
addViteConfig(wxt, () => ({
plugins: [UnimportPlugin.vite(wxt.config.imports)]
}));
}
});
async function getImportsDeclarationEntry(unimport) {
return {
path: "types/imports.d.ts",
text: [
"// Generated by wxt",
await unimport.generateTypeDeclarations(),
""
].join("\n"),
tsReference: true
};
}
async function getImportsModuleEntry(wxt, unimport) {
const imports = await unimport.getImports();
return {
path: "types/imports-module.d.ts",
text: [
"// Generated by wxt",
"// Types for the #import virtual module",
"declare module '#imports' {",
` ${toExports(imports, wxt.config.wxtDir, true).replaceAll("\n", "\n ")}`,
"}",
""
].join("\n"),
tsReference: true
};
}
async function getEslintConfigEntry(unimport, version, options) {
const globals = (await unimport.getImports()).map((i) => i.as ?? i.name).filter(Boolean).sort().reduce((globals2, name) => {
globals2[name] = options.eslintrc.globalsPropValue;
return globals2;
}, {});
if (version <= 8) return getEslint8ConfigEntry(options, globals);
else return getEslint9ConfigEntry(options, globals);
}
export function getEslint8ConfigEntry(options, globals) {
return {
path: options.eslintrc.filePath,
text: JSON.stringify({ globals }, null, 2) + "\n"
};
}
export function getEslint9ConfigEntry(options, globals) {
return {
path: options.eslintrc.filePath,
text: `const globals = ${JSON.stringify(globals, null, 2)}
export default {
name: "wxt/auto-imports",
languageOptions: {
globals,
/** @type {import('eslint').Linter.SourceType} */
sourceType: "module",
},
};
`
};
}