Skip to content

Commit dc27e17

Browse files
clydinalan-agius4
authored andcommitted
fix(@angular/build): inherit preserveSymlinks option from build target in unit-test builder
The unit-test builder did not pass the preserveSymlinks configuration to Vitest's custom configuration plugin and resolved it directly from buildTargetOptions in Karma executor without considering process arguments. This caused module resolution failures in unit tests for symlinked packages. This change inherits preserveSymlinks from the referenced buildTarget options, falling back to process.execArgv if not defined. The resolved value is then successfully forwarded to the underlying bundlers and executors (Karma and Vitest).
1 parent 8ef83be commit dc27e17

5 files changed

Lines changed: 10 additions & 1 deletion

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,10 @@ export async function* execute(
286286
return;
287287
}
288288

289+
// Resolve final preserveSymlinks option
290+
normalizedOptions.preserveSymlinks =
291+
buildTargetOptions.preserveSymlinks ?? process.execArgv.includes('--preserve-symlinks');
292+
289293
// Get runner-specific build options
290294
let runnerBuildOptions;
291295
let virtualFiles;
@@ -327,6 +331,7 @@ export async function* execute(
327331
progress: normalizedOptions.buildProgress ?? buildTargetOptions.progress,
328332
quiet: normalizedOptions.quiet,
329333
...(normalizedOptions.tsConfig ? { tsConfig: normalizedOptions.tsConfig } : {}),
334+
preserveSymlinks: normalizedOptions.preserveSymlinks,
330335
} satisfies ApplicationBuilderInternalOptions;
331336

332337
const dumpDirectory = normalizedOptions.dumpVirtualFiles

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export async function normalizeOptions(
134134
: [],
135135
dumpVirtualFiles: options.dumpVirtualFiles,
136136
listTests: options.listTests,
137+
preserveSymlinks: undefined as boolean | undefined,
137138
runnerConfig:
138139
typeof runnerConfig === 'string'
139140
? runnerConfig.length === 0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class KarmaExecutor implements TestExecutor {
9191
progress: unitTestOptions.buildProgress ?? buildTargetOptions.progress,
9292
watch: unitTestOptions.watch,
9393
poll: buildTargetOptions.poll,
94-
preserveSymlinks: buildTargetOptions.preserveSymlinks,
94+
preserveSymlinks: unitTestOptions.preserveSymlinks,
9595
browsers: unitTestOptions.browsers?.join(','),
9696
codeCoverage: unitTestOptions.coverage.enabled,
9797
codeCoverageExclude: unitTestOptions.coverage.exclude,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ export class VitestExecutor implements TestExecutor {
382382
include,
383383
watch,
384384
isolate: this.options.isolate,
385+
preserveSymlinks: this.options.preserveSymlinks,
385386
}),
386387
],
387388
};

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ interface VitestConfigPluginOptions {
5656
optimizeDepsInclude: string[];
5757
watch: boolean;
5858
isolate: boolean | undefined;
59+
preserveSymlinks?: boolean;
5960
}
6061

6162
async function findTestEnvironment(
@@ -259,6 +260,7 @@ export async function createVitestConfigPlugin(
259260
resolve: {
260261
mainFields: ['es2020', 'module', 'main'],
261262
conditions: ['es2015', 'es2020', 'module', ...(browser ? ['browser'] : [])],
263+
preserveSymlinks: options.preserveSymlinks,
262264
},
263265
};
264266

0 commit comments

Comments
 (0)