I am looking for a proper tsconfig.js to have a ng 17 compilation works.
Note : to get the repo with the node modules
git clone https://github.com/thomaspeugeot/ngimportissue.git
cd ngimportissue
npm i
Situation
A workspace has been created with angular version 17.
% ng version
...
Angular CLI: 17.0.3
the workspace has been created with the following config
ng new ng --defaults=true --minimal=true --no-standalone --routing --ssr=false
The issue arises when ng tries to compiles modules outsides the workspace.
As seen in ng/src/app/app.module.ts, the application imports some modules that are outside the workspace. One of them is GongModule
.
...
import { GongModule } from 'gong'
@NgModule({
declarations: [
AppComponent
],
imports: [
...
GongModule,
As seen in vendor/github.com/fullstack-lang/gong/ng/projects/gong/src/lib/gong.module.ts, GongModule
itself imports angular modules
import { NgModule } from '@angular/core';
@NgModule({
declarations: [
],
imports: [
CommonModule,
...
...
Angular cannot build the application
% ng build
⠋ Building...✘ [ERROR] Could not resolve "@angular/common/http"
../vendor/github.com/fullstack-lang/gong/ng/projects/gong/src/lib/commitnbfromback.service.ts:2:27:
2 │ import { HttpParams } from '@angular/common/http';
╵ ~~~~~~~~~~~~~~~~~~~~~~
...
I expected a normal compilation
This is new with ng 17
This problem did not occur with ng v16
This is an issue related to the import path
going verbose and having a trace in ng/build_trace.txt, one better understands what's wrong
% ng build --verbose > build_trace.txt 2>&1
ng/build_trace.txt
Searching for "@angular/common/http" in "node_modules" directories starting from "/private/tmp/ngimportissue/vendor/github.com/fullstack-lang/gongdoc/ng/projects/gongdoc/src/lib"
Matching "@angular/common/http" against "paths" in "/private/tmp/ngimportissue/ng/tsconfig.app.json"
Using "/private/tmp/ngimportissue/ng" as "baseURL"
Found a fuzzy match for "*" in "paths"
Attempting to load "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http" as a file
Checking for file "http"
Checking for file "http.mjs"
Checking for file "http.js"
Checking for file "http.ts"
Checking for file "http.tsx"
Failed to find file "http"
Attempting to load "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http" as a directory
Read 2 entries for directory "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http"
No "browser" map found in directory "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http"
Failed to find file "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http/index.mjs"
Failed to find file "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http/index.js"
Failed to find file "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http/index.ts"
Failed to find file "/private/tmp/ngimportissue/ng/node_modules/@angular/common/http/index.tsx"
Parsed package name "@angular/common" and package subpath "./http"
✘ [ERROR] Could not resolve "@angular/common/http"
It seems the builder is mislead by the the import path. It does not search the esm2022
or fesm2022
where the index file is present. Indeed ng/node_modules/@angular/common/esm2022/http/http.mjs
is present (for information, this file is present but not in the git repo also, you need to perfom nmp i
to have it).
The import path in ng/tsconfig.json that worked with ng v16 is configured to work with import path outside the workspace.
"paths": {
"*": [
"./node_modules/*"
],
It does not work with ng 17.
There is a Workaround
If one configures the project as a browser
instead of application
, the compilation works.
It is this configuration that is created when one migrates the projects from ng 16 to ng 17.
Below is the diff for ng/angular.json
--- a/ng/angular.json
+++ b/ng/angular.json
@@ -5,7 +5,7 @@
"ng": {
"architect": {
"build": {
- "builder": "@angular-devkit/build-angular:application",
+ "builder": "@angular-devkit/build-angular:browser",
"configurations": {
"development": {
"extractLicenses": false,
@@ -34,7 +34,7 @@
"src/favicon.ico",
"src/assets"
],
- "browser": "src/main.ts",
+ "main": "src/main.ts",
"index": "src/index.html",
:...skipping...
diff --git a/ng/angular.json b/ng/angular.json
index 288f403..f4e5a7c 100644
--- a/ng/angular.json
+++ b/ng/angular.json
@@ -5,7 +5,7 @@
"ng": {
"architect": {
"build": {
- "builder": "@angular-devkit/build-angular:application",
+ "builder": "@angular-devkit/build-angular:browser",
"configurations": {
"development": {
"extractLicenses": false,
@@ -34,7 +34,7 @@
"src/favicon.ico",
"src/assets"
],
- "browser": "src/main.ts",
+ "main": "src/main.ts",
"index": "src/index.html",
"outputPath": "dist/ng",
"polyfills": [
Questions
I would like to undestand why the compilation fails.
I am looking for the proper tsconfig.js config to have the compilation works. Other solutions could be suitable of course.