Skip to content

Commit cd7edec

Browse files
committed
fix(imports): generate .d.ts file for eslint > 9 auto imports
1 parent 04ae542 commit cd7edec

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

packages/wxt-demo/eslint.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import autoImports from './.wxt/eslintrc-auto-import.js';
1+
import autoImports from './.wxt/eslintrc-auto-import.json';
22

33
export default [
44
{

packages/wxt-demo/wxt.config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { defineConfig } from 'wxt';
22
import { presetUno } from 'unocss';
3+
import path, { resolve } from 'node:path';
34

45
export default defineConfig({
56
srcDir: 'src',
@@ -56,4 +57,10 @@ export default defineConfig({
5657
presets: [presetUno()],
5758
},
5859
},
60+
imports: {
61+
eslintrc: {
62+
enabled: true,
63+
filePath: path.resolve('.wxt/eslintrc-auto-import.json'),
64+
},
65+
},
5966
});

packages/wxt/src/builtin-modules/unimport.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import path from 'node:path';
12
import { addViteConfig, defineWxtModule } from '../modules';
23
import type {
34
EslintGlobalsPropValue,
@@ -49,16 +50,16 @@ export default defineWxtModule({
4950
// Only create global types when user has enabled auto-imports
5051
entries.push(await getImportsDeclarationEntry(unimport));
5152

53+
// Only generate ESLint config if that feature is enabled
5254
if (wxt.config.imports.eslintrc.enabled === false) return;
5355

54-
// Only generate ESLint config if that feature is enabled
55-
entries.push(
56-
await getEslintConfigEntry(
57-
unimport,
58-
wxt.config.imports.eslintrc.enabled,
59-
wxt.config.imports,
60-
),
56+
const eslintConfigEntries = await getEslintConfigEntry(
57+
unimport,
58+
wxt.config.imports.eslintrc.enabled,
59+
wxt.config.imports,
6160
);
61+
62+
entries.push(...eslintConfigEntries);
6263
});
6364

6465
// Add vite plugin
@@ -105,7 +106,7 @@ async function getEslintConfigEntry(
105106
unimport: Unimport,
106107
version: 8 | 9,
107108
options: WxtResolvedUnimportOptions,
108-
): Promise<WxtDirFileEntry> {
109+
): Promise<WxtDirFileEntry[]> {
109110
const globals = (await unimport.getImports())
110111
.map((i) => i.as ?? i.name)
111112
.filter(Boolean)
@@ -115,7 +116,7 @@ async function getEslintConfigEntry(
115116
return globals;
116117
}, {});
117118

118-
if (version <= 8) return getEslint8ConfigEntry(options, globals);
119+
if (version <= 8) return [getEslint8ConfigEntry(options, globals)];
119120
else return getEslint9ConfigEntry(options, globals);
120121
}
121122

@@ -132,8 +133,8 @@ export function getEslint8ConfigEntry(
132133
export function getEslint9ConfigEntry(
133134
options: WxtResolvedUnimportOptions,
134135
globals: Record<string, EslintGlobalsPropValue>,
135-
): WxtDirFileEntry {
136-
return {
136+
): WxtDirFileEntry[] {
137+
const javaScriptFileEntry: WxtDirFileEntry = {
137138
path: options.eslintrc.filePath,
138139
text: `const globals = ${JSON.stringify(globals, null, 2)}
139140
@@ -147,4 +148,26 @@ export default {
147148
};
148149
`,
149150
};
151+
152+
const javaScriptFileDirname = path.dirname(options.eslintrc.filePath);
153+
const javaScriptFileExtension = path.extname(options.eslintrc.filePath);
154+
const javaScriptFileBasename = path.basename(
155+
options.eslintrc.filePath,
156+
javaScriptFileExtension,
157+
);
158+
159+
const typeScriptFilePath = path.join(
160+
javaScriptFileDirname,
161+
`${javaScriptFileBasename}.d.ts`,
162+
);
163+
164+
const typeScriptFileEntry: WxtDirFileEntry = {
165+
path: typeScriptFilePath,
166+
text: `import type { ConfigObject } from "@eslint/core";
167+
declare const config: ConfigObject;
168+
export default config;
169+
`,
170+
};
171+
172+
return [javaScriptFileEntry, typeScriptFileEntry];
150173
}

0 commit comments

Comments
 (0)