UNPKG

wxt

Version:

⚡ Next-gen Web Extension Framework

98 lines (96 loc) 3.03 kB
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", }, }; ` }; }