From 95d3a5635635317019178dbac5d2d2e3ac56e7c7 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:24:16 -0500 Subject: [PATCH] fix(@angular/build): update vitest to 4.0.6 and remove coverage workaround Upgrades Vitest and @vitest/coverage-v8 dependencies to version 4.0.6. This update allows for the removal of a temporary workaround that augmented `BaseCoverageProvider.prototype.isIncluded` in `executor.ts`. The issue with direct filesystem checks in Vitest's coverage provider has been resolved in version 4.0.6, simplifying the code and relying on the official library's implementation. (cherry picked from commit 9af4f76e4bfea7b06511a16102ab8980cfe8141c) --- modules/testing/builder/package.json | 4 +- packages/angular/build/package.json | 4 +- .../unit-test/runners/vitest/executor.ts | 17 --- pnpm-lock.yaml | 109 +++++++++--------- tests/legacy-cli/e2e/utils/vitest.ts | 2 +- 5 files changed, 59 insertions(+), 77 deletions(-) diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index ee6fa056bbfe..27e7eef758ca 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -4,9 +4,9 @@ "@angular-devkit/architect": "workspace:*", "@angular/ssr": "workspace:*", "@angular-devkit/build-angular": "workspace:*", - "@vitest/coverage-v8": "4.0.0", + "@vitest/coverage-v8": "4.0.6", "jsdom": "27.0.1", "rxjs": "7.8.2", - "vitest": "4.0.0" + "vitest": "4.0.6" } } diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index f49ebe26c93f..e38f62a1be97 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -56,7 +56,7 @@ "ng-packagr": "21.0.0-rc.0", "postcss": "8.5.6", "rxjs": "7.8.2", - "vitest": "4.0.0" + "vitest": "4.0.6" }, "peerDependencies": { "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP", @@ -74,7 +74,7 @@ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", "typescript": ">=5.9 <6.0", - "vitest": "^4.0.0" + "vitest": "^4.0.6" }, "peerDependenciesMeta": { "@angular/core": { diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts index f7ff75c82d70..7e1e931f6c3a 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts @@ -143,9 +143,7 @@ export class VitestExecutor implements TestExecutor { } = this.options; let vitestNodeModule; - let vitestCoverageModule; try { - vitestCoverageModule = await import('vitest/coverage'); vitestNodeModule = await import('vitest/node'); } catch (error: unknown) { assertIsError(error); @@ -158,21 +156,6 @@ export class VitestExecutor implements TestExecutor { } const { startVitest } = vitestNodeModule; - // Augment BaseCoverageProvider to include logic to support the built virtual files. - // Temporary workaround to avoid the direct filesystem checks in the base provider that - // were introduced in v4. Also ensures that all built virtual files are available. - const builtVirtualFiles = this.buildResultFiles; - vitestCoverageModule.BaseCoverageProvider.prototype.isIncluded = function (filename) { - const relativeFilename = path.relative(workspaceRoot, filename); - if (!this.options.include || builtVirtualFiles.has(relativeFilename)) { - return !isMatch(relativeFilename, this.options.exclude); - } else { - return isMatch(relativeFilename, this.options.include, { - ignore: this.options.exclude, - }); - } - }; - // Setup vitest browser options if configured const browserOptions = await setupBrowserConfiguration( browsers, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79b7ac4cb1d4..4f72f75dd728 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -332,8 +332,8 @@ importers: specifier: workspace:* version: link:../../../packages/angular/ssr '@vitest/coverage-v8': - specifier: 4.0.0 - version: 4.0.0(vitest@4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: 4.0.6 + version: 4.0.6(vitest@4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) jsdom: specifier: 27.0.1 version: 27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -341,8 +341,8 @@ importers: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.0 - version: 4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.6 + version: 4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/angular/build: dependencies: @@ -447,8 +447,8 @@ importers: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.0 - version: 4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.6 + version: 4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: lmdb: specifier: 3.4.3 @@ -3721,20 +3721,20 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@4.0.0': - resolution: {integrity: sha512-VyVmZ8TccaGCZT9C0/vIi3kbPmvD/rLUcRx1AC8QzqaCm9SLYr1p3rxirW3EuwEGWnVU7KjGckAwJR1SRtgurA==} + '@vitest/coverage-v8@4.0.6': + resolution: {integrity: sha512-cv6pFXj9/Otk7q1Ocoj8k3BUVVwnFr3jqcqpwYrU5LkKClU9DpaMEdX+zptx/RyIJS+/VpoxMWmfISXchmVDPQ==} peerDependencies: - '@vitest/browser': 4.0.0 - vitest: 4.0.0 + '@vitest/browser': 4.0.6 + vitest: 4.0.6 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.0': - resolution: {integrity: sha512-NLwsOv2m6RfTEMk5AhpFIUVbd5BDmZnev5XxIIwJiNsXFOetFdqMzil/paGpwwbfQyaeQCokB1rQbKsnvLeR/w==} + '@vitest/expect@4.0.6': + resolution: {integrity: sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==} - '@vitest/mocker@4.0.0': - resolution: {integrity: sha512-s5S729mda0Umb60zbZeyYm58dpv97VNOXZ1bLSZ9AfaOE8TJoW4IDfEnw3IaCk9nq/Hug80hFmAz5NAh+XOImQ==} + '@vitest/mocker@4.0.6': + resolution: {integrity: sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -3744,20 +3744,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.0': - resolution: {integrity: sha512-oUjxwO6VcUP0VtCkJERILS2yKV4AZiE1VTWDjvjeb8pXG6P5iubyeP+cmcj2vzCPdUst8vNhXMqC1CnxvDN97Q==} + '@vitest/pretty-format@4.0.6': + resolution: {integrity: sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==} - '@vitest/runner@4.0.0': - resolution: {integrity: sha512-w3kADT0nDmY4dQyfPtq7zEe6wbwDy88Go2b7NpWuj0iqA1H26CTS/JB2/t8tKbvxk7MTJ9vTsRK/VMVuKmLPaQ==} + '@vitest/runner@4.0.6': + resolution: {integrity: sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==} - '@vitest/snapshot@4.0.0': - resolution: {integrity: sha512-ELrK8qhbH3WdhD/2qh3NnR7xnaxOGx62NYLj5XKAGPIABOc+1ITN1XfH/MTgdP6Ov7O91DycuGrzwpizdCpuHg==} + '@vitest/snapshot@4.0.6': + resolution: {integrity: sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==} - '@vitest/spy@4.0.0': - resolution: {integrity: sha512-VKD9p74W9ALFV2dSy3j8WtitY3gtloO+U6EZq84TY5gTaTTt1Lvs9nZnuaBomzEHYp/QbtGRMMKBOCsir2IAgA==} + '@vitest/spy@4.0.6': + resolution: {integrity: sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==} - '@vitest/utils@4.0.0': - resolution: {integrity: sha512-8OXfn18Y7UtcpqhiQAfxcmZIsemPPKcg/guU2CLvafXn50G6B2EvKuj3A5h7ZMAvm95tDkll13rTtdd08MKjLQ==} + '@vitest/utils@4.0.6': + resolution: {integrity: sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==} '@web/browser-logs@0.4.1': resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==} @@ -7483,7 +7483,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qjobs@1.2.0: @@ -8649,18 +8648,18 @@ packages: yaml: optional: true - vitest@4.0.0: - resolution: {integrity: sha512-Z+qKuTt2py+trSv2eJNYPaQKos88EmmLntXLAJkOHdd1v3BdcS4DgIkyC6cQPRoh8tWb+QiFfW08U347mjcV0g==} + vitest@4.0.6: + resolution: {integrity: sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.0 - '@vitest/browser-preview': 4.0.0 - '@vitest/browser-webdriverio': 4.0.0 - '@vitest/ui': 4.0.0 + '@vitest/browser-playwright': 4.0.6 + '@vitest/browser-preview': 4.0.6 + '@vitest/browser-webdriverio': 4.0.6 + '@vitest/ui': 4.0.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -12260,10 +12259,10 @@ snapshots: dependencies: vite: 7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/coverage-v8@4.0.0(vitest@4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.6(vitest@4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.0 + '@vitest/utils': 4.0.6 ast-v8-to-istanbul: 0.3.8 debug: 4.4.3(supports-color@10.2.2) istanbul-lib-coverage: 3.2.2 @@ -12273,47 +12272,47 @@ snapshots: magicast: 0.3.5 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.0': + '@vitest/expect@4.0.6': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.0 - '@vitest/utils': 4.0.0 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.0(vite@7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.6(vite@7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.0 + '@vitest/spy': 4.0.6 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: vite: 7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/pretty-format@4.0.0': + '@vitest/pretty-format@4.0.6': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.0': + '@vitest/runner@4.0.6': dependencies: - '@vitest/utils': 4.0.0 + '@vitest/utils': 4.0.6 pathe: 2.0.3 - '@vitest/snapshot@4.0.0': + '@vitest/snapshot@4.0.6': dependencies: - '@vitest/pretty-format': 4.0.0 + '@vitest/pretty-format': 4.0.6 magic-string: 0.30.19 pathe: 2.0.3 - '@vitest/spy@4.0.0': {} + '@vitest/spy@4.0.6': {} - '@vitest/utils@4.0.0': + '@vitest/utils@4.0.6': dependencies: - '@vitest/pretty-format': 4.0.0 + '@vitest/pretty-format': 4.0.6 tinyrainbow: 3.0.3 '@web/browser-logs@0.4.1': @@ -18160,15 +18159,15 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@4.0.0(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.6(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.0 - '@vitest/mocker': 4.0.0(vite@7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.0 - '@vitest/runner': 4.0.0 - '@vitest/snapshot': 4.0.0 - '@vitest/spy': 4.0.0 - '@vitest/utils': 4.0.0 + '@vitest/expect': 4.0.6 + '@vitest/mocker': 4.0.6(vite@7.1.11(@types/node@24.9.2)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.6 + '@vitest/runner': 4.0.6 + '@vitest/snapshot': 4.0.6 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 debug: 4.4.3(supports-color@10.2.2) es-module-lexer: 1.7.0 expect-type: 1.2.2 diff --git a/tests/legacy-cli/e2e/utils/vitest.ts b/tests/legacy-cli/e2e/utils/vitest.ts index a16d7fca3cee..3f312ff29c3e 100644 --- a/tests/legacy-cli/e2e/utils/vitest.ts +++ b/tests/legacy-cli/e2e/utils/vitest.ts @@ -3,7 +3,7 @@ import { updateJsonFile } from './project'; /** Updates the `test` builder in the current workspace to use Vitest. */ export async function applyVitestBuilder(): Promise { - await silentNpm('install', 'vitest@4.0.0', 'jsdom@27.0.0', '--save-dev'); + await silentNpm('install', 'vitest@4.0.6', 'jsdom@27.0.0', '--save-dev'); await updateJsonFile('angular.json', (json) => { const projects = Object.values(json['projects']);