diff --git a/packages/wxt-demo/eslint.config.js b/packages/wxt-demo/eslint.config.js index 0d75cf23b..06f07440b 100644 --- a/packages/wxt-demo/eslint.config.js +++ b/packages/wxt-demo/eslint.config.js @@ -1,4 +1,4 @@ -import autoImports from './.wxt/eslintrc-auto-import.js'; +import autoImports from './.wxt/eslintrc-auto-import.json'; export default [ { diff --git a/packages/wxt-demo/wxt.config.ts b/packages/wxt-demo/wxt.config.ts index e68b93b46..5ff6e335b 100644 --- a/packages/wxt-demo/wxt.config.ts +++ b/packages/wxt-demo/wxt.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from 'wxt'; import { presetUno } from 'unocss'; +import path from 'node:path'; export default defineConfig({ srcDir: 'src', @@ -56,4 +57,10 @@ export default defineConfig({ presets: [presetUno()], }, }, + imports: { + eslintrc: { + enabled: true, + filePath: path.resolve('.wxt/eslintrc-auto-import.json'), + }, + }, }); diff --git a/packages/wxt/src/builtin-modules/unimport.ts b/packages/wxt/src/builtin-modules/unimport.ts index c49bde02c..7577afcc0 100644 --- a/packages/wxt/src/builtin-modules/unimport.ts +++ b/packages/wxt/src/builtin-modules/unimport.ts @@ -1,3 +1,4 @@ +import path from 'node:path'; import { addViteConfig, defineWxtModule } from '../modules'; import type { EslintGlobalsPropValue, @@ -49,16 +50,16 @@ export default defineWxtModule({ // Only create global types when user has enabled auto-imports entries.push(await getImportsDeclarationEntry(unimport)); + // Only generate ESLint config if that feature is enabled if (wxt.config.imports.eslintrc.enabled === false) return; - // Only generate ESLint config if that feature is enabled - entries.push( - await getEslintConfigEntry( - unimport, - wxt.config.imports.eslintrc.enabled, - wxt.config.imports, - ), + const eslintConfigEntries = await getEslintConfigEntry( + unimport, + wxt.config.imports.eslintrc.enabled, + wxt.config.imports, ); + + entries.push(...eslintConfigEntries); }); // Add vite plugin @@ -105,7 +106,7 @@ async function getEslintConfigEntry( unimport: Unimport, version: 8 | 9, options: WxtResolvedUnimportOptions, -): Promise { +): Promise { const globals = (await unimport.getImports()) .map((i) => i.as ?? i.name) .filter(Boolean) @@ -115,7 +116,7 @@ async function getEslintConfigEntry( return globals; }, {}); - if (version <= 8) return getEslint8ConfigEntry(options, globals); + if (version <= 8) return [getEslint8ConfigEntry(options, globals)]; else return getEslint9ConfigEntry(options, globals); } @@ -132,8 +133,8 @@ export function getEslint8ConfigEntry( export function getEslint9ConfigEntry( options: WxtResolvedUnimportOptions, globals: Record, -): WxtDirFileEntry { - return { +): WxtDirFileEntry[] { + const javaScriptFileEntry: WxtDirFileEntry = { path: options.eslintrc.filePath, text: `const globals = ${JSON.stringify(globals, null, 2)} @@ -147,4 +148,26 @@ export default { }; `, }; + + const javaScriptFileDirname = path.dirname(options.eslintrc.filePath); + const javaScriptFileExtension = path.extname(options.eslintrc.filePath); + const javaScriptFileBasename = path.basename( + options.eslintrc.filePath, + javaScriptFileExtension, + ); + + const typeScriptFilePath = path.join( + javaScriptFileDirname, + `${javaScriptFileBasename}.d.ts`, + ); + + const typeScriptFileEntry: WxtDirFileEntry = { + path: typeScriptFilePath, + text: `import type { ConfigObject } from "@eslint/core"; +declare const config: ConfigObject; +export default config; +`, + }; + + return [javaScriptFileEntry, typeScriptFileEntry]; }