Skip to content

Commit 14c54b3

Browse files
committed
refactor(@angular/build): unify configuration loading and option transformations in TypeScriptCompilation
Both AotCompilation and JitCompilation previously executed identical logic during initialization to read tsconfig.json using readConfiguration and immediately pass the options to transformCompilerOptions. The loadConfiguration method on TypeScriptCompilation now accepts optional compilerOptionOverrides and applies transformCompilerOptions directly. This unifies configuration reading and option transformations into a single cohesive step, eliminates duplicate setup boilerplate across AotCompilation and JitCompilation, and reduces unnecessary direct imports of transformCompilerOptions.
1 parent 675f1f5 commit 14c54b3

4 files changed

Lines changed: 70 additions & 25 deletions

File tree

packages/angular/build/src/tools/angular/compilation/angular-compilation_spec.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import ts from 'typescript';
1010
import type { AngularHostOptions } from '../angular-host';
11-
import { transformCompilerOptions } from './compiler-options';
11+
import { CompilerOptionOverrides, transformCompilerOptions } from './compiler-options';
1212
import { TypeScriptCompilation } from './typescript-compilation';
1313
import {
1414
AngularCompilation,
@@ -90,6 +90,10 @@ describe('AngularCompilation', () => {
9090
public getCachedSourceFiles(): Map<string, ts.SourceFile> {
9191
return this.sourceFiles;
9292
}
93+
94+
public async testLoadConfiguration(tsconfig: string, overrides?: CompilerOptionOverrides) {
95+
return this.loadConfiguration(tsconfig, overrides);
96+
}
9397
}
9498

9599
it('collects and converts diagnostics categorized by error and warning', async () => {
@@ -134,6 +138,32 @@ describe('AngularCompilation', () => {
134138
expect(compilerCli).toBeDefined();
135139
expect(typeof compilerCli.readConfiguration).toBe('function');
136140
});
141+
142+
it('loads configuration and applies compiler option transformations', async () => {
143+
const compilation = new MockTypeScriptCompilation();
144+
const mockReadConfig = jasmine.createSpy('readConfiguration').and.returnValue({
145+
options: { target: ts.ScriptTarget.ES2020 },
146+
rootNames: ['/src/main.ts'],
147+
errors: [],
148+
});
149+
spyOn(TypeScriptCompilation, 'loadCompilerCli').and.resolveTo({
150+
readConfiguration: mockReadConfig,
151+
} as unknown as typeof import('@angular/compiler-cli'));
152+
153+
const result = await compilation.testLoadConfiguration('tsconfig.json', { sourcemap: true });
154+
155+
expect(mockReadConfig).toHaveBeenCalledWith(
156+
'tsconfig.json',
157+
jasmine.objectContaining({
158+
suppressOutputPathCheck: true,
159+
outDir: undefined,
160+
}),
161+
);
162+
expect(result.rootNames).toEqual(['/src/main.ts']);
163+
expect(result.compilerOptions.target).toBe(ts.ScriptTarget.ES2022);
164+
expect(result.compilerOptions.inlineSources).toBe(true);
165+
expect(result.warnings.length).toBeGreaterThan(0);
166+
});
137167
});
138168

139169
describe('createAngularCompilation', () => {

packages/angular/build/src/tools/angular/compilation/aot-compilation.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
*/
88

99
import type * as ng from '@angular/compiler-cli';
10-
import type { PartialMessage } from 'esbuild';
1110
import assert from 'node:assert';
1211
import { relative } from 'node:path';
1312
import ts from 'typescript';
@@ -26,7 +25,7 @@ import {
2625
DiagnosticModes,
2726
type EmitFileResult,
2827
} from './angular-compilation';
29-
import { CompilerOptionOverrides, transformCompilerOptions } from './compiler-options';
28+
import type { CompilerOptionOverrides } from './compiler-options';
3029
import { collectHmrCandidates } from './hmr-candidates';
3130
import { TypeScriptCompilation } from './typescript-compilation';
3231
import { printSourceFileWithMap } from './typescript-printer';
@@ -72,17 +71,11 @@ export class AotCompilation extends TypeScriptCompilation {
7271

7372
// Load the compiler configuration and transform as needed
7473
const {
75-
options: originalCompilerOptions,
74+
compilerOptions,
7675
rootNames,
7776
errors: configurationDiagnostics,
78-
} = await this.loadConfiguration(tsconfig);
79-
80-
const { compilerOptions, warnings } = transformCompilerOptions(
81-
ts,
82-
originalCompilerOptions,
83-
compilerOptionOverrides,
84-
tsconfig,
85-
);
77+
warnings,
78+
} = await this.loadConfiguration(tsconfig, compilerOptionOverrides);
8679

8780
const useTypeScriptTranspilation =
8881
(compilerOptions['_useTypeScriptTranspilation'] as boolean | undefined) ??

packages/angular/build/src/tools/angular/compilation/jit-compilation.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
*/
88

99
import type * as ng from '@angular/compiler-cli';
10-
import type { PartialMessage } from 'esbuild';
1110
import assert from 'node:assert';
1211
import ts from 'typescript';
1312
import { profileSync } from '../../esbuild/profiling';
@@ -20,7 +19,7 @@ import {
2019
DiagnosticModes,
2120
type EmitFileResult,
2221
} from './angular-compilation';
23-
import { CompilerOptionOverrides, transformCompilerOptions } from './compiler-options';
22+
import type { CompilerOptionOverrides } from './compiler-options';
2423
import { TypeScriptCompilation } from './typescript-compilation';
2524

2625
class JitCompilationState {
@@ -51,17 +50,11 @@ export class JitCompilation extends TypeScriptCompilation {
5150

5251
// Load the compiler configuration and transform as needed
5352
const {
54-
options: originalCompilerOptions,
53+
compilerOptions,
5554
rootNames,
5655
errors: configurationDiagnostics,
57-
} = await this.loadConfiguration(tsconfig);
58-
59-
const { compilerOptions, warnings } = transformCompilerOptions(
60-
ts,
61-
originalCompilerOptions,
62-
compilerOptionOverrides,
63-
tsconfig,
64-
);
56+
warnings,
57+
} = await this.loadConfiguration(tsconfig, compilerOptionOverrides);
6558

6659
if (hostOptions.modifiedFiles) {
6760
this.invalidateFiles(hostOptions.modifiedFiles);

packages/angular/build/src/tools/angular/compilation/typescript-compilation.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,16 @@ import ts from 'typescript';
1212
import { toPosixPath } from '../../../utils/path';
1313
import { profileAsync, profileSync } from '../../esbuild/profiling';
1414
import { AngularCompilation, DiagnosticModes } from './angular-compilation';
15+
import { type CompilerOptionOverrides, transformCompilerOptions } from './compiler-options';
1516
import { convertTypeScriptDiagnostic } from './diagnostics';
1617

18+
export interface TransformedConfiguration {
19+
compilerOptions: ng.CompilerOptions;
20+
rootNames: string[];
21+
errors: ts.Diagnostic[];
22+
warnings: PartialMessage[];
23+
}
24+
1725
export abstract class TypeScriptCompilation extends AngularCompilation {
1826
static #angularCompilerCliModule?: typeof ng;
1927

@@ -23,10 +31,17 @@ export abstract class TypeScriptCompilation extends AngularCompilation {
2331
return TypeScriptCompilation.#angularCompilerCliModule;
2432
}
2533

26-
protected async loadConfiguration(tsconfig: string): Promise<ng.ParsedConfiguration> {
34+
protected async loadConfiguration(
35+
tsconfig: string,
36+
compilerOptionOverrides?: CompilerOptionOverrides,
37+
): Promise<TransformedConfiguration> {
2738
const { readConfiguration } = await TypeScriptCompilation.loadCompilerCli();
2839

29-
return profileSync('NG_READ_CONFIG', () =>
40+
const {
41+
options: originalCompilerOptions,
42+
rootNames,
43+
errors,
44+
} = profileSync('NG_READ_CONFIG', () =>
3045
readConfiguration(tsconfig, {
3146
// Angular specific configuration defaults and overrides to ensure a functioning compilation.
3247
suppressOutputPathCheck: true,
@@ -44,6 +59,20 @@ export abstract class TypeScriptCompilation extends AngularCompilation {
4459
removeComments: false,
4560
}),
4661
);
62+
63+
const { compilerOptions, warnings } = transformCompilerOptions(
64+
ts,
65+
originalCompilerOptions,
66+
compilerOptionOverrides,
67+
tsconfig,
68+
);
69+
70+
return {
71+
compilerOptions,
72+
rootNames,
73+
errors,
74+
warnings,
75+
};
4776
}
4877

4978
protected readonly sourceFiles = new Map<string, ts.SourceFile>();

0 commit comments

Comments
 (0)