I have an Angular CLI workspace containing two library projects, foo
and bar
. When I build the second of the two libraries, foo
, the build fails with the following error:
error TS6059: File '/code/projects/bar/src/lib/types.ts' is not under 'rootDir' '/code/projects/foo/src'. 'rootDir' is expected tocontain all source files.
Error: error TS6059: File '/code/projects/bar/src/lib/types.ts' is not under 'rootDir' '/code/projects/foo/src'. 'rootDir' is expected to contain all source files. at Object.<anonymous> (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:53:68) at Generator.next (<anonymous>) at /code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:7:71 at new Promise (<anonymous>) at __awaiter (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:3:12) at Object.compileSourceFiles (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:19:12) at Object.<anonymous> (/code/node_modules/ng-packagr/lib/ng-v5/entry-point/ts/compile-ngc.transform.js:26:32) at Generator.next (<anonymous>) at /code/node_modules/ng-packagr/lib/ng-v5/entry-point/ts/compile-ngc.transform.js:7:71 at new Promise (<anonymous>)
I have reproduced the error in a sandbox repo on GitHub here. I have simplified the code to as much as I can while still experiencing the error. You can reproduce the error by executing npm run build
on the rootDir-expect-all-source-files-error branch. What is the cause of the error? May this be a bug with ng-packagr
or ngc
or tsc
? Or is it simply a configuration issue?
Observations
Below are code changes with which I can make the build pass, but I would like to know what is causing the error with the code as is.
bar.component.ts
Build fails
export class BarComponent {
list = this.barService.list();
constructor(private barService: BarService) {}
}
Build passes
Initialize list property in constructor instead of inline
export class BarComponent {
list;
constructor(private barService: BarService) {
this.list = this.barService.list();
}
}
bar.service.ts
Build fails
import { Injectable } from '@angular/core';
import { List, Item } from './types';
@Injectable({
providedIn: 'root'
})
export class BarService {
private _list: List = [];
constructor() { }
add(item: Item): void {
this._list.push(item);
}
list(): List {
return this._list;
}
}
Build passes
Remove the data types
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class BarService {
private _list: any[] = [];
constructor() { }
add(item: any): void {
this._list.push(item);
}
list(): any {
return this._list;
}
}
rootDir
property in your tsconfig, Angular CLI seems to internally restrict it to the root of the library you want to compile. Then, if youimport
another lib outside, TypeScript rightfully complains. ConcerningrootDir
have a look here: #57422958 (disclaimer: answer from me). – Minardi