test(core): fix schematics calls to run synchronously (#34364)

Previously the calls to run the schematics were not being properly
or consistently awaited in the tests. While this currently does not
affect the tests' performance, this fix corrects the syntax and
adds stability for future changes.

PR Close #34364
This commit is contained in:
Adam Plumer 2019-12-12 00:06:34 -06:00 committed by Kara Erickson
parent 6e7ca05efc
commit 3255d2b197
8 changed files with 225 additions and 226 deletions

View File

@ -160,6 +160,6 @@ describe('dynamic queries migration', () => {
} }
function runMigration() { function runMigration() {
runner.runSchematicAsync('migration-v9-dynamic-queries', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v9-dynamic-queries', {}, tree).toPromise();
} }
}); });

View File

@ -63,8 +63,8 @@ describe('Missing injectable migration', () => {
host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents));
} }
async function runMigration() { function runMigration() {
await runner.runSchematicAsync('migration-v9-missing-injectable', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v9-missing-injectable', {}, tree).toPromise();
} }
describe('NgModule', () => createTests('NgModule', 'providers')); describe('NgModule', () => createTests('NgModule', 'providers'));
@ -79,10 +79,10 @@ describe('Missing injectable migration', () => {
async() => { async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component} from '@angular/core'; import {Component} from '@angular/core';
export class MyService {} export class MyService {}
export class MySecondService {} export class MySecondService {}
@Component({ @Component({
providers: [MyService], providers: [MyService],
viewProviders: [MySecondService], viewProviders: [MySecondService],
@ -106,9 +106,9 @@ describe('Missing injectable migration', () => {
it(`should migrate type provider in ${type}`, async() => { it(`should migrate type provider in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -124,9 +124,9 @@ describe('Missing injectable migration', () => {
it(`should migrate object literal provider in ${type} to explicit value provider`, async() => { it(`should migrate object literal provider in ${type} to explicit value provider`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
@${type}({${propName}: [{provide: MyService}]}) @${type}({${propName}: [{provide: MyService}]})
export class TestClass {} export class TestClass {}
`); `);
@ -143,7 +143,7 @@ describe('Missing injectable migration', () => {
it(`should migrate object literal provider with forwardRef in ${type}`, async() => { it(`should migrate object literal provider with forwardRef in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}, forwardRef} from '@angular/core'; import {${type}, forwardRef} from '@angular/core';
@${type}({${propName}: [forwardRef(() => MyService)]}) @${type}({${propName}: [forwardRef(() => MyService)]})
export class TestClass {} export class TestClass {}
@ -161,9 +161,9 @@ describe('Missing injectable migration', () => {
it(`should not migrate object literal provider with "useValue" in ${type}`, async() => { it(`should not migrate object literal provider with "useValue" in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
@${type}({${propName}: [{provide: MyService, useValue: null }]}) @${type}({${propName}: [{provide: MyService, useValue: null }]})
export class TestClass {} export class TestClass {}
`); `);
@ -177,9 +177,9 @@ describe('Missing injectable migration', () => {
it(`should not migrate provider with "useClass" and "deps" in ${type}`, async() => { it(`should not migrate provider with "useClass" and "deps" in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
@${type}({${propName}: [{provide: MyService, deps: []}]}) @${type}({${propName}: [{provide: MyService, deps: []}]})
export class TestClass {} export class TestClass {}
`); `);
@ -193,9 +193,9 @@ describe('Missing injectable migration', () => {
it(`should not migrate object literal provider with "useFactory" in ${type}`, async() => { it(`should not migrate object literal provider with "useFactory" in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
@${type}({${propName}: [{provide: MyService, useFactory: () => null }]}) @${type}({${propName}: [{provide: MyService, useFactory: () => null }]})
export class TestClass {} export class TestClass {}
`); `);
@ -209,10 +209,10 @@ describe('Missing injectable migration', () => {
it(`should not migrate object literal provider with "useExisting" in ${type}`, async() => { it(`should not migrate object literal provider with "useExisting" in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
export class MyToken {} export class MyToken {}
@${type}({${propName}: [ @${type}({${propName}: [
{provide: MyService: useValue: null}, {provide: MyService: useValue: null},
{provide: MyToken, useExisting: MyService}, {provide: MyToken, useExisting: MyService},
@ -229,10 +229,10 @@ describe('Missing injectable migration', () => {
it(`should migrate object literal provider with "useClass" in ${type}`, async() => { it(`should migrate object literal provider with "useClass" in ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
export class MyToken {} export class MyToken {}
@${type}({${propName}: [{provide: MyToken, useClass: MyService}]}) @${type}({${propName}: [{provide: MyToken, useClass: MyService}]})
export class TestClass {} export class TestClass {}
`); `);
@ -251,10 +251,10 @@ describe('Missing injectable migration', () => {
async() => { async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class MyService {} export class MyService {}
export class MyToken {} export class MyToken {}
@${type}({ @${type}({
${propName}: [ ${propName}: [
{provide: MyToken, useExisting: MyService}, {provide: MyToken, useExisting: MyService},
@ -266,7 +266,7 @@ describe('Missing injectable migration', () => {
writeFile('/other.ts', ` writeFile('/other.ts', `
import {${type} from '@angular/core'; import {${type} from '@angular/core';
import {MyService} from './index'; import {MyService} from './index';
export @${type}({ export @${type}({
${propName}: [{provide: MyService, useClass: MyService}], ${propName}: [{provide: MyService, useClass: MyService}],
}) })
@ -284,10 +284,10 @@ describe('Missing injectable migration', () => {
it('should not migrate provider which is already decorated with @Injectable', async() => { it('should not migrate provider which is already decorated with @Injectable', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Injectable, ${type}} from '@angular/core'; import {Injectable, ${type}} from '@angular/core';
@Injectable() @Injectable()
export class MyService {} export class MyService {}
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -302,10 +302,10 @@ describe('Missing injectable migration', () => {
it('should not migrate provider which is already decorated with @Directive', async() => { it('should not migrate provider which is already decorated with @Directive', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Directive, ${type}} from '@angular/core'; import {Directive, ${type}} from '@angular/core';
@Directive() @Directive()
export class MyService {} export class MyService {}
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -319,10 +319,10 @@ describe('Missing injectable migration', () => {
it('should not migrate provider which is already decorated with @Component', async() => { it('should not migrate provider which is already decorated with @Component', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, ${type}} from '@angular/core'; import {Component, ${type}} from '@angular/core';
@Component() @Component()
export class MyService {} export class MyService {}
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -336,10 +336,10 @@ describe('Missing injectable migration', () => {
it('should not migrate provider which is already decorated with @Pipe', async() => { it('should not migrate provider which is already decorated with @Pipe', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Pipe, ${type}} from '@angular/core'; import {Pipe, ${type}} from '@angular/core';
@Pipe() @Pipe()
export class MyService {} export class MyService {}
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -353,10 +353,10 @@ describe('Missing injectable migration', () => {
it(`should migrate multiple providers in same ${type}`, async() => { it(`should migrate multiple providers in same ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
@${type}({${propName}: [ServiceA, ServiceB]}) @${type}({${propName}: [ServiceA, ServiceB]})
export class TestClass {} export class TestClass {}
`); `);
@ -373,11 +373,11 @@ describe('Missing injectable migration', () => {
it(`should migrate multiple mixed providers in same ${type}`, async() => { it(`should migrate multiple mixed providers in same ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
export class ServiceC {} export class ServiceC {}
@${type}({ @${type}({
${propName}: [ ${propName}: [
ServiceA, ServiceA,
@ -402,12 +402,12 @@ describe('Missing injectable migration', () => {
it(`should migrate multiple nested providers in same ${type}`, async() => { it(`should migrate multiple nested providers in same ${type}`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
export class ServiceC {} export class ServiceC {}
export class ServiceD {} export class ServiceD {}
@${type}({ @${type}({
${propName}: [ ${propName}: [
ServiceA, ServiceA,
@ -436,11 +436,11 @@ describe('Missing injectable migration', () => {
it('should migrate providers referenced through identifier', async() => { it('should migrate providers referenced through identifier', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
export class ServiceC {} export class ServiceC {}
const PROVIDERS = [ const PROVIDERS = [
ServiceA, ServiceA,
ServiceB, ServiceB,
@ -448,7 +448,7 @@ describe('Missing injectable migration', () => {
// an invalid object literal. // an invalid object literal.
{provide: ServiceC, }, {provide: ServiceC, },
]; ];
@${type}({ @${type}({
${propName}: PROVIDERS, ${propName}: PROVIDERS,
}) })
@ -470,15 +470,15 @@ describe('Missing injectable migration', () => {
it('should migrate providers created through static analyzable function call', async() => { it('should migrate providers created through static analyzable function call', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
export class ServiceC {} export class ServiceC {}
export function createProviders(x: any, b: any) { export function createProviders(x: any, b: any) {
return [ServiceA, x, b] return [ServiceA, x, b]
} }
@${type}({ @${type}({
${propName}: createProviders(ServiceB, {provide: ServiceC}), ${propName}: createProviders(ServiceB, {provide: ServiceC}),
}) })
@ -500,13 +500,13 @@ describe('Missing injectable migration', () => {
it('should migrate providers which are computed through spread operator', async() => { it('should migrate providers which are computed through spread operator', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
export class ServiceB {} export class ServiceB {}
export class ServiceC {} export class ServiceC {}
const otherServices = [ServiceB, {provide: ServiceC}]; const otherServices = [ServiceB, {provide: ServiceC}];
@${type}({ @${type}({
${propName}: [ServiceA, ...otherServices], ${propName}: [ServiceA, ...otherServices],
}) })
@ -528,9 +528,9 @@ describe('Missing injectable migration', () => {
it(`should migrate provider once if referenced in multiple ${type} definitions`, async() => { it(`should migrate provider once if referenced in multiple ${type} definitions`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
export class ServiceA {} export class ServiceA {}
@${type}({${propName}: [ServiceA]}) @${type}({${propName}: [ServiceA]})
export class TestClassA {} export class TestClassA {}
`); `);
@ -538,9 +538,9 @@ describe('Missing injectable migration', () => {
writeFile('/second.ts', ` writeFile('/second.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {ServiceA} from './index'; import {ServiceA} from './index';
export class ServiceB {} export class ServiceB {}
@${type}({${propName}: [ServiceA, ServiceB]}) @${type}({${propName}: [ServiceA, ServiceB]})
export class TestClassB {} export class TestClassB {}
`); `);
@ -562,14 +562,14 @@ describe('Missing injectable migration', () => {
async() => { async() => {
writeFile('/provider.ts', ` writeFile('/provider.ts', `
export class MyService {} export class MyService {}
export const PROVIDER = {provide: MyService}; export const PROVIDER = {provide: MyService};
`); `);
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {PROVIDER} from './provider'; import {PROVIDER} from './provider';
@${type}({${propName}: [PROVIDER]}) @${type}({${propName}: [PROVIDER]})
export class TestClassA {} export class TestClassA {}
`); `);
@ -577,9 +577,9 @@ describe('Missing injectable migration', () => {
writeFile('/second.ts', ` writeFile('/second.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {PROVIDER} from './provider'; import {PROVIDER} from './provider';
export class ServiceB {} export class ServiceB {}
@${type}({${propName}: [PROVIDER, ServiceB]}) @${type}({${propName}: [PROVIDER, ServiceB]})
export class TestClassB {} export class TestClassB {}
`); `);
@ -596,13 +596,13 @@ describe('Missing injectable migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {MyService, MySecondService} from './service'; import {MyService, MySecondService} from './service';
@${type}({${propName}: [MyService, MySecondService]}) @${type}({${propName}: [MyService, MySecondService]})
export class TestClass {} export class TestClass {}
`); `);
writeFile('/service.ts', `export class MyService {} writeFile('/service.ts', `export class MyService {}
export class MySecondService {} export class MySecondService {}
`); `);
@ -620,7 +620,7 @@ describe('Missing injectable migration', () => {
async() => { async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import * as core from '@angular/core'; import * as core from '@angular/core';
export class MyService { export class MyService {
constructor() { constructor() {
console.log(core.isDevMode()); console.log(core.isDevMode());
@ -631,7 +631,7 @@ describe('Missing injectable migration', () => {
writeFile('/app.module.ts', ` writeFile('/app.module.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {MyService} from './index'; import {MyService} from './index';
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -646,7 +646,7 @@ describe('Missing injectable migration', () => {
it('should warn if a referenced individual provider could not be resolved', async() => { it('should warn if a referenced individual provider could not be resolved', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
@${type}({${propName}: [NotPresent]}) @${type}({${propName}: [NotPresent]})
export class TestClass {} export class TestClass {}
`); `);
@ -662,7 +662,7 @@ describe('Missing injectable migration', () => {
it(`should warn if ${propName} value could not be resolved`, async() => { it(`should warn if ${propName} value could not be resolved`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
@${type}({${propName}: NOT_ANALYZABLE) @${type}({${propName}: NOT_ANALYZABLE)
export class TestClass {} export class TestClass {}
`); `);
@ -678,7 +678,7 @@ describe('Missing injectable migration', () => {
it(`should not throw if an empty @${type} is analyzed`, async() => { it(`should not throw if an empty @${type} is analyzed`, async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
@${type}() @${type}()
export class MyModule {} export class MyModule {}
`); `);
@ -697,7 +697,7 @@ describe('Missing injectable migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {MyService} from './service'; import {MyService} from './service';
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -705,7 +705,7 @@ describe('Missing injectable migration', () => {
writeFile('/service.ts', ` writeFile('/service.ts', `
import * as a from 'a'; import * as a from 'a';
import * as a from 'b'; // some comment import * as a from 'b'; // some comment
export class MyService {} export class MyService {}
`); `);
@ -722,7 +722,7 @@ describe('Missing injectable migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {MyService} from './service'; import {MyService} from './service';
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
@ -743,14 +743,14 @@ describe('Missing injectable migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {${type}} from '@angular/core'; import {${type}} from '@angular/core';
import {MyService} from './service'; import {MyService} from './service';
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);
writeFile('/service.ts', ` writeFile('/service.ts', `
import {Inject} from '@angular/core'; import {Inject} from '@angular/core';
@Inject() @Inject()
export class MyService {} export class MyService {}
`); `);
@ -774,7 +774,7 @@ describe('Missing injectable migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {MyService} from 'my-lib'; import {MyService} from 'my-lib';
import {Pipe, ${type}} from '@angular/core'; import {Pipe, ${type}} from '@angular/core';
@${type}({${propName}: [MyService]}) @${type}({${propName}: [MyService]})
export class TestClass {} export class TestClass {}
`); `);

View File

@ -49,14 +49,14 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return', async() => { it('should add generic type for function return', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule, ModuleWithProviders} from '@angular/core'; import {NgModule, ModuleWithProviders} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export function getProvider() { export function getProvider() {
return {ngModule: BaseModule} return {ngModule: BaseModule}
} }
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders {
@ -72,18 +72,18 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return; external file', async() => { it('should add generic type for function return; external file', async() => {
writeFile('/module.ts', ` writeFile('/module.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
`); `);
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule, ModuleWithProviders} from '@angular/core'; import {NgModule, ModuleWithProviders} from '@angular/core';
import {BaseModule} from './module'; import {BaseModule} from './module';
export function getProvider() { export function getProvider() {
return {ngModule: BaseModule} return {ngModule: BaseModule}
} }
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders {
@ -99,14 +99,14 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return without explicit type', async() => { it('should add generic type for function return without explicit type', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export function getProvider() { export function getProvider() {
return {ngModule: BaseModule} return {ngModule: BaseModule}
} }
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot() { static forRoot() {
@ -122,12 +122,12 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variable', async() => { it('should add generic type for const variable', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {ModuleWithProviders, NgModule} from '@angular/core'; import {ModuleWithProviders, NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule}; export const myModuleWithProviders = {ngModule: BaseModule};
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot(): ModuleWithProviders { static forRoot(): ModuleWithProviders {
@ -143,12 +143,12 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variable without explicit type', async() => { it('should add generic type for const variable without explicit type', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule}; export const myModuleWithProviders = {ngModule: BaseModule};
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot() { static forRoot() {
@ -164,12 +164,12 @@ describe('ModuleWithProviders migration', () => {
it('should not add generic type for const variable with invalid base object', async() => { it('should not add generic type for const variable with invalid base object', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule, otherKey: 'a'}; export const myModuleWithProviders = {ngModule: BaseModule, otherKey: 'a'};
@NgModule({}) @NgModule({})
export class TestModule { export class TestModule {
static forRoot() { static forRoot() {
@ -185,24 +185,24 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variables and functions with incomplete type', async() => { it('should add generic type for const variables and functions with incomplete type', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {ModuleWithProviders, NgModule} from '@angular/core'; import {ModuleWithProviders, NgModule} from '@angular/core';
@NgModule({}) @NgModule({})
export class BaseModule {} export class BaseModule {}
export const myModuleWithProviders: ModuleWithProviders = {ngModule: BaseModule}; export const myModuleWithProviders: ModuleWithProviders = {ngModule: BaseModule};
export function mwpFunction(): ModuleWithProviders { export function mwpFunction(): ModuleWithProviders {
return myModuleWithProviders; return myModuleWithProviders;
} }
export class MwpClass { export class MwpClass {
mwp: ModuleWithProviders = myModuleWithProviders; mwp: ModuleWithProviders = myModuleWithProviders;
private _mwp: ModuleWithProviders = myModuleWithProviders; private _mwp: ModuleWithProviders = myModuleWithProviders;
getMwp(): ModuleWithProviders { getMwp(): ModuleWithProviders {
return myModuleWithProviders; return myModuleWithProviders;
} }
static initMwp(): ModuleWithProviders { static initMwp(): ModuleWithProviders {
return myModuleWithProviders; return myModuleWithProviders;
} }
@ -217,7 +217,7 @@ describe('ModuleWithProviders migration', () => {
it('should not add generic type for const variables without initialization', async() => { it('should not add generic type for const variables without initialization', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {ModuleWithProviders} from '@angular/core'; import {ModuleWithProviders} from '@angular/core';
export const myModuleWithProviders: ModuleWithProviders; export const myModuleWithProviders: ModuleWithProviders;
`); `);
@ -230,6 +230,6 @@ describe('ModuleWithProviders migration', () => {
} }
function runMigration() { function runMigration() {
runner.runSchematicAsync('migration-v9-module-with-providers', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v9-module-with-providers', {}, tree).toPromise();
} }
}); });

View File

@ -165,6 +165,6 @@ describe('move-document migration', () => {
} }
function runMigration() { function runMigration() {
runner.runSchematicAsync('migration-v8-move-document', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v8-move-document', {}, tree).toPromise();
} }
}); });

View File

@ -100,8 +100,8 @@ describe('static-queries migration with template strategy', () => {
host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents));
} }
async function runMigration() { function runMigration() {
await runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
} }
describe('ViewChild', () => { describe('ViewChild', () => {
@ -533,13 +533,13 @@ describe('static-queries migration with template strategy', () => {
read?: any; read?: any;
}): any; }): any;
} }
export declare const ViewChild: ViewChildDecorator; export declare const ViewChild: ViewChildDecorator;
`); `);
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule, Component, ViewChild} from '@angular/core'; import {NgModule, Component, ViewChild} from '@angular/core';
@Component({ @Component({
template: '<ng-template><p #myRef></p></ng-template>' template: '<ng-template><p #myRef></p></ng-template>'
}) })
@ -551,7 +551,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', ` writeFile('/my-module.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {MyComp} from './index'; import {MyComp} from './index';
@NgModule({declarations: [MyComp]}) @NgModule({declarations: [MyComp]})
export class MyModule {} export class MyModule {}
`); `);
@ -568,7 +568,7 @@ describe('static-queries migration with template strategy', () => {
async() => { async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {NgModule, Component, ViewChild} from '@angular/core'; import {NgModule, Component, ViewChild} from '@angular/core';
@Component({ @Component({
template: '<p #myRef>{{myVar.hello()}}</p>' template: '<p #myRef>{{myVar.hello()}}</p>'
}) })
@ -576,7 +576,7 @@ describe('static-queries migration with template strategy', () => {
// This causes a type checking exception as the template // This causes a type checking exception as the template
// tries to call a function called "hello()" on this variable. // tries to call a function called "hello()" on this variable.
myVar: boolean = false; myVar: boolean = false;
@ViewChild('myRef') query: any; @ViewChild('myRef') query: any;
} }
`); `);
@ -584,7 +584,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', ` writeFile('/my-module.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {MyComp} from './index'; import {MyComp} from './index';
@NgModule({declarations: [MyComp]}) @NgModule({declarations: [MyComp]})
export class MyModule {} export class MyModule {}
`); `);
@ -599,7 +599,7 @@ describe('static-queries migration with template strategy', () => {
it('should notify user if project has syntax errors which can affect analysis', async() => { it('should notify user if project has syntax errors which can affect analysis', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, ViewChild} from '@angular/core'; import {Component, ViewChild} from '@angular/core';
@Component({ @Component({
template: '<p #myRef></p>' template: '<p #myRef></p>'
}) })
@ -608,7 +608,7 @@ describe('static-queries migration with template strategy', () => {
} }
`); `);
writeFile('/file-with-syntax-error.ts', ` writeFile('/file-with-syntax-error.ts', `
export classX ClassWithSyntaxError { export classX ClassWithSyntaxError {
// ... // ...
} }
@ -617,7 +617,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', ` writeFile('/my-module.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {MyComp} from './index'; import {MyComp} from './index';
@NgModule({declarations: [MyComp]}) @NgModule({declarations: [MyComp]})
export class MyModule {} export class MyModule {}
`); `);
@ -716,7 +716,7 @@ describe('static-queries migration with template strategy', () => {
it('should add a todo if query options cannot be migrated inline', async() => { it('should add a todo if query options cannot be migrated inline', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, ViewChild} from '@angular/core'; import {Component, NgModule, ViewChild} from '@angular/core';
const myOptionsVar = {}; const myOptionsVar = {};
@Component({template: '<p #myRef></p>'}) @Component({template: '<p #myRef></p>'})

View File

@ -172,8 +172,8 @@ describe('static-queries migration with usage strategy', () => {
host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents));
} }
async function runMigration() { function runMigration() {
await runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise(); return runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
} }
function createQueryTests(queryType: 'ViewChild' | 'ContentChild') { function createQueryTests(queryType: 'ViewChild' | 'ContentChild') {
@ -686,12 +686,12 @@ describe('static-queries migration with usage strategy', () => {
resolve(): Promise; resolve(): Promise;
reject(): Promise; reject(): Promise;
} }
interface Promise { interface Promise {
then(cb: Function): Promise; then(cb: Function): Promise;
catch(cb: Function): Promise; catch(cb: Function): Promise;
} }
declare var Promise: PromiseConstructor; declare var Promise: PromiseConstructor;
`); `);
writeFile('/index.ts', ` writeFile('/index.ts', `
@ -1437,15 +1437,15 @@ describe('static-queries migration with usage strategy', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, ${queryType}} from '@angular/core'; import {Component, ${queryType}} from '@angular/core';
import {thirdPartySync} from 'my-lib'; import {thirdPartySync} from 'my-lib';
@Component({template: '<span>Template</span>'}) @Component({template: '<span>Template</span>'})
export class MyComponent { export class MyComponent {
@${queryType}('test') query: any; @${queryType}('test') query: any;
@${queryType}('test') query2: any; @${queryType}('test') query2: any;
ngOnInit() { ngOnInit() {
const myVarFn = () => this.query2.doSomething(); const myVarFn = () => this.query2.doSomething();
thirdPartySync(() => this.query.doSomething()); thirdPartySync(() => this.query.doSomething());
thirdPartySync(myVarFn); thirdPartySync(myVarFn);
} }
@ -1473,12 +1473,12 @@ describe('static-queries migration with usage strategy', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, ${queryType}} from '@angular/core'; import {Component, ${queryType}} from '@angular/core';
import {ThirdParty} from 'my-lib'; import {ThirdParty} from 'my-lib';
@Component({template: '<span>Template</span>'}) @Component({template: '<span>Template</span>'})
export class MyComponent { export class MyComponent {
@${queryType}('test') query: any; @${queryType}('test') query: any;
ngOnInit() { ngOnInit() {
new ThirdParty(() => this.query.doSomething()); new ThirdParty(() => this.query.doSomething());
} }
} }
@ -1533,11 +1533,11 @@ describe('static-queries migration with usage strategy', () => {
@Component({template: '<span>Test</span>'}) @Component({template: '<span>Test</span>'})
export class MyComponent { export class MyComponent {
@${queryType}('test') query: any; @${queryType}('test') query: any;
ngOnInit() { ngOnInit() {
this.myFunction(); this.myFunction();
} }
myFunction(unused?: string, cb = () => this.query.doSomething) { myFunction(unused?: string, cb = () => this.query.doSomething) {
cb(); cb();
} }

View File

@ -68,13 +68,12 @@ describe('Undecorated classes with DI migration', () => {
host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents));
} }
async function runMigration() { function runMigration() {
return runner.runSchematicAsync('migration-v9-undecorated-classes-with-di', {}, tree) return runner.runSchematicAsync('migration-v9-undecorated-classes-with-di', {}, tree)
.toPromise(); .toPromise();
} }
function function writeFakeAngular() {
writeFakeAngular() {
writeFile('/node_modules/@angular/core/index.d.ts', ` writeFile('/node_modules/@angular/core/index.d.ts', `
export declare class PipeTransform {} export declare class PipeTransform {}
export declare class NgZone {} export declare class NgZone {}
@ -92,7 +91,7 @@ describe('Undecorated classes with DI migration', () => {
})); }));
writeFile('/node_modules/my-lib/index.d.ts', ` writeFile('/node_modules/my-lib/index.d.ts', `
import {NgZone} from '@angular/core'; import {NgZone} from '@angular/core';
export declare class SuperBaseClass { export declare class SuperBaseClass {
constructor(zone: NgZone); constructor(zone: NgZone);
} }
@ -101,12 +100,12 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {SuperBaseClass} from 'my-lib'; import {SuperBaseClass} from 'my-lib';
export class BaseClass extends SuperBaseClass {} export class BaseClass extends SuperBaseClass {}
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class MyModule {} export class MyModule {}
`); `);
@ -125,21 +124,21 @@ describe('Undecorated classes with DI migration', () => {
it('should add @Directive() decorator to extended base class', async() => { it('should add @Directive() decorator to extended base class', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
export class BaseClass2 { export class BaseClass2 {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@Component({template: ''}) @Component({template: ''})
export class MyComponent2 extends BaseClass2 {} export class MyComponent2 extends BaseClass2 {}
@NgModule({declarations: [MyComponent, MyComponent2]}) @NgModule({declarations: [MyComponent, MyComponent2]})
export class AppModule {} export class AppModule {}
`); `);
@ -153,17 +152,17 @@ describe('Undecorated classes with DI migration', () => {
it('not decorated base class multiple times if extended multiple times', async() => { it('not decorated base class multiple times if extended multiple times', async() => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@Component({template: ''}) @Component({template: ''})
export class MyComponent2 extends BaseClass {} export class MyComponent2 extends BaseClass {}
@NgModule({declarations: [MyComponent, MyComponent2]}) @NgModule({declarations: [MyComponent, MyComponent2]})
export class AppModule {} export class AppModule {}
`); `);
@ -171,7 +170,7 @@ describe('Undecorated classes with DI migration', () => {
await runMigration(); await runMigration();
expect(tree.readContent('/index.ts')).toContain(dedent ` expect(tree.readContent('/index.ts')).toContain(dedent `
@Directive() @Directive()
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
@ -181,14 +180,14 @@ describe('Undecorated classes with DI migration', () => {
it('should add @Injectable() decorator to extended base class', async() => { it('should add @Injectable() decorator to extended base class', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Injectable, NgModule, NgZone} from '@angular/core'; import {Injectable, NgModule, NgZone} from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Injectable({template: ''}) @Injectable({template: ''})
export class MyService extends BaseClass {} export class MyService extends BaseClass {}
@NgModule({providers: [MyService]}) @NgModule({providers: [MyService]})
export class AppModule {} export class AppModule {}
`); `);
@ -201,10 +200,10 @@ describe('Undecorated classes with DI migration', () => {
it('should not decorate base class for decorated pipe', async() => { it('should not decorate base class for decorated pipe', async() => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, NgModule, Pipe, PipeTransform} from '@angular/core'; import {Component, NgModule, Pipe, PipeTransform} from '@angular/core';
@Pipe({name: 'test'}) @Pipe({name: 'test'})
export class MyPipe extends PipeTransform {} export class MyPipe extends PipeTransform {}
@NgModule({declarations: [MyPipe]}) @NgModule({declarations: [MyPipe]})
export class AppModule {} export class AppModule {}
`); `);
@ -256,29 +255,29 @@ describe('Undecorated classes with DI migration', () => {
async() => { async() => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, Injectable, NgModule, NgZone} from '@angular/core'; import {Component, Injectable, NgModule, NgZone} from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass { export class MyComponent extends BaseClass {
constructor(zone: NgZone) { constructor(zone: NgZone) {
super(zone); super(zone);
} }
} }
@Injectable() @Injectable()
export class MyService extends BaseClass { export class MyService extends BaseClass {
constructor(zone: NgZone) { constructor(zone: NgZone) {
super(zone); super(zone);
} }
} }
@NgModule({declarations: [MyComponent], providers: [MyService]}) @NgModule({declarations: [MyComponent], providers: [MyService]})
export class AppModule {} export class AppModule {}
`); `);
@ -295,18 +294,18 @@ describe('Undecorated classes with DI migration', () => {
it('should not decorate base class if it already has decorator', async() => { it('should not decorate base class if it already has decorator', async() => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, Directive, NgModule, NgZone} from '@angular/core'; import {Component, Directive, NgModule, NgZone} from '@angular/core';
@Directive({selector: 'base-class'}) @Directive({selector: 'base-class'})
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class AppModule {} export class AppModule {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -314,7 +313,7 @@ describe('Undecorated classes with DI migration', () => {
await runMigration(); await runMigration();
expect(tree.readContent('/index.ts')).toContain(dedent ` expect(tree.readContent('/index.ts')).toContain(dedent `
@Directive({selector: 'base-class'}) @Directive({selector: 'base-class'})
export class BaseClass {`); export class BaseClass {`);
}); });
@ -327,7 +326,7 @@ describe('Undecorated classes with DI migration', () => {
})); }));
writeFile('/node_modules/my-lib/index.d.ts', ` writeFile('/node_modules/my-lib/index.d.ts', `
import {NgZone} from '@angular/core'; import {NgZone} from '@angular/core';
export declare class SuperBaseClass { export declare class SuperBaseClass {
constructor(zone: NgZone); constructor(zone: NgZone);
} }
@ -336,30 +335,30 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, Injectable, NgModule} from '@angular/core'; import {Component, Injectable, NgModule} from '@angular/core';
import {SuperBaseClass} from 'my-lib'; import {SuperBaseClass} from 'my-lib';
export class BaseClass extends SuperBaseClass {} export class BaseClass extends SuperBaseClass {}
export class BaseClass2 extends SuperBaseClass {} export class BaseClass2 extends SuperBaseClass {}
export class PassThroughClass extends BaseClass {} export class PassThroughClass extends BaseClass {}
// should cause "BaseClass" to get a todo comment. // should cause "BaseClass" to get a todo comment.
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends PassThroughClass {} export class MyComponent extends PassThroughClass {}
// should cause "BaseClass2" to get a todo comment. // should cause "BaseClass2" to get a todo comment.
@Injectable() @Injectable()
export class MyService extends BaseClass2 {} export class MyService extends BaseClass2 {}
// should cause "BaseClass" to get a todo comment. // should cause "BaseClass" to get a todo comment.
@Component({template: ''}) @Component({template: ''})
export class MyComponent2 extends BaseClass {} export class MyComponent2 extends BaseClass {}
// should get a todo comment because there are no base classes // should get a todo comment because there are no base classes
// in between. // in between.
@Component({template: ''}) @Component({template: ''})
export class MyComponent3 extends SuperBaseClass {} export class MyComponent3 extends SuperBaseClass {}
@NgModule({declarations: [MyComponent, MyComponent2, MyComponent3], providers: [MyService]}) @NgModule({declarations: [MyComponent, MyComponent2, MyComponent3], providers: [MyService]})
export class MyModule {} export class MyModule {}
`); `);
@ -404,10 +403,10 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {BaseComponent} from 'my-lib'; import {BaseComponent} from 'my-lib';
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseComponent {} export class MyComponent extends BaseComponent {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class MyModule {} export class MyModule {}
`); `);
@ -424,10 +423,10 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {BaseDirective} from 'my-lib'; import {BaseDirective} from 'my-lib';
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseDirective {} export class MyComponent extends BaseDirective {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class MyModule {} export class MyModule {}
`); `);
@ -446,10 +445,10 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {BaseComponent} from 'my-lib'; import {BaseComponent} from 'my-lib';
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseComponent {} export class MyComponent extends BaseComponent {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class MyModule {} export class MyModule {}
`); `);
@ -466,16 +465,16 @@ describe('Undecorated classes with DI migration', () => {
it('should decorate all undecorated directives of inheritance chain', async() => { it('should decorate all undecorated directives of inheritance chain', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
export class SuperBaseClass { export class SuperBaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
export class BaseClass extends SuperBaseClass {} export class BaseClass extends SuperBaseClass {}
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class MyModule {} export class MyModule {}
`); `);
@ -490,16 +489,16 @@ describe('Undecorated classes with DI migration', () => {
it('should decorate all undecorated providers of inheritance chain', async() => { it('should decorate all undecorated providers of inheritance chain', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Injectable, NgModule, NgZone} from '@angular/core'; import {Injectable, NgModule, NgZone} from '@angular/core';
export class SuperBaseClass { export class SuperBaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
export class BaseClass extends SuperBaseClass {} export class BaseClass extends SuperBaseClass {}
@Injectable() @Injectable()
export class MyService extends BaseClass {} export class MyService extends BaseClass {}
@NgModule({providers: [MyService]}) @NgModule({providers: [MyService]})
export class MyModule {} export class MyModule {}
`); `);
@ -516,17 +515,17 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
import {BaseClass} from './base'; import {BaseClass} from './base';
@Component({template: ''}) @Component({template: ''})
export class A extends BaseClass {} export class A extends BaseClass {}
@NgModule({declarations: [A]}) @NgModule({declarations: [A]})
export class MyModule {} export class MyModule {}
`); `);
writeFile('/base.ts', ` writeFile('/base.ts', `
import * as core from '@angular/core'; import * as core from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: core.NgZone) {} constructor(zone: core.NgZone) {}
} }
@ -542,14 +541,14 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
import {Directive} from './third_party_directive'; import {Directive} from './third_party_directive';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@Component({template: ''}) @Component({template: ''})
export class MyComponent extends BaseClass {} export class MyComponent extends BaseClass {}
@NgModule({declarations: [MyComponent]}) @NgModule({declarations: [MyComponent]})
export class AppModule {} export class AppModule {}
`); `);
@ -566,19 +565,19 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule, NgZone} from '@angular/core'; import {Component, NgModule, NgZone} from '@angular/core';
import {BaseClass} from './base'; import {BaseClass} from './base';
@Component({template: ''}) @Component({template: ''})
export class A extends BaseClass {} export class A extends BaseClass {}
@NgModule({declarations: [A]}) @NgModule({declarations: [A]})
export class MyModule {} export class MyModule {}
`); `);
writeFile('/base.ts', ` writeFile('/base.ts', `
import {Directive} from './external'; import {Directive} from './external';
export class MyService {} export class MyService {}
export class BaseClass { export class BaseClass {
constructor(zone: MyService) {} constructor(zone: MyService) {}
} }
@ -595,17 +594,17 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {BaseClass} from './base'; import {BaseClass} from './base';
@Component({template: ''}) @Component({template: ''})
export class A extends BaseClass {} export class A extends BaseClass {}
@NgModule({declarations: [A]}) @NgModule({declarations: [A]})
export class MyModule {} export class MyModule {}
`); `);
writeFile('/base.ts', ` writeFile('/base.ts', `
import {Directive as AliasedDir, NgZone} from '@angular/core'; import {Directive as AliasedDir, NgZone} from '@angular/core';
export class BaseClass { export class BaseClass {
constructor(zone: NgZone) {} constructor(zone: NgZone) {}
} }
@ -637,7 +636,7 @@ describe('Undecorated classes with DI migration', () => {
templateUrl: './my-dir.html', templateUrl: './my-dir.html',
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -667,14 +666,14 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Directive, NgModule} from '@angular/core'; import {Directive, NgModule} from '@angular/core';
/** my comment */ /** my comment */
@Directive({ @Directive({
selector: 'my-dir', selector: 'my-dir',
styleUrls: ['./my-dir.css'], styleUrls: ['./my-dir.css'],
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -683,7 +682,7 @@ describe('Undecorated classes with DI migration', () => {
expect(tree.readContent('/index.ts')).toContain(dedent ` expect(tree.readContent('/index.ts')).toContain(dedent `
import {BaseClass} from './lib/base'; import {BaseClass} from './lib/base';
@Directive({ @Directive({
selector: 'my-dir', selector: 'my-dir',
styleUrls: ['./my-dir.css'] styleUrls: ['./my-dir.css']
@ -704,10 +703,10 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Pipe, NgModule} from '@angular/core'; import {Pipe, NgModule} from '@angular/core';
@Pipe({name: 'my-pipe-name'}) @Pipe({name: 'my-pipe-name'})
export class BasePipe {} export class BasePipe {}
@NgModule({declarations: [BasePipe]}) @NgModule({declarations: [BasePipe]})
export class LibModule {} export class LibModule {}
`); `);
@ -728,7 +727,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {NgModule, Component} from '@angular/core'; import {NgModule, Component} from '@angular/core';
import {CDK_TABLE_TEMPLATE} from '@angular/cdk/table'; import {CDK_TABLE_TEMPLATE} from '@angular/cdk/table';
const A = 'hello'; const A = 'hello';
@Component({ @Component({
@ -777,16 +776,16 @@ describe('Undecorated classes with DI migration', () => {
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
import {CDK_TABLE_TEMPLATE as tableTmpl} from '@angular/cdk/table'; import {CDK_TABLE_TEMPLATE as tableTmpl} from '@angular/cdk/table';
import {STYLE_THROUGH_VAR} from '../styles'; import {STYLE_THROUGH_VAR} from '../styles';
export const LOCAL_STYLE = 'local_style'; export const LOCAL_STYLE = 'local_style';
@Component({ @Component({
selector: 'my-dir', selector: 'my-dir',
template: tableTmpl, template: tableTmpl,
styles: [STYLE_THROUGH_VAR, LOCAL_STYLE] styles: [STYLE_THROUGH_VAR, LOCAL_STYLE]
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -822,23 +821,23 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/second-module.ts', dedent ` writeFile('/second-module.ts', dedent `
import {NgModule, Directive} from '@angular/core'; import {NgModule, Directive} from '@angular/core';
import {MyComp} from './index'; import {MyComp} from './index';
@Directive({selector: 'other-dir'}) @Directive({selector: 'other-dir'})
export class OtherDir {} export class OtherDir {}
@NgModule({declarations: [OtherDir, [MyComp]], entryComponents: [MyComp]}) @NgModule({declarations: [OtherDir, [MyComp]], entryComponents: [MyComp]})
export class MySecondModule {} export class MySecondModule {}
`); `);
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
@Component({ @Component({
selector: 'my-dir', selector: 'my-dir',
template: '', template: '',
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -859,7 +858,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {BaseClass} from './lib/base'; import {BaseClass} from './lib/base';
// this will conflict if "MY_TEMPLATE" from the base class is imported. The // this will conflict if "MY_TEMPLATE" from the base class is imported. The
// import to that export from base class should be aliased to avoid the collision. // import to that export from base class should be aliased to avoid the collision.
const MY_TEMPLATE = ''; const MY_TEMPLATE = '';
@ -872,15 +871,15 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
export const MY_TEMPLATE = ''; export const MY_TEMPLATE = '';
@Component({ @Component({
selector: 'my-dir', selector: 'my-dir',
template: MY_TEMPLATE, template: MY_TEMPLATE,
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -910,7 +909,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Component, NgModule, Document} from '@angular/core'; import {Component, NgModule, Document} from '@angular/core';
// this variable cannot be imported automatically. // this variable cannot be imported automatically.
const someProviders = [{provide: Document, useValue: null}] const someProviders = [{provide: Document, useValue: null}]
@ -920,7 +919,7 @@ describe('Undecorated classes with DI migration', () => {
providers: [...someProviders], providers: [...someProviders],
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -954,7 +953,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
export const metadataThroughVar = { export const metadataThroughVar = {
styleUrls: ['./test.css'], styleUrls: ['./test.css'],
} }
@ -965,7 +964,7 @@ describe('Undecorated classes with DI migration', () => {
...metadataThroughVar, ...metadataThroughVar,
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -1002,7 +1001,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/lib/my-tmpl.html', ''); writeFile('/lib/my-tmpl.html', '');
writeFile('/lib/base.ts', dedent ` writeFile('/lib/base.ts', dedent `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
export const host = {}; export const host = {};
export const templateUrl = './my-tmpl.html'; export const templateUrl = './my-tmpl.html';
const styleUrls = ["hello.css"]; const styleUrls = ["hello.css"];
@ -1014,7 +1013,7 @@ describe('Undecorated classes with DI migration', () => {
host, host,
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -1043,14 +1042,14 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {BaseComponent, BasePipe} from 'my-lib'; import {BaseComponent, BasePipe} from 'my-lib';
export class PassThrough extends BaseComponent {} export class PassThrough extends BaseComponent {}
@NgModule({declarations: [PassThrough]}) @NgModule({declarations: [PassThrough]})
export class MyPassThroughMod {} export class MyPassThroughMod {}
export class MyComp extends PassThrough {} export class MyComp extends PassThrough {}
export class MyPipe extends BasePipe {} export class MyPipe extends BasePipe {}
@NgModule({declarations: [MyComp, MyPipe]}) @NgModule({declarations: [MyComp, MyPipe]})
@ -1110,7 +1109,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/index.ts', dedent ` writeFile('/index.ts', dedent `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {BaseComponent} from 'my-lib'; import {BaseComponent} from 'my-lib';
export class MyComp extends BaseComponent {} export class MyComp extends BaseComponent {}
@NgModule({declarations: [MyComp]}) @NgModule({declarations: [MyComp]})
@ -1172,7 +1171,7 @@ describe('Undecorated classes with DI migration', () => {
@NgModule({declarations: [MyDir]}) @NgModule({declarations: [MyDir]})
export class MyModule {} export class MyModule {}
export {LOCAL_NAME as PUBLIC_NAME}; export {LOCAL_NAME as PUBLIC_NAME};
`); `);
@ -1186,7 +1185,7 @@ describe('Undecorated classes with DI migration', () => {
styleUrls: [PUBLIC_NAME] styleUrls: [PUBLIC_NAME]
}) })
export class BaseClass {} export class BaseClass {}
@NgModule({declarations: [BaseClass]}) @NgModule({declarations: [BaseClass]})
export class LibModule {} export class LibModule {}
`); `);
@ -1220,7 +1219,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/node_modules/my-lib/index.d.ts', `export * from './public-api';`); writeFile('/node_modules/my-lib/index.d.ts', `export * from './public-api';`);
writeFile('/node_modules/my-lib/public-api.d.ts', ` writeFile('/node_modules/my-lib/public-api.d.ts', `
import {NgZone} from '@angular/core'; import {NgZone} from '@angular/core';
export const testValidators: any; export const testValidators: any;
export declare class BasePipe {} export declare class BasePipe {}
export declare class BaseDirective {} export declare class BaseDirective {}
@ -1328,7 +1327,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/node_modules/my-lib/index.d.ts', `export * from './public-api';`); writeFile('/node_modules/my-lib/index.d.ts', `export * from './public-api';`);
writeFile('/node_modules/my-lib/public-api.d.ts', ` writeFile('/node_modules/my-lib/public-api.d.ts', `
import {NgZone} from '@angular/core'; import {NgZone} from '@angular/core';
export declare class BaseComponent { export declare class BaseComponent {
constructor(zone: NgZone); constructor(zone: NgZone);
} }
@ -1407,7 +1406,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/src/app.component.ts', ` writeFile('/src/app.component.ts', `
import {Component} from '@angular/core'; import {Component} from '@angular/core';
@Component({template: ''}) @Component({template: ''})
export class AppComponent {} export class AppComponent {}
`); `);
@ -1415,7 +1414,7 @@ describe('Undecorated classes with DI migration', () => {
writeFile('/src/app.module.ts', ` writeFile('/src/app.module.ts', `
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {AppComponent} from './app.component'; import {AppComponent} from './app.component';
@NgModule({declarations: [AppComponent]}) @NgModule({declarations: [AppComponent]})
export class AppModule {} export class AppModule {}
`); `);
@ -1434,10 +1433,10 @@ describe('Undecorated classes with DI migration', () => {
it('should gracefully exit migration if project fails with structural diagnostic', async() => { it('should gracefully exit migration if project fails with structural diagnostic', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
@Component({template: ''}) @Component({template: ''})
export class TestComp {} export class TestComp {}
@NgModule({declarations: [/* TestComp not added */]}) @NgModule({declarations: [/* TestComp not added */]})
export class MyModule {} export class MyModule {}
`); `);
@ -1477,13 +1476,13 @@ describe('Undecorated classes with DI migration', () => {
it('should not throw if resources could not be read', async() => { it('should not throw if resources could not be read', async() => {
writeFile('/index.ts', ` writeFile('/index.ts', `
import {Component, NgModule} from '@angular/core'; import {Component, NgModule} from '@angular/core';
@Component({ @Component({
templateUrl: './my-template.pug', templateUrl: './my-template.pug',
styleUrls: ["./test.scss", "./some-special-file.custom"], styleUrls: ["./test.scss", "./some-special-file.custom"],
}) })
export class TestComp {} export class TestComp {}
@NgModule({declarations: [TestComp]}) @NgModule({declarations: [TestComp]})
export class MyModule {} export class MyModule {}
`); `);

View File

@ -22,7 +22,7 @@ export function createMigrationCompilerHost(
const treeRelativePath = relative(basePath, fileName); const treeRelativePath = relative(basePath, fileName);
const fakeOutput = fakeRead ? fakeRead(treeRelativePath) : null; const fakeOutput = fakeRead ? fakeRead(treeRelativePath) : null;
const buffer = fakeOutput === null ? tree.read(treeRelativePath) : fakeOutput; const buffer = fakeOutput === null ? tree.read(treeRelativePath) : fakeOutput;
// Strip BOM as otherwise TSC methods (Ex: getWidth) will return an offset which // Strip BOM as otherwise TSC methods (Ex: getWidth) will return an offset,
// which breaks the CLI UpdateRecorder. // which breaks the CLI UpdateRecorder.
// See: https://github.com/angular/angular/pull/30719 // See: https://github.com/angular/angular/pull/30719
return buffer ? buffer.toString().replace(/^\uFEFF/, '') : undefined; return buffer ? buffer.toString().replace(/^\uFEFF/, '') : undefined;