diff --git a/packages/compiler-cli/src/perform_watch.ts b/packages/compiler-cli/src/perform_watch.ts index 095c44197c..c9e802dc37 100644 --- a/packages/compiler-cli/src/perform_watch.ts +++ b/packages/compiler-cli/src/perform_watch.ts @@ -153,7 +153,7 @@ export function performWatchCompilation(host: PerformWatchHost): } // Invoked to perform initial compilation or re-compilation in watch mode - function doCompilation(modifiedResourceFiles?: Set): Diagnostics { + function doCompilation(): Diagnostics { if (!cachedOptions) { cachedOptions = host.readConfiguration(); } @@ -197,8 +197,12 @@ export function performWatchCompilation(host: PerformWatchHost): return ce.content !; }; // Provide access to the file paths that triggered this rebuild - cachedCompilerHost.getModifiedResourceFiles = - modifiedResourceFiles !== undefined ? () => modifiedResourceFiles : undefined; + cachedCompilerHost.getModifiedResourceFiles = function() { + if (timerHandleForRecompilation === undefined) { + return undefined; + } + return timerHandleForRecompilation.modifiedResourceFiles; + }; } ignoreFilesForWatch.clear(); const oldProgram = cachedProgram; @@ -287,7 +291,7 @@ export function performWatchCompilation(host: PerformWatchHost): function recompile() { host.reportDiagnostics( [createMessageDiagnostic('File change detected. Starting incremental compilation.')]); - doCompilation(timerHandleForRecompilation !.modifiedResourceFiles); + doCompilation(); timerHandleForRecompilation = undefined; } } diff --git a/packages/compiler-cli/test/BUILD.bazel b/packages/compiler-cli/test/BUILD.bazel index 2c06400846..3c651e6540 100644 --- a/packages/compiler-cli/test/BUILD.bazel +++ b/packages/compiler-cli/test/BUILD.bazel @@ -109,6 +109,7 @@ ts_library( ":test_utils", "//packages/compiler", "//packages/compiler-cli", + "//packages/private/testing", "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/perform_watch_spec.ts b/packages/compiler-cli/test/perform_watch_spec.ts index b38d732ebf..479a3e388b 100644 --- a/packages/compiler-cli/test/perform_watch_spec.ts +++ b/packages/compiler-cli/test/perform_watch_spec.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {ivyEnabled} from '@angular/private/testing'; import * as fs from 'fs'; import * as path from 'path'; import * as ts from 'typescript'; @@ -24,8 +25,8 @@ describe('perform watch', () => { outDir = path.resolve(testSupport.basePath, 'outDir'); }); - function createConfig(): ng.ParsedConfiguration { - const options = testSupport.createCompilerOptions({outDir}); + function createConfig(overrideOptions: ng.CompilerOptions = {}): ng.ParsedConfiguration { + const options = testSupport.createCompilerOptions({outDir, ...overrideOptions}); return { options, rootNames: [path.resolve(testSupport.basePath, 'src/index.ts')], @@ -50,6 +51,33 @@ describe('perform watch', () => { expect(fs.existsSync(path.resolve(outDir, 'src', 'main.ngfactory.js'))).toBe(true); }); + it('should recompile components when its template changes', () => { + const config = createConfig({enableIvy: ivyEnabled}); + const host = new MockWatchHost(config); + + testSupport.writeFiles({ + 'src/main.ts': createModuleAndCompSource('main', './main.html'), + 'src/main.html': 'initial', + 'src/index.ts': `export * from './main'; `, + }); + + const watchResult = performWatchCompilation(host); + expectNoDiagnostics(config.options, watchResult.firstCompileResult); + + const htmlPath = path.posix.join(testSupport.basePath, 'src', 'main.html'); + const genPath = ivyEnabled ? path.posix.join(outDir, 'src', 'main.js') : + path.posix.join(outDir, 'src', 'main.ngfactory.js'); + + const initial = fs.readFileSync(genPath, {encoding: 'utf8'}); + expect(initial).toContain('"initial"'); + + testSupport.write(htmlPath, 'updated'); + host.triggerFileChange(FileChangeEvent.Change, htmlPath); + + const updated = fs.readFileSync(genPath, {encoding: 'utf8'}); + expect(updated).toContain('"updated"'); + }); + it('should cache files on subsequent runs', () => { const config = createConfig(); const host = new MockWatchHost(config);