diff --git a/packages/compiler-cli/src/main.ts b/packages/compiler-cli/src/main.ts index 13ca9d5c22..050d6d089e 100644 --- a/packages/compiler-cli/src/main.ts +++ b/packages/compiler-cli/src/main.ts @@ -26,7 +26,7 @@ export function main( config?: NgcParsedConfiguration, customTransformers?: api.CustomTransformers, programReuse?: { program: api.Program | undefined, }, - modifiedResourceFiles?: Set): number { + modifiedResourceFiles?: Set| null): number { let {project, rootNames, options, errors: configErrors, watch, emitFlags} = config || readNgcCommandLineAndConfiguration(args); if (configErrors.length) { diff --git a/packages/compiler-cli/src/ngtsc/incremental/src/state.ts b/packages/compiler-cli/src/ngtsc/incremental/src/state.ts index 983dde26a5..9f5fa79791 100644 --- a/packages/compiler-cli/src/ngtsc/incremental/src/state.ts +++ b/packages/compiler-cli/src/ngtsc/incremental/src/state.ts @@ -112,7 +112,7 @@ export class IncrementalState implements DependencyTracker, MetadataReader, Meta } private hasChangedResourceDependencies(sf: ts.SourceFile): boolean { - if (this.modifiedResourceFiles === undefined || !this.metadata.has(sf)) { + if (this.modifiedResourceFiles === null || !this.metadata.has(sf)) { return false; } const resourceDeps = this.metadata.get(sf) !.resourcePaths; diff --git a/packages/compiler-cli/src/perform_compile.ts b/packages/compiler-cli/src/perform_compile.ts index 4d27b2b323..f7ea7bbb59 100644 --- a/packages/compiler-cli/src/perform_compile.ts +++ b/packages/compiler-cli/src/perform_compile.ts @@ -224,7 +224,7 @@ export function exitCodeFromResult(diags: Diagnostics | undefined): number { export function performCompilation( {rootNames, options, host, oldProgram, emitCallback, mergeEmitResultsCallback, gatherDiagnostics = defaultGatherDiagnostics, customTransformers, - emitFlags = api.EmitFlags.Default, modifiedResourceFiles}: { + emitFlags = api.EmitFlags.Default, modifiedResourceFiles = null}: { rootNames: string[], options: api.CompilerOptions, host?: api.CompilerHost, @@ -234,7 +234,7 @@ export function performCompilation( gatherDiagnostics?: (program: api.Program) => Diagnostics, customTransformers?: api.CustomTransformers, emitFlags?: api.EmitFlags, - modifiedResourceFiles?: Set, + modifiedResourceFiles?: Set| null, }): PerformCompilationResult { let program: api.Program|undefined; let emitResult: ts.EmitResult|undefined; diff --git a/packages/compiler-cli/test/ngtsc/env.ts b/packages/compiler-cli/test/ngtsc/env.ts index efb1fe6793..1f1639688d 100644 --- a/packages/compiler-cli/test/ngtsc/env.ts +++ b/packages/compiler-cli/test/ngtsc/env.ts @@ -26,7 +26,7 @@ import {setWrapHostForTest} from '../../src/transformers/compiler_host'; export class NgtscTestEnvironment { private multiCompileHostExt: MultiCompileHostExt|null = null; private oldProgram: Program|null = null; - private changedResources: Set|undefined = undefined; + private changedResources: Set|null = null; private constructor( private fs: FileSystem, readonly outDir: AbsoluteFsPath, readonly basePath: AbsoluteFsPath) {} @@ -107,6 +107,12 @@ export class NgtscTestEnvironment { this.multiCompileHostExt.flushWrittenFileTracking(); } + /** + * Older versions of the CLI do not provide the `CompilerHost.getModifiedResourceFiles()` method. + * This results in the `changedResources` set being `null`. + */ + simulateLegacyCLICompilerHost() { this.changedResources = null; } + getFilesWrittenSinceLastFlush(): Set { if (this.multiCompileHostExt === null) { throw new Error(`Not tracking written files - call enableMultipleCompilations()`); diff --git a/packages/compiler-cli/test/ngtsc/incremental_spec.ts b/packages/compiler-cli/test/ngtsc/incremental_spec.ts index ee288769d3..0ed8697d94 100644 --- a/packages/compiler-cli/test/ngtsc/incremental_spec.ts +++ b/packages/compiler-cli/test/ngtsc/incremental_spec.ts @@ -23,6 +23,23 @@ runInEachFileSystem(() => { env.tsconfig(); }); + it('should not crash if CLI does not provide getModifiedResourceFiles()', () => { + env.write('component1.ts', ` + import {Component} from '@angular/core'; + + @Component({selector: 'cmp', templateUrl: './component1.template.html'}) + export class Cmp1 {} + `); + env.write('component1.template.html', 'cmp1'); + env.driveMain(); + + // Simulate a change to `component1.html` + env.flushWrittenFileTracking(); + env.invalidateCachedFile('component1.html'); + env.simulateLegacyCLICompilerHost(); + env.driveMain(); + }); + it('should skip unchanged services', () => { env.write('service.ts', ` import {Injectable} from '@angular/core';