Skip to content

Commit 5653fad

Browse files
alan-agius4matsko
authored andcommitted
feat: add TypeScript 3 support (angular#25275)
PR Close angular#25275
1 parent c230173 commit 5653fad

File tree

30 files changed

+219
-86
lines changed

30 files changed

+219
-86
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @license
3+
* Copyright Google Inc. All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
9+
import * as compiler from '@angular/compiler';
10+
import * as compilerTesting from '@angular/compiler/testing';
11+
import * as core from '@angular/core';
12+
import * as coreTesting from '@angular/core/testing';
13+
import * as elements from '@angular/elements';
14+
import * as forms from '@angular/forms';
15+
import * as http from '@angular/http';
16+
import * as httpTesting from '@angular/http/testing';
17+
import * as platformBrowser from '@angular/platform-browser';
18+
import * as platformBrowserTesting from '@angular/platform-browser/testing';
19+
import * as platformBrowserDynamic from '@angular/platform-browser-dynamic';
20+
import * as platformServer from '@angular/platform-server';
21+
import * as platformServerTesting from '@angular/platform-server/testing';
22+
import * as platformWebworker from '@angular/platform-webworker';
23+
import * as platformWebworkerDynamic from '@angular/platform-webworker-dynamic';
24+
import * as router from '@angular/router';
25+
import * as routerTesting from '@angular/router/testing';
26+
import * as serviceWorker from '@angular/service-worker';
27+
import * as upgrade from '@angular/upgrade';
28+
29+
export default {
30+
compiler,
31+
compilerTesting,
32+
core,
33+
coreTesting,
34+
elements,
35+
forms,
36+
http,
37+
httpTesting,
38+
platformBrowser,
39+
platformBrowserTesting,
40+
platformBrowserDynamic,
41+
platformServer,
42+
platformServerTesting,
43+
platformWebworker,
44+
platformWebworkerDynamic,
45+
router,
46+
routerTesting,
47+
serviceWorker,
48+
upgrade,
49+
};
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"name": "angular-integration",
3+
"description": "Assert that users with TypeScript 3.0 can type-check an Angular application",
4+
"version": "0.0.0",
5+
"license": "MIT",
6+
"dependencies": {
7+
"@angular/animations": "file:../../dist/packages-dist/animations",
8+
"@angular/common": "file:../../dist/packages-dist/common",
9+
"@angular/compiler": "file:../../dist/packages-dist/compiler",
10+
"@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli",
11+
"@angular/core": "file:../../dist/packages-dist/core",
12+
"@angular/elements": "file:../../dist/packages-dist/elements",
13+
"@angular/forms": "file:../../dist/packages-dist/forms",
14+
"@angular/http": "file:../../dist/packages-dist/http",
15+
"@angular/platform-browser": "file:../../dist/packages-dist/platform-browser",
16+
"@angular/platform-browser-dynamic": "file:../../dist/packages-dist/platform-browser-dynamic",
17+
"@angular/platform-server": "file:../../dist/packages-dist/platform-server",
18+
"@angular/platform-webworker": "file:../../dist/packages-dist/platform-webworker",
19+
"@angular/platform-webworker-dynamic": "file:../../dist/packages-dist/platform-webworker-dynamic",
20+
"@angular/router": "file:../../dist/packages-dist/router",
21+
"@angular/service-worker": "file:../../dist/packages-dist/service-worker",
22+
"@angular/upgrade": "file:../../dist/packages-dist/upgrade",
23+
"@types/jasmine": "2.5.41",
24+
"rxjs": "file:../../node_modules/rxjs",
25+
"typescript": "3.0.x",
26+
"zone.js": "file:../../node_modules/zone.js"
27+
},
28+
"scripts": {
29+
"test": "tsc"
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"compilerOptions": {
3+
"emitDecoratorMetadata": true,
4+
"experimentalDecorators": true,
5+
"module": "commonjs",
6+
"moduleResolution": "node",
7+
"outDir": "../../dist/typings_test_ts30/",
8+
"rootDir": ".",
9+
"target": "es5",
10+
"lib": [
11+
"es5",
12+
"dom",
13+
"es2015.collection",
14+
"es2015.iterable",
15+
"es2015.promise"
16+
],
17+
"types": [],
18+
"strictNullChecks": true
19+
},
20+
"files": [
21+
"include-all.ts",
22+
"node_modules/@types/jasmine/index.d.ts"
23+
]
24+
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
"tslint": "5.7.0",
125125
"tslint-eslint-rules": "4.1.1",
126126
"tsutils": "2.20.0",
127-
"typescript": "2.9.x",
127+
"typescript": "~3.0.1",
128128
"uglify-es": "^3.3.9",
129129
"universal-analytics": "0.4.15",
130130
"vlq": "0.2.2",

packages/bazel/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
},
1212
"peerDependencies": {
1313
"@angular/compiler-cli": "0.0.0-PLACEHOLDER",
14-
"typescript": ">=2.7.2 <2.10"
14+
"typescript": ">=3.0.1 <3.1"
1515
},
1616
"repository": {
1717
"type": "git",

packages/benchpress/test/reporter/console_reporter_spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import {ConsoleReporter, Injector, MeasureValues, SampleDescription} from '../..
1818

1919
function createReporter(
2020
{columnWidth = null, sampleId = null, descriptions = null, metrics = null}: {
21-
columnWidth?: number,
22-
sampleId?: string,
23-
descriptions?: {[key: string]: any}[],
24-
metrics?: {[key: string]: any}
21+
columnWidth?: number | null,
22+
sampleId?: string | null,
23+
descriptions?: {[key: string]: any}[] | null,
24+
metrics?: {[key: string]: any} | null
2525
}) {
2626
log = [];
2727
if (!descriptions) {

packages/common/http/src/xhr.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ export class HttpXhrBackend implements HttpBackend {
314314
}
315315

316316
// Fire the request, and notify the event stream that it was fired.
317-
xhr.send(reqBody);
317+
xhr.send(reqBody !);
318318
observer.next({type: HttpEventType.Sent});
319319

320320
// This is the return from the Observable function, which is the

packages/compiler-cli/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
"source-map": "^0.6.1"
2020
},
2121
"peerDependencies": {
22-
"typescript": ">=2.7.2 <2.10",
23-
"@angular/compiler": "0.0.0-PLACEHOLDER"
22+
"@angular/compiler": "0.0.0-PLACEHOLDER",
23+
"typescript": ">=3.0.1 <3.1"
2424
},
2525
"engines" : {
2626
"node" : ">=8.0"

packages/compiler-cli/src/metadata/collector.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {Evaluator, errorSymbol, recordMapEntry} from './evaluator';
1212
import {ClassMetadata, ConstructorMetadata, FunctionMetadata, InterfaceMetadata, METADATA_VERSION, MemberMetadata, MetadataEntry, MetadataError, MetadataMap, MetadataSymbolicBinaryExpression, MetadataSymbolicCallExpression, MetadataSymbolicExpression, MetadataSymbolicIfExpression, MetadataSymbolicIndexExpression, MetadataSymbolicPrefixExpression, MetadataSymbolicReferenceExpression, MetadataSymbolicSelectExpression, MetadataSymbolicSpreadExpression, MetadataValue, MethodMetadata, ModuleExportMetadata, ModuleMetadata, isClassMetadata, isConstructorMetadata, isFunctionMetadata, isMetadataError, isMetadataGlobalReferenceExpression, isMetadataImportDefaultReference, isMetadataImportedSymbolReferenceExpression, isMetadataSymbolicExpression, isMetadataSymbolicReferenceExpression, isMetadataSymbolicSelectExpression, isMethodMetadata} from './schema';
1313
import {Symbols} from './symbols';
1414

15-
const isStatic = (node: ts.Node) => ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static;
15+
const isStatic = (node: ts.Declaration) =>
16+
ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static;
1617

1718
/**
1819
* A set of collector options to use when collecting metadata.
@@ -277,8 +278,8 @@ export class MetadataCollector {
277278
}
278279
});
279280

280-
const isExport = (node: ts.Node) =>
281-
sourceFile.isDeclarationFile || ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export;
281+
const isExport = (node: ts.Node) => sourceFile.isDeclarationFile ||
282+
ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export;
282283
const isExportedIdentifier = (identifier?: ts.Identifier) =>
283284
identifier && exportMap.has(identifier.text);
284285
const isExported =

packages/compiler-cli/src/transformers/lower_expressions.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ function isEligibleForLowering(node: ts.Node | undefined): boolean {
224224
return false;
225225
case ts.SyntaxKind.VariableDeclaration:
226226
// Avoid lowering expressions already in an exported variable declaration
227-
return (ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) == 0;
227+
return (ts.getCombinedModifierFlags(node as ts.VariableDeclaration) &
228+
ts.ModifierFlags.Export) == 0;
228229
}
229230
return isEligibleForLowering(node.parent);
230231
}
@@ -370,7 +371,7 @@ function createExportTableFor(sourceFile: ts.SourceFile): Set<string> {
370371
case ts.SyntaxKind.ClassDeclaration:
371372
case ts.SyntaxKind.FunctionDeclaration:
372373
case ts.SyntaxKind.InterfaceDeclaration:
373-
if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) != 0) {
374+
if ((ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export) != 0) {
374375
const classDeclaration =
375376
node as(ts.ClassDeclaration | ts.FunctionDeclaration | ts.InterfaceDeclaration);
376377
const name = classDeclaration.name;
@@ -385,7 +386,7 @@ function createExportTableFor(sourceFile: ts.SourceFile): Set<string> {
385386
break;
386387
case ts.SyntaxKind.VariableDeclaration:
387388
const variableDeclaration = node as ts.VariableDeclaration;
388-
if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) != 0 &&
389+
if ((ts.getCombinedModifierFlags(variableDeclaration) & ts.ModifierFlags.Export) != 0 &&
389390
variableDeclaration.name.kind == ts.SyntaxKind.Identifier) {
390391
const name = variableDeclaration.name as ts.Identifier;
391392
exportTable.add(name.text);

packages/compiler-cli/src/transformers/program.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,14 @@ const defaultEmitCallback: TsEmitCallback =
102102
* Minimum supported TypeScript version
103103
* ∀ supported typescript version v, v >= MIN_TS_VERSION
104104
*/
105-
const MIN_TS_VERSION = '2.7.2';
105+
const MIN_TS_VERSION = '3.0.1';
106106

107107
/**
108108
* Supremum of supported TypeScript versions
109109
* ∀ supported typescript version v, v < MAX_TS_VERSION
110110
* MAX_TS_VERSION is not considered as a supported TypeScript version
111111
*/
112-
const MAX_TS_VERSION = '2.10.0';
112+
const MAX_TS_VERSION = '3.1.0';
113113

114114
class AngularCompilerProgram implements Program {
115115
private rootNames: string[];

packages/compiler-cli/test/diagnostics/expression_diagnostics_spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ describe('expression diagnostics', () => {
2929
registry = ts.createDocumentRegistry(false, '/src');
3030
host = new MockLanguageServiceHost(['app/app.component.ts'], FILES, '/src');
3131
service = ts.createLanguageService(host, registry);
32-
const program = service.getProgram();
32+
const program = service.getProgram() !;
3333
const checker = program.getTypeChecker();
3434
const options: CompilerOptions = Object.create(host.getCompilationSettings());
3535
options.genDir = '/dist';
3636
options.basePath = '/src';
37-
const symbolResolverHost = new ReflectorHost(() => program, host, options);
38-
context = new DiagnosticContext(service, program, checker, symbolResolverHost);
37+
const symbolResolverHost = new ReflectorHost(() => program !, host, options);
38+
context = new DiagnosticContext(service, program !, checker, symbolResolverHost);
3939
type = context.getStaticSymbol('app/app.component.ts', 'AppComponent');
4040
});
4141

packages/compiler-cli/test/diagnostics/typescript_symbols_spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ describe('symbol query', () => {
3939
const host = new MockLanguageServiceHost(
4040
['/quickstart/app/app.component.ts'], QUICKSTART, '/quickstart');
4141
const service = ts.createLanguageService(host, registry);
42-
program = service.getProgram();
42+
program = service.getProgram() !;
4343
checker = program.getTypeChecker();
4444
sourceFile = program.getSourceFile('/quickstart/app/app.component.ts') !;
4545
const options: CompilerOptions = Object.create(host.getCompilationSettings());

packages/compiler-cli/test/metadata/collector_spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ describe('Collector', () => {
4040
'interface-reference.ts'
4141
]);
4242
service = ts.createLanguageService(host, documentRegistry);
43-
program = service.getProgram();
43+
program = service.getProgram() !;
4444
collector = new MetadataCollector({quotedNames: true});
4545
});
4646

@@ -1128,7 +1128,7 @@ describe('Collector', () => {
11281128
function override(fileName: string, content: string) {
11291129
host.overrideFile(fileName, content);
11301130
host.addFile(fileName);
1131-
program = service.getProgram();
1131+
program = service.getProgram() !;
11321132
}
11331133

11341134
function collectSource(content: string): ModuleMetadata {

packages/compiler-cli/test/metadata/evaluator_spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('Evaluator', () => {
2929
'newExpression.ts', 'errors.ts', 'declared.ts'
3030
]);
3131
service = ts.createLanguageService(host, documentRegistry);
32-
program = service.getProgram();
32+
program = service.getProgram() !;
3333
typeChecker = program.getTypeChecker();
3434
symbols = new Symbols(null as any as ts.SourceFile);
3535
evaluator = new Evaluator(symbols, new Map());

packages/compiler-cli/test/metadata/symbols_spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ describe('Symbols', () => {
4242
beforeEach(() => {
4343
host = new Host(FILES, ['consts.ts', 'expressions.ts', 'imports.ts']);
4444
service = ts.createLanguageService(host);
45-
program = service.getProgram();
45+
program = service.getProgram() !;
4646
expressions = program.getSourceFile('expressions.ts') !;
4747
imports = program.getSourceFile('imports.ts') !;
4848
});

packages/compiler-cli/test/metadata/typescript.mocks.ts

+24-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
import * as fs from 'fs';
10+
import * as path from 'path';
1011
import * as ts from 'typescript';
1112

1213
export interface Directory { [name: string]: (Directory|string); }
@@ -54,8 +55,10 @@ export class Host implements ts.LanguageServiceHost {
5455
if (this.overrides.has(fileName)) {
5556
return this.overrides.get(fileName);
5657
}
57-
if (fileName.endsWith('lib.d.ts')) {
58-
return fs.readFileSync(ts.getDefaultLibFilePath(this.getCompilationSettings()), 'utf8');
58+
if (/lib(.*)\.d\.ts/.test(fileName)) {
59+
const libDirPath = path.dirname(ts.getDefaultLibFilePath(this.getCompilationSettings()));
60+
const libPath = path.join(libDirPath, fileName);
61+
return fs.readFileSync(libPath, 'utf8');
5962
}
6063
const current = open(this.directory, fileName);
6164
if (typeof current === 'string') return current;
@@ -76,6 +79,9 @@ export function open(directory: Directory, fileName: string): Directory|string|u
7679
}
7780

7881
export class MockNode implements ts.Node {
82+
decorators?: ts.NodeArray<ts.Decorator>;
83+
modifiers?: ts.NodeArray<ts.Modifier>;
84+
parent !: ts.Node;
7985
constructor(
8086
public kind: ts.SyntaxKind = ts.SyntaxKind.Identifier, public flags: ts.NodeFlags = 0,
8187
public pos: number = 0, public end: number = 0) {}
@@ -101,6 +107,11 @@ export class MockNode implements ts.Node {
101107
}
102108

103109
export class MockIdentifier extends MockNode implements ts.Identifier {
110+
originalKeywordKind?: ts.SyntaxKind;
111+
isInJSDocNamespace?: boolean;
112+
decorators?: ts.NodeArray<ts.Decorator>;
113+
modifiers?: ts.NodeArray<ts.Modifier>;
114+
parent !: ts.Node;
104115
public text: string;
105116
// TODO(issue/24571): remove '!'.
106117
public escapedText !: ts.__String;
@@ -124,6 +135,12 @@ export class MockIdentifier extends MockNode implements ts.Identifier {
124135
}
125136

126137
export class MockVariableDeclaration extends MockNode implements ts.VariableDeclaration {
138+
parent !: ts.VariableDeclarationList | ts.CatchClause;
139+
exclamationToken?: ts.Token<ts.SyntaxKind.ExclamationToken>;
140+
type?: ts.TypeNode;
141+
initializer?: ts.Expression;
142+
decorators?: ts.NodeArray<ts.Decorator>;
143+
modifiers?: ts.NodeArray<ts.Modifier>;
127144
// tslint:disable-next-line
128145
public _declarationBrand: any;
129146

@@ -140,6 +157,11 @@ export class MockVariableDeclaration extends MockNode implements ts.VariableDecl
140157
}
141158

142159
export class MockSymbol implements ts.Symbol {
160+
declarations !: ts.Declaration[];
161+
valueDeclaration !: ts.Declaration;
162+
members?: ts.UnderscoreEscapedMap<ts.Symbol>;
163+
exports?: ts.UnderscoreEscapedMap<ts.Symbol>;
164+
globalExports?: ts.UnderscoreEscapedMap<ts.Symbol>;
143165
// TODO(issue/24571): remove '!'.
144166
public escapedName !: ts.__String;
145167
constructor(

packages/compiler-cli/test/test_support.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ function createTestSupportFor(basePath: string) {
8383
'lib': [
8484
path.resolve(basePath, 'node_modules/typescript/lib/lib.es6.d.ts'),
8585
],
86-
...overrideOptions,
86+
'paths': {'@angular/*': ['./node_modules/@angular/*']}, ...overrideOptions,
8787
};
8888
}
8989

packages/compiler/src/config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class CompilerConfig {
2626
defaultEncapsulation?: ViewEncapsulation,
2727
useJit?: boolean,
2828
jitDevMode?: boolean,
29-
missingTranslation?: MissingTranslationStrategy,
29+
missingTranslation?: MissingTranslationStrategy|null,
3030
preserveWhitespaces?: boolean,
3131
strictInjectionParameters?: boolean,
3232
} = {}) {

packages/compiler/test/template_parser/template_parser_spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1137,8 +1137,8 @@ Binding to attribute 'onEvent' is disallowed for security reasons ("<my-componen
11371137

11381138
function createDir(
11391139
selector: string, {providers = null, viewProviders = null, deps = [], queries = []}: {
1140-
providers?: CompileProviderMetadata[],
1141-
viewProviders?: CompileProviderMetadata[],
1140+
providers?: CompileProviderMetadata[] | null,
1141+
viewProviders?: CompileProviderMetadata[] | null,
11421142
deps?: string[],
11431143
queries?: string[]
11441144
} = {}): CompileDirectiveSummary {

packages/core/src/sanitization/inert_body.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export class InertBodyHelper {
8080
const xhr = new XMLHttpRequest();
8181
xhr.responseType = 'document';
8282
xhr.open('GET', 'data:text/html;charset=utf-8,' + html, false);
83-
xhr.send(null);
83+
xhr.send(undefined);
8484
const body: HTMLBodyElement = xhr.response.body;
8585
body.removeChild(body.firstChild !);
8686
return body;

0 commit comments

Comments
 (0)