angular / angular/angular-cli

Vitest coverage issue `vite:import-analysis` error `Pre-transform error: Failed to resolve import "#/util" from "src/app/app.ts". Does the file exist?`

Open
#32,891 3 comments 0 reactions 0 assignees View on GitHub
angular/build:unit-test area: @angular/build gemini-triaged
Dominant language
TypeScript
Stars
27k
Forks
11.8k
Avg merge
14h 23m
Merged PRs (30d)
162

Description

### Command

test

### Is this a regression?

- [x] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

vitest@4.0.8

### Description

I'm not sure if this issue is an issue with Vitest, or the Angular CLI integration with Vitest. I put the issue here, because I have no idea how to reproduce this issue without Angular at the moment.

The issue is that when using `tsconfig.json` property `paths` and running browser tests with coverage, these `paths` will not used when Vitest tries to read coverage from source maps. The requirement seems to be that a shared chunk exists (`import './app'` in the repro steps).

This results in errors during coverage generation, but tests do not crash. The errors come from Vite's dev server pre transforming original `.ts` files referenced in source-maps.

**Requirements**
- Using `paths` in `tsconfig.json`
- Angular CLI + `eslint` creates a shared chunk that has the `paths` in it's sourcemap
- Vitest with `browsers` + `coverage` + `coverageInclude`
- Vitest `v4.1.0+`

### Minimal Reproduction

1. Init Angular project & install vitest coverage & browser packages
```
npx @angular/cli@21.1.5 new ng21.1.5 -s -t --style css --no-ssr --ai-config none
npm i -E -D vitest@4.1.0 @vitest/browser-playwright@4.1.0 @vitest/coverage-v8@4.1.0 playwright
```
2. Add `src/app/util.ts` file
```ts
export const greet = 'Hello';
```
3. Add a path alias to util file
```json
{
"compilerOptions": {
"paths": {
"#/util": ["./src/app/util.ts"]
}
}
}
```
4. Make `App` (`app.ts`) use value from `util.ts`
```ts
import { greet } from '#/util';
// ...
export class App {
protected readonly title = signal(greet);
}
```
5. Add import to `app.ts` from `app.config.ts`
```ts
import './app';
```
6. Run tests with browser, coverage & coverage include
```
npx ng test --no-watch --browsers chromium --coverage --coverage-include src/app/**/*.ts
```

### Exception or Error

```text
There's logged errors for every file that uses the path alias, which in our project is most of them (e.g. `import { shared } from '#/core';`).

00:02:12 [vite] (client) Pre-transform error: Failed to resolve import "#/util" from "src/app/app.ts". Does the file exist?
Plugin: vite:import-analysis
File: C:/Users/foo/repro/src/app/app.ts:3:22
11 | import { Component, signal } from "@angular/core";
12 | import { RouterOutlet } from "@angular/router";
13 | import { greet } from "#/util";
| ^
14 | export let App = class {
15 | title = signal(greet);
```

### Your Environment

```text
I've tried with `@angular/build` + `@angular/cli` at several versions, including `21.1.x` and `21.2.x`. Downgrading `vitest` to `4.0.8` fixes the issue, but `vitest@4.1.0` and `4.1.2` both failed.

----------------------------------------

Angular CLI : 21.2.5
Angular : 21.2.6
Node.js : 25.8.2 (Unsupported)
Package Manager : npm 11.11.1
Operating System : win32 x64

┌───────────────────────────┬───────────────────┬───────────────────┐
│ Package │ Installed Version │ Requested Version │
├───────────────────────────┼───────────────────┼───────────────────┤
│ @angular/build │ 21.2.5 │ ^21.1.5 │
│ @angular/cli │ 21.2.5 │ ^21.1.5 │
│ @angular/common │ 21.2.6 │ ^21.1.0 │
│ @angular/compiler │ 21.2.6 │ ^21.1.0 │
│ @angular/compiler-cli │ 21.2.6 │ ^21.1.0 │
│ @angular/core │ 21.2.6 │ ^21.1.0 │
│ @angular/forms │ 21.2.6 │ ^21.1.0 │
│ @angular/platform-browser │ 21.2.6 │ ^21.1.0 │
│ @angular/router │ 21.2.6 │ ^21.1.0 │
│ rxjs │ 7.8.2 │ ~7.8.0 │
│ typescript │ 5.9.3 │ ~5.9.2 │
│ vitest │ 4.1.0 │ 4.1.0 │
└───────────────────────────┴───────────────────┴───────────────────┘
```

### Anything else relevant?

Does not seem to be OS specific. The issue is on GitHub Actions on Ubuntu, and locally on Windows.

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the failure with the listed Angular project, tsconfig.json path alias, src/app/app.ts import, and the ng test command, comparing Vitest 4.1.0 with 4.0.8. Trace coverage generation and source-map handling when the shared app chunk references the alias. Done means browser coverage completes without vite:import-analysis errors while the alias resolves.

Written by the indexing model from the issue text.

Assessment

Tech stack
playwright, typescript
Domain
testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.