From 476790290e8c2fcda1cbe183a9266a1900c87d2c Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Mon, 25 Sep 2017 12:36:08 -0700 Subject: [PATCH] fix(compiler-cli): do not validate metadata from declaration files (#19324) Upgrading metadata files causes spurious reports of metadata errors. Fixes #18867 --- .../src/transformers/lower_expressions.ts | 8 ++++- .../transformers/lower_expressions_spec.ts | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/transformers/lower_expressions.ts b/packages/compiler-cli/src/transformers/lower_expressions.ts index 86e196c17e..5e6baafff6 100644 --- a/packages/compiler-cli/src/transformers/lower_expressions.ts +++ b/packages/compiler-cli/src/transformers/lower_expressions.ts @@ -322,8 +322,14 @@ export class LowerMetadataCache implements RequestsMap { return value; }; + // Do not validate or lower metadata in a declaration file. Declaration files are requested + // when we need to update the version of the metadata to add informatoin that might be missing + // in the out-of-date version that can be recovered from the .d.ts file. + const declarationFile = sourceFile.isDeclarationFile; + const metadata = this.collector.getMetadata( - sourceFile, this.strict, sourceFile.isDeclarationFile ? undefined : substituteExpression); + sourceFile, this.strict && !declarationFile, + declarationFile ? undefined : substituteExpression); return {metadata, requests}; } diff --git a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts index 9cac1252c2..abbbc6db55 100644 --- a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts +++ b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts @@ -98,6 +98,38 @@ describe('Expression lowering', () => { expect(collected.requests.has(collected.annotations[0].start)) .toBeTruthy('did not find the data field'); }); + + it('should throw a validation execption for invalid files', () => { + const cache = new LowerMetadataCache({}, /* strict */ true); + const sourceFile = ts.createSourceFile( + 'foo.ts', ` + import {Injectable} from '@angular/core'; + + class SomeLocalClass {} + @Injectable() + export class SomeClass { + constructor(a: SomeLocalClass) {} + } + `, + ts.ScriptTarget.Latest, true); + expect(() => cache.getMetadata(sourceFile)).toThrow(); + }); + + it('should not report validation errors on a .d.ts file', () => { + const cache = new LowerMetadataCache({}, /* strict */ true); + const dtsFile = ts.createSourceFile( + 'foo.d.ts', ` + import {Injectable} from '@angular/core'; + + class SomeLocalClass {} + @Injectable() + export class SomeClass { + constructor(a: SomeLocalClass) {} + } + `, + ts.ScriptTarget.Latest, true); + expect(() => cache.getMetadata(dtsFile)).not.toThrow(); + }); }); });