`unit-test` builder resolves include paths relative to sourceRoot instead of project root, breaking secondary entry points tests

Open
#33,467 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
58/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Quiet
Tech stack
angular, typescript

Research direction

Start by running the minimal reproduction with the @angular/build:unit-test builder and inspect how its include patterns from angular.json are resolved. Verify the behavior with a library containing the shown my-sub-package/**/*.spec.ts path. Done means patterns resolve from the project root and ng test discovers tests in secondary entry points without ../ path traversal.

Written by the indexing model from the issue text.

Description

angular/build:unit-test area: @angular/build
Command

test

Is this a regression?
  • Yes, this behavior used to work in the previous version
The previous version in which this bug was not present was

No response

Description

When using the @angular/build:unit-test builder in a library project that contains Secondary Entry Points (sub-packages), the builder incorrectly resolves the glob patterns defined in the include array (inside angular.json) relative to the project's sourceRoot (usually .../src) instead of the project's root.

Because the unit-test builder anchors include patterns to sourceRoot, it cannot discover test files located in secondary entry points unless developers use relative path traversal (for example, ../my-sub-package/**/*.spec.ts).

Minimal Reproduction

Create an Angular library project.
2. Generate a secondary entry point inside the library root (for example, projects/my-lib/my-sub-package/).
3. Add a unit test inside the secondary entry point:

projects/my-lib/my-sub-package/my-sub.spec.ts
  1. Configure the test target in angular.json using @angular/build:unit-test:

    {
      "options": {
        "include": [
          "**/*.spec.ts",
          "my-sub-package/**/*.spec.ts"
        ],
        "tsConfig": "projects/my-lib/tsconfig.spec.json"
      }
    }
    
  2. Run:

    ng test
    
Exception or Error

The builder should resolve the include patterns relative to the project's root, or otherwise recognize ng-packagr secondary entry points, allowing patterns such as:

{
  "include": [
    "**/*.spec.ts",
    "my-sub-package/**/*.spec.ts"
  ]
}

to correctly match test files located in:

projects/my-lib/my-sub-package/
Workaround

Currently, developers must escape the sourceRoot directory by using a parent path segment in angular.json:

{
  "options": {
    "include": [
      "**/*.spec.ts",
      "../my-sub-package/**/*.spec.ts"
    ],
    "tsConfig": "projects/my-lib/tsconfig.spec.json"
  }
}
Your Environment
_                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI       : 22.0.4
Angular           : 22.0.2
Node.js           : 24.16.0
Package Manager   : npm 11.13.0
Operating System  : linux x64

┌───────────────────────────────────┬───────────────────┬───────────────────┐
│ Package                           │ Installed Version │ Requested Version │
├───────────────────────────────────┼───────────────────┼───────────────────┤
│ @angular/animations               │ 22.0.2            │ ^22.0.2           │
│ @angular/build                    │ 22.0.4            │ ^22.0.4           │
│ @angular/cli                      │ 22.0.4            │ ^22.0.4           │
│ @angular/common                   │ 22.0.2            │ ^22.0.2           │
│ @angular/compiler                 │ 22.0.2            │ ^22.0.2           │
│ @angular/compiler-cli             │ 22.0.2            │ ^22.0.2           │
│ @angular/core                     │ 22.0.2            │ ^22.0.2           │
│ @angular/forms                    │ 22.0.2            │ ^22.0.2           │
│ @angular/localize                 │ 22.0.2            │ ^22.0.2           │
│ @angular/platform-browser         │ 22.0.2            │ ^22.0.2           │
│ @angular/platform-browser-dynamic │ 22.0.2            │ ^22.0.2           │
│ @angular/router                   │ 22.0.2            │ ^22.0.2           │
│ @angular/service-worker           │ 22.0.2            │ ^22.0.2           │
│ ng-packagr                        │ 22.0.0            │ ^22.0.0           │
│ rxjs                              │ 7.8.2             │ ~7.8.2            │
│ typescript                        │ 6.0.3             │ ^6.0.3            │
│ vitest                            │ 4.1.9             │ ^4.1.9            │
│ zone.js                           │ 0.16.2            │ ^0.16.2           │
└───────────────────────────────────┴───────────────────┴───────────────────┘
Anything else relevant?

No response

Dominant language
TypeScript
Stars
27k
Forks
11.8k
Avg merge
16h 35m
Merged PRs (30d)
176

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from angular/angular-cli

All issues in angular/angular-cli

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.