From fc0aeb5a4b3b435f47a38e52ae9ca88ca2983d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 29 May 2025 14:33:19 +0200 Subject: [PATCH] fix(angular): update tsconfig files generation to better support angular v20 (#31357) - Remove TS project reference to non-existent `tsconfig.editor.json` file - Ensure the `tsconfig.spec.json` file for Jest has the correct `module`/`moduleResolution` compiler options --- .../__snapshots__/application.spec.ts.snap | 6 ---- .../application/application.spec.ts | 1 - .../files/base/tsconfig.json__tpl__ | 4 +-- .../application/lib/update-tsconfig-files.ts | 36 +++++++++++++++++-- .../library/lib/update-tsconfig-files.ts | 25 +++++++++++-- .../src/generators/library/library.spec.ts | 1 + .../angular/src/generators/library/library.ts | 2 +- 7 files changed, 61 insertions(+), 14 deletions(-) diff --git a/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap b/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap index 7430053125..0a4ff03201 100644 --- a/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap +++ b/packages/angular/src/generators/application/__snapshots__/application.spec.ts.snap @@ -599,9 +599,6 @@ exports[`app --strict should enable strict type checking: app tsconfig.json 1`] "files": [], "include": [], "references": [ - { - "path": "./tsconfig.editor.json", - }, { "path": "./tsconfig.app.json", }, @@ -1162,9 +1159,6 @@ exports[`app not nested should generate files: tsconfig.json 1`] = ` "files": [], "include": [], "references": [ - { - "path": "./tsconfig.editor.json", - }, { "path": "./tsconfig.app.json", }, diff --git a/packages/angular/src/generators/application/application.spec.ts b/packages/angular/src/generators/application/application.spec.ts index d744cb1ba4..7d4007f2fc 100644 --- a/packages/angular/src/generators/application/application.spec.ts +++ b/packages/angular/src/generators/application/application.spec.ts @@ -9,7 +9,6 @@ import { Tree, updateJson, updateNxJson, - updateProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import * as enquirer from 'enquirer'; diff --git a/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ b/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ index fa64dc7574..39bb6ad73b 100644 --- a/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ +++ b/packages/angular/src/generators/application/files/base/tsconfig.json__tpl__ @@ -6,10 +6,10 @@ }, "files": [], "include": [], - "references": [ + "references": [<% if (angularMajorVersion < 20) { %> { "path": "./tsconfig.editor.json" - }, + },<% } %> { "path": "./tsconfig.app.json" } diff --git a/packages/angular/src/generators/application/lib/update-tsconfig-files.ts b/packages/angular/src/generators/application/lib/update-tsconfig-files.ts index 3b4cf9e14c..33b214d335 100644 --- a/packages/angular/src/generators/application/lib/update-tsconfig-files.ts +++ b/packages/angular/src/generators/application/lib/update-tsconfig-files.ts @@ -7,8 +7,8 @@ import { } from '@nx/devkit'; import { getRootTsConfigFileName } from '@nx/js'; import { getNeededCompilerOptionOverrides } from '@nx/js/src/utils/typescript/configuration'; -import { gte, lt } from 'semver'; import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript'; +import { gte, lt } from 'semver'; import { updateAppEditorTsConfigExcludedFiles } from '../../utils/update-app-editor-tsconfig-excluded-files'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import { enableStrictTypeChecking } from './enable-strict-type-checking'; @@ -59,7 +59,11 @@ export function updateTsconfigFiles(tree: Tree, options: NormalizedSchema) { } } - updateJson(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => { + const tsconfigPath = joinPathFragments( + options.appProjectRoot, + 'tsconfig.json' + ); + updateJson(tree, tsconfigPath, (json) => { json.compilerOptions = { ...json.compilerOptions, ...compilerOptions, @@ -71,9 +75,37 @@ export function updateTsconfigFiles(tree: Tree, options: NormalizedSchema) { ); return json; }); + + if (options.unitTestRunner === 'jest') { + const tsconfigSpecPath = joinPathFragments( + options.appProjectRoot, + 'tsconfig.spec.json' + ); + updateJson(tree, tsconfigSpecPath, (json) => { + json.compilerOptions = { + ...json.compilerOptions, + module: 'commonjs', + moduleResolution: 'node10', + }; + json.compilerOptions = getNeededCompilerOptionOverrides( + tree, + json.compilerOptions, + tsconfigPath + ); + return json; + }); + } } function updateEditorTsConfig(tree: Tree, options: NormalizedSchema) { + const tsconfigEditorPath = joinPathFragments( + options.appProjectRoot, + 'tsconfig.editor.json' + ); + if (!tree.exists(tsconfigEditorPath)) { + return; + } + const appTsConfig = readJson( tree, joinPathFragments(options.appProjectRoot, 'tsconfig.app.json') diff --git a/packages/angular/src/generators/library/lib/update-tsconfig-files.ts b/packages/angular/src/generators/library/lib/update-tsconfig-files.ts index b6af10ad39..3c34d20270 100644 --- a/packages/angular/src/generators/library/lib/update-tsconfig-files.ts +++ b/packages/angular/src/generators/library/lib/update-tsconfig-files.ts @@ -27,6 +27,7 @@ export function updateTsConfigFiles( experimentalDecorators: true, importHelpers: true, target: 'es2022', + moduleResolution: 'bundler', ...(options.strict ? { strict: true, @@ -46,11 +47,11 @@ export function updateTsConfigFiles( if (angularMajorVersion >= 20) { compilerOptions.module = 'preserve'; } else { - compilerOptions.moduleResolution = 'bundler'; compilerOptions.module = 'es2022'; } - updateJson(tree, `${options.projectRoot}/tsconfig.json`, (json) => { + const tsconfigPath = joinPathFragments(options.projectRoot, 'tsconfig.json'); + updateJson(tree, tsconfigPath, (json) => { json.compilerOptions = { ...json.compilerOptions, ...compilerOptions, @@ -73,6 +74,26 @@ export function updateTsConfigFiles( return json; }); + + if (options.unitTestRunner === 'jest') { + const tsconfigSpecPath = joinPathFragments( + options.projectRoot, + 'tsconfig.spec.json' + ); + updateJson(tree, tsconfigSpecPath, (json) => { + json.compilerOptions = { + ...json.compilerOptions, + module: 'commonjs', + moduleResolution: 'node10', + }; + json.compilerOptions = getNeededCompilerOptionOverrides( + tree, + json.compilerOptions, + tsconfigPath + ); + return json; + }); + } } function updateProjectConfig( diff --git a/packages/angular/src/generators/library/library.spec.ts b/packages/angular/src/generators/library/library.spec.ts index 34ce47dc49..19b103258f 100644 --- a/packages/angular/src/generators/library/library.spec.ts +++ b/packages/angular/src/generators/library/library.spec.ts @@ -316,6 +316,7 @@ describe('lib', () => { experimentalDecorators: true, importHelpers: true, module: 'preserve', + moduleResolution: 'bundler', skipLibCheck: true, noFallthroughCasesInSwitch: true, noPropertyAccessFromIndexSignature: true, diff --git a/packages/angular/src/generators/library/library.ts b/packages/angular/src/generators/library/library.ts index 7f74cece78..95597c824a 100644 --- a/packages/angular/src/generators/library/library.ts +++ b/packages/angular/src/generators/library/library.ts @@ -72,8 +72,8 @@ export async function libraryGenerator( const project = await addProject(tree, libraryOptions); createFiles(tree, options, project); - updateTsConfigFiles(tree, libraryOptions); await addUnitTestRunner(tree, libraryOptions); + updateTsConfigFiles(tree, libraryOptions); updateNpmScopeIfBuildableOrPublishable(tree, libraryOptions); setGeneratorDefaults(tree, options);