From 30208759cde21f4ee825501770b76e1ccdc54024 Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Fri, 15 Dec 2017 17:30:41 -0800 Subject: [PATCH] fix(compiler-cli): do not emit invalid .metadata.json files If no metadata is collected the `ngc` would generate file that contained `[null]` instead of eliding the `.metadata.json` file. Fixes: #20479 --- .../compiler-cli/src/transformers/program.ts | 8 +++++--- packages/compiler-cli/test/ngc_spec.ts | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/compiler-cli/src/transformers/program.ts b/packages/compiler-cli/src/transformers/program.ts index 39ffc15fcc..c7b0079ea0 100644 --- a/packages/compiler-cli/src/transformers/program.ts +++ b/packages/compiler-cli/src/transformers/program.ts @@ -336,9 +336,11 @@ class AngularCompilerProgram implements Program { if (!sf.isDeclarationFile && !GENERATED_FILES.test(sf.fileName)) { metadataJsonCount++; const metadata = this.metadataCache.getMetadata(sf); - const metadataText = JSON.stringify([metadata]); - const outFileName = srcToOutPath(sf.fileName.replace(/\.tsx?$/, '.metadata.json')); - this.writeFile(outFileName, metadataText, false, undefined, undefined, [sf]); + if (metadata) { + const metadataText = JSON.stringify([metadata]); + const outFileName = srcToOutPath(sf.fileName.replace(/\.tsx?$/, '.metadata.json')); + this.writeFile(outFileName, metadataText, false, undefined, undefined, [sf]); + } } }); } diff --git a/packages/compiler-cli/test/ngc_spec.ts b/packages/compiler-cli/test/ngc_spec.ts index f282628c6e..5702658061 100644 --- a/packages/compiler-cli/test/ngc_spec.ts +++ b/packages/compiler-cli/test/ngc_spec.ts @@ -1474,6 +1474,26 @@ describe('ngc transformer command-line', () => { }); describe('regressions', () => { + //#20479 + it('should not generate an invalid metadata file', () => { + write('src/tsconfig.json', `{ + "extends": "../tsconfig-base.json", + "files": ["lib.ts"], + "angularCompilerOptions": { + "skipTemplateCodegen": true + } + }`); + write('src/lib.ts', ` + export namespace A{ + export class C1 { + } + export interface I1{ + } + }`); + expect(main(['-p', path.join(basePath, 'src/tsconfig.json')])).toBe(0); + shouldNotExist('src/lib.metadata.json'); + }); + //#19544 it('should recognize @NgModule() directive with a redundant @Injectable()', () => { write('src/tsconfig.json', `{