Skip to content

Commit 220961f

Browse files
committed
build(@angular/build): update vitest to v4.0.0
This commit updates the version of `vitest` and its related packages from `3.2.4` to `4.0.0` within the unit testing system. This major version update for Vitest introduces several changes that are addressed here: - The `coverage.all` option has been removed in Vitest v4. Accordingly, the `coverageAll` option has been removed from the unit-test builders schema and its usage has been removed from the Karma and Vitest test runner implementations. - The browser provider mechanism has been updated. Vitest now uses provider-specific packages (e.g., @vitest/browser-playwright) instead of the general @vitest/browser package. The browser configuration setup has been made asynchronous and now dynamically loads the appropriate provider.
1 parent 2761d85 commit 220961f

File tree

13 files changed

+138
-284
lines changed

13 files changed

+138
-284
lines changed

goldens/public-api/angular/build/index.api.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ export type UnitTestBuilderOptions = {
219219
browsers?: string[];
220220
buildTarget?: string;
221221
coverage?: boolean;
222-
coverageAll?: boolean;
223222
coverageExclude?: string[];
224223
coverageInclude?: string[];
225224
coverageReporters?: SchemaCoverageReporter[];

modules/testing/builder/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
"@angular-devkit/architect": "workspace:*",
55
"@angular/ssr": "workspace:*",
66
"@angular-devkit/build-angular": "workspace:*",
7-
"@vitest/coverage-v8": "3.2.4",
7+
"@vitest/coverage-v8": "4.0.0",
88
"jsdom": "27.0.1",
99
"rxjs": "7.8.2",
10-
"vitest": "3.2.4"
10+
"vitest": "4.0.0"
1111
}
1212
}

packages/angular/build/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"ng-packagr": "21.0.0-next.4",
5757
"postcss": "8.5.6",
5858
"rxjs": "7.8.2",
59-
"vitest": "3.2.4"
59+
"vitest": "4.0.0"
6060
},
6161
"peerDependencies": {
6262
"@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP",
@@ -74,7 +74,7 @@
7474
"tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
7575
"tslib": "^2.3.0",
7676
"typescript": ">=5.9 <6.0",
77-
"vitest": "^3.1.1"
77+
"vitest": "^4.0.0"
7878
},
7979
"peerDependenciesMeta": {
8080
"@angular/core": {

packages/angular/build/src/builders/unit-test/options.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ export async function normalizeOptions(
8585
runnerName: runner ?? 'vitest',
8686
coverage: options.coverage
8787
? {
88-
all: options.coverageAll,
8988
exclude: options.coverageExclude,
9089
include: options.coverageInclude,
9190
reporters: normalizeReporterOption(options.coverageReporters),

packages/angular/build/src/builders/unit-test/runners/karma/executor.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,6 @@ export class KarmaExecutor implements TestExecutor {
3939
);
4040
}
4141

42-
if (unitTestOptions.coverage?.all) {
43-
context.logger.warn(
44-
'The "karma" test runner does not support the "coverageAll" option. The option will be ignored.',
45-
);
46-
}
47-
4842
if (unitTestOptions.coverage?.include) {
4943
context.logger.warn(
5044
'The "karma" test runner does not support the "coverageInclude" option. The option will be ignored.',

packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import { createRequire } from 'node:module';
1010
import type { BrowserBuiltinProvider, BrowserConfigOptions } from 'vitest/node';
11+
import { assertIsError } from '../../../../utils/error';
1112

1213
export interface BrowserConfiguration {
1314
browser?: BrowserConfigOptions;
@@ -40,45 +41,60 @@ function normalizeBrowserName(browserName: string): string {
4041
return normalized.replace(/headless$/, '');
4142
}
4243

43-
export function setupBrowserConfiguration(
44+
export async function setupBrowserConfiguration(
4445
browsers: string[] | undefined,
4546
debug: boolean,
4647
projectSourceRoot: string,
4748
viewport: { width: number; height: number } | undefined,
48-
): BrowserConfiguration {
49+
): Promise<BrowserConfiguration> {
4950
if (browsers === undefined) {
5051
return {};
5152
}
5253

5354
const projectResolver = createRequire(projectSourceRoot + '/').resolve;
5455
let errors: string[] | undefined;
5556

56-
try {
57-
projectResolver('@vitest/browser');
58-
} catch {
59-
errors ??= [];
60-
errors.push(
61-
'The "browsers" option requires the "@vitest/browser" package to be installed within the project.' +
62-
' Please install this package and rerun the test command.',
63-
);
64-
}
65-
66-
const provider = findBrowserProvider(projectResolver);
67-
if (!provider) {
57+
const providerName = findBrowserProvider(projectResolver);
58+
if (!providerName) {
6859
errors ??= [];
6960
errors.push(
7061
'The "browsers" option requires either "playwright" or "webdriverio" to be installed within the project.' +
7162
' Please install one of these packages and rerun the test command.',
7263
);
7364
}
7465

75-
// Vitest current requires the playwright browser provider to use the inspect-brk option used by "debug"
76-
if (debug && provider !== 'playwright') {
77-
errors ??= [];
78-
errors.push(
79-
'Debugging browser mode tests currently requires the use of "playwright".' +
80-
' Please install this package and rerun the test command.',
81-
);
66+
let provider: import('vitest/node').BrowserProviderOption | undefined;
67+
if (providerName) {
68+
const providerPackage = `@vitest/browser-${providerName}`;
69+
try {
70+
const providerModule = await import(providerPackage);
71+
72+
// Validate that the imported module has the expected structure
73+
const providerFactory = providerModule[providerName];
74+
if (typeof providerFactory === 'function') {
75+
provider = providerFactory();
76+
} else {
77+
errors ??= [];
78+
errors.push(
79+
`The "${providerPackage}" package does not have a valid browser provider export.`,
80+
);
81+
}
82+
} catch (e) {
83+
assertIsError(e);
84+
errors ??= [];
85+
// Check for a module not found error to provide a more specific message
86+
if (e.code === 'ERR_MODULE_NOT_FOUND') {
87+
errors.push(
88+
`The "browsers" option with "${providerName}" requires the "${providerPackage}" package.` +
89+
' Please install this package and rerun the test command.',
90+
);
91+
} else {
92+
// Handle other potential errors during import
93+
errors.push(
94+
`An error occurred while loading the "${providerPackage}" browser provider:\n ${e.message}`,
95+
);
96+
}
97+
}
8298
}
8399

84100
if (errors) {
@@ -88,7 +104,7 @@ export function setupBrowserConfiguration(
88104
const isCI = !!process.env['CI'];
89105
const headless = isCI || browsers.some((name) => name.toLowerCase().includes('headless'));
90106

91-
const browser: BrowserConfigOptions = {
107+
const browser = {
92108
enabled: true,
93109
provider,
94110
headless,
@@ -97,7 +113,7 @@ export function setupBrowserConfiguration(
97113
instances: browsers.map((browserName) => ({
98114
browser: normalizeBrowserName(browserName),
99115
})),
100-
};
116+
} satisfies BrowserConfigOptions;
101117

102118
return { browser };
103119
}

packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ export class VitestExecutor implements TestExecutor {
153153
const { startVitest } = vitestNodeModule;
154154

155155
// Setup vitest browser options if configured
156-
const browserOptions = setupBrowserConfiguration(
156+
const browserOptions = await setupBrowserConfiguration(
157157
browsers,
158158
debug,
159159
this.options.projectSourceRoot,
@@ -236,7 +236,6 @@ async function generateCoverageOption(
236236

237237
return {
238238
enabled: true,
239-
all: coverage.all,
240239
excludeAfterRemap: true,
241240
include: coverage.include,
242241
reportsDirectory: toPosixPath(path.join('coverage', projectName)),

packages/angular/build/src/builders/unit-test/runners/vitest/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ const VitestTestRunner: TestRunner = {
2323
checker.check('vitest');
2424

2525
if (options.browsers?.length) {
26-
checker.check('@vitest/browser');
2726
checker.checkAny(
2827
['playwright', 'webdriverio'],
2928
'The "browsers" option requires either "playwright" or "webdriverio" to be installed.',

packages/angular/build/src/builders/unit-test/schema.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@
6565
"description": "Enables coverage reporting for tests.",
6666
"default": false
6767
},
68-
"coverageAll": {
69-
"type": "boolean",
70-
"description": "Includes all files that match the `coverageInclude` pattern in the coverage report, not just those touched by tests.",
71-
"default": true
72-
},
7368
"coverageInclude": {
7469
"type": "array",
7570
"description": "Specifies glob patterns of files to include in the coverage report.",

packages/angular/build/src/builders/unit-test/tests/options/code-coverage-exclude_spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => {
2727
harness.useTarget('test', {
2828
...BASE_OPTIONS,
2929
coverage: true,
30+
coverageInclude: ['**/*.ts'],
3031
});
3132

3233
const { result } = await harness.executeOnce();
@@ -39,6 +40,7 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => {
3940
harness.useTarget('test', {
4041
...BASE_OPTIONS,
4142
coverage: true,
43+
coverageInclude: ['**/*.ts'],
4244
coverageExclude: ['**/error.ts'],
4345
});
4446

0 commit comments

Comments
 (0)