diff --git a/packages/bazel/src/ngc-wrapped/index.ts b/packages/bazel/src/ngc-wrapped/index.ts index c0228fe4d8..e78b106454 100644 --- a/packages/bazel/src/ngc-wrapped/index.ts +++ b/packages/bazel/src/ngc-wrapped/index.ts @@ -184,7 +184,7 @@ export function compile({allDepsCompiledWithBazel = true, useManifestPathsAsModu } // Detect from compilerOpts whether the entrypoint is being invoked in Ivy mode. - const isInIvyMode = compilerOpts.enableIvy === 'ngtsc'; + const isInIvyMode = !!compilerOpts.enableIvy; // Disable downleveling and Closure annotation if in Ivy mode. if (isInIvyMode) { @@ -246,9 +246,18 @@ export function compile({allDepsCompiledWithBazel = true, useManifestPathsAsModu files, compilerOpts, bazelOpts, tsHost, fileLoader, generatedFileModuleResolver); } - // Also need to disable decorator downleveling in the BazelHost in Ivy mode. if (isInIvyMode) { + // Also need to disable decorator downleveling in the BazelHost in Ivy mode. bazelHost.transformDecorators = false; + + const delegate = bazelHost.shouldSkipTsickleProcessing.bind(bazelHost); + bazelHost.shouldSkipTsickleProcessing = (fileName: string) => { + // The base implementation of shouldSkipTsickleProcessing checks whether `fileName` is part of + // the original `srcs[]`. For Angular (Ivy) compilations, ngfactory/ngsummary files that are + // shims for original .ts files in the program should be treated identically. Thus, strip the + // '.ngfactory' or '.ngsummary' part of the filename away before calling the delegate. + return delegate(fileName.replace(/\.(ngfactory|ngsummary)\.ts$/, '.ts')); + }; } // Prevent tsickle adding any types at all if we don't want closure compiler annotations. diff --git a/packages/compiler-cli/src/main.ts b/packages/compiler-cli/src/main.ts index 64f03358fb..88b2fc37b5 100644 --- a/packages/compiler-cli/src/main.ts +++ b/packages/compiler-cli/src/main.ts @@ -103,8 +103,9 @@ function createEmitCallback(options: api.CompilerOptions): api.TsEmitCallback|un tsickle.TsickleHost, 'shouldSkipTsickleProcessing'|'pathToModuleName'| 'shouldIgnoreWarningsForPath'|'fileNameToModuleId'|'googmodule'|'untyped'| 'convertIndexImportShorthand'|'transformDecorators'|'transformTypesToClosure'> = { - shouldSkipTsickleProcessing: (fileName) => - /\.d\.ts$/.test(fileName) || GENERATED_FILES.test(fileName), + shouldSkipTsickleProcessing: (fileName) => /\.d\.ts$/.test(fileName) || + // View Engine's generated files were never intended to be processed with tsickle. + (!options.enableIvy && GENERATED_FILES.test(fileName)), pathToModuleName: (context, importPath) => '', shouldIgnoreWarningsForPath: (filePath) => false, fileNameToModuleId: (fileName) => fileName, diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 76c840ab42..5229a5c9d5 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -4594,6 +4594,31 @@ runInEachFileSystem(os => { expect(trim(jsContents).startsWith(trim(fileoverview))).toBeTruthy(); }); + it('should be produced for generated factory files', () => { + env.tsconfig({ + 'annotateForClosureCompiler': true, + 'generateNgFactoryShims': true, + }); + env.write(`test.ts`, ` + import {Component} from '@angular/core'; + + @Component({ + template: '
', + }) + export class SomeComp {} + `); + + env.driveMain(); + const jsContents = env.getContents('test.ngfactory.js'); + const fileoverview = ` + /** + * @fileoverview added by tsickle + * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ + `; + expect(trim(jsContents).startsWith(trim(fileoverview))).toBeTruthy(); + }); + it('should always be at the very beginning of a script (if placed above imports)', () => { env.tsconfig({ 'annotateForClosureCompiler': true,