From f69b5944016a0716a6bf558f8fd76ac0cb6a1a5c Mon Sep 17 00:00:00 2001
From: Patryk Kuniczak
Date: Sun, 26 Jul 2026 03:55:49 +0200
Subject: [PATCH] feat!: Change default behavior of `getUnimportEslintOptions`
true flag (#2296)
---
docs/guide/essentials/config/auto-imports.md | 8 ++---
.../__snapshots__/auto-imports.test.ts.snap | 4 +--
packages/wxt/e2e/tests/auto-imports.test.ts | 4 +--
packages/wxt/src/core/resolve-config.ts | 33 ++++++++++---------
packages/wxt/src/types.ts | 4 +--
5 files changed, 28 insertions(+), 25 deletions(-)
diff --git a/docs/guide/essentials/config/auto-imports.md b/docs/guide/essentials/config/auto-imports.md
index 86b29503..9c2a0fde 100644
--- a/docs/guide/essentials/config/auto-imports.md
+++ b/docs/guide/essentials/config/auto-imports.md
@@ -43,7 +43,7 @@ ESLint doesn't know about the auto-imported variables unless they are explicitly
:::code-group
-```ts [ESLint 9]
+```ts [ESLint >=9]
export default defineConfig({
imports: {
eslintrc: {
@@ -53,7 +53,7 @@ export default defineConfig({
});
```
-```ts [ESLint 8]
+```ts [ESLint <=8]
export default defineConfig({
imports: {
eslintrc: {
@@ -69,7 +69,7 @@ Then in your ESLint config, import and use the generated file:
:::code-group
-```js [ESLint 9]
+```js [ESLint >=9]
// eslint.config.mjs
import autoImports from './.wxt/eslint-auto-imports.mjs';
@@ -81,7 +81,7 @@ export default [
];
```
-```js [ESLint 8]
+```js [ESLint <=8]
// .eslintrc.mjs
export default {
extends: ['./.wxt/eslintrc-auto-import.json'],
diff --git a/packages/wxt/e2e/tests/__snapshots__/auto-imports.test.ts.snap b/packages/wxt/e2e/tests/__snapshots__/auto-imports.test.ts.snap
index 868663ac..83bcb684 100644
--- a/packages/wxt/e2e/tests/__snapshots__/auto-imports.test.ts.snap
+++ b/packages/wxt/e2e/tests/__snapshots__/auto-imports.test.ts.snap
@@ -119,8 +119,8 @@ export default {
"
`;
-exports[`Auto Imports > eslintrc > "enabled: true" should output a JSON config file compatible with ESlint 8 1`] = `
-".wxt/eslintrc-auto-import.json
+exports[`Auto Imports > eslintrc > "enabled: true" should output a JSON config file compatible with ESlint of package.json 1`] = `
+".wxt/eslint-auto-imports.mjs
----------------------------------------
{
"globals": {
diff --git a/packages/wxt/e2e/tests/auto-imports.test.ts b/packages/wxt/e2e/tests/auto-imports.test.ts
index f1c305b5..8e82f7ee 100644
--- a/packages/wxt/e2e/tests/auto-imports.test.ts
+++ b/packages/wxt/e2e/tests/auto-imports.test.ts
@@ -217,7 +217,7 @@ describe('Auto Imports', () => {
});
describe('eslintrc', () => {
- it('"enabled: true" should output a JSON config file compatible with ESlint 8', async () => {
+ it('"enabled: true" should output a JSON config file compatible with ESlint of package.json', async () => {
const project = new TestProject();
project.addFile('entrypoints/popup.html', ``);
@@ -230,7 +230,7 @@ describe('Auto Imports', () => {
});
expect(
- await project.serializeFile('.wxt/eslintrc-auto-import.json'),
+ await project.serializeFile('.wxt/eslint-auto-imports.mjs'),
).toMatchSnapshot();
});
diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts
index af5c8180..10c0eb7b 100644
--- a/packages/wxt/src/core/resolve-config.ts
+++ b/packages/wxt/src/core/resolve-config.ts
@@ -1,19 +1,19 @@
import { loadConfig } from 'c12';
import { resolve as esmResolve } from 'import-meta-resolve';
import {
- InlineConfig,
- ResolvedConfig,
- UserConfig,
ConfigEnv,
- UserManifestFn,
- UserManifest,
- WebExtConfig,
- WxtResolvedUnimportOptions,
+ InlineConfig,
Logger,
+ ResolvedConfig,
+ ResolvedEslintrc,
+ UserConfig,
+ UserManifest,
+ UserManifestFn,
+ WebExtConfig,
WxtCommand,
WxtModule,
WxtModuleWithMetadata,
- ResolvedEslintrc,
+ WxtResolvedUnimportOptions,
ExtensionRunner,
} from '../types';
import path from 'node:path';
@@ -523,18 +523,21 @@ async function getUnimportEslintOptions(
options === false ? false : (options?.eslintrc?.enabled ?? 'auto');
let enabled: ResolvedEslintrc['enabled'];
+ const version = await getEslintVersion();
+ let major = parseInt(version[0]) as Exclude<
+ ResolvedEslintrc['enabled'],
+ false
+ >;
+
switch (inlineEnabled) {
case 'auto':
- const version = await getEslintVersion();
- let major = parseInt(version[0]);
if (isNaN(major)) enabled = false;
- if (major <= 8) enabled = 8;
- else if (major >= 9) enabled = 9;
- // NaN
+ else if (major <= 8) enabled = 8;
+ else if (major >= 9) enabled = major;
else enabled = false;
break;
case true:
- enabled = 8;
+ enabled = major;
break;
default:
enabled = inlineEnabled;
@@ -544,7 +547,7 @@ async function getUnimportEslintOptions(
enabled,
filePath: path.resolve(
wxtDir,
- enabled === 9 ? 'eslint-auto-imports.mjs' : 'eslintrc-auto-import.json',
+ enabled === 8 ? 'eslintrc-auto-import.json' : 'eslint-auto-imports.mjs',
),
globalsPropValue: true,
};
diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts
index 03caab2b..7ad8cb64 100644
--- a/packages/wxt/src/types.ts
+++ b/packages/wxt/src/types.ts
@@ -1,5 +1,5 @@
import type * as vite from 'vite';
-import { UnimportOptions, Import } from 'unimport';
+import { Import, UnimportOptions } from 'unimport';
import { LogLevel } from 'consola';
import type { ContentScriptContext } from './utils/content-script-context';
import type { PluginVisualizerOptions } from '@aklinker1/rollup-plugin-visualizer';
@@ -1646,10 +1646,10 @@ export interface Eslintrc {
* When true, generates a file that can be used by ESLint to know which
* variables are valid globals.
*
+ * - `true`: Version of `package.json``.
* - `false`: Don't generate the file.
* - `'auto'`: Check if eslint is installed, and if it is, generate a compatible
* config file.
- * - `true`: Same as `8`.
* - `8`: Generate a config file compatible with ESLint 8.
* - `9`: Generate a config file compatible with ESLint 9.
*