Skip to content

Commit 6c49e5c

Browse files
committed
Improve & extend vitest args handling
1 parent 273b940 commit 6c49e5c

4 files changed

Lines changed: 30 additions & 12 deletions

File tree

packages/knip/fixtures/plugins/vitest/package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22
"name": "@plugins/vitest",
33
"scripts": {
44
"test": "vitest --config vitest-default-coverage.config.ts",
5-
"test:ui": "vitest --ui"
5+
"test:ui": "vitest --ui",
6+
"test:coverage": "vitest --coverage.provider istanbul",
7+
"test:reporter": "vitest --reporter vitest-sonar-reporter",
8+
"test:reporter:builtin": "vitest --reporter verbose",
9+
"test:env": "vitest --environment jsdom",
10+
"test:typecheck": "vitest --typecheck.checker vue-tsc",
11+
"test:typecheck:tsc": "vitest --typecheck.checker tsc"
612
},
713
"devDependencies": {
814
"vitest": "*",

packages/knip/src/plugins/vitest/index.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { ParsedArgs } from 'minimist';
22
import { DEFAULT_EXTENSIONS } from '../../constants.js';
33
import type { Args } from '../../types/args.js';
44
import type { IsPluginEnabled, Plugin, PluginOptions, ResolveConfig } from '../../types/config.js';
5-
import type { PackageJson } from '../../types/package-json.js';
65
import { _glob } from '../../util/glob.js';
76
import { type Input, toAlias, toConfig, toDeferResolve, toDependency, toEntry } from '../../util/input.js';
87
import { isAbsolute, isInternal, join, toPosix } from '../../util/path.js';
@@ -24,13 +23,8 @@ const mocks = ['**/__mocks__/**/*.[jt]s?(x)'];
2423

2524
const entry = ['**/*.{bench,test,test-d,spec}.?(c|m)[jt]s?(x)', ...mocks];
2625

27-
const isVitestCoverageCommand = /vitest(.+)--coverage(?:\.enabled(?:=true)?)?/;
28-
29-
const hasScriptWithCoverage = (scripts: PackageJson['scripts']) =>
30-
scripts ? Object.values(scripts).some(script => isVitestCoverageCommand.test(script)) : false;
31-
3226
const findConfigDependencies = (localConfig: ViteConfig, options: PluginOptions, vitestRoot: string) => {
33-
const { manifest, configFileDir: dir } = options;
27+
const { configFileDir: dir } = options;
3428
const testConfig = localConfig.test;
3529

3630
if (!testConfig) return [];
@@ -44,8 +38,7 @@ const findConfigDependencies = (localConfig: ViteConfig, options: PluginOptions,
4438
: [];
4539
const reporters = getExternalReporters(testConfig.reporters);
4640

47-
const hasCoverageEnabled =
48-
(testConfig.coverage && testConfig.coverage.enabled !== false) || hasScriptWithCoverage(manifest.scripts);
41+
const hasCoverageEnabled = testConfig.coverage && testConfig.coverage.enabled !== false;
4942
const coverage = hasCoverageEnabled ? [`@vitest/coverage-${testConfig.coverage?.provider ?? 'v8'}`] : [];
5043

5144
const setupFiles = [testConfig.setupFiles ?? []].flat().map(specifier => ({ ...toDeferResolve(specifier), dir: vitestRoot }));
@@ -192,6 +185,21 @@ const args: Args = {
192185
resolveInputs: (parsed: ParsedArgs) => {
193186
const inputs: Input[] = [];
194187
if (parsed['ui']) inputs.push(toDependency('@vitest/ui', { optional: true }));
188+
if (parsed['coverage']) {
189+
const provider = typeof parsed['coverage'] === 'object' ? parsed['coverage'].provider : undefined;
190+
inputs.push(toDependency(`@vitest/coverage-${provider ?? 'v8'}`));
191+
}
192+
if (parsed['reporter']) {
193+
for (const reporter of getExternalReporters([parsed['reporter']].flat())) {
194+
inputs.push(toDependency(reporter));
195+
}
196+
}
197+
if (parsed['environment'] && parsed['environment'] !== 'node') {
198+
inputs.push(toDependency(getEnvSpecifier(parsed['environment'])));
199+
}
200+
if (typeof parsed['typecheck'] === 'object' && parsed['typecheck'].checker) {
201+
inputs.push(toDependency(parsed['typecheck'].checker === 'tsc' ? 'typescript' : parsed['typecheck'].checker));
202+
}
195203
return inputs;
196204
},
197205
};

packages/knip/test/plugins/vitest-npm-script.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ test('Find dependencies with the Vitest plugin', async () => {
1212
const { issues, counters } = await main(options);
1313

1414
assert(issues.devDependencies['package.json']['vitest']);
15-
assert(issues.unlisted['vitest.config.ts']['@vitest/coverage-v8']);
15+
assert(issues.unlisted['package.json']['@vitest/coverage-v8']);
1616
assert(issues.binaries['package.json']['vitest']);
1717

1818
assert.deepEqual(counters, {

packages/knip/test/plugins/vitest.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@ test('Find dependencies with the Vitest plugin', async () => {
1919
assert(issues.unlisted['vitest-default-coverage.config.ts']['@vitest/coverage-v8']);
2020
assert(issues.unlisted['vitest.config.ts']['happy-dom']);
2121
assert(issues.unlisted['vitest.config.ts']['@vitest/coverage-istanbul']);
22+
assert(issues.unlisted['package.json']['@vitest/coverage-istanbul']);
23+
assert(issues.unlisted['package.json']['vitest-sonar-reporter']);
24+
assert(issues.unlisted['package.json']['jsdom']);
25+
assert(issues.unlisted['package.json']['vue-tsc']);
2226
assert(issues.unresolved['vitest.config.ts']['setup.js']);
2327

2428
assert.deepEqual(counters, {
2529
...baseCounters,
26-
unlisted: 7,
30+
unlisted: 11,
2731
unresolved: 1,
2832
processed: 9,
2933
total: 9,

0 commit comments

Comments
 (0)