build: upgrade jasmine (and related typings) to latest version (#19904)
With these changes, the types are a little stricter now and also not
compatible with Protractor's jasmine-like syntax. So, we have to also
use `@types/jasminewd2` for e2e tests (but not for non-e2e tests).
I also had to "augment" `@types/jasminewd2`, because the latest
typings from [DefinitelyTyped][1] do not reflect the fact that the
`jasminewd2` version (v2.1.0) currently used by Protractor supports
passing a `done` callback to a spec.
[1]: 566e039485/types/jasminewd2/index.d.ts (L9-L15)
Fixes #23952
Closes #24733
PR Close #19904
This commit is contained in:
parent
1e74ea9e60
commit
00c110b055
4
build.sh
4
build.sh
|
@ -409,6 +409,10 @@ if [[ ${BUILD_ALL} == true && ${TYPECHECK_ALL} == true ]]; then
|
||||||
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
|
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
|
||||||
$TSC -p ${TSCONFIG}
|
$TSC -p ${TSCONFIG}
|
||||||
travisFoldEnd "tsc -p ${TSCONFIG}"
|
travisFoldEnd "tsc -p ${TSCONFIG}"
|
||||||
|
TSCONFIG="packages/examples/tsconfig.json"
|
||||||
|
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
|
||||||
|
$TSC -p ${TSCONFIG}
|
||||||
|
travisFoldEnd "tsc -p ${TSCONFIG}"
|
||||||
TSCONFIG="modules/tsconfig.json"
|
TSCONFIG="modules/tsconfig.json"
|
||||||
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
|
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
|
||||||
$TSC -p ${TSCONFIG}
|
$TSC -p ${TSCONFIG}
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../dist/e2e",
|
"outDir": "../dist/e2e",
|
||||||
"types": ["jasmine"],
|
"types": [
|
||||||
|
"jasmine",
|
||||||
|
"jasminewd2"
|
||||||
|
],
|
||||||
"skipLibCheck": true
|
"skipLibCheck": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,9 @@
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jasmine": "file:../../node_modules/@types/jasmine",
|
|
||||||
"@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli",
|
"@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli",
|
||||||
|
"@types/jasmine": "file:../../node_modules/@types/jasmine",
|
||||||
|
"@types/jasminewd2": "file:../../node_modules/@types/jasminewd2",
|
||||||
"concurrently": "3.4.0",
|
"concurrently": "3.4.0",
|
||||||
"lite-server": "2.2.2",
|
"lite-server": "2.2.2",
|
||||||
"protractor": "file:../../node_modules/protractor",
|
"protractor": "file:../../node_modules/protractor",
|
||||||
|
|
|
@ -8,10 +8,11 @@
|
||||||
|
|
||||||
// This file contains all ambient imports needed to compile the modules/ source code
|
// This file contains all ambient imports needed to compile the modules/ source code
|
||||||
|
|
||||||
/// <reference path="../node_modules/zone.js/dist/zone.js.d.ts" />
|
|
||||||
/// <reference path="../node_modules/@types/hammerjs/index.d.ts" />
|
/// <reference path="../node_modules/@types/hammerjs/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
|
/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
|
||||||
|
/// <reference path="../node_modules/@types/jasminewd2/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/node/index.d.ts" />
|
/// <reference path="../node_modules/@types/node/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/selenium-webdriver/index.d.ts" />
|
/// <reference path="../node_modules/zone.js/dist/zone.js.d.ts" />
|
||||||
|
/// <reference path="../tools/types-ext/jasminewd2.d.ts" />
|
||||||
/// <reference path="./es6-subset.d.ts" />
|
/// <reference path="./es6-subset.d.ts" />
|
||||||
/// <reference path="./system.d.ts" />
|
/// <reference path="./system.d.ts" />
|
||||||
|
|
|
@ -47,7 +47,8 @@
|
||||||
"@types/diff": "^3.2.2",
|
"@types/diff": "^3.2.2",
|
||||||
"@types/fs-extra": "4.0.2",
|
"@types/fs-extra": "4.0.2",
|
||||||
"@types/hammerjs": "2.0.35",
|
"@types/hammerjs": "2.0.35",
|
||||||
"@types/jasmine": "2.2.22-alpha",
|
"@types/jasmine": "^2.8.8",
|
||||||
|
"@types/jasminewd2": "^2.0.3",
|
||||||
"@types/minimist": "^1.2.0",
|
"@types/minimist": "^1.2.0",
|
||||||
"@types/node": "6.0.88",
|
"@types/node": "6.0.88",
|
||||||
"@types/selenium-webdriver": "3.0.7",
|
"@types/selenium-webdriver": "3.0.7",
|
||||||
|
@ -84,8 +85,8 @@
|
||||||
"hammerjs": "2.0.8",
|
"hammerjs": "2.0.8",
|
||||||
"husky": "^0.14.3",
|
"husky": "^0.14.3",
|
||||||
"incremental-dom": "0.4.1",
|
"incremental-dom": "0.4.1",
|
||||||
"jasmine": "2.4.1",
|
"jasmine": "2.8",
|
||||||
"jasmine-core": "2.4.1",
|
"jasmine-core": "2.8",
|
||||||
"jpm": "1.3.1",
|
"jpm": "1.3.1",
|
||||||
"karma": "0.13.20",
|
"karma": "0.13.20",
|
||||||
"karma-browserstack-launcher": "0.1.9",
|
"karma-browserstack-launcher": "0.1.9",
|
||||||
|
|
|
@ -30,7 +30,7 @@ export interface TestSupport {
|
||||||
writeFiles(...mockDirs: {[fileName: string]: string}[]): void;
|
writeFiles(...mockDirs: {[fileName: string]: string}[]): void;
|
||||||
shouldExist(fileName: string): void;
|
shouldExist(fileName: string): void;
|
||||||
shouldNotExist(fileName: string): void;
|
shouldNotExist(fileName: string): void;
|
||||||
runOneBuild(): void;
|
runOneBuild(): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setup(
|
export function setup(
|
||||||
|
|
|
@ -48,13 +48,11 @@ import {Options, PerfLogEvent, PerfLogFeatures, UserMetric, WebDriverAdapter} fr
|
||||||
const metric = createMetric(
|
const metric = createMetric(
|
||||||
[[]], new PerfLogFeatures(),
|
[[]], new PerfLogFeatures(),
|
||||||
{userMetrics: {'loadTime': 'time to load', 'content': 'time to see content'}});
|
{userMetrics: {'loadTime': 'time to load', 'content': 'time to see content'}});
|
||||||
metric.beginMeasure()
|
metric.beginMeasure().then(() => metric.endMeasure(true)).then(values => {
|
||||||
.then((_) => metric.endMeasure(true))
|
expect(values['loadTime']).toBe(25);
|
||||||
.then((values: {[key: string]: string}) => {
|
expect(values['content']).toBe(250);
|
||||||
expect(values['loadTime']).toBe(25);
|
async.done();
|
||||||
expect(values['content']).toBe(250);
|
});
|
||||||
async.done();
|
|
||||||
});
|
|
||||||
|
|
||||||
wdAdapter.data['loadTime'] = 25;
|
wdAdapter.data['loadTime'] = 25;
|
||||||
// Wait before setting 2nd property.
|
// Wait before setting 2nd property.
|
||||||
|
|
|
@ -166,12 +166,12 @@ import {expect} from '@angular/platform-browser/testing/src/matchers';
|
||||||
fixture.componentInstance.currentComponent = Module2InjectedComponent;
|
fixture.componentInstance.currentComponent = Module2InjectedComponent;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef'];
|
const moduleRef = fixture.componentInstance.ngComponentOutlet['_moduleRef'] !;
|
||||||
spyOn(moduleRef, 'destroy').and.callThrough();
|
spyOn(moduleRef, 'destroy').and.callThrough();
|
||||||
|
|
||||||
expect(moduleRef !.destroy).not.toHaveBeenCalled();
|
expect(moduleRef.destroy).not.toHaveBeenCalled();
|
||||||
fixture.destroy();
|
fixture.destroy();
|
||||||
expect(moduleRef !.destroy).toHaveBeenCalled();
|
expect(moduleRef.destroy).toHaveBeenCalled();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should not re-create moduleRef when it didn\'t actually change', async(() => {
|
it('should not re-create moduleRef when it didn\'t actually change', async(() => {
|
||||||
|
|
|
@ -16,10 +16,9 @@ export class FeatureComponent {
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [FeatureComponent],
|
declarations: [FeatureComponent],
|
||||||
imports: [RouterModule.forChild([
|
imports: [RouterModule.forChild([
|
||||||
{path: '', component: FeatureComponent}, {path: 'd', loadChildren: './default.module'} {
|
{path: '', component: FeatureComponent},
|
||||||
path: 'e',
|
{path: 'd', loadChildren: './default.module'},
|
||||||
loadChildren: 'feature/feature.module#FeatureModule'
|
{path: 'e', loadChildren: 'feature/feature.module#FeatureModule'},
|
||||||
}
|
|
||||||
])]
|
])]
|
||||||
})
|
})
|
||||||
export class Feature2Module {
|
export class Feature2Module {
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {CompilerHost, CompilerOptions, LazyRoute} from './transformers/api';
|
import {CompilerOptions} from './transformers/api';
|
||||||
import {getOriginalReferences} from './transformers/compiler_host';
|
import {getOriginalReferences} from './transformers/compiler_host';
|
||||||
import {createProgram} from './transformers/entry_points';
|
import {createProgram} from './transformers/entry_points';
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ describe('expression diagnostics', () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reject(template: string, expected: string | RegExp) {
|
function reject(template: string, expected: string) {
|
||||||
const info = getDiagnosticTemplateInfo(context, type, 'app/app.component.html', template);
|
const info = getDiagnosticTemplateInfo(context, type, 'app/app.component.html', template);
|
||||||
if (info) {
|
if (info) {
|
||||||
const diagnostics = getTemplateExpressionDiagnostics(info);
|
const diagnostics = getTemplateExpressionDiagnostics(info);
|
||||||
|
@ -240,4 +240,4 @@ const FILES: Directory = {
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {MetadataCollector} from '../../src/metadata/collector';
|
import {MetadataCollector} from '../../src/metadata/collector';
|
||||||
import {ClassMetadata, ConstructorMetadata, METADATA_VERSION, MetadataEntry, ModuleMetadata, isClassMetadata, isMetadataGlobalReferenceExpression} from '../../src/metadata/schema';
|
import {ClassMetadata, ConstructorMetadata, METADATA_VERSION, MetadataEntry, MetadataMap, MetadataSymbolicExpression, ModuleMetadata, isClassMetadata, isMetadataGlobalReferenceExpression} from '../../src/metadata/schema';
|
||||||
|
|
||||||
import {Directory, Host, expectValidSources} from './typescript.mocks';
|
import {Directory, Host, expectValidSources} from './typescript.mocks';
|
||||||
|
|
||||||
|
@ -269,9 +269,11 @@ describe('Collector', () => {
|
||||||
it('should provide any reference for an any ctor parameter type', () => {
|
it('should provide any reference for an any ctor parameter type', () => {
|
||||||
const casesAny = <ClassMetadata>casesMetadata.metadata['CaseAny'];
|
const casesAny = <ClassMetadata>casesMetadata.metadata['CaseAny'];
|
||||||
expect(casesAny).toBeTruthy();
|
expect(casesAny).toBeTruthy();
|
||||||
const ctorData = casesAny.members !['__ctor__'];
|
const ctorData = casesAny.members !['__ctor__'] as ConstructorMetadata[];
|
||||||
expect(ctorData).toEqual(
|
expect(ctorData).toEqual([{
|
||||||
[{__symbolic: 'constructor', parameters: [{__symbolic: 'reference', name: 'any'}]}]);
|
__symbolic: 'constructor',
|
||||||
|
parameters: [{__symbolic: 'reference', name: 'any'} as MetadataSymbolicExpression]
|
||||||
|
}]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should record annotations on set and get declarations', () => {
|
it('should record annotations on set and get declarations', () => {
|
||||||
|
@ -285,7 +287,8 @@ describe('Collector', () => {
|
||||||
arguments: ['firstName']
|
arguments: ['firstName']
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
});
|
} as any as MetadataMap); // TODO: Review use of `any` here (#19904)
|
||||||
|
|
||||||
const caseGetProp = <ClassMetadata>casesMetadata.metadata['GetProp'];
|
const caseGetProp = <ClassMetadata>casesMetadata.metadata['GetProp'];
|
||||||
expect(caseGetProp.members).toEqual(propertyData(11));
|
expect(caseGetProp.members).toEqual(propertyData(11));
|
||||||
const caseSetProp = <ClassMetadata>casesMetadata.metadata['SetProp'];
|
const caseSetProp = <ClassMetadata>casesMetadata.metadata['SetProp'];
|
||||||
|
@ -297,8 +300,7 @@ describe('Collector', () => {
|
||||||
it('should record references to parameterized types', () => {
|
it('should record references to parameterized types', () => {
|
||||||
const casesForIn = <ClassMetadata>casesMetadata.metadata['NgFor'];
|
const casesForIn = <ClassMetadata>casesMetadata.metadata['NgFor'];
|
||||||
expect(casesForIn).toEqual({
|
expect(casesForIn).toEqual({
|
||||||
__symbolic: 'class',
|
__symbolic: 'class', decorators: [{
|
||||||
decorators: [{
|
|
||||||
__symbolic: 'call',
|
__symbolic: 'call',
|
||||||
expression: {
|
expression: {
|
||||||
__symbolic: 'reference',
|
__symbolic: 'reference',
|
||||||
|
@ -308,17 +310,17 @@ describe('Collector', () => {
|
||||||
character: 7
|
character: 7
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
members: {
|
members: {
|
||||||
__ctor__: [{
|
__ctor__: [{
|
||||||
__symbolic: 'constructor',
|
__symbolic: 'constructor',
|
||||||
parameters: [{
|
parameters: [{
|
||||||
__symbolic: 'reference',
|
__symbolic: 'reference',
|
||||||
name: 'ClassReference',
|
name: 'ClassReference',
|
||||||
arguments: [{__symbolic: 'reference', name: 'NgForRow'}]
|
arguments: [{__symbolic: 'reference', name: 'NgForRow'}]
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
});
|
} as any as ClassMetadata); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should report errors for destructured imports', () => {
|
it('should report errors for destructured imports', () => {
|
||||||
|
@ -358,9 +360,9 @@ describe('Collector', () => {
|
||||||
const someClass = <ClassMetadata>metadata.metadata['SomeClass'];
|
const someClass = <ClassMetadata>metadata.metadata['SomeClass'];
|
||||||
const ctor = <ConstructorMetadata>someClass.members !['__ctor__'][0];
|
const ctor = <ConstructorMetadata>someClass.members !['__ctor__'][0];
|
||||||
const parameters = ctor.parameters;
|
const parameters = ctor.parameters;
|
||||||
expect(parameters).toEqual([
|
expect(parameters).toEqual([{
|
||||||
{__symbolic: 'reference', module: 'angular2/common', name: 'NgFor', line: 6, character: 29}
|
__symbolic: 'reference', module: 'angular2/common', name: 'NgFor', line: 6, character: 29
|
||||||
]);
|
} as MetadataSymbolicExpression]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should record all exported classes', () => {
|
it('should record all exported classes', () => {
|
||||||
|
@ -443,9 +445,9 @@ describe('Collector', () => {
|
||||||
const someClass = <ClassMetadata>metadata.metadata['SomeClass'];
|
const someClass = <ClassMetadata>metadata.metadata['SomeClass'];
|
||||||
const ctor = <ConstructorMetadata>someClass.members !['__ctor__'][0];
|
const ctor = <ConstructorMetadata>someClass.members !['__ctor__'][0];
|
||||||
const parameters = ctor.parameters;
|
const parameters = ctor.parameters;
|
||||||
expect(parameters).toEqual([
|
expect(parameters).toEqual([{
|
||||||
{__symbolic: 'reference', module: 'angular2/common', name: 'NgFor', line: 6, character: 29}
|
__symbolic: 'reference', module: 'angular2/common', name: 'NgFor', line: 6, character: 29
|
||||||
]);
|
} as MetadataSymbolicExpression]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to collect the value of an enum', () => {
|
it('should be able to collect the value of an enum', () => {
|
||||||
|
@ -533,7 +535,7 @@ describe('Collector', () => {
|
||||||
arguments: ['a']
|
arguments: ['a']
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}]);
|
}] as any as MetadataSymbolicExpression[]); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to collect a static field', () => {
|
it('should be able to collect a static field', () => {
|
||||||
|
@ -576,7 +578,7 @@ describe('Collector', () => {
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
}]);
|
}] as any as MetadataSymbolicExpression[]); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to collect a method with a conditional expression', () => {
|
it('should be able to collect a method with a conditional expression', () => {
|
||||||
|
@ -764,7 +766,7 @@ describe('Collector', () => {
|
||||||
}]],
|
}]],
|
||||||
parameters: [{__symbolic: 'reference', name: 'any'}]
|
parameters: [{__symbolic: 'reference', name: 'any'}]
|
||||||
}]
|
}]
|
||||||
});
|
} as any as MetadataMap); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('with interpolations', () => {
|
describe('with interpolations', () => {
|
||||||
|
@ -868,7 +870,7 @@ describe('Collector', () => {
|
||||||
{__symbolic: 'reference', module: './foo', name: 'Foo', line: 3, character: 24}
|
{__symbolic: 'reference', module: './foo', name: 'Foo', line: 3, character: 24}
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
});
|
} as any as MetadataMap); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should treat exported class expressions as a class', () => {
|
it('should treat exported class expressions as a class', () => {
|
||||||
|
|
|
@ -1747,7 +1747,7 @@ describe('ngc transformer command-line', () => {
|
||||||
const exitCode =
|
const exitCode =
|
||||||
main(['-p', path.join(basePath, 'src/tsconfig.json')], message => messages.push(message));
|
main(['-p', path.join(basePath, 'src/tsconfig.json')], message => messages.push(message));
|
||||||
expect(exitCode).toBe(1, 'Compile was expected to fail');
|
expect(exitCode).toBe(1, 'Compile was expected to fail');
|
||||||
expect(messages[0]).toContain(['Tagged template expressions are not supported in metadata']);
|
expect(messages[0]).toContain('Tagged template expressions are not supported in metadata');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Regression: #20076
|
// Regression: #20076
|
||||||
|
|
|
@ -502,7 +502,7 @@ describe('TypeScriptNodeEmitter', () => {
|
||||||
generatedColumn: 0,
|
generatedColumn: 0,
|
||||||
originalLine: 1,
|
originalLine: 1,
|
||||||
originalColumn: 0,
|
originalColumn: 0,
|
||||||
name: null
|
name: null ! // TODO: Review use of `!` here (#19904)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
source: sourceUrl,
|
source: sourceUrl,
|
||||||
|
@ -510,7 +510,7 @@ describe('TypeScriptNodeEmitter', () => {
|
||||||
generatedColumn: 16,
|
generatedColumn: 16,
|
||||||
originalLine: 1,
|
originalLine: 1,
|
||||||
originalColumn: 26,
|
originalColumn: 26,
|
||||||
name: null
|
name: null ! // TODO: Review use of `!` here (#19904)
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
|
@ -373,8 +373,8 @@ describe('ng program', () => {
|
||||||
{rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host});
|
{rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host});
|
||||||
program.loadNgStructureAsync().then(() => {
|
program.loadNgStructureAsync().then(() => {
|
||||||
program.emit();
|
program.emit();
|
||||||
const factory =
|
const ngFactoryPath = path.resolve(testSupport.basePath, 'built/src/main.ngfactory.js');
|
||||||
fs.readFileSync(path.resolve(testSupport.basePath, 'built/src/main.ngfactory.js'));
|
const factory = fs.readFileSync(ngFactoryPath, 'utf8');
|
||||||
expect(factory).toContain('Hello world!');
|
expect(factory).toContain('Hello world!');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -677,8 +677,9 @@ describe('ng program', () => {
|
||||||
program.listLazyRoutes();
|
program.listLazyRoutes();
|
||||||
program.emit();
|
program.emit();
|
||||||
|
|
||||||
const lazyNgFactory =
|
const ngFactoryPath = path.resolve(testSupport.basePath, 'built/src/lazy/lazy.ngfactory.js');
|
||||||
fs.readFileSync(path.resolve(testSupport.basePath, 'built/src/lazy/lazy.ngfactory.js'));
|
const lazyNgFactory = fs.readFileSync(ngFactoryPath, 'utf8');
|
||||||
|
|
||||||
expect(lazyNgFactory).toContain('import * as i1 from "./lazy";');
|
expect(lazyNgFactory).toContain('import * as i1 from "./lazy";');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -735,8 +736,10 @@ describe('ng program', () => {
|
||||||
expect(normalizeRoutes(program.listLazyRoutes('src/main#MainModule'))).toEqual([
|
expect(normalizeRoutes(program.listLazyRoutes('src/main#MainModule'))).toEqual([
|
||||||
{
|
{
|
||||||
module: {name: 'MainModule', filePath: path.resolve(testSupport.basePath, 'src/main.ts')},
|
module: {name: 'MainModule', filePath: path.resolve(testSupport.basePath, 'src/main.ts')},
|
||||||
referencedModule:
|
referencedModule: {
|
||||||
{name: undefined, filePath: path.resolve(testSupport.basePath, 'src/child.ts')},
|
name: undefined as any as string, // TODO: Review use of `any` here (#19904)
|
||||||
|
filePath: path.resolve(testSupport.basePath, 'src/child.ts')
|
||||||
|
},
|
||||||
route: './child'
|
route: './child'
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -103,83 +103,86 @@ import * as core from '@angular/core';
|
||||||
});
|
});
|
||||||
|
|
||||||
it('const enums should be equal', () => {
|
it('const enums should be equal', () => {
|
||||||
expect(compilerCore.NodeFlags.None).toBe(core.ɵNodeFlags.None);
|
const expectToBe = (val1: any, val2: any) => expect(val1).toBe(val2);
|
||||||
expect(compilerCore.NodeFlags.TypeElement).toBe(core.ɵNodeFlags.TypeElement);
|
|
||||||
expect(compilerCore.NodeFlags.TypeText).toBe(core.ɵNodeFlags.TypeText);
|
|
||||||
expect(compilerCore.NodeFlags.ProjectedTemplate).toBe(core.ɵNodeFlags.ProjectedTemplate);
|
|
||||||
expect(compilerCore.NodeFlags.CatRenderNode).toBe(core.ɵNodeFlags.CatRenderNode);
|
|
||||||
expect(compilerCore.NodeFlags.TypeNgContent).toBe(core.ɵNodeFlags.TypeNgContent);
|
|
||||||
expect(compilerCore.NodeFlags.TypePipe).toBe(core.ɵNodeFlags.TypePipe);
|
|
||||||
expect(compilerCore.NodeFlags.TypePureArray).toBe(core.ɵNodeFlags.TypePureArray);
|
|
||||||
expect(compilerCore.NodeFlags.TypePureObject).toBe(core.ɵNodeFlags.TypePureObject);
|
|
||||||
expect(compilerCore.NodeFlags.TypePurePipe).toBe(core.ɵNodeFlags.TypePurePipe);
|
|
||||||
expect(compilerCore.NodeFlags.CatPureExpression).toBe(core.ɵNodeFlags.CatPureExpression);
|
|
||||||
expect(compilerCore.NodeFlags.TypeValueProvider).toBe(core.ɵNodeFlags.TypeValueProvider);
|
|
||||||
expect(compilerCore.NodeFlags.TypeClassProvider).toBe(core.ɵNodeFlags.TypeClassProvider);
|
|
||||||
expect(compilerCore.NodeFlags.TypeFactoryProvider).toBe(core.ɵNodeFlags.TypeFactoryProvider);
|
|
||||||
expect(compilerCore.NodeFlags.TypeUseExistingProvider)
|
|
||||||
.toBe(core.ɵNodeFlags.TypeUseExistingProvider);
|
|
||||||
expect(compilerCore.NodeFlags.LazyProvider).toBe(core.ɵNodeFlags.LazyProvider);
|
|
||||||
expect(compilerCore.NodeFlags.PrivateProvider).toBe(core.ɵNodeFlags.PrivateProvider);
|
|
||||||
expect(compilerCore.NodeFlags.TypeDirective).toBe(core.ɵNodeFlags.TypeDirective);
|
|
||||||
expect(compilerCore.NodeFlags.Component).toBe(core.ɵNodeFlags.Component);
|
|
||||||
expect(compilerCore.NodeFlags.CatProviderNoDirective)
|
|
||||||
.toBe(core.ɵNodeFlags.CatProviderNoDirective);
|
|
||||||
expect(compilerCore.NodeFlags.CatProvider).toBe(core.ɵNodeFlags.CatProvider);
|
|
||||||
expect(compilerCore.NodeFlags.OnInit).toBe(core.ɵNodeFlags.OnInit);
|
|
||||||
expect(compilerCore.NodeFlags.OnDestroy).toBe(core.ɵNodeFlags.OnDestroy);
|
|
||||||
expect(compilerCore.NodeFlags.DoCheck).toBe(core.ɵNodeFlags.DoCheck);
|
|
||||||
expect(compilerCore.NodeFlags.OnChanges).toBe(core.ɵNodeFlags.OnChanges);
|
|
||||||
expect(compilerCore.NodeFlags.AfterContentInit).toBe(core.ɵNodeFlags.AfterContentInit);
|
|
||||||
expect(compilerCore.NodeFlags.AfterContentChecked).toBe(core.ɵNodeFlags.AfterContentChecked);
|
|
||||||
expect(compilerCore.NodeFlags.AfterViewInit).toBe(core.ɵNodeFlags.AfterViewInit);
|
|
||||||
expect(compilerCore.NodeFlags.AfterViewChecked).toBe(core.ɵNodeFlags.AfterViewChecked);
|
|
||||||
expect(compilerCore.NodeFlags.EmbeddedViews).toBe(core.ɵNodeFlags.EmbeddedViews);
|
|
||||||
expect(compilerCore.NodeFlags.ComponentView).toBe(core.ɵNodeFlags.ComponentView);
|
|
||||||
expect(compilerCore.NodeFlags.TypeContentQuery).toBe(core.ɵNodeFlags.TypeContentQuery);
|
|
||||||
expect(compilerCore.NodeFlags.TypeViewQuery).toBe(core.ɵNodeFlags.TypeViewQuery);
|
|
||||||
expect(compilerCore.NodeFlags.StaticQuery).toBe(core.ɵNodeFlags.StaticQuery);
|
|
||||||
expect(compilerCore.NodeFlags.DynamicQuery).toBe(core.ɵNodeFlags.DynamicQuery);
|
|
||||||
expect(compilerCore.NodeFlags.CatQuery).toBe(core.ɵNodeFlags.CatQuery);
|
|
||||||
expect(compilerCore.NodeFlags.Types).toBe(core.ɵNodeFlags.Types);
|
|
||||||
|
|
||||||
expect(compilerCore.DepFlags.None).toBe(core.ɵDepFlags.None);
|
expectToBe(compilerCore.NodeFlags.None, core.ɵNodeFlags.None);
|
||||||
expect(compilerCore.DepFlags.SkipSelf).toBe(core.ɵDepFlags.SkipSelf);
|
expectToBe(compilerCore.NodeFlags.TypeElement, core.ɵNodeFlags.TypeElement);
|
||||||
expect(compilerCore.DepFlags.Optional).toBe(core.ɵDepFlags.Optional);
|
expectToBe(compilerCore.NodeFlags.TypeText, core.ɵNodeFlags.TypeText);
|
||||||
expect(compilerCore.DepFlags.Value).toBe(core.ɵDepFlags.Value);
|
expectToBe(compilerCore.NodeFlags.ProjectedTemplate, core.ɵNodeFlags.ProjectedTemplate);
|
||||||
|
expectToBe(compilerCore.NodeFlags.CatRenderNode, core.ɵNodeFlags.CatRenderNode);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeNgContent, core.ɵNodeFlags.TypeNgContent);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypePipe, core.ɵNodeFlags.TypePipe);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypePureArray, core.ɵNodeFlags.TypePureArray);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypePureObject, core.ɵNodeFlags.TypePureObject);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypePurePipe, core.ɵNodeFlags.TypePurePipe);
|
||||||
|
expectToBe(compilerCore.NodeFlags.CatPureExpression, core.ɵNodeFlags.CatPureExpression);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeValueProvider, core.ɵNodeFlags.TypeValueProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeClassProvider, core.ɵNodeFlags.TypeClassProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeFactoryProvider, core.ɵNodeFlags.TypeFactoryProvider);
|
||||||
|
expectToBe(
|
||||||
|
compilerCore.NodeFlags.TypeUseExistingProvider, core.ɵNodeFlags.TypeUseExistingProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.LazyProvider, core.ɵNodeFlags.LazyProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.PrivateProvider, core.ɵNodeFlags.PrivateProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeDirective, core.ɵNodeFlags.TypeDirective);
|
||||||
|
expectToBe(compilerCore.NodeFlags.Component, core.ɵNodeFlags.Component);
|
||||||
|
expectToBe(
|
||||||
|
compilerCore.NodeFlags.CatProviderNoDirective, core.ɵNodeFlags.CatProviderNoDirective);
|
||||||
|
expectToBe(compilerCore.NodeFlags.CatProvider, core.ɵNodeFlags.CatProvider);
|
||||||
|
expectToBe(compilerCore.NodeFlags.OnInit, core.ɵNodeFlags.OnInit);
|
||||||
|
expectToBe(compilerCore.NodeFlags.OnDestroy, core.ɵNodeFlags.OnDestroy);
|
||||||
|
expectToBe(compilerCore.NodeFlags.DoCheck, core.ɵNodeFlags.DoCheck);
|
||||||
|
expectToBe(compilerCore.NodeFlags.OnChanges, core.ɵNodeFlags.OnChanges);
|
||||||
|
expectToBe(compilerCore.NodeFlags.AfterContentInit, core.ɵNodeFlags.AfterContentInit);
|
||||||
|
expectToBe(compilerCore.NodeFlags.AfterContentChecked, core.ɵNodeFlags.AfterContentChecked);
|
||||||
|
expectToBe(compilerCore.NodeFlags.AfterViewInit, core.ɵNodeFlags.AfterViewInit);
|
||||||
|
expectToBe(compilerCore.NodeFlags.AfterViewChecked, core.ɵNodeFlags.AfterViewChecked);
|
||||||
|
expectToBe(compilerCore.NodeFlags.EmbeddedViews, core.ɵNodeFlags.EmbeddedViews);
|
||||||
|
expectToBe(compilerCore.NodeFlags.ComponentView, core.ɵNodeFlags.ComponentView);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeContentQuery, core.ɵNodeFlags.TypeContentQuery);
|
||||||
|
expectToBe(compilerCore.NodeFlags.TypeViewQuery, core.ɵNodeFlags.TypeViewQuery);
|
||||||
|
expectToBe(compilerCore.NodeFlags.StaticQuery, core.ɵNodeFlags.StaticQuery);
|
||||||
|
expectToBe(compilerCore.NodeFlags.DynamicQuery, core.ɵNodeFlags.DynamicQuery);
|
||||||
|
expectToBe(compilerCore.NodeFlags.CatQuery, core.ɵNodeFlags.CatQuery);
|
||||||
|
expectToBe(compilerCore.NodeFlags.Types, core.ɵNodeFlags.Types);
|
||||||
|
|
||||||
expect(compilerCore.InjectFlags.Default).toBe(core.InjectFlags.Default);
|
expectToBe(compilerCore.DepFlags.None, core.ɵDepFlags.None);
|
||||||
expect(compilerCore.InjectFlags.SkipSelf).toBe(core.InjectFlags.SkipSelf);
|
expectToBe(compilerCore.DepFlags.SkipSelf, core.ɵDepFlags.SkipSelf);
|
||||||
expect(compilerCore.InjectFlags.Self).toBe(core.InjectFlags.Self);
|
expectToBe(compilerCore.DepFlags.Optional, core.ɵDepFlags.Optional);
|
||||||
|
expectToBe(compilerCore.DepFlags.Value, core.ɵDepFlags.Value);
|
||||||
|
|
||||||
expect(compilerCore.ArgumentType.Inline).toBe(core.ɵArgumentType.Inline);
|
expectToBe(compilerCore.InjectFlags.Default, core.InjectFlags.Default);
|
||||||
expect(compilerCore.ArgumentType.Dynamic).toBe(core.ɵArgumentType.Dynamic);
|
expectToBe(compilerCore.InjectFlags.SkipSelf, core.InjectFlags.SkipSelf);
|
||||||
|
expectToBe(compilerCore.InjectFlags.Self, core.InjectFlags.Self);
|
||||||
|
|
||||||
expect(compilerCore.BindingFlags.TypeElementAttribute)
|
|
||||||
.toBe(core.ɵBindingFlags.TypeElementAttribute);
|
|
||||||
expect(compilerCore.BindingFlags.TypeElementClass).toBe(core.ɵBindingFlags.TypeElementClass);
|
|
||||||
expect(compilerCore.BindingFlags.TypeElementStyle).toBe(core.ɵBindingFlags.TypeElementStyle);
|
|
||||||
expect(compilerCore.BindingFlags.TypeProperty).toBe(core.ɵBindingFlags.TypeProperty);
|
|
||||||
expect(compilerCore.BindingFlags.SyntheticProperty)
|
|
||||||
.toBe(core.ɵBindingFlags.SyntheticProperty);
|
|
||||||
expect(compilerCore.BindingFlags.SyntheticHostProperty)
|
|
||||||
.toBe(core.ɵBindingFlags.SyntheticHostProperty);
|
|
||||||
expect(compilerCore.BindingFlags.CatSyntheticProperty)
|
|
||||||
.toBe(core.ɵBindingFlags.CatSyntheticProperty);
|
|
||||||
expect(compilerCore.BindingFlags.Types).toBe(core.ɵBindingFlags.Types);
|
|
||||||
|
|
||||||
expect(compilerCore.QueryBindingType.First).toBe(core.ɵQueryBindingType.First);
|
expectToBe(compilerCore.ArgumentType.Inline, core.ɵArgumentType.Inline);
|
||||||
expect(compilerCore.QueryBindingType.All).toBe(core.ɵQueryBindingType.All);
|
expectToBe(compilerCore.ArgumentType.Dynamic, core.ɵArgumentType.Dynamic);
|
||||||
|
|
||||||
expect(compilerCore.QueryValueType.ElementRef).toBe(core.ɵQueryValueType.ElementRef);
|
expectToBe(
|
||||||
expect(compilerCore.QueryValueType.RenderElement).toBe(core.ɵQueryValueType.RenderElement);
|
compilerCore.BindingFlags.TypeElementAttribute, core.ɵBindingFlags.TypeElementAttribute);
|
||||||
expect(compilerCore.QueryValueType.TemplateRef).toBe(core.ɵQueryValueType.TemplateRef);
|
expectToBe(compilerCore.BindingFlags.TypeElementClass, core.ɵBindingFlags.TypeElementClass);
|
||||||
expect(compilerCore.QueryValueType.ViewContainerRef)
|
expectToBe(compilerCore.BindingFlags.TypeElementStyle, core.ɵBindingFlags.TypeElementStyle);
|
||||||
.toBe(core.ɵQueryValueType.ViewContainerRef);
|
expectToBe(compilerCore.BindingFlags.TypeProperty, core.ɵBindingFlags.TypeProperty);
|
||||||
expect(compilerCore.QueryValueType.Provider).toBe(core.ɵQueryValueType.Provider);
|
expectToBe(compilerCore.BindingFlags.SyntheticProperty, core.ɵBindingFlags.SyntheticProperty);
|
||||||
|
expectToBe(
|
||||||
|
compilerCore.BindingFlags.SyntheticHostProperty,
|
||||||
|
core.ɵBindingFlags.SyntheticHostProperty);
|
||||||
|
expectToBe(
|
||||||
|
compilerCore.BindingFlags.CatSyntheticProperty, core.ɵBindingFlags.CatSyntheticProperty);
|
||||||
|
expectToBe(compilerCore.BindingFlags.Types, core.ɵBindingFlags.Types);
|
||||||
|
|
||||||
expect(compilerCore.ViewFlags.None).toBe(core.ɵViewFlags.None);
|
expectToBe(compilerCore.QueryBindingType.First, core.ɵQueryBindingType.First);
|
||||||
expect(compilerCore.ViewFlags.OnPush).toBe(core.ɵViewFlags.OnPush);
|
expectToBe(compilerCore.QueryBindingType.All, core.ɵQueryBindingType.All);
|
||||||
|
|
||||||
|
expectToBe(compilerCore.QueryValueType.ElementRef, core.ɵQueryValueType.ElementRef);
|
||||||
|
expectToBe(compilerCore.QueryValueType.RenderElement, core.ɵQueryValueType.RenderElement);
|
||||||
|
expectToBe(compilerCore.QueryValueType.TemplateRef, core.ɵQueryValueType.TemplateRef);
|
||||||
|
expectToBe(
|
||||||
|
compilerCore.QueryValueType.ViewContainerRef, core.ɵQueryValueType.ViewContainerRef);
|
||||||
|
expectToBe(compilerCore.QueryValueType.Provider, core.ɵQueryValueType.Provider);
|
||||||
|
|
||||||
|
expectToBe(compilerCore.ViewFlags.None, core.ɵViewFlags.None);
|
||||||
|
expectToBe(compilerCore.ViewFlags.OnPush, core.ɵViewFlags.OnPush);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ import {CssLexer, CssLexerMode, CssToken, CssTokenType, cssScannerError, getRawM
|
||||||
it('should throw an error if a selector is being parsed while in the wrong mode', () => {
|
it('should throw an error if a selector is being parsed while in the wrong mode', () => {
|
||||||
const cssCode = '.class > tag';
|
const cssCode = '.class > tag';
|
||||||
|
|
||||||
let capturedMessage: string = undefined !;
|
let capturedMessage: string|null = null;
|
||||||
try {
|
try {
|
||||||
tokenize(cssCode, false, CssLexerMode.STYLE_BLOCK);
|
tokenize(cssCode, false, CssLexerMode.STYLE_BLOCK);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -282,8 +282,8 @@ import {CssLexer, CssLexerMode, CssToken, CssTokenType, cssScannerError, getRawM
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(capturedMessage).toMatch(/Unexpected character \[\>\] at column 0:7 in expression/g);
|
expect(capturedMessage).toMatch(/Unexpected character \[\>\] at column 0:7 in expression/g);
|
||||||
capturedMessage = null !;
|
|
||||||
|
|
||||||
|
capturedMessage = null;
|
||||||
try {
|
try {
|
||||||
tokenize(cssCode, false, CssLexerMode.SELECTOR);
|
tokenize(cssCode, false, CssLexerMode.SELECTOR);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -170,21 +170,22 @@ function _getCaptureAst(capture: any[], index = 0): CssAst {
|
||||||
expect(captures.length).toEqual(3);
|
expect(captures.length).toEqual(3);
|
||||||
|
|
||||||
const rule1 = <CssSelectorRuleAst>_getCaptureAst(captures, 0);
|
const rule1 = <CssSelectorRuleAst>_getCaptureAst(captures, 0);
|
||||||
expect(rule1).toEqual(ast.rules[0]);
|
expect(rule1).toEqual(ast.rules[0] as CssSelectorRuleAst);
|
||||||
|
|
||||||
const firstSelector = rule1.selectors[0];
|
const firstSelector = rule1.selectors[0];
|
||||||
const firstSimpleSelector = firstSelector.selectorParts[0];
|
const firstSimpleSelector = firstSelector.selectorParts[0];
|
||||||
_assertTokens(firstSimpleSelector.tokens, ['.', 'rule1']);
|
_assertTokens(firstSimpleSelector.tokens, ['.', 'rule1']);
|
||||||
|
|
||||||
const rule2 = <CssSelectorRuleAst>_getCaptureAst(captures, 1);
|
const rule2 = <CssSelectorRuleAst>_getCaptureAst(captures, 1);
|
||||||
expect(rule2).toEqual(ast.rules[1]);
|
expect(rule2).toEqual(ast.rules[1] as CssSelectorRuleAst);
|
||||||
|
|
||||||
const secondSelector = rule2.selectors[0];
|
const secondSelector = rule2.selectors[0];
|
||||||
const secondSimpleSelector = secondSelector.selectorParts[0];
|
const secondSimpleSelector = secondSelector.selectorParts[0];
|
||||||
_assertTokens(secondSimpleSelector.tokens, ['.', 'rule2']);
|
_assertTokens(secondSimpleSelector.tokens, ['.', 'rule2']);
|
||||||
|
|
||||||
const rule3 = <CssSelectorRuleAst>_getCaptureAst(captures, 2);
|
const rule3 = <CssSelectorRuleAst>_getCaptureAst(captures, 2);
|
||||||
expect(rule3).toEqual((<CssMediaQueryRuleAst>ast.rules[2]).block.entries[0]);
|
expect(rule3).toEqual(
|
||||||
|
(ast.rules[2] as CssSelectorRuleAst).block.entries[0] as CssSelectorRuleAst);
|
||||||
|
|
||||||
const thirdSelector = rule3.selectors[0];
|
const thirdSelector = rule3.selectors[0];
|
||||||
const thirdSimpleSelector = thirdSelector.selectorParts[0];
|
const thirdSimpleSelector = thirdSelector.selectorParts[0];
|
||||||
|
|
|
@ -547,7 +547,7 @@ function fakeNoTranslate(
|
||||||
|
|
||||||
function extract(
|
function extract(
|
||||||
html: string, implicitTags: string[] = [],
|
html: string, implicitTags: string[] = [],
|
||||||
implicitAttrs: {[k: string]: string[]} = {}): [string[], string, string][] {
|
implicitAttrs: {[k: string]: string[]} = {}): [string[], string, string, string][] {
|
||||||
const result =
|
const result =
|
||||||
extractMessages(parseHtml(html), DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs);
|
extractMessages(parseHtml(html), DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs);
|
||||||
|
|
||||||
|
@ -558,7 +558,7 @@ function extract(
|
||||||
// clang-format off
|
// clang-format off
|
||||||
// https://github.com/angular/clang-format/issues/35
|
// https://github.com/angular/clang-format/issues/35
|
||||||
return result.messages.map(
|
return result.messages.map(
|
||||||
message => [serializeI18nNodes(message.nodes), message.meaning, message.description, message.id]) as [string[], string, string][];
|
message => [serializeI18nNodes(message.nodes), message.meaning, message.description, message.id]) as [string[], string, string, string][];
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,9 +116,10 @@ function expectMap(
|
||||||
const sm = ctx.toSourceMapGenerator('o.ts').toJSON() !;
|
const sm = ctx.toSourceMapGenerator('o.ts').toJSON() !;
|
||||||
const genPosition = {line: genLine + 1, column: genCol};
|
const genPosition = {line: genLine + 1, column: genCol};
|
||||||
const origPosition = originalPositionFor(sm, genPosition);
|
const origPosition = originalPositionFor(sm, genPosition);
|
||||||
expect(origPosition.source).toEqual(source);
|
// TODO: Review use of `any` here (#19904)
|
||||||
expect(origPosition.line).toEqual(srcLine === null ? null : srcLine + 1);
|
expect(origPosition.source as any).toEqual(source);
|
||||||
expect(origPosition.column).toEqual(srcCol);
|
expect(origPosition.line as any).toEqual(srcLine === null ? null : srcLine + 1);
|
||||||
|
expect(origPosition.column as any).toEqual(srcCol);
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the number of segments per line
|
// returns the number of segments per line
|
||||||
|
|
|
@ -36,4 +36,4 @@ export function extractSourceMap(source: string): SourceMap|null {
|
||||||
|
|
||||||
function decodeB64String(s: string): string {
|
function decodeB64String(s: string): string {
|
||||||
return b64.toByteArray(s).reduce((s: string, c: number) => s + String.fromCharCode(c), '');
|
return b64.toByteArray(s).reduce((s: string, c: number) => s + String.fromCharCode(c), '');
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,13 @@ import {ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'
|
||||||
let resourceLoader: MockResourceLoader;
|
let resourceLoader: MockResourceLoader;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
// Jasmine relies on methods on `Function.prototype`, so restore the prototype on the spy.
|
||||||
|
// Work around for: https://github.com/jasmine/jasmine/issues/1573
|
||||||
|
// TODO: Figure out a better way to retrieve the JIT sources, without spying on `Function`.
|
||||||
|
const originalProto = ɵglobal.Function.prototype;
|
||||||
jitSpy = spyOn(ɵglobal, 'Function').and.callThrough();
|
jitSpy = spyOn(ɵglobal, 'Function').and.callThrough();
|
||||||
|
ɵglobal.Function.prototype = originalProto;
|
||||||
|
|
||||||
resourceLoader = new MockResourceLoader();
|
resourceLoader = new MockResourceLoader();
|
||||||
TestBed.configureCompiler({providers: [{provide: ResourceLoader, useValue: resourceLoader}]});
|
TestBed.configureCompiler({providers: [{provide: ResourceLoader, useValue: resourceLoader}]});
|
||||||
});
|
});
|
||||||
|
|
|
@ -35,12 +35,13 @@ function mockSystem(modules: {[module: string]: any}) {
|
||||||
|
|
||||||
it('loads a default factory by appending the factory suffix', async(() => {
|
it('loads a default factory by appending the factory suffix', async(() => {
|
||||||
const loader = new SystemJsNgModuleLoader(new Compiler());
|
const loader = new SystemJsNgModuleLoader(new Compiler());
|
||||||
loader.load('test').then(contents => { expect(contents).toBe('test module factory'); });
|
loader.load('test').then(
|
||||||
|
contents => { expect(contents).toBe('test module factory' as any); });
|
||||||
}));
|
}));
|
||||||
it('loads a named factory by appending the factory suffix', async(() => {
|
it('loads a named factory by appending the factory suffix', async(() => {
|
||||||
const loader = new SystemJsNgModuleLoader(new Compiler());
|
const loader = new SystemJsNgModuleLoader(new Compiler());
|
||||||
loader.load('test#Named').then(contents => {
|
loader.load('test#Named').then(contents => {
|
||||||
expect(contents).toBe('test NamedNgFactory');
|
expect(contents).toBe('test NamedNgFactory' as any);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
it('loads a named factory with a configured prefix and suffix', async(() => {
|
it('loads a named factory with a configured prefix and suffix', async(() => {
|
||||||
|
@ -49,7 +50,7 @@ function mockSystem(modules: {[module: string]: any}) {
|
||||||
factoryPathSuffix: '/suffixed',
|
factoryPathSuffix: '/suffixed',
|
||||||
});
|
});
|
||||||
loader.load('test#Named').then(contents => {
|
loader.load('test#Named').then(contents => {
|
||||||
expect(contents).toBe('test module factory');
|
expect(contents).toBe('test module factory' as any);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
|
@ -315,7 +315,7 @@ class TestObj {
|
||||||
// But we should still get an array of the right length based on function.length.
|
// But we should still get an array of the right length based on function.length.
|
||||||
expect(reflector.parameters(ChildWithCtorNoDecorator)).toEqual([
|
expect(reflector.parameters(ChildWithCtorNoDecorator)).toEqual([
|
||||||
undefined, undefined, undefined
|
undefined, undefined, undefined
|
||||||
]);
|
] as any[]); // TODO: Review use of `any` here (#19904)
|
||||||
|
|
||||||
expect(reflector.parameters(NoDecorators)).toEqual([]);
|
expect(reflector.parameters(NoDecorators)).toEqual([]);
|
||||||
expect(reflector.parameters(<any>{})).toEqual([]);
|
expect(reflector.parameters(<any>{})).toEqual([]);
|
||||||
|
|
|
@ -1203,8 +1203,8 @@ describe('di', () => {
|
||||||
describe('@Attribute', () => {
|
describe('@Attribute', () => {
|
||||||
|
|
||||||
it('should inject attribute', () => {
|
it('should inject attribute', () => {
|
||||||
let exist: string|undefined = 'wrong';
|
let exist = 'wrong' as string | undefined;
|
||||||
let nonExist: string|undefined = 'wrong';
|
let nonExist = 'wrong' as string | undefined;
|
||||||
|
|
||||||
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
||||||
if (rf & RenderFlags.Create) {
|
if (rf & RenderFlags.Create) {
|
||||||
|
@ -1221,8 +1221,8 @@ describe('di', () => {
|
||||||
|
|
||||||
// https://stackblitz.com/edit/angular-8ytqkp?file=src%2Fapp%2Fapp.component.ts
|
// https://stackblitz.com/edit/angular-8ytqkp?file=src%2Fapp%2Fapp.component.ts
|
||||||
it('should not inject attributes representing bindings and outputs', () => {
|
it('should not inject attributes representing bindings and outputs', () => {
|
||||||
let exist: string|undefined = 'wrong';
|
let exist = 'wrong' as string | undefined;
|
||||||
let nonExist: string|undefined = 'wrong';
|
let nonExist = 'wrong' as string | undefined;
|
||||||
|
|
||||||
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
||||||
if (rf & RenderFlags.Create) {
|
if (rf & RenderFlags.Create) {
|
||||||
|
@ -1238,8 +1238,8 @@ describe('di', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not accidentally inject attributes representing bindings and outputs', () => {
|
it('should not accidentally inject attributes representing bindings and outputs', () => {
|
||||||
let exist: string|undefined = 'wrong';
|
let exist = 'wrong' as string | undefined;
|
||||||
let nonExist: string|undefined = 'wrong';
|
let nonExist = 'wrong' as string | undefined;
|
||||||
|
|
||||||
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) {
|
||||||
if (rf & RenderFlags.Create) {
|
if (rf & RenderFlags.Create) {
|
||||||
|
@ -1415,7 +1415,7 @@ describe('di', () => {
|
||||||
// so that we have smaller HelloWorld.
|
// so that we have smaller HelloWorld.
|
||||||
(parent.tNode as{parent: any}).parent = undefined;
|
(parent.tNode as{parent: any}).parent = undefined;
|
||||||
|
|
||||||
const injector = getOrCreateNodeInjector();
|
const injector: any = getOrCreateNodeInjector(); // TODO: Review use of `any` here (#19904)
|
||||||
expect(injector).not.toBe(null);
|
expect(injector).not.toBe(null);
|
||||||
} finally {
|
} finally {
|
||||||
leaveView(oldView);
|
leaveView(oldView);
|
||||||
|
|
|
@ -259,7 +259,7 @@ describe('NgOnChangesFeature', () => {
|
||||||
|
|
||||||
it('correctly computes firstChange', () => {
|
it('correctly computes firstChange', () => {
|
||||||
class MyDirective implements OnChanges {
|
class MyDirective implements OnChanges {
|
||||||
public log: Array<string|SimpleChange> = [];
|
public log: Array<string|SimpleChange|undefined> = [];
|
||||||
public valA: string = 'initValue';
|
public valA: string = 'initValue';
|
||||||
// TODO(issue/24571): remove '!'.
|
// TODO(issue/24571): remove '!'.
|
||||||
public valB !: string;
|
public valB !: string;
|
||||||
|
|
|
@ -112,7 +112,7 @@ describe('elementProperty', () => {
|
||||||
|
|
||||||
class OtherDir {
|
class OtherDir {
|
||||||
// TODO(issue/24571): remove '!'.
|
// TODO(issue/24571): remove '!'.
|
||||||
id !: boolean;
|
id !: number;
|
||||||
clickStream = new EventEmitter();
|
clickStream = new EventEmitter();
|
||||||
|
|
||||||
static ngDirectiveDef = defineDirective({
|
static ngDirectiveDef = defineDirective({
|
||||||
|
@ -138,7 +138,7 @@ describe('elementProperty', () => {
|
||||||
|
|
||||||
class IdDir {
|
class IdDir {
|
||||||
// TODO(issue/24571): remove '!'.
|
// TODO(issue/24571): remove '!'.
|
||||||
idNumber !: number;
|
idNumber !: string;
|
||||||
|
|
||||||
static ngDirectiveDef = defineDirective({
|
static ngDirectiveDef = defineDirective({
|
||||||
type: IdDir,
|
type: IdDir,
|
||||||
|
@ -347,15 +347,14 @@ describe('elementProperty', () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(renderToHtml(Template, {condition: true, id1: 'one', id2: 'two', id3: 'three'}, deps))
|
expect(renderToHtml(Template, {condition: true, id1: 'one', id2: 'two', id3: 3}, deps))
|
||||||
.toEqual(`<button iddir="">Click me</button><button id="two">Click me too</button>`);
|
.toEqual(`<button iddir="">Click me</button><button id="two">Click me too</button>`);
|
||||||
expect(idDir !.idNumber).toEqual('one');
|
expect(idDir !.idNumber).toEqual('one');
|
||||||
|
|
||||||
expect(
|
expect(renderToHtml(Template, {condition: false, id1: 'four', id2: 'two', id3: 3}, deps))
|
||||||
renderToHtml(Template, {condition: false, id1: 'four', id2: 'two', id3: 'three'}, deps))
|
|
||||||
.toEqual(`<button iddir="">Click me</button><button otherdir="">Click me too</button>`);
|
.toEqual(`<button iddir="">Click me</button><button otherdir="">Click me too</button>`);
|
||||||
expect(idDir !.idNumber).toEqual('four');
|
expect(idDir !.idNumber).toEqual('four');
|
||||||
expect(otherDir !.id).toEqual('three');
|
expect(otherDir !.id).toEqual(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -293,11 +293,11 @@ describe('array literals', () => {
|
||||||
const e0_ff =
|
const e0_ff =
|
||||||
(v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any,
|
(v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any,
|
||||||
v8: any) => ['start', v0, v1, v2, v3, v4, v5, v6, v7, v8, 'end'];
|
v8: any) => ['start', v0, v1, v2, v3, v4, v5, v6, v7, v8, 'end'];
|
||||||
const e0_ff_1 = (v: any) => { return {name: v}; };
|
const e0_ff_1 = (v: any) => `modified_${v}`;
|
||||||
|
|
||||||
renderToHtml(Template, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'], directives);
|
renderToHtml(Template, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'], directives);
|
||||||
/**
|
/**
|
||||||
* <my-comp [names]="['start', v0, v1, v2, v3, {name: v4}, v5, v6, v7, v8, 'end']">
|
* <my-comp [names]="['start', v0, v1, v2, v3, `modified_${v4}`, v5, v6, v7, v8, 'end']">
|
||||||
* </my-comp>
|
* </my-comp>
|
||||||
*/
|
*/
|
||||||
function Template(rf: RenderFlags, c: any) {
|
function Template(rf: RenderFlags, c: any) {
|
||||||
|
@ -315,17 +315,17 @@ describe('array literals', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(myComp !.names).toEqual([
|
expect(myComp !.names).toEqual([
|
||||||
'start', 'a', 'b', 'c', 'd', {name: 'e'}, 'f', 'g', 'h', 'i', 'end'
|
'start', 'a', 'b', 'c', 'd', 'modified_e', 'f', 'g', 'h', 'i', 'end'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
renderToHtml(Template, ['a1', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'], directives);
|
renderToHtml(Template, ['a1', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'], directives);
|
||||||
expect(myComp !.names).toEqual([
|
expect(myComp !.names).toEqual([
|
||||||
'start', 'a1', 'b', 'c', 'd', {name: 'e'}, 'f', 'g', 'h', 'i', 'end'
|
'start', 'a1', 'b', 'c', 'd', 'modified_e', 'f', 'g', 'h', 'i', 'end'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
renderToHtml(Template, ['a1', 'b', 'c', 'd', 'e5', 'f', 'g', 'h', 'i'], directives);
|
renderToHtml(Template, ['a1', 'b', 'c', 'd', 'e5', 'f', 'g', 'h', 'i'], directives);
|
||||||
expect(myComp !.names).toEqual([
|
expect(myComp !.names).toEqual([
|
||||||
'start', 'a1', 'b', 'c', 'd', {name: 'e5'}, 'f', 'g', 'h', 'i', 'end'
|
'start', 'a1', 'b', 'c', 'd', 'modified_e5', 'f', 'g', 'h', 'i', 'end'
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import {callMostRecentEventListenerHandler, compViewDef, createAndGetRootNodes,
|
||||||
* We map addEventListener to the Zones internal name. This is because we want to be fast
|
* We map addEventListener to the Zones internal name. This is because we want to be fast
|
||||||
* and bypass the zone bookkeeping. We know that we can do the bookkeeping faster.
|
* and bypass the zone bookkeeping. We know that we can do the bookkeeping faster.
|
||||||
*/
|
*/
|
||||||
const addEventListener = '__zone_symbol__addEventListener';
|
const addEventListener = '__zone_symbol__addEventListener' as 'addEventListener';
|
||||||
|
|
||||||
{
|
{
|
||||||
describe(`Component Views`, () => {
|
describe(`Component Views`, () => {
|
||||||
|
|
|
@ -20,8 +20,8 @@ import {ARG_TYPE_VALUES, callMostRecentEventListenerHandler, checkNodeInlineOrDy
|
||||||
* We map addEventListener to the Zones internal name. This is because we want to be fast
|
* We map addEventListener to the Zones internal name. This is because we want to be fast
|
||||||
* and bypass the zone bookkeeping. We know that we can do the bookkeeping faster.
|
* and bypass the zone bookkeeping. We know that we can do the bookkeeping faster.
|
||||||
*/
|
*/
|
||||||
const addEventListener = '__zone_symbol__addEventListener';
|
const addEventListener = '__zone_symbol__addEventListener' as 'addEventListener';
|
||||||
const removeEventListener = '__zone_symbol__removeEventListener';
|
const removeEventListener = '__zone_symbol__removeEventListener' as 'removeEventListener';
|
||||||
|
|
||||||
{
|
{
|
||||||
describe(`View Elements`, () => {
|
describe(`View Elements`, () => {
|
||||||
|
|
|
@ -23,7 +23,7 @@ export const proxy: ClassDecorator = (t: any) => t;
|
||||||
const _global = <any>(typeof window === 'undefined' ? global : window);
|
const _global = <any>(typeof window === 'undefined' ? global : window);
|
||||||
|
|
||||||
export const afterEach: Function = _global.afterEach;
|
export const afterEach: Function = _global.afterEach;
|
||||||
export const expect: (actual: any) => jasmine.Matchers = _global.expect;
|
export const expect: <T>(actual: T) => jasmine.Matchers<T> = _global.expect;
|
||||||
|
|
||||||
const jsmBeforeEach = _global.beforeEach;
|
const jsmBeforeEach = _global.beforeEach;
|
||||||
const jsmDescribe = _global.describe;
|
const jsmDescribe = _global.describe;
|
||||||
|
|
|
@ -15,7 +15,7 @@ describe('testability example', () => {
|
||||||
describe('using task tracking', () => {
|
describe('using task tracking', () => {
|
||||||
const URL = '/core/testability/ts/whenStable/';
|
const URL = '/core/testability/ts/whenStable/';
|
||||||
|
|
||||||
it('times out with a list of tasks', (done) => {
|
it('times out with a list of tasks', (done: DoneFn) => {
|
||||||
browser.get(URL);
|
browser.get(URL);
|
||||||
browser.ignoreSynchronization = true;
|
browser.ignoreSynchronization = true;
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,13 @@
|
||||||
"rxjs/*": ["../../node_modules/rxjs/*"]
|
"rxjs/*": ["../../node_modules/rxjs/*"]
|
||||||
},
|
},
|
||||||
"outDir": "../../dist/examples",
|
"outDir": "../../dist/examples",
|
||||||
"types": ["jasmine", "node", "angular", "systemjs"]
|
"types": ["angular"]
|
||||||
},
|
},
|
||||||
|
|
||||||
"include": [
|
"include": [
|
||||||
"./**/*.ts",
|
"../../node_modules/@types/jasminewd2/index.d.ts",
|
||||||
"../../node_modules/zone.js/dist/zone.js.d.ts",
|
"../../tools/types-ext/jasminewd2.d.ts",
|
||||||
// TODO(i): we can't use protractor's built-in typings because they contain lots of ambient definitions
|
"../types.d.ts",
|
||||||
"../../node_modules/@types/protractor/index.d.ts"
|
"**/*.ts"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
// WARNING:
|
||||||
|
// This file is used to build the e2e tests only.
|
||||||
|
// The rest of the files are included in `/packages/tsconfig.json`.
|
||||||
|
{
|
||||||
|
"extends": "../tsconfig.json",
|
||||||
|
|
||||||
|
"compilerOptions": {
|
||||||
|
"types": []
|
||||||
|
},
|
||||||
|
|
||||||
|
"include": [
|
||||||
|
"../../node_modules/@types/jasminewd2/index.d.ts",
|
||||||
|
"../../tools/types-ext/jasminewd2.d.ts",
|
||||||
|
"../types.d.ts",
|
||||||
|
"**/e2e_test/*"
|
||||||
|
],
|
||||||
|
|
||||||
|
"exclude": []
|
||||||
|
}
|
|
@ -50,4 +50,4 @@ describe('upgrade/static (full)', () => {
|
||||||
firstHero = element.all(by.css('ng1-hero')).get(0);
|
firstHero = element.all(by.css('ng1-hero')).get(0);
|
||||||
expect(firstHero.element(by.css('h2')).getText()).toEqual('Wonder Woman');
|
expect(firstHero.element(by.css('h2')).getText()).toEqual('Wonder Woman');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {ElementFinder, by} from 'protractor';
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
namespace jasmine {
|
namespace jasmine {
|
||||||
interface Matchers {
|
interface Matchers<T> {
|
||||||
toBeAHero(): Promise<void>;
|
toBeAHero(): Promise<void>;
|
||||||
toHaveName(exectedName: string): Promise<void>;
|
toHaveName(exectedName: string): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,14 +92,14 @@ function asyncValidator(expected: any, timeout = 0) {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return custom accessor when provided', () => {
|
it('should return custom accessor when provided', () => {
|
||||||
const customAccessor = new SpyValueAccessor();
|
const customAccessor: ControlValueAccessor = new SpyValueAccessor() as any;
|
||||||
const checkboxAccessor = new CheckboxControlValueAccessor(null !, null !);
|
const checkboxAccessor = new CheckboxControlValueAccessor(null !, null !);
|
||||||
expect(selectValueAccessor(dir, <any>[defaultAccessor, customAccessor, checkboxAccessor]))
|
expect(selectValueAccessor(dir, <any>[defaultAccessor, customAccessor, checkboxAccessor]))
|
||||||
.toEqual(customAccessor);
|
.toEqual(customAccessor);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return custom accessor when provided with select multiple', () => {
|
it('should return custom accessor when provided with select multiple', () => {
|
||||||
const customAccessor = new SpyValueAccessor();
|
const customAccessor: ControlValueAccessor = new SpyValueAccessor() as any;
|
||||||
const selectMultipleAccessor = new SelectMultipleControlValueAccessor(null !, null !);
|
const selectMultipleAccessor = new SelectMultipleControlValueAccessor(null !, null !);
|
||||||
expect(selectValueAccessor(
|
expect(selectValueAccessor(
|
||||||
dir, <any>[defaultAccessor, customAccessor, selectMultipleAccessor]))
|
dir, <any>[defaultAccessor, customAccessor, selectMultipleAccessor]))
|
||||||
|
|
|
@ -207,7 +207,7 @@ import {MyInput, MyInputForm} from './value_accessor_integration_spec';
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
emailInput = fixture.debugElement.query(By.css('[formControlName="email"]'));
|
emailInput = fixture.debugElement.query(By.css('[formControlName="email"]'));
|
||||||
expect(emailInput).toBe(null);
|
expect(emailInput as any).toBe(null); // TODO: Review use of `any` here (#19904)
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should strip array controls that are not found', () => {
|
it('should strip array controls that are not found', () => {
|
||||||
|
@ -1393,7 +1393,7 @@ import {MyInput, MyInputForm} from './value_accessor_integration_spec';
|
||||||
fixture.componentInstance.form = formGroup;
|
fixture.componentInstance.form = formGroup;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
const values: string[] = [];
|
const values: any[] = [];
|
||||||
const streams = merge(
|
const streams = merge(
|
||||||
control.valueChanges, control.statusChanges, formGroup.valueChanges,
|
control.valueChanges, control.statusChanges, formGroup.valueChanges,
|
||||||
formGroup.statusChanges);
|
formGroup.statusChanges);
|
||||||
|
@ -1430,7 +1430,7 @@ import {MyInput, MyInputForm} from './value_accessor_integration_spec';
|
||||||
fixture.componentInstance.form = formGroup;
|
fixture.componentInstance.form = formGroup;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
const values: string[] = [];
|
const values: (string | {[key: string]: string})[] = [];
|
||||||
const streams = merge(
|
const streams = merge(
|
||||||
control.valueChanges, control.statusChanges, formGroup.valueChanges,
|
control.valueChanges, control.statusChanges, formGroup.valueChanges,
|
||||||
formGroup.statusChanges);
|
formGroup.statusChanges);
|
||||||
|
|
|
@ -460,7 +460,7 @@ import {NgModelCustomComp, NgModelCustomWrapper} from './value_accessor_integrat
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
tick();
|
tick();
|
||||||
|
|
||||||
const values: string[] = [];
|
const values: any[] = [];
|
||||||
const form = fixture.debugElement.children[0].injector.get(NgForm);
|
const form = fixture.debugElement.children[0].injector.get(NgForm);
|
||||||
|
|
||||||
const sub = merge(form.valueChanges !, form.statusChanges !)
|
const sub = merge(form.valueChanges !, form.statusChanges !)
|
||||||
|
@ -748,7 +748,7 @@ import {NgModelCustomComp, NgModelCustomWrapper} from './value_accessor_integrat
|
||||||
|
|
||||||
it('should reset properly', fakeAsync(() => {
|
it('should reset properly', fakeAsync(() => {
|
||||||
const fixture = initTest(NgModelForm);
|
const fixture = initTest(NgModelForm);
|
||||||
fixture.componentInstance.name = 'Nancy';
|
fixture.componentInstance.name = 'Nancy' as string | null;
|
||||||
fixture.componentInstance.options = {updateOn: 'submit'};
|
fixture.componentInstance.options = {updateOn: 'submit'};
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
tick();
|
tick();
|
||||||
|
@ -792,7 +792,7 @@ import {NgModelCustomComp, NgModelCustomWrapper} from './value_accessor_integrat
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
tick();
|
tick();
|
||||||
|
|
||||||
const values: string[] = [];
|
const values: any[] = [];
|
||||||
const form = fixture.debugElement.children[0].injector.get(NgForm);
|
const form = fixture.debugElement.children[0].injector.get(NgForm);
|
||||||
|
|
||||||
const sub = merge(form.valueChanges !, form.statusChanges !)
|
const sub = merge(form.valueChanges !, form.statusChanges !)
|
||||||
|
@ -1028,7 +1028,7 @@ import {NgModelCustomComp, NgModelCustomWrapper} from './value_accessor_integrat
|
||||||
|
|
||||||
it('should reset the form to empty when reset event is fired', fakeAsync(() => {
|
it('should reset the form to empty when reset event is fired', fakeAsync(() => {
|
||||||
const fixture = initTest(NgModelForm);
|
const fixture = initTest(NgModelForm);
|
||||||
fixture.componentInstance.name = 'should be cleared';
|
fixture.componentInstance.name = 'should be cleared' as string | null;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
tick();
|
tick();
|
||||||
|
|
||||||
|
@ -1654,7 +1654,7 @@ class StandaloneNgModel {
|
||||||
})
|
})
|
||||||
class NgModelForm {
|
class NgModelForm {
|
||||||
// TODO(issue/24571): remove '!'.
|
// TODO(issue/24571): remove '!'.
|
||||||
name !: string;
|
name !: string | null;
|
||||||
// TODO(issue/24571): remove '!'.
|
// TODO(issue/24571): remove '!'.
|
||||||
event !: Event;
|
event !: Event;
|
||||||
options = {};
|
options = {};
|
||||||
|
|
|
@ -327,7 +327,7 @@ import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'
|
||||||
const fixture = initTest(NgModelSelectWithNullForm);
|
const fixture = initTest(NgModelSelectWithNullForm);
|
||||||
const comp = fixture.componentInstance;
|
const comp = fixture.componentInstance;
|
||||||
comp.cities = [{'name': 'SF'}, {'name': 'NYC'}];
|
comp.cities = [{'name': 'SF'}, {'name': 'NYC'}];
|
||||||
comp.selectedCity = null !;
|
comp.selectedCity = null;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
const select = fixture.debugElement.query(By.css('select'));
|
const select = fixture.debugElement.query(By.css('select'));
|
||||||
|
@ -336,7 +336,7 @@ import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'
|
||||||
dispatchEvent(select.nativeElement, 'change');
|
dispatchEvent(select.nativeElement, 'change');
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
tick();
|
tick();
|
||||||
expect(comp.selectedCity['name']).toEqual('NYC');
|
expect(comp.selectedCity !['name']).toEqual('NYC');
|
||||||
|
|
||||||
select.nativeElement.value = '0: null';
|
select.nativeElement.value = '0: null';
|
||||||
dispatchEvent(select.nativeElement, 'change');
|
dispatchEvent(select.nativeElement, 'change');
|
||||||
|
@ -1231,7 +1231,7 @@ class NgModelSelectForm {
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
class NgModelSelectWithNullForm {
|
class NgModelSelectWithNullForm {
|
||||||
selectedCity: {[k: string]: string} = {};
|
selectedCity: {[k: string]: string}|null = {};
|
||||||
cities: any[] = [];
|
cities: any[] = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,14 +80,14 @@ import {DOCUMENT} from '@angular/platform-browser/src/dom/dom_tokens';
|
||||||
it('supports setting and accessing value \'false\' via get', () => {
|
it('supports setting and accessing value \'false\' via get', () => {
|
||||||
const transferState: TransferState = TestBed.get(TransferState);
|
const transferState: TransferState = TestBed.get(TransferState);
|
||||||
transferState.set(TEST_KEY, false);
|
transferState.set(TEST_KEY, false);
|
||||||
expect(transferState.get(TEST_KEY, 20)).toBe(false);
|
expect(transferState.get(TEST_KEY, true)).toBe(false);
|
||||||
expect(transferState.hasKey(TEST_KEY)).toBe(true);
|
expect(transferState.hasKey(TEST_KEY)).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('supports setting and accessing value \'null\' via get', () => {
|
it('supports setting and accessing value \'null\' via get', () => {
|
||||||
const transferState: TransferState = TestBed.get(TransferState);
|
const transferState: TransferState = TestBed.get(TransferState);
|
||||||
transferState.set(TEST_KEY, null);
|
transferState.set(TEST_KEY, null);
|
||||||
expect(transferState.get(TEST_KEY, 20)).toBe(null);
|
expect(transferState.get(TEST_KEY, 20 as any)).toBe(null);
|
||||||
expect(transferState.hasKey(TEST_KEY)).toBe(true);
|
expect(transferState.hasKey(TEST_KEY)).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -130,4 +130,4 @@ import {DOCUMENT} from '@angular/platform-browser/src/dom/dom_tokens';
|
||||||
expect(unescapedObj['testString']).toBe(testString);
|
expect(unescapedObj['testString']).toBe(testString);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -809,7 +809,7 @@ class CompWithUrlTemplate {
|
||||||
|
|
||||||
describe('errors', () => {
|
describe('errors', () => {
|
||||||
let originalJasmineIt: (description: string, func: () => void) => jasmine.Spec;
|
let originalJasmineIt: (description: string, func: () => void) => jasmine.Spec;
|
||||||
let originalJasmineBeforeEach: (beforeEachFunction: () => void) => void;
|
let originalJasmineBeforeEach: (beforeEachFunction: (done: DoneFn) => void) => void;
|
||||||
|
|
||||||
const patchJasmineIt = () => {
|
const patchJasmineIt = () => {
|
||||||
let resolve: (result: any) => void;
|
let resolve: (result: any) => void;
|
||||||
|
|
|
@ -15,7 +15,7 @@ import {ɵgetDOM as getDOM} from '@angular/platform-browser';
|
||||||
/**
|
/**
|
||||||
* Jasmine matchers that check Angular specific conditions.
|
* Jasmine matchers that check Angular specific conditions.
|
||||||
*/
|
*/
|
||||||
export interface NgMatchers extends jasmine.Matchers {
|
export interface NgMatchers extends jasmine.Matchers<any> {
|
||||||
/**
|
/**
|
||||||
* Expect the value to be a `Promise`.
|
* Expect the value to be a `Promise`.
|
||||||
*
|
*
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {PRIMARY_OUTLET, ParamMap, convertToParamMap} from './shared';
|
import {PRIMARY_OUTLET, ParamMap, Params, convertToParamMap} from './shared';
|
||||||
import {forEach, shallowEqual} from './utils/collection';
|
import {forEach, shallowEqual} from './utils/collection';
|
||||||
|
|
||||||
export function createEmptyUrlTree() {
|
export function createEmptyUrlTree() {
|
||||||
|
@ -23,8 +23,8 @@ export function containsTree(container: UrlTree, containee: UrlTree, exact: bool
|
||||||
containsSegmentGroup(container.root, containee.root);
|
containsSegmentGroup(container.root, containee.root);
|
||||||
}
|
}
|
||||||
|
|
||||||
function equalQueryParams(
|
function equalQueryParams(container: Params, containee: Params): boolean {
|
||||||
container: {[k: string]: string}, containee: {[k: string]: string}): boolean {
|
// TODO: This does not handle array params correctly.
|
||||||
return shallowEqual(container, containee);
|
return shallowEqual(container, containee);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,8 +38,8 @@ function equalSegmentGroups(container: UrlSegmentGroup, containee: UrlSegmentGro
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function containsQueryParams(
|
function containsQueryParams(container: Params, containee: Params): boolean {
|
||||||
container: {[k: string]: string}, containee: {[k: string]: string}): boolean {
|
// TODO: This does not handle array params correctly.
|
||||||
return Object.keys(containee).length <= Object.keys(container).length &&
|
return Object.keys(containee).length <= Object.keys(container).length &&
|
||||||
Object.keys(containee).every(key => containee[key] === container[key]);
|
Object.keys(containee).every(key => containee[key] === container[key]);
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ export class UrlTree {
|
||||||
/** The root segment group of the URL tree */
|
/** The root segment group of the URL tree */
|
||||||
public root: UrlSegmentGroup,
|
public root: UrlSegmentGroup,
|
||||||
/** The query params of the URL */
|
/** The query params of the URL */
|
||||||
public queryParams: {[key: string]: string},
|
public queryParams: Params,
|
||||||
/** The fragment of the URL */
|
/** The fragment of the URL */
|
||||||
public fragment: string|null) {}
|
public fragment: string|null) {}
|
||||||
|
|
||||||
|
@ -446,8 +446,8 @@ class UrlParser {
|
||||||
return new UrlSegmentGroup([], this.parseChildren());
|
return new UrlSegmentGroup([], this.parseChildren());
|
||||||
}
|
}
|
||||||
|
|
||||||
parseQueryParams(): {[key: string]: any} {
|
parseQueryParams(): Params {
|
||||||
const params: {[key: string]: any} = {};
|
const params: Params = {};
|
||||||
if (this.consumeOptional('?')) {
|
if (this.consumeOptional('?')) {
|
||||||
do {
|
do {
|
||||||
this.parseQueryParam(params);
|
this.parseQueryParam(params);
|
||||||
|
@ -534,7 +534,7 @@ class UrlParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse a single query parameter `name[=value]`
|
// Parse a single query parameter `name[=value]`
|
||||||
private parseQueryParam(params: {[key: string]: any}): void {
|
private parseQueryParam(params: Params): void {
|
||||||
const key = matchQueryParams(this.remaining);
|
const key = matchQueryParams(this.remaining);
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -210,7 +210,7 @@ describe('bootstrap', () => {
|
||||||
|
|
||||||
platformBrowserDynamic([]).bootstrapModule(TestModule).then(res => {
|
platformBrowserDynamic([]).bootstrapModule(TestModule).then(res => {
|
||||||
const router = res.injector.get(Router);
|
const router = res.injector.get(Router);
|
||||||
spyOn(router, 'resetRootComponentType').and.callThrough();
|
spyOn(router as any, 'resetRootComponentType').and.callThrough();
|
||||||
|
|
||||||
const appRef: ApplicationRef = res.injector.get(ApplicationRef);
|
const appRef: ApplicationRef = res.injector.get(ApplicationRef);
|
||||||
appRef.bootstrap(SecondRootCmp);
|
appRef.bootstrap(SecondRootCmp);
|
||||||
|
@ -236,7 +236,7 @@ describe('bootstrap', () => {
|
||||||
|
|
||||||
platformBrowserDynamic([]).bootstrapModule(TestModule).then(res => {
|
platformBrowserDynamic([]).bootstrapModule(TestModule).then(res => {
|
||||||
const router = res.injector.get(Router);
|
const router = res.injector.get(Router);
|
||||||
spyOn(router, 'resetRootComponentType').and.callThrough();
|
spyOn(router as any, 'resetRootComponentType').and.callThrough();
|
||||||
|
|
||||||
const appRef: ApplicationRef = res.injector.get(ApplicationRef);
|
const appRef: ApplicationRef = res.injector.get(ApplicationRef);
|
||||||
appRef.components[0].onDestroy(() => {
|
appRef.components[0].onDestroy(() => {
|
||||||
|
|
|
@ -131,7 +131,7 @@ function checkActivatedRoute(
|
||||||
if (actual === null) {
|
if (actual === null) {
|
||||||
expect(actual).toBeDefined();
|
expect(actual).toBeDefined();
|
||||||
} else {
|
} else {
|
||||||
expect(actual.component).toBe(cmp);
|
expect(actual.component as any).toBe(cmp);
|
||||||
expect(actual.outlet).toEqual(outlet);
|
expect(actual.outlet).toEqual(outlet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -799,7 +799,7 @@ function checkActivatedRoute(
|
||||||
} else {
|
} else {
|
||||||
expect(actual.url.map(s => s.path).join('/')).toEqual(url);
|
expect(actual.url.map(s => s.path).join('/')).toEqual(url);
|
||||||
expect(actual.params).toEqual(params);
|
expect(actual.params).toEqual(params);
|
||||||
expect(actual.component).toBe(cmp);
|
expect(actual.component as any).toBe(cmp);
|
||||||
expect(actual.outlet).toEqual(outlet);
|
expect(actual.outlet).toEqual(outlet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,12 +9,12 @@
|
||||||
import {Location} from '@angular/common';
|
import {Location} from '@angular/common';
|
||||||
import {TestBed, inject} from '@angular/core/testing';
|
import {TestBed, inject} from '@angular/core/testing';
|
||||||
|
|
||||||
import {ResolveData} from '../src/config';
|
import {Routes} from '../src/config';
|
||||||
import {ChildActivationStart} from '../src/events';
|
import {ChildActivationStart} from '../src/events';
|
||||||
import {PreActivation} from '../src/pre_activation';
|
import {PreActivation} from '../src/pre_activation';
|
||||||
import {Router} from '../src/router';
|
import {Router} from '../src/router';
|
||||||
import {ChildrenOutletContexts} from '../src/router_outlet_context';
|
import {ChildrenOutletContexts} from '../src/router_outlet_context';
|
||||||
import {ActivatedRouteSnapshot, RouterStateSnapshot, createEmptyStateSnapshot} from '../src/router_state';
|
import {RouterStateSnapshot, createEmptyStateSnapshot} from '../src/router_state';
|
||||||
import {DefaultUrlSerializer} from '../src/url_tree';
|
import {DefaultUrlSerializer} from '../src/url_tree';
|
||||||
import {TreeNode} from '../src/utils/tree';
|
import {TreeNode} from '../src/utils/tree';
|
||||||
import {RouterTestingModule} from '../testing/src/router_testing_module';
|
import {RouterTestingModule} from '../testing/src/router_testing_module';
|
||||||
|
@ -30,14 +30,17 @@ describe('Router', () => {
|
||||||
|
|
||||||
it('should copy config to avoid mutations of user-provided objects', () => {
|
it('should copy config to avoid mutations of user-provided objects', () => {
|
||||||
const r: Router = TestBed.get(Router);
|
const r: Router = TestBed.get(Router);
|
||||||
const configs = [{
|
const configs: Routes = [{
|
||||||
path: 'a',
|
path: 'a',
|
||||||
component: TestComponent,
|
component: TestComponent,
|
||||||
children: [{path: 'b', component: TestComponent}, {path: 'c', component: TestComponent}]
|
children: [{path: 'b', component: TestComponent}, {path: 'c', component: TestComponent}]
|
||||||
}];
|
}];
|
||||||
|
const children = configs[0].children !;
|
||||||
|
|
||||||
r.resetConfig(configs);
|
r.resetConfig(configs);
|
||||||
|
|
||||||
let rConfigs = r.config;
|
const rConfigs = r.config;
|
||||||
|
const rChildren = rConfigs[0].children !;
|
||||||
|
|
||||||
// routes array and shallow copy
|
// routes array and shallow copy
|
||||||
expect(configs).not.toBe(rConfigs);
|
expect(configs).not.toBe(rConfigs);
|
||||||
|
@ -46,11 +49,11 @@ describe('Router', () => {
|
||||||
expect(configs[0].component).toBe(rConfigs[0].component);
|
expect(configs[0].component).toBe(rConfigs[0].component);
|
||||||
|
|
||||||
// children should be new array and routes shallow copied
|
// children should be new array and routes shallow copied
|
||||||
expect(configs[0].children).not.toBe(rConfigs[0].children);
|
expect(children).not.toBe(rChildren);
|
||||||
expect(configs[0].children[0]).not.toBe(rConfigs[0].children ![0]);
|
expect(children[0]).not.toBe(rChildren[0]);
|
||||||
expect(configs[0].children[0].path).toBe(rConfigs[0].children ![0].path);
|
expect(children[0].path).toBe(rChildren[0].path);
|
||||||
expect(configs[0].children[1]).not.toBe(rConfigs[0].children ![1]);
|
expect(children[1]).not.toBe(rChildren[1]);
|
||||||
expect(configs[0].children[1].path).toBe(rConfigs[0].children ![1].path);
|
expect(children[1].path).toBe(rChildren[1].path);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -125,41 +125,41 @@ describe('RouterState & Snapshot', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should return false when params are different', () => {
|
it('should return false when params are different', () => {
|
||||||
expect(equalParamsAndUrlSegments(createSnapshot({a: 1}, []), createSnapshot({a: 2}, [])))
|
expect(equalParamsAndUrlSegments(createSnapshot({a: '1'}, []), createSnapshot({a: '2'}, [])))
|
||||||
.toEqual(false);
|
.toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false when urls are different', () => {
|
it('should return false when urls are different', () => {
|
||||||
expect(equalParamsAndUrlSegments(
|
expect(equalParamsAndUrlSegments(
|
||||||
createSnapshot({a: 1}, [new UrlSegment('a', {})]),
|
createSnapshot({a: '1'}, [new UrlSegment('a', {})]),
|
||||||
createSnapshot({a: 1}, [new UrlSegment('b', {})])))
|
createSnapshot({a: '1'}, [new UrlSegment('b', {})])))
|
||||||
.toEqual(false);
|
.toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return true othewise', () => {
|
it('should return true othewise', () => {
|
||||||
expect(equalParamsAndUrlSegments(
|
expect(equalParamsAndUrlSegments(
|
||||||
createSnapshot({a: 1}, [new UrlSegment('a', {})]),
|
createSnapshot({a: '1'}, [new UrlSegment('a', {})]),
|
||||||
createSnapshot({a: 1}, [new UrlSegment('a', {})])))
|
createSnapshot({a: '1'}, [new UrlSegment('a', {})])))
|
||||||
.toEqual(true);
|
.toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false when upstream params are different', () => {
|
it('should return false when upstream params are different', () => {
|
||||||
const [snapshot1, snapshot2] =
|
const [snapshot1, snapshot2] =
|
||||||
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {c: 1}], ['a', 'a']);
|
createSnapshotPairWithParent([{a: '1'}, {a: '1'}], [{b: '1'}, {c: '1'}], ['a', 'a']);
|
||||||
|
|
||||||
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false when upstream urls are different', () => {
|
it('should return false when upstream urls are different', () => {
|
||||||
const [snapshot1, snapshot2] =
|
const [snapshot1, snapshot2] =
|
||||||
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'b']);
|
createSnapshotPairWithParent([{a: '1'}, {a: '1'}], [{b: '1'}, {b: '1'}], ['a', 'b']);
|
||||||
|
|
||||||
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return true when upstream urls and params are equal', () => {
|
it('should return true when upstream urls and params are equal', () => {
|
||||||
const [snapshot1, snapshot2] =
|
const [snapshot1, snapshot2] =
|
||||||
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'a']);
|
createSnapshotPairWithParent([{a: '1'}, {a: '1'}], [{b: '1'}, {b: '1'}], ['a', 'a']);
|
||||||
|
|
||||||
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(true);
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(true);
|
||||||
});
|
});
|
||||||
|
@ -184,8 +184,8 @@ describe('RouterState & Snapshot', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should call change observers', () => {
|
it('should call change observers', () => {
|
||||||
const firstPlace = createSnapshot({a: 1}, []);
|
const firstPlace = createSnapshot({a: '1'}, []);
|
||||||
const secondPlace = createSnapshot({a: 2}, []);
|
const secondPlace = createSnapshot({a: '2'}, []);
|
||||||
route.snapshot = firstPlace;
|
route.snapshot = firstPlace;
|
||||||
(route as any)._futureSnapshot = secondPlace;
|
(route as any)._futureSnapshot = secondPlace;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ describe('SpyNgModuleFactoryLoader', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return the created promise', () => {
|
it('should return the created promise', () => {
|
||||||
const expected = Promise.resolve('returned');
|
const expected: any = Promise.resolve('returned');
|
||||||
const compiler: any = {compileModuleAsync: () => expected};
|
const compiler: any = {compileModuleAsync: () => expected};
|
||||||
|
|
||||||
const r = new SpyNgModuleFactoryLoader(<any>compiler);
|
const r = new SpyNgModuleFactoryLoader(<any>compiler);
|
||||||
|
|
|
@ -387,35 +387,35 @@ import {async_fit, async_it} from './async';
|
||||||
});
|
});
|
||||||
it('processes update availability notifications when sent', (done: DoneFn) => {
|
it('processes update availability notifications when sent', (done: DoneFn) => {
|
||||||
update.available.subscribe(event => {
|
update.available.subscribe(event => {
|
||||||
expect(event.current).toEqual({version: 'A'});
|
expect(event.current).toEqual({hash: 'A'});
|
||||||
expect(event.available).toEqual({version: 'B'});
|
expect(event.available).toEqual({hash: 'B'});
|
||||||
expect(event.type).toEqual('UPDATE_AVAILABLE');
|
expect(event.type).toEqual('UPDATE_AVAILABLE');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
mock.sendMessage({
|
mock.sendMessage({
|
||||||
type: 'UPDATE_AVAILABLE',
|
type: 'UPDATE_AVAILABLE',
|
||||||
current: {
|
current: {
|
||||||
version: 'A',
|
hash: 'A',
|
||||||
},
|
},
|
||||||
available: {
|
available: {
|
||||||
version: 'B',
|
hash: 'B',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('processes update activation notifications when sent', (done: DoneFn) => {
|
it('processes update activation notifications when sent', (done: DoneFn) => {
|
||||||
update.activated.subscribe(event => {
|
update.activated.subscribe(event => {
|
||||||
expect(event.previous).toEqual({version: 'A'});
|
expect(event.previous).toEqual({hash: 'A'});
|
||||||
expect(event.current).toEqual({version: 'B'});
|
expect(event.current).toEqual({hash: 'B'});
|
||||||
expect(event.type).toEqual('UPDATE_ACTIVATED');
|
expect(event.type).toEqual('UPDATE_ACTIVATED');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
mock.sendMessage({
|
mock.sendMessage({
|
||||||
type: 'UPDATE_ACTIVATED',
|
type: 'UPDATE_ACTIVATED',
|
||||||
previous: {
|
previous: {
|
||||||
version: 'A',
|
hash: 'A',
|
||||||
},
|
},
|
||||||
current: {
|
current: {
|
||||||
version: 'B',
|
hash: 'B',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -30,10 +30,11 @@
|
||||||
},
|
},
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"bazel",
|
"bazel",
|
||||||
"compiler-cli/integrationtest",
|
|
||||||
"platform-server/integrationtest",
|
|
||||||
"common/locales",
|
"common/locales",
|
||||||
"elements/schematics"
|
"compiler-cli/integrationtest",
|
||||||
|
"elements/schematics",
|
||||||
|
"examples/**/e2e_test/*",
|
||||||
|
"platform-server/integrationtest"
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,20 +8,19 @@
|
||||||
|
|
||||||
// This file contains all ambient imports needed to compile the modules/ source code
|
// This file contains all ambient imports needed to compile the modules/ source code
|
||||||
|
|
||||||
/// <reference path="../node_modules/zone.js/dist/zone.js.d.ts" />
|
|
||||||
/// <reference path="../node_modules/@types/hammerjs/index.d.ts" />
|
/// <reference path="../node_modules/@types/hammerjs/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
|
/// <reference path="../node_modules/@types/jasmine/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/node/index.d.ts" />
|
/// <reference path="../node_modules/@types/node/index.d.ts" />
|
||||||
/// <reference path="../node_modules/@types/selenium-webdriver/index.d.ts" />
|
/// <reference path="../node_modules/zone.js/dist/zone.js.d.ts" />
|
||||||
/// <reference path="./es6-subset.d.ts" />
|
/// <reference path="./es6-subset.d.ts" />
|
||||||
/// <reference path="./system.d.ts" />
|
|
||||||
/// <reference path="./goog.d.ts" />
|
/// <reference path="./goog.d.ts" />
|
||||||
|
/// <reference path="./system.d.ts" />
|
||||||
|
|
||||||
declare let isNode: boolean;
|
declare let isNode: boolean;
|
||||||
declare let isBrowser: boolean;
|
declare let isBrowser: boolean;
|
||||||
|
|
||||||
declare namespace jasmine {
|
declare namespace jasmine {
|
||||||
interface Matchers {
|
interface Matchers<T> {
|
||||||
toHaveProperties(obj: any): boolean;
|
toHaveProperties(obj: any): boolean;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -787,7 +787,7 @@ withEachNg1Version(() => {
|
||||||
childMod.componentFactoryResolver.resolveComponentFactory(LazyLoadedComponent) !;
|
childMod.componentFactoryResolver.resolveComponentFactory(LazyLoadedComponent) !;
|
||||||
const lazyCmp = cmpFactory.create(componentInjector);
|
const lazyCmp = cmpFactory.create(componentInjector);
|
||||||
|
|
||||||
expect(lazyCmp.instance.module).toBe(childMod.injector);
|
expect(lazyCmp.instance.module.injector).toBe(childMod.injector);
|
||||||
});
|
});
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -60,5 +60,6 @@ travisFoldEnd "tsc tools"
|
||||||
travisFoldStart "tsc all"
|
travisFoldStart "tsc all"
|
||||||
node dist/tools/@angular/compiler-cli/src/main -p packages/tsconfig-metadata.json
|
node dist/tools/@angular/compiler-cli/src/main -p packages/tsconfig-metadata.json
|
||||||
$(npm bin)/tsc -p packages
|
$(npm bin)/tsc -p packages
|
||||||
|
$(npm bin)/tsc -p packages/examples
|
||||||
$(npm bin)/tsc -p modules
|
$(npm bin)/tsc -p modules
|
||||||
travisFoldEnd "tsc all"
|
travisFoldEnd "tsc all"
|
||||||
|
|
|
@ -533,9 +533,7 @@ export declare abstract class UrlSerializer {
|
||||||
export declare class UrlTree {
|
export declare class UrlTree {
|
||||||
fragment: string | null;
|
fragment: string | null;
|
||||||
readonly queryParamMap: ParamMap;
|
readonly queryParamMap: ParamMap;
|
||||||
queryParams: {
|
queryParams: Params;
|
||||||
[key: string]: string;
|
|
||||||
};
|
|
||||||
root: UrlSegmentGroup;
|
root: UrlSegmentGroup;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,7 @@ const BaseConfig = {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (platform == 'node') {
|
if (platform == 'node') {
|
||||||
const specFiles = [
|
const specFiles = ['@angular/**/*_spec.js'];
|
||||||
'@angular/**/*_spec.js', '@angular/compiler-cli/test/**/*_spec.js',
|
|
||||||
'@angular/benchpress/test/**/*_spec.js'
|
|
||||||
];
|
|
||||||
tscWatch = new TscWatch(Object.assign(
|
tscWatch = new TscWatch(Object.assign(
|
||||||
{
|
{
|
||||||
tsconfig: 'packages/tsconfig.json',
|
tsconfig: 'packages/tsconfig.json',
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style license that can be
|
||||||
|
* found in the LICENSE file at https://angular.io/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extended typings for `jasminewd2`.
|
||||||
|
*
|
||||||
|
* The currently used `jasminewd2` version (v2.1.0), supports passing a `done` callback to a spec,
|
||||||
|
* but the latest typings on [DefinitelyTyped][1] do not reflect that.
|
||||||
|
* Overwrite the relevant function signatures to add a `done` callback.
|
||||||
|
*
|
||||||
|
* [1]:
|
||||||
|
* https://github.com/DefinitelyTyped/DefinitelyTyped/blob/566e0394859fdc1dc893658ccec6b06372d56a91/types/jasminewd2/index.d.ts#L9-L15
|
||||||
|
*/
|
||||||
|
declare function it(
|
||||||
|
expectation: string, assertion?: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function fit(
|
||||||
|
expectation: string, assertion?: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function xit(
|
||||||
|
expectation: string, assertion?: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function beforeEach(action: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function afterEach(action: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function beforeAll(action: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
||||||
|
declare function afterAll(action: (done: DoneFn) => Promise<void>, timeout?: number): void;
|
42
yarn.lock
42
yarn.lock
|
@ -96,9 +96,15 @@
|
||||||
version "2.0.35"
|
version "2.0.35"
|
||||||
resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.35.tgz#7b7c950c7d54593e23bffc8d2b4feba9866a7277"
|
resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.35.tgz#7b7c950c7d54593e23bffc8d2b4feba9866a7277"
|
||||||
|
|
||||||
"@types/jasmine@2.2.22-alpha":
|
"@types/jasmine@*", "@types/jasmine@^2.8.8":
|
||||||
version "2.2.22-alpha"
|
version "2.8.8"
|
||||||
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.2.22-alpha.tgz#eecaee43fe42ef6b5cfefad1bcc370c433f485bf"
|
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9"
|
||||||
|
|
||||||
|
"@types/jasminewd2@^2.0.3":
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95"
|
||||||
|
dependencies:
|
||||||
|
"@types/jasmine" "*"
|
||||||
|
|
||||||
"@types/minimatch@*":
|
"@types/minimatch@*":
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
|
@ -2517,13 +2523,6 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glo
|
||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
path-is-absolute "^1.0.0"
|
path-is-absolute "^1.0.0"
|
||||||
|
|
||||||
glob@^3.2.11:
|
|
||||||
version "3.2.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
|
|
||||||
dependencies:
|
|
||||||
inherits "2"
|
|
||||||
minimatch "0.3"
|
|
||||||
|
|
||||||
glob@^4.3.1:
|
glob@^4.3.1:
|
||||||
version "4.5.3"
|
version "4.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
|
||||||
|
@ -3256,11 +3255,7 @@ isstream@~0.1.1, isstream@~0.1.2:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
||||||
|
|
||||||
jasmine-core@2.4.1, jasmine-core@~2.4.0:
|
jasmine-core@2.8, jasmine-core@~2.8.0:
|
||||||
version "2.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.4.1.tgz#6f83ab3a0f16951722ce07d206c773d57cc838be"
|
|
||||||
|
|
||||||
jasmine-core@~2.8.0:
|
|
||||||
version "2.8.0"
|
version "2.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
|
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
|
||||||
|
|
||||||
|
@ -3270,15 +3265,7 @@ jasmine-diff@^0.1.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
diff "^3.2.0"
|
diff "^3.2.0"
|
||||||
|
|
||||||
jasmine@2.4.1:
|
jasmine@2.8, jasmine@^2.5.3:
|
||||||
version "2.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.4.1.tgz#9016dda453213d27ac6d43dc4ea97315a189085e"
|
|
||||||
dependencies:
|
|
||||||
exit "^0.1.2"
|
|
||||||
glob "^3.2.11"
|
|
||||||
jasmine-core "~2.4.0"
|
|
||||||
|
|
||||||
jasmine@^2.5.3:
|
|
||||||
version "2.8.0"
|
version "2.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
|
resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -3993,13 +3980,6 @@ mimic-fn@^1.0.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
|
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
|
||||||
|
|
||||||
minimatch@0.3:
|
|
||||||
version "0.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
|
|
||||||
dependencies:
|
|
||||||
lru-cache "2"
|
|
||||||
sigmund "~1.0.0"
|
|
||||||
|
|
||||||
"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
|
"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||||
|
|
Loading…
Reference in New Issue