Skip to content

Commit 8f6c612

Browse files
authored
feat: support clean coverage directory before running tests (#558)
1 parent d7a086a commit 8f6c612

File tree

9 files changed

+46
-18
lines changed

9 files changed

+46
-18
lines changed

e2e/test-coverage/index.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,9 @@ it('coverage-istanbul with custom options', async () => {
9999
// text reporter
100100
expectLog('% Stmts', logs);
101101

102-
// TODO: should clean and not generate html reporter
103102
expect(
104103
fs.existsSync(join(__dirname, 'fixtures/coverage/index.html')),
105-
).toBeTruthy();
104+
).toBeFalsy();
106105
});
107106

108107
it('coverage-istanbul with custom reportsDirectory', async () => {

packages/core/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ const createDefaultConfig = (): NormalizedConfig => ({
116116
provider: 'istanbul',
117117
reporters: ['text', 'html', 'clover', 'json'],
118118
reportsDirectory: './coverage',
119+
clean: true,
119120
},
120121
});
121122

packages/core/src/core/rsbuild.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,17 @@ export const prepareRsbuild = async (
124124
},
125125
});
126126

127-
if (coverage?.enabled) {
127+
if (coverage?.enabled && command !== 'list') {
128128
const { loadCoverageProvider } = await import('../coverage');
129+
const { pluginCoverageCore } = await import('../coverage/plugin');
129130
const { pluginCoverage } = await loadCoverageProvider(
130131
coverage,
131132
context.rootPath,
132133
);
133-
rsbuildInstance.addPlugins([pluginCoverage(coverage)]);
134+
rsbuildInstance.addPlugins([
135+
pluginCoverage(coverage),
136+
pluginCoverageCore(coverage),
137+
]);
134138
}
135139

136140
return rsbuildInstance;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import fs from 'node:fs';
2+
import type { RsbuildPlugin } from '@rstest/core';
3+
import type { NormalizedCoverageOptions } from '../types/coverage';
4+
5+
export const pluginCoverageCore: (
6+
coverageOptions: NormalizedCoverageOptions,
7+
) => RsbuildPlugin = (coverageOptions) => ({
8+
name: 'rstest:coverage-core',
9+
setup: (api) => {
10+
api.onBeforeDevCompile(({ isFirstCompile }) => {
11+
if (isFirstCompile && coverageOptions.clean) {
12+
if (fs.existsSync(coverageOptions.reportsDirectory)) {
13+
fs.rmSync(coverageOptions.reportsDirectory, { recursive: true });
14+
}
15+
}
16+
});
17+
},
18+
});

packages/core/src/types/config.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { RsbuildConfig } from '@rsbuild/core';
2-
import type { CoverageOptions } from './coverage';
2+
import type { CoverageOptions, NormalizedCoverageOptions } from './coverage';
33
import type {
44
BuiltInReporterNames,
55
Reporter,
@@ -21,7 +21,7 @@ export type RstestPoolOptions = {
2121

2222
export type ProjectConfig = Omit<
2323
RstestConfig,
24-
'projects' | 'reporters' | 'pool' | 'isolate'
24+
'projects' | 'reporters' | 'pool' | 'isolate' | 'coverage'
2525
>;
2626

2727
/**
@@ -246,16 +246,17 @@ type OptionalKeys =
246246
| 'dev'
247247
| 'onConsoleLog';
248248

249-
export type NormalizedProjectConfig = Required<
250-
Omit<RstestConfig, OptionalKeys | 'projects' | 'reporters' | 'pool'>
251-
> & {
252-
[key in OptionalKeys]?: RstestConfig[key];
253-
};
254-
255249
export type NormalizedConfig = Required<
256-
Omit<RstestConfig, OptionalKeys | 'pool' | 'projects'>
250+
Omit<RstestConfig, OptionalKeys | 'pool' | 'projects' | 'coverage'>
257251
> & {
258252
[key in OptionalKeys]?: RstestConfig[key];
259253
} & {
260254
pool: RstestPoolOptions;
255+
coverage: NormalizedCoverageOptions;
256+
};
257+
258+
export type NormalizedProjectConfig = Required<
259+
Omit<NormalizedConfig, OptionalKeys | 'projects' | 'reporters' | 'pool'>
260+
> & {
261+
[key in OptionalKeys]?: NormalizedConfig[key];
261262
};

packages/core/src/types/core.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ export type RstestContext = {
3939
/**
4040
* The command type.
4141
*
42-
* - dev: `rstest dev`
43-
* - run: `rstest run`
42+
* - run: `rstest`
43+
* - dev: `rstest dev` or watch mode
44+
* - list: `rstest list`
4445
*/
4546
command: RstestCommand;
4647
reporters: Reporter[];

packages/core/src/types/coverage.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ export type CoverageOptions = {
3131
*/
3232
reportsDirectory?: string;
3333

34-
// TODO: support clean
34+
/**
35+
* Whether to clean the coverage directory before running tests.
36+
* @default true
37+
*/
38+
clean?: boolean;
3539
};
3640

3741
export type NormalizedCoverageOptions = Required<CoverageOptions>;

website/docs/en/config/test/projects.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
```ts
66
type ProjectConfig = Omit<
77
RstestConfig,
8-
'projects' | 'reporters' | 'pool' | 'isolate'
8+
'projects' | 'reporters' | 'pool' | 'isolate' | 'coverage'
99
>;
1010

1111
type Projects = (string | ProjectConfig)[];

website/docs/zh/config/test/projects.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
```ts
66
type ProjectConfig = Omit<
77
RstestConfig,
8-
'projects' | 'reporters' | 'pool' | 'isolate'
8+
'projects' | 'reporters' | 'pool' | 'isolate' | 'coverage'
99
>;
1010

1111
type Projects = (string | ProjectConfig)[];

0 commit comments

Comments
 (0)