From 16c8ee211b539257801415efa7dbe7d51fe4ef6c Mon Sep 17 00:00:00 2001 From: Teo Date: Wed, 9 Jul 2025 20:34:55 +0200 Subject: [PATCH] feat(@angular/build): add headless mode for vitest browser mode --- .../angular/build/src/builders/unit-test/builder.ts | 13 ++++++++++++- .../build/src/builders/unit-test/schema.json | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index fd9f88580d70..5bf1556cadcb 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -331,6 +331,15 @@ function findBrowserProvider( } } +function normalizeBrowserName(browserName: string): string { + // Normalize browser names to match Vitest's expectations for headless but also supports karma's names + // e.g., 'ChromeHeadless' -> 'chrome', 'FirefoxHeadless' + // and 'Chrome' -> 'chrome', 'Firefox' -> 'firefox'. + const normalized = browserName.toLowerCase(); + + return normalized.replace(/headless$/, ''); +} + function setupBrowserConfiguration( browsers: string[] | undefined, debug: boolean, @@ -378,8 +387,10 @@ function setupBrowserConfiguration( const browser = { enabled: true, provider, + headless: browsers.some((name) => name.toLowerCase().includes('headless')), + instances: browsers.map((browserName) => ({ - browser: browserName, + browser: normalizeBrowserName(browserName), })), }; diff --git a/packages/angular/build/src/builders/unit-test/schema.json b/packages/angular/build/src/builders/unit-test/schema.json index 0f54d813ace1..8628bb9725e9 100644 --- a/packages/angular/build/src/builders/unit-test/schema.json +++ b/packages/angular/build/src/builders/unit-test/schema.json @@ -19,7 +19,7 @@ "enum": ["karma", "vitest"] }, "browsers": { - "description": "A list of browsers to use for test execution. If undefined, jsdom on Node.js will be used instead of a browser.", + "description": "A list of browsers to use for test execution. If undefined, jsdom on Node.js will be used instead of a browser. For Vitest and Karma, browser names ending with 'Headless' (e.g., 'ChromeHeadless') will enable headless mode for that browser.", "type": "array", "items": { "type": "string"