From 3af5ef4a538b452a3804db75727a823314a7d992 Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Thu, 8 Feb 2018 08:59:25 -0800 Subject: [PATCH] build: upgrade to TypeScript 2.7 Fixes: #21571 --- package.json | 4 +- .../src/diagnostics/typescript_symbols.ts | 4 +- .../src/transformers/lower_expressions.ts | 9 +- .../compiler-cli/src/transformers/program.ts | 5 +- .../compiler-cli/test/diagnostics/mocks.ts | 22 ++--- .../test/diagnostics/symbol_query_spec.ts | 2 +- .../test/metadata/collector_spec.ts | 82 +++++++++---------- .../test/metadata/evaluator_spec.ts | 24 +++--- .../test/metadata/symbols_spec.ts | 4 +- .../test/metadata/typescript.mocks.ts | 1 + packages/compiler-cli/test/test_support.ts | 1 + .../transformers/lower_expressions_spec.ts | 2 +- .../test/transformers/program_spec.ts | 42 ++++++---- packages/compiler/test/aot/compiler_spec.ts | 2 +- .../core/src/render3/interfaces/definition.ts | 2 +- packages/language-service/src/ts_plugin.ts | 18 +++- .../language-service/src/typescript_host.ts | 12 +-- .../test/dom/events/event_manager_spec.ts | 18 ++-- .../service-worker/worker/testing/fetch.ts | 4 +- yarn.lock | 12 +-- 20 files changed, 155 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index 855591fb4f81e..bc9a5a671ae1f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "dependencies": { "core-js": "^2.4.1", "reflect-metadata": "^0.1.3", - "rxjs": "5.5.5", + "rxjs": "5.5.6", "tslib": "^1.7.1", "zone.js": "^0.8.12" }, @@ -103,7 +103,7 @@ "tslint": "5.7.0", "tslint-eslint-rules": "4.1.1", "tsutils": "2.12.1", - "typescript": "2.6.x", + "typescript": "2.7.x", "uglify-js": "2.8.29", "universal-analytics": "0.4.15", "vlq": "0.2.2", diff --git a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts index fd31380319b85..6490e969ac271 100644 --- a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts +++ b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts @@ -46,7 +46,9 @@ export function getClassMembers( if (declaration) { const type = checker.getTypeAtLocation(declaration); const node = program.getSourceFile(staticSymbol.filePath); - return new TypeWrapper(type, {node, program, checker}).members(); + if (node) { + return new TypeWrapper(type, {node, program, checker}).members(); + } } } diff --git a/packages/compiler-cli/src/transformers/lower_expressions.ts b/packages/compiler-cli/src/transformers/lower_expressions.ts index 0793782a50465..6134d62c8493a 100644 --- a/packages/compiler-cli/src/transformers/lower_expressions.ts +++ b/packages/compiler-cli/src/transformers/lower_expressions.ts @@ -190,9 +190,12 @@ export function getExpressionLoweringTransformFactory( // Return the factory return (context: ts.TransformationContext) => (sourceFile: ts.SourceFile): ts.SourceFile => { // We need to use the original SourceFile for reading metadata, and not the transformed one. - const requests = requestsMap.getRequests(program.getSourceFile(sourceFile.fileName)); - if (requests && requests.size) { - return transformSourceFile(sourceFile, requests, context); + const originalFile = program.getSourceFile(sourceFile.fileName); + if (originalFile) { + const requests = requestsMap.getRequests(originalFile); + if (requests && requests.size) { + return transformSourceFile(sourceFile, requests, context); + } } return sourceFile; }; diff --git a/packages/compiler-cli/src/transformers/program.ts b/packages/compiler-cli/src/transformers/program.ts index ebe789dbd4432..df09c8a66ffc5 100644 --- a/packages/compiler-cli/src/transformers/program.ts +++ b/packages/compiler-cli/src/transformers/program.ts @@ -299,7 +299,10 @@ class AngularCompilerProgram implements Program { genFile = genFileByFileName.get(sourceFile.fileName); if (!sourceFile.isDeclarationFile && !GENERATED_FILES.test(sourceFile.fileName)) { // Note: sourceFile is the transformed sourcefile, not the original one! - emittedSourceFiles.push(this.tsProgram.getSourceFile(sourceFile.fileName)); + const originalFile = this.tsProgram.getSourceFile(sourceFile.fileName); + if (originalFile) { + emittedSourceFiles.push(originalFile); + } } } this.writeFile(outFileName, outData, writeByteOrderMark, onError, genFile, sourceFiles); diff --git a/packages/compiler-cli/test/diagnostics/mocks.ts b/packages/compiler-cli/test/diagnostics/mocks.ts index 13cbbce3d06ce..76226efad2a11 100644 --- a/packages/compiler-cli/test/diagnostics/mocks.ts +++ b/packages/compiler-cli/test/diagnostics/mocks.ts @@ -240,16 +240,18 @@ export function getDiagnosticTemplateInfo( const members = getClassMembers(context.program, context.checker, type); if (members) { const sourceFile = context.program.getSourceFile(type.filePath); - const query = getSymbolQuery( - context.program, context.checker, sourceFile, - () => - getPipesTable(sourceFile, context.program, context.checker, compiledTemplate.pipes)); - return { - fileName: templateFile, - offset: 0, query, members, - htmlAst: compiledTemplate.htmlAst, - templateAst: compiledTemplate.templateAst - }; + if (sourceFile) { + const query = getSymbolQuery( + context.program, context.checker, sourceFile, + () => getPipesTable( + sourceFile, context.program, context.checker, compiledTemplate.pipes)); + return { + fileName: templateFile, + offset: 0, query, members, + htmlAst: compiledTemplate.htmlAst, + templateAst: compiledTemplate.templateAst + }; + } } } } diff --git a/packages/compiler-cli/test/diagnostics/symbol_query_spec.ts b/packages/compiler-cli/test/diagnostics/symbol_query_spec.ts index 7073f8958d301..09d536e643778 100644 --- a/packages/compiler-cli/test/diagnostics/symbol_query_spec.ts +++ b/packages/compiler-cli/test/diagnostics/symbol_query_spec.ts @@ -41,7 +41,7 @@ describe('symbol query', () => { const service = ts.createLanguageService(host, registry); program = service.getProgram(); checker = program.getTypeChecker(); - sourceFile = program.getSourceFile('/quickstart/app/app.component.ts'); + sourceFile = program.getSourceFile('/quickstart/app/app.component.ts') !; const options: CompilerOptions = Object.create(host.getCompilationSettings()); options.genDir = '/dist'; options.basePath = '/quickstart'; diff --git a/packages/compiler-cli/test/metadata/collector_spec.ts b/packages/compiler-cli/test/metadata/collector_spec.ts index 9d4bbf7e0e011..4b0128f7723a0 100644 --- a/packages/compiler-cli/test/metadata/collector_spec.ts +++ b/packages/compiler-cli/test/metadata/collector_spec.ts @@ -47,13 +47,13 @@ describe('Collector', () => { it('should not have errors in test data', () => { expectValidSources(service, program); }); it('should return undefined for modules that have no metadata', () => { - const sourceFile = program.getSourceFile('app/empty.ts'); + const sourceFile = program.getSourceFile('app/empty.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toBeUndefined(); }); it('should treat all symbols of .d.ts files as exported', () => { - const sourceFile = program.getSourceFile('declarations.d.ts'); + const sourceFile = program.getSourceFile('declarations.d.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -66,7 +66,7 @@ describe('Collector', () => { }); it('should return an interface reference for types', () => { - const sourceFile = program.getSourceFile('/exported-type.ts'); + const sourceFile = program.getSourceFile('/exported-type.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -76,7 +76,7 @@ describe('Collector', () => { }); it('should return an interface reference for interfaces', () => { - const sourceFile = program.getSourceFile('app/hero.ts'); + const sourceFile = program.getSourceFile('app/hero.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -86,13 +86,13 @@ describe('Collector', () => { }); it('should preserve module names from TypeScript sources', () => { - const sourceFile = program.getSourceFile('named-module.d.ts'); + const sourceFile = program.getSourceFile('named-module.d.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata !['importAs']).toEqual('some-named-module'); }); it('should be able to collect a simple component\'s metadata', () => { - const sourceFile = program.getSourceFile('app/hero-detail.component.ts'); + const sourceFile = program.getSourceFile('app/hero-detail.component.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -144,7 +144,7 @@ describe('Collector', () => { }); it('should be able to get a more complicated component\'s metadata', () => { - const sourceFile = program.getSourceFile('/app/app.component.ts'); + const sourceFile = program.getSourceFile('/app/app.component.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -236,7 +236,7 @@ describe('Collector', () => { }); it('should return the values of exported variables', () => { - const sourceFile = program.getSourceFile('/app/mock-heroes.ts'); + const sourceFile = program.getSourceFile('/app/mock-heroes.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -262,7 +262,7 @@ describe('Collector', () => { let casesMetadata: ModuleMetadata; beforeEach(() => { - casesFile = program.getSourceFile('/app/cases-data.ts'); + casesFile = program.getSourceFile('/app/cases-data.ts') !; casesMetadata = collector.getMetadata(casesFile) !; }); @@ -322,7 +322,7 @@ describe('Collector', () => { }); it('should report errors for destructured imports', () => { - const unsupported1 = program.getSourceFile('/unsupported-1.ts'); + const unsupported1 = program.getSourceFile('/unsupported-1.ts') !; const metadata = collector.getMetadata(unsupported1); expect(metadata).toEqual({ __symbolic: 'module', @@ -338,7 +338,7 @@ describe('Collector', () => { }); it('should report an error for references to unexpected types', () => { - const unsupported1 = program.getSourceFile('/unsupported-2.ts'); + const unsupported1 = program.getSourceFile('/unsupported-2.ts') !; const metadata = collector.getMetadata(unsupported1) !; const barClass = metadata.metadata['Bar']; const ctor = barClass.members !['__ctor__'][0]; @@ -353,7 +353,7 @@ describe('Collector', () => { }); it('should be able to handle import star type references', () => { - const importStar = program.getSourceFile('/import-star.ts'); + const importStar = program.getSourceFile('/import-star.ts') !; const metadata = collector.getMetadata(importStar) !; const someClass = metadata.metadata['SomeClass']; const ctor = someClass.members !['__ctor__'][0]; @@ -364,7 +364,7 @@ describe('Collector', () => { }); it('should record all exported classes', () => { - const sourceFile = program.getSourceFile('/exported-classes.ts'); + const sourceFile = program.getSourceFile('/exported-classes.ts') !; const metadata = collector.getMetadata(sourceFile); expect(metadata).toEqual({ __symbolic: 'module', @@ -378,7 +378,7 @@ describe('Collector', () => { }); it('should be able to record functions', () => { - const exportedFunctions = program.getSourceFile('/exported-functions.ts'); + const exportedFunctions = program.getSourceFile('/exported-functions.ts') !; const metadata = collector.getMetadata(exportedFunctions); expect(metadata).toEqual({ __symbolic: 'module', @@ -438,7 +438,7 @@ describe('Collector', () => { }); it('should be able to handle import star type references', () => { - const importStar = program.getSourceFile('/import-star.ts'); + const importStar = program.getSourceFile('/import-star.ts') !; const metadata = collector.getMetadata(importStar) !; const someClass = metadata.metadata['SomeClass']; const ctor = someClass.members !['__ctor__'][0]; @@ -449,14 +449,14 @@ describe('Collector', () => { }); it('should be able to collect the value of an enum', () => { - const enumSource = program.getSourceFile('/exported-enum.ts'); + const enumSource = program.getSourceFile('/exported-enum.ts') !; const metadata = collector.getMetadata(enumSource) !; const someEnum: any = metadata.metadata['SomeEnum']; expect(someEnum).toEqual({A: 0, B: 1, C: 100, D: 101}); }); it('should ignore a non-export enum', () => { - const enumSource = program.getSourceFile('/private-enum.ts'); + const enumSource = program.getSourceFile('/private-enum.ts') !; const metadata = collector.getMetadata(enumSource) !; const publicEnum: any = metadata.metadata['PublicEnum']; const privateEnum: any = metadata.metadata['PrivateEnum']; @@ -465,7 +465,7 @@ describe('Collector', () => { }); it('should be able to collect enums initialized from consts', () => { - const enumSource = program.getSourceFile('/exported-enum.ts'); + const enumSource = program.getSourceFile('/exported-enum.ts') !; const metadata = collector.getMetadata(enumSource) !; const complexEnum: any = metadata.metadata['ComplexEnum']; expect(complexEnum).toEqual({ @@ -484,7 +484,7 @@ describe('Collector', () => { }); it('should be able to collect a simple static method', () => { - const staticSource = program.getSourceFile('/static-method.ts'); + const staticSource = program.getSourceFile('/static-method.ts') !; const metadata = collector.getMetadata(staticSource) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['MyModule']; @@ -502,7 +502,7 @@ describe('Collector', () => { }); it('should be able to collect a call to a static method', () => { - const staticSource = program.getSourceFile('/static-method-call.ts'); + const staticSource = program.getSourceFile('/static-method-call.ts') !; const metadata = collector.getMetadata(staticSource) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['Foo']; @@ -537,7 +537,7 @@ describe('Collector', () => { }); it('should be able to collect a static field', () => { - const staticSource = program.getSourceFile('/static-field.ts'); + const staticSource = program.getSourceFile('/static-field.ts') !; const metadata = collector.getMetadata(staticSource) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['MyModule']; @@ -546,7 +546,7 @@ describe('Collector', () => { }); it('should be able to collect a reference to a static field', () => { - const staticSource = program.getSourceFile('/static-field-reference.ts'); + const staticSource = program.getSourceFile('/static-field-reference.ts') !; const metadata = collector.getMetadata(staticSource) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['Foo']; @@ -580,7 +580,7 @@ describe('Collector', () => { }); it('should be able to collect a method with a conditional expression', () => { - const source = program.getSourceFile('/static-method-with-if.ts'); + const source = program.getSourceFile('/static-method-with-if.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['MyModule']; @@ -605,7 +605,7 @@ describe('Collector', () => { }); it('should be able to collect a method with a default parameter', () => { - const source = program.getSourceFile('/static-method-with-default.ts'); + const source = program.getSourceFile('/static-method-with-default.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata).toBeDefined(); const classData = metadata.metadata['MyModule']; @@ -634,7 +634,7 @@ describe('Collector', () => { }); it('should be able to collect re-exported symbols', () => { - const source = program.getSourceFile('/re-exports.ts'); + const source = program.getSourceFile('/re-exports.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.exports).toEqual([ {from: './static-field', export: ['MyModule']}, @@ -644,13 +644,13 @@ describe('Collector', () => { }); it('should be able to collect a export as symbol', () => { - const source = program.getSourceFile('export-as.d.ts'); + const source = program.getSourceFile('export-as.d.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.metadata).toEqual({SomeFunction: {__symbolic: 'function'}}); }); it('should be able to collect exports with no module specifier', () => { - const source = program.getSourceFile('/re-exports-2.ts'); + const source = program.getSourceFile('/re-exports-2.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.metadata).toEqual({ MyClass: Object({__symbolic: 'class'}), @@ -672,7 +672,7 @@ describe('Collector', () => { }); it('should collect an error symbol if collecting a reference to a non-exported symbol', () => { - const source = program.getSourceFile('/local-symbol-ref.ts'); + const source = program.getSourceFile('/local-symbol-ref.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.metadata).toEqual({ REQUIRED_VALIDATOR: { @@ -700,7 +700,7 @@ describe('Collector', () => { }); it('should collect an error symbol if collecting a reference to a non-exported function', () => { - const source = program.getSourceFile('/local-function-ref.ts'); + const source = program.getSourceFile('/local-function-ref.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.metadata).toEqual({ REQUIRED_VALIDATOR: { @@ -728,7 +728,7 @@ describe('Collector', () => { }); it('should collect an error for a simple function that references a local variable', () => { - const source = program.getSourceFile('/local-symbol-ref-func.ts'); + const source = program.getSourceFile('/local-symbol-ref-func.ts') !; const metadata = collector.getMetadata(source) !; expect(metadata.metadata).toEqual({ foo: { @@ -746,7 +746,7 @@ describe('Collector', () => { }); it('should collect any for interface parameter reference', () => { - const source = program.getSourceFile('/interface-reference.ts'); + const source = program.getSourceFile('/interface-reference.ts') !; const metadata = collector.getMetadata(source) !; expect((metadata.metadata['SomeClass'] as ClassMetadata).members).toEqual({ __ctor__: [{ @@ -886,24 +886,24 @@ describe('Collector', () => { describe('in strict mode', () => { it('should throw if an error symbol is collecting a reference to a non-exported symbol', () => { - const source = program.getSourceFile('/local-symbol-ref.ts'); + const source = program.getSourceFile('/local-symbol-ref.ts') !; expect(() => collector.getMetadata(source, true)).toThrowError(/Reference to a local symbol/); }); it('should throw if an error if collecting a reference to a non-exported function', () => { - const source = program.getSourceFile('/local-function-ref.ts'); + const source = program.getSourceFile('/local-function-ref.ts') !; expect(() => collector.getMetadata(source, true)) .toThrowError(/Reference to a non-exported function/); }); it('should throw for references to unexpected types', () => { - const unsupported2 = program.getSourceFile('/unsupported-2.ts'); + const unsupported2 = program.getSourceFile('/unsupported-2.ts') !; expect(() => collector.getMetadata(unsupported2, true)) .toThrowError(/Reference to non-exported class/); }); it('should throw for errors in a static method', () => { - const unsupported3 = program.getSourceFile('/unsupported-3.ts'); + const unsupported3 = program.getSourceFile('/unsupported-3.ts') !; expect(() => collector.getMetadata(unsupported3, true)) .toThrowError(/Reference to a non-exported class/); }); @@ -913,33 +913,33 @@ describe('Collector', () => { it('should not throw with a class with no name', () => { const fileName = '/invalid-class.ts'; override(fileName, 'export class'); - const invalidClass = program.getSourceFile(fileName); + const invalidClass = program.getSourceFile(fileName) !; expect(() => collector.getMetadata(invalidClass)).not.toThrow(); }); it('should not throw with a function with no name', () => { const fileName = '/invalid-function.ts'; override(fileName, 'export function'); - const invalidFunction = program.getSourceFile(fileName); + const invalidFunction = program.getSourceFile(fileName) !; expect(() => collector.getMetadata(invalidFunction)).not.toThrow(); }); }); describe('inheritance', () => { it('should record `extends` clauses for declared classes', () => { - const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts')) !; + const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts') !) !; expect(metadata.metadata['DeclaredChildClass']) .toEqual({__symbolic: 'class', extends: {__symbolic: 'reference', name: 'ParentClass'}}); }); it('should record `extends` clauses for classes in the same file', () => { - const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts')) !; + const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts') !) !; expect(metadata.metadata['ChildClassSameFile']) .toEqual({__symbolic: 'class', extends: {__symbolic: 'reference', name: 'ParentClass'}}); }); it('should record `extends` clauses for classes in a different file', () => { - const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts')) !; + const metadata = collector.getMetadata(program.getSourceFile('/class-inheritance.ts') !) !; expect(metadata.metadata['ChildClassOtherFile']).toEqual({ __symbolic: 'class', extends: { @@ -959,7 +959,7 @@ describe('Collector', () => { } it('should collect the correct arity for a class', () => { - const metadata = collector.getMetadata(program.getSourceFile('/class-arity.ts')) !; + const metadata = collector.getMetadata(program.getSourceFile('/class-arity.ts') !) !; const zero = metadata.metadata['Zero']; if (expectClass(zero)) expect(zero.arity).toBeUndefined(); diff --git a/packages/compiler-cli/test/metadata/evaluator_spec.ts b/packages/compiler-cli/test/metadata/evaluator_spec.ts index b08492dda4a68..efb88c7d9d6ff 100644 --- a/packages/compiler-cli/test/metadata/evaluator_spec.ts +++ b/packages/compiler-cli/test/metadata/evaluator_spec.ts @@ -47,7 +47,7 @@ describe('Evaluator', () => { }); it('should be able to fold literal expressions', () => { - const consts = program.getSourceFile('consts.ts'); + const consts = program.getSourceFile('consts.ts') !; expect(evaluator.isFoldable(findVarInitializer(consts, 'someName'))).toBeTruthy(); expect(evaluator.isFoldable(findVarInitializer(consts, 'someBool'))).toBeTruthy(); expect(evaluator.isFoldable(findVarInitializer(consts, 'one'))).toBeTruthy(); @@ -55,7 +55,7 @@ describe('Evaluator', () => { }); it('should be able to fold expressions with foldable references', () => { - const expressions = program.getSourceFile('expressions.ts'); + const expressions = program.getSourceFile('expressions.ts') !; symbols.define('someName', 'some-name'); symbols.define('someBool', true); symbols.define('one', 1); @@ -69,7 +69,7 @@ describe('Evaluator', () => { }); it('should be able to evaluate literal expressions', () => { - const consts = program.getSourceFile('consts.ts'); + const consts = program.getSourceFile('consts.ts') !; expect(evaluator.evaluateNode(findVarInitializer(consts, 'someName'))).toBe('some-name'); expect(evaluator.evaluateNode(findVarInitializer(consts, 'someBool'))).toBe(true); expect(evaluator.evaluateNode(findVarInitializer(consts, 'one'))).toBe(1); @@ -77,7 +77,7 @@ describe('Evaluator', () => { }); it('should be able to evaluate expressions', () => { - const expressions = program.getSourceFile('expressions.ts'); + const expressions = program.getSourceFile('expressions.ts') !; symbols.define('someName', 'some-name'); symbols.define('someBool', true); symbols.define('one', 1); @@ -124,7 +124,7 @@ describe('Evaluator', () => { }); it('should report recursive references as symbolic', () => { - const expressions = program.getSourceFile('expressions.ts'); + const expressions = program.getSourceFile('expressions.ts') !; expect(evaluator.evaluateNode(findVarInitializer(expressions, 'recursiveA'))) .toEqual({__symbolic: 'reference', name: 'recursiveB'}); expect(evaluator.evaluateNode(findVarInitializer(expressions, 'recursiveB'))) @@ -132,13 +132,13 @@ describe('Evaluator', () => { }); it('should correctly handle special cases for CONST_EXPR', () => { - const const_expr = program.getSourceFile('const_expr.ts'); + const const_expr = program.getSourceFile('const_expr.ts') !; expect(evaluator.evaluateNode(findVarInitializer(const_expr, 'bTrue'))).toEqual(true); expect(evaluator.evaluateNode(findVarInitializer(const_expr, 'bFalse'))).toEqual(false); }); it('should resolve a forwardRef', () => { - const forwardRef = program.getSourceFile('forwardRef.ts'); + const forwardRef = program.getSourceFile('forwardRef.ts') !; expect(evaluator.evaluateNode(findVarInitializer(forwardRef, 'bTrue'))).toEqual(true); expect(evaluator.evaluateNode(findVarInitializer(forwardRef, 'bFalse'))).toEqual(false); }); @@ -146,7 +146,7 @@ describe('Evaluator', () => { it('should return new expressions', () => { symbols.define('Value', {__symbolic: 'reference', module: './classes', name: 'Value'}); evaluator = new Evaluator(symbols, new Map()); - const newExpression = program.getSourceFile('newExpression.ts'); + const newExpression = program.getSourceFile('newExpression.ts') !; expect(evaluator.evaluateNode(findVarInitializer(newExpression, 'someValue'))).toEqual({ __symbolic: 'new', expression: @@ -162,7 +162,7 @@ describe('Evaluator', () => { }); it('should support referene to a declared module type', () => { - const declared = program.getSourceFile('declared.ts'); + const declared = program.getSourceFile('declared.ts') !; const aDecl = findVar(declared, 'a') !; expect(evaluator.evaluateNode(aDecl.type !)).toEqual({ __symbolic: 'select', @@ -172,7 +172,7 @@ describe('Evaluator', () => { }); it('should return errors for unsupported expressions', () => { - const errors = program.getSourceFile('errors.ts'); + const errors = program.getSourceFile('errors.ts') !; const fDecl = findVar(errors, 'f') !; expect(evaluator.evaluateNode(fDecl.initializer !)) .toEqual({__symbolic: 'error', message: 'Lambda not supported', line: 1, character: 12}); @@ -202,14 +202,14 @@ describe('Evaluator', () => { }); it('should be able to fold an array spread', () => { - const expressions = program.getSourceFile('expressions.ts'); + const expressions = program.getSourceFile('expressions.ts') !; symbols.define('arr', [1, 2, 3, 4]); const arrSpread = findVar(expressions, 'arrSpread') !; expect(evaluator.evaluateNode(arrSpread.initializer !)).toEqual([0, 1, 2, 3, 4, 5]); }); it('should be able to produce a spread expression', () => { - const expressions = program.getSourceFile('expressions.ts'); + const expressions = program.getSourceFile('expressions.ts') !; const arrSpreadRef = findVar(expressions, 'arrSpreadRef') !; expect(evaluator.evaluateNode(arrSpreadRef.initializer !)).toEqual([ 0, {__symbolic: 'spread', expression: {__symbolic: 'reference', name: 'arrImport'}}, 5 diff --git a/packages/compiler-cli/test/metadata/symbols_spec.ts b/packages/compiler-cli/test/metadata/symbols_spec.ts index 9ec9041fc3d18..36b8157b41ccd 100644 --- a/packages/compiler-cli/test/metadata/symbols_spec.ts +++ b/packages/compiler-cli/test/metadata/symbols_spec.ts @@ -43,8 +43,8 @@ describe('Symbols', () => { host = new Host(FILES, ['consts.ts', 'expressions.ts', 'imports.ts']); service = ts.createLanguageService(host); program = service.getProgram(); - expressions = program.getSourceFile('expressions.ts'); - imports = program.getSourceFile('imports.ts'); + expressions = program.getSourceFile('expressions.ts') !; + imports = program.getSourceFile('imports.ts') !; }); it('should not have syntax errors in the test sources', () => { diff --git a/packages/compiler-cli/test/metadata/typescript.mocks.ts b/packages/compiler-cli/test/metadata/typescript.mocks.ts index 517191ec077b3..93f7438cc9a4a 100644 --- a/packages/compiler-cli/test/metadata/typescript.mocks.ts +++ b/packages/compiler-cli/test/metadata/typescript.mocks.ts @@ -104,6 +104,7 @@ export class MockIdentifier extends MockNode implements ts.Identifier { public text: string; public escapedText: ts.__String; // tslint:disable + public _declarationBrand: any; public _primaryExpressionBrand: any; public _memberExpressionBrand: any; public _leftHandSideExpressionBrand: any; diff --git a/packages/compiler-cli/test/test_support.ts b/packages/compiler-cli/test/test_support.ts index 35cf8661b75ab..19785a893e069 100644 --- a/packages/compiler-cli/test/test_support.ts +++ b/packages/compiler-cli/test/test_support.ts @@ -85,6 +85,7 @@ export function setup(): TestSupport { 'experimentalDecorators': true, 'skipLibCheck': true, 'strict': true, + 'strictPropertyInitialization': false, 'types': [], 'outDir': path.resolve(basePath, 'built'), 'rootDir': basePath, diff --git a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts index 88669935196bd..4c429c2008d7b 100644 --- a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts +++ b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts @@ -192,7 +192,7 @@ function convert(annotatedSource: string) { const program = ts.createProgram( [fileName], {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2017}, host); - const moduleSourceFile = program.getSourceFile(fileName); + const moduleSourceFile = program.getSourceFile(fileName) !; const transformers: ts.CustomTransformers = { before: [getExpressionLoweringTransformFactory( { diff --git a/packages/compiler-cli/test/transformers/program_spec.ts b/packages/compiler-cli/test/transformers/program_spec.ts index 89cdaefafdeaa..dcfbad2035cfe 100644 --- a/packages/compiler-cli/test/transformers/program_spec.ts +++ b/packages/compiler-cli/test/transformers/program_spec.ts @@ -446,45 +446,57 @@ describe('ng program', () => { {rootNames: [path.resolve(testSupport.basePath, 'src/index.ts')], options, host}); program.emit(); + const enum ShouldBe { Empty, EmptyExport, NoneEmpty } function assertGenFile( - fileName: string, checks: {originalFileName: string, shouldBeEmpty: boolean}) { + fileName: string, checks: {originalFileName: string, shouldBe: ShouldBe}) { const writeData = written.get(path.join(testSupport.basePath, fileName)); expect(writeData).toBeTruthy(); expect(writeData !.original !.some( sf => sf.fileName === path.join(testSupport.basePath, checks.originalFileName))) .toBe(true); - if (checks.shouldBeEmpty) { - // The file should only contain comments (the preamble comment added by ngc). - expect(writeData !.data).toMatch(/^(\s*\/\*([^*]|\*[^/])*\*\/\s*)?$/); - } else { - expect(writeData !.data).not.toBe(''); + switch (checks.shouldBe) { + case ShouldBe.Empty: + expect(writeData !.data).toMatch(/^(\s*\/\*([^*]|\*[^/])*\*\/\s*)?$/); + break; + case ShouldBe.EmptyExport: + expect(writeData !.data) + .toMatch(/^((\s*\/\*([^*]|\*[^/])*\*\/\s*)|(\s*export\s*{\s*}\s*;\s*)|())$/); + break; + case ShouldBe.NoneEmpty: + expect(writeData !.data).not.toBe(''); + break; } } assertGenFile( - 'built/src/util.ngfactory.js', {originalFileName: 'src/util.ts', shouldBeEmpty: true}); + 'built/src/util.ngfactory.js', {originalFileName: 'src/util.ts', shouldBe: ShouldBe.Empty}); assertGenFile( - 'built/src/util.ngfactory.d.ts', {originalFileName: 'src/util.ts', shouldBeEmpty: true}); + 'built/src/util.ngfactory.d.ts', + {originalFileName: 'src/util.ts', shouldBe: ShouldBe.EmptyExport}); assertGenFile( - 'built/src/util.ngsummary.js', {originalFileName: 'src/util.ts', shouldBeEmpty: true}); + 'built/src/util.ngsummary.js', {originalFileName: 'src/util.ts', shouldBe: ShouldBe.Empty}); assertGenFile( - 'built/src/util.ngsummary.d.ts', {originalFileName: 'src/util.ts', shouldBeEmpty: true}); + 'built/src/util.ngsummary.d.ts', + {originalFileName: 'src/util.ts', shouldBe: ShouldBe.EmptyExport}); assertGenFile( - 'built/src/util.ngsummary.json', {originalFileName: 'src/util.ts', shouldBeEmpty: false}); + 'built/src/util.ngsummary.json', + {originalFileName: 'src/util.ts', shouldBe: ShouldBe.NoneEmpty}); // Note: we always fill non shim and shim style files as they might // be shared by component with and without ViewEncapsulation. assertGenFile( - 'built/src/main.css.ngstyle.js', {originalFileName: 'src/main.ts', shouldBeEmpty: false}); + 'built/src/main.css.ngstyle.js', + {originalFileName: 'src/main.ts', shouldBe: ShouldBe.NoneEmpty}); assertGenFile( - 'built/src/main.css.ngstyle.d.ts', {originalFileName: 'src/main.ts', shouldBeEmpty: true}); + 'built/src/main.css.ngstyle.d.ts', + {originalFileName: 'src/main.ts', shouldBe: ShouldBe.EmptyExport}); // Note: this file is not empty as we actually generated code for it assertGenFile( 'built/src/main.css.shim.ngstyle.js', - {originalFileName: 'src/main.ts', shouldBeEmpty: false}); + {originalFileName: 'src/main.ts', shouldBe: ShouldBe.NoneEmpty}); assertGenFile( 'built/src/main.css.shim.ngstyle.d.ts', - {originalFileName: 'src/main.ts', shouldBeEmpty: true}); + {originalFileName: 'src/main.ts', shouldBe: ShouldBe.EmptyExport}); }); it('should not emit /// references in .d.ts files', () => { diff --git a/packages/compiler/test/aot/compiler_spec.ts b/packages/compiler/test/aot/compiler_spec.ts index d8aea934c0853..bbb01f14f4bfe 100644 --- a/packages/compiler/test/aot/compiler_spec.ts +++ b/packages/compiler/test/aot/compiler_spec.ts @@ -279,7 +279,7 @@ describe('compiler (unbundled Angular)', () => { }; compile([FILES, angularFiles], { postCompile: program => { - const factorySource = program.getSourceFile('/app/app.ngfactory.ts'); + const factorySource = program.getSourceFile('/app/app.ngfactory.ts') !; expect(factorySource.text).not.toContain('\'/app/app.ngfactory\''); } }); diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index ed95c7a9860ba..609f54955a55f 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -139,7 +139,7 @@ export interface PipeDef { export interface DirectiveDefArgs { type: Type; - factory: () => T | [T]; + factory: () => T | ({0: T} & any[]); /* trying to say T | [T, ...any] */ inputs?: {[P in keyof T]?: string}; outputs?: {[P in keyof T]?: string}; methods?: {[P in keyof T]?: string}; diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index 81a92964c8c4f..e88d9941c1ca3 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -72,7 +72,13 @@ function angularOnlyFilter(ls: ts.LanguageService): ts.LanguageService { dispose: () => ls.dispose(), getApplicableRefactors: (fileName, positionOrRaneg) => [], getEditsForRefactor: (fileName, formatOptions, positionOrRange, refactorName, actionName) => - undefined + undefined, + getDefinitionAndBoundSpan: (fileName: string, position: number): + ts.DefinitionInfoAndBoundSpan => + ({definitions: [], textSpan: {start: 0, length: 0}}), + getCombinedCodeFix: + (scope: ts.CombinedCodeFixScope, fixId: {}, formatOptions: ts.FormatCodeSettings): + ts.CombinedCodeActions => ({changes: [], commands: undefined}) }; } @@ -172,7 +178,11 @@ export function create(info: any /* ts.server.PluginCreateInfo */): ts.LanguageS getProgram: () => ls.getProgram(), dispose: () => ls.dispose(), getApplicableRefactors: tryFilenameOneCall(ls.getApplicableRefactors), - getEditsForRefactor: tryFilenameFourCall(ls.getEditsForRefactor) + getEditsForRefactor: tryFilenameFourCall(ls.getEditsForRefactor), + getDefinitionAndBoundSpan: tryFilenameOneCall(ls.getDefinitionAndBoundSpan), + getCombinedCodeFix: + (scope: ts.CombinedCodeFixScope, fixId: {}, formatOptions: ts.FormatCodeSettings) => + tryCall(undefined, () => ls.getCombinedCodeFix(scope, fixId, formatOptions)) }; } @@ -300,7 +310,9 @@ export function create(info: any /* ts.server.PluginCreateInfo */): ts.LanguageS const ours = ls.getDiagnostics(fileName); if (ours && ours.length) { const file = oldLS.getProgram().getSourceFile(fileName); - base.push.apply(base, ours.map(d => diagnosticToDiagnostic(d, file))); + if (file) { + base.push.apply(base, ours.map(d => diagnosticToDiagnostic(d, file))); + } } }); diff --git a/packages/language-service/src/typescript_host.ts b/packages/language-service/src/typescript_host.ts index 8a076f6f69a05..1673f3a4b5d0f 100644 --- a/packages/language-service/src/typescript_host.ts +++ b/packages/language-service/src/typescript_host.ts @@ -212,7 +212,7 @@ export class TypeScriptServiceHost implements LanguageServiceHost { return result; } - getSourceFile(fileName: string): ts.SourceFile { + getSourceFile(fileName: string): ts.SourceFile|undefined { return this.tsService.getProgram().getSourceFile(fileName); } @@ -339,10 +339,12 @@ export class TypeScriptServiceHost implements LanguageServiceHost { let [declaration, decorator] = this.getTemplateClassDeclFromNode(node); if (declaration && declaration.name) { const sourceFile = this.getSourceFile(fileName); - return this.getSourceFromDeclaration( - fileName, version, this.stringOf(node) || '', shrink(spanOf(node)), - this.reflector.getStaticSymbol(sourceFile.fileName, declaration.name.text), - declaration, node, sourceFile); + if (sourceFile) { + return this.getSourceFromDeclaration( + fileName, version, this.stringOf(node) || '', shrink(spanOf(node)), + this.reflector.getStaticSymbol(sourceFile.fileName, declaration.name.text), + declaration, node, sourceFile); + } } break; } diff --git a/packages/platform-browser/test/dom/events/event_manager_spec.ts b/packages/platform-browser/test/dom/events/event_manager_spec.ts index 5f6724364331f..185bf98822757 100644 --- a/packages/platform-browser/test/dom/events/event_manager_spec.ts +++ b/packages/platform-browser/test/dom/events/event_manager_spec.ts @@ -106,7 +106,7 @@ import {el} from '../../../testing/src/browser_util'; }; const manager = new EventManager([domEventPlugin], new FakeNgZone()); - let remover = null; + let remover: any = null; Zone.root.run(() => { remover = manager.addEventListener(element, 'click', handler); }); getDOM().dispatchEvent(element, dispatchedEvent); expect(receivedEvent).toBe(dispatchedEvent); @@ -136,8 +136,8 @@ import {el} from '../../../testing/src/browser_util'; }; const manager = new EventManager([domEventPlugin], new FakeNgZone()); - let remover1 = null; - let remover2 = null; + let remover1: any = null; + let remover2: any = null; Zone.root.run(() => { remover1 = manager.addEventListener(element, 'click', handler1); }); Zone.root.fork({name: 'test'}).run(() => { remover2 = manager.addEventListener(element, 'click', handler2); @@ -172,8 +172,8 @@ import {el} from '../../../testing/src/browser_util'; }; const manager = new EventManager([domEventPlugin], new FakeNgZone()); - let remover1 = null; - let remover2 = null; + let remover1: any = null; + let remover2: any = null; Zone.root.run(() => { remover1 = manager.addEventListener(element, 'click', handler1); }); Zone.root.fork({name: 'test'}).run(() => { remover2 = manager.addEventListener(element, 'click', handler2); @@ -239,8 +239,8 @@ import {el} from '../../../testing/src/browser_util'; }; const manager = new EventManager([domEventPlugin], new FakeNgZone()); - let remover1 = null; - let remover2 = null; + let remover1: any = null; + let remover2: any = null; Zone.root.run(() => { remover1 = manager.addEventListener(element, 'click', handler); }); Zone.root.fork({name: 'test'}).run(() => { remover2 = manager.addEventListener(element, 'click', handler); @@ -274,8 +274,8 @@ import {el} from '../../../testing/src/browser_util'; }; const manager = new EventManager([domEventPlugin], new FakeNgZone()); - let remover1 = null; - let remover2 = null; + let remover1: any = null; + let remover2: any = null; // handler1 is added in root zone Zone.root.run(() => { remover1 = manager.addEventListener(element, 'click', handler1); }); // handler2 is added in 'angular' zone diff --git a/packages/service-worker/worker/testing/fetch.ts b/packages/service-worker/worker/testing/fetch.ts index 3a55f84a6ac43..5176e468011d1 100644 --- a/packages/service-worker/worker/testing/fetch.ts +++ b/packages/service-worker/worker/testing/fetch.ts @@ -92,10 +92,12 @@ export class MockRequest extends MockBody implements Request { readonly referrer: string = ''; readonly referrerPolicy: ReferrerPolicy = 'no-referrer'; readonly type: RequestType = ''; + readonly signal: AbortSignal = null as any; + url: string; constructor(input: string|Request, init: RequestInit = {}) { - super(init !== undefined ? init.body || null : null); + super(init !== undefined ? (init.body as(string | null)) || null : null); if (typeof input !== 'string') { throw 'Not implemented'; } diff --git a/yarn.lock b/yarn.lock index 716af993c41bb..62d76ba545442 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6175,9 +6175,9 @@ rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" -rxjs@5.5.5: - version "5.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.5.tgz#e164f11d38eaf29f56f08c3447f74ff02dd84e97" +rxjs@5.5.6: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" dependencies: symbol-observable "1.0.1" @@ -7186,9 +7186,9 @@ typescript@2.0.10: version "2.0.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.10.tgz#ccdd4ed86fd5550a407101a0814012e1b3fac3dd" -typescript@2.6.x: - version "2.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" +typescript@2.7.x: + version "2.7.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.1.tgz#bb3682c2c791ac90e7c6210b26478a8da085c359" uglify-js@1.2.6, uglify-js@~1.2.5: version "1.2.6"