Skip to content

Commit 50072cd

Browse files
committed
fix(@angular/build): add webcontainer support for Vitest browser provider
Currently, Vitest's browser providers (playwright, webdriverio) are not compatible with webcontainer environments. This change introduces detection for webcontainers and and automatically configures the Vitest unit test builder to use the `@vitest/browser-preview` provider when running within a webcontainer. This ensures that browser-based unit tests can execute correctly in webcontainer environments, providing a more consistent development experience across different platforms. The user is notified when the webcontainer environment is detected and the preview provider is activated. Dependency checks are also updated to ensure the correct `@vitest/browser-preview` package is installed when needed.
1 parent ea4fb9d commit 50072cd

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,16 @@ export interface BrowserConfiguration {
1818
function findBrowserProvider(
1919
projectResolver: NodeJS.RequireResolve,
2020
): BrowserBuiltinProvider | undefined {
21+
const requiresPreview = !!process.versions.webcontainer;
22+
2123
// One of these must be installed in the project to use browser testing
22-
const vitestBuiltinProviders = ['playwright', 'webdriverio'] as const;
24+
const vitestBuiltinProviders = requiresPreview
25+
? (['preview'] as const)
26+
: (['playwright', 'webdriverio', 'preview'] as const);
2327

2428
for (const providerName of vitestBuiltinProviders) {
2529
try {
26-
projectResolver(providerName);
30+
projectResolver(`@vitest/browser-${providerName}`);
2731

2832
return providerName;
2933
} catch {}
@@ -102,13 +106,18 @@ export async function setupBrowserConfiguration(
102106
}
103107

104108
const isCI = !!process.env['CI'];
105-
const headless = isCI || browsers.some((name) => name.toLowerCase().includes('headless'));
109+
let headless = isCI || browsers.some((name) => name.toLowerCase().includes('headless'));
110+
if (providerName === 'preview') {
111+
// `preview` provider does not support headless mode
112+
headless = false;
113+
}
106114

107115
const browser = {
108116
enabled: true,
109117
provider,
110118
headless,
111119
ui: !headless,
120+
isolate: debug,
112121
viewport,
113122
instances: browsers.map((browserName) => ({
114123
browser: normalizeBrowserName(browserName),

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ const VitestTestRunner: TestRunner = {
2323
checker.check('vitest');
2424

2525
if (options.browsers?.length) {
26-
checker.checkAny(
27-
['playwright', 'webdriverio'],
28-
'The "browsers" option requires either "playwright" or "webdriverio" to be installed.',
29-
);
26+
if (process.versions.webcontainer) {
27+
checker.check('@vitest/browser-preview');
28+
} else {
29+
checker.checkAny(
30+
['@vitest/browser-playwright', '@vitest/browser-webdriverio', '@vitest/browser-preview'],
31+
'The "browsers" option requires either ' +
32+
'"@vitest/browser-playwright", "@vitest/browser-webdriverio", or "@vitest/browser-preview" to be installed.',
33+
);
34+
}
3035
} else {
3136
// JSDOM is used when no browsers are specified
3237
checker.check('jsdom');
@@ -47,6 +52,12 @@ const VitestTestRunner: TestRunner = {
4752
const projectName = context.target?.project;
4853
assert(projectName, 'The builder requires a target.');
4954

55+
if (!!process.versions.webcontainer && options.browsers?.length) {
56+
context.logger.info(
57+
`Webcontainer environment detected. Using '@vitest/browser-preview' for browser-based tests.`,
58+
);
59+
}
60+
5061
if (typeof options.runnerConfig === 'string') {
5162
context.logger.info(`Using Vitest configuration file: ${options.runnerConfig}`);
5263
} else if (options.runnerConfig) {

0 commit comments

Comments
 (0)