Skip to content

Commit f80abba

Browse files
committed
fix(imports): generate d.ts file for eslint auto imports
1 parent 78f8434 commit f80abba

File tree

4 files changed

+73
-27
lines changed

4 files changed

+73
-27
lines changed

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

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { addViteConfig, defineWxtModule } from '../modules';
22
import type {
33
EslintGlobalsPropValue,
4+
ResolvedEslintrc8,
5+
ResolvedEslintrc9,
6+
ResolvedEslintrcEnabled,
47
Wxt,
58
WxtDirFileEntry,
69
WxtModule,
7-
WxtResolvedUnimportOptions,
810
} from '../types';
911
import { type Unimport, createUnimport, toExports } from 'unimport';
1012
import UnimportPlugin from 'unimport/unplugin';
@@ -52,13 +54,12 @@ export default defineWxtModule({
5254
if (wxt.config.imports.eslintrc.enabled === false) return;
5355

5456
// 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-
),
57+
const eslintConfigEntries = await getEslintConfigEntries(
58+
unimport,
59+
wxt.config.imports.eslintrc,
6160
);
61+
62+
entries.push(...eslintConfigEntries);
6263
});
6364

6465
// Add vite plugin
@@ -101,40 +102,42 @@ async function getImportsModuleEntry(
101102
};
102103
}
103104

104-
async function getEslintConfigEntry(
105+
async function getEslintConfigEntries(
105106
unimport: Unimport,
106-
version: 8 | 9,
107-
options: WxtResolvedUnimportOptions,
108-
): Promise<WxtDirFileEntry> {
107+
eslintrc: ResolvedEslintrcEnabled,
108+
): Promise<WxtDirFileEntry[]> {
109109
const globals = (await unimport.getImports())
110110
.map((i) => i.as ?? i.name)
111111
.filter(Boolean)
112112
.sort()
113113
.reduce<Record<string, EslintGlobalsPropValue>>((globals, name) => {
114-
globals[name] = options.eslintrc.globalsPropValue;
114+
globals[name] = eslintrc.globalsPropValue;
115115
return globals;
116116
}, {});
117117

118-
if (version <= 8) return getEslint8ConfigEntry(options, globals);
119-
else return getEslint9ConfigEntry(options, globals);
118+
if (eslintrc.enabled === 9) {
119+
return getEslint9ConfigEntry(eslintrc, globals);
120+
} else {
121+
return [getEslint8ConfigEntry(eslintrc, globals)];
122+
}
120123
}
121124

122125
export function getEslint8ConfigEntry(
123-
options: WxtResolvedUnimportOptions,
126+
eslintrc: ResolvedEslintrc8,
124127
globals: Record<string, EslintGlobalsPropValue>,
125128
): WxtDirFileEntry {
126129
return {
127-
path: options.eslintrc.filePath,
130+
path: eslintrc.filePath,
128131
text: JSON.stringify({ globals }, null, 2) + '\n',
129132
};
130133
}
131134

132135
export function getEslint9ConfigEntry(
133-
options: WxtResolvedUnimportOptions,
136+
eslintrc: ResolvedEslintrc9,
134137
globals: Record<string, EslintGlobalsPropValue>,
135-
): WxtDirFileEntry {
136-
return {
137-
path: options.eslintrc.filePath,
138+
): WxtDirFileEntry[] {
139+
const jsFileEntry: WxtDirFileEntry = {
140+
path: eslintrc.filePath,
138141
text: `const globals = ${JSON.stringify(globals, null, 2)}
139142
140143
export default {
@@ -147,4 +150,14 @@ export default {
147150
};
148151
`,
149152
};
153+
154+
const tsFileEntry: WxtDirFileEntry = {
155+
path: eslintrc.definitionPath,
156+
text: `import type { ConfigObject } from "@eslint/core";
157+
declare const config: ConfigObject;
158+
export default config;
159+
`,
160+
};
161+
162+
return [jsFileEntry, tsFileEntry];
150163
}

packages/wxt/src/core/resolve-config.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -522,12 +522,27 @@ async function getUnimportEslintOptions(
522522
enabled = inlineEnabled;
523523
}
524524

525+
if (enabled === false) {
526+
return { enabled: false };
527+
}
528+
529+
const filePath = path.resolve(
530+
wxtDir,
531+
enabled === 9 ? 'eslint-auto-imports.mjs' : 'eslintrc-auto-import.json',
532+
);
533+
534+
if (enabled === 9) {
535+
return {
536+
enabled: 9,
537+
filePath,
538+
globalsPropValue: true,
539+
definitionPath: path.resolve(wxtDir, 'eslint-auto-imports.d.mts'),
540+
};
541+
}
542+
525543
return {
526544
enabled,
527-
filePath: path.resolve(
528-
wxtDir,
529-
enabled === 9 ? 'eslint-auto-imports.mjs' : 'eslintrc-auto-import.json',
530-
),
545+
filePath,
531546
globalsPropValue: true,
532547
};
533548
}

packages/wxt/src/core/utils/testing/fake-objects.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ export const fakeResolvedConfig = fakeObjectCreator<ResolvedConfig>(() => {
248248
eslintrc: {
249249
enabled: faker.helpers.arrayElement([false, 8, 9]),
250250
filePath: fakeFile(),
251+
definitionPath: fakeFile(),
251252
globalsPropValue: faker.helpers.arrayElement([
252253
true,
253254
false,

packages/wxt/src/types.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,14 +1448,31 @@ export interface Eslintrc {
14481448
globalsPropValue?: EslintGlobalsPropValue;
14491449
}
14501450

1451-
export interface ResolvedEslintrc {
1452-
/** False if disabled, otherwise the major version of ESLint installed */
1453-
enabled: false | 8 | 9;
1451+
interface ResolvedEslintrcBase {
14541452
/** Absolute path */
14551453
filePath: string;
14561454
globalsPropValue: EslintGlobalsPropValue;
14571455
}
14581456

1457+
export interface ResolvedEslintrc8 extends ResolvedEslintrcBase {
1458+
enabled: 8;
1459+
}
1460+
1461+
export interface ResolvedEslintrc9 extends ResolvedEslintrcBase {
1462+
enabled: 9;
1463+
definitionPath: string;
1464+
}
1465+
1466+
interface ResolvedEslintrcDisabled {
1467+
/** False if disabled, otherwise the major version of ESLint installed */
1468+
enabled: false;
1469+
}
1470+
1471+
export type ResolvedEslintrcEnabled = ResolvedEslintrc8 | ResolvedEslintrc9;
1472+
export type ResolvedEslintrc =
1473+
| ResolvedEslintrcDisabled
1474+
| ResolvedEslintrcEnabled;
1475+
14591476
export type WxtUnimportOptions = Partial<UnimportOptions> & {
14601477
/**
14611478
* When using ESLint, auto-imported variables are linted as "undeclared

0 commit comments

Comments
 (0)