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

View File

@ -49,14 +49,14 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return', async() => {
writeFile('/index.ts', `
import {NgModule, ModuleWithProviders} from '@angular/core';
@NgModule({})
export class BaseModule {}
export function getProvider() {
return {ngModule: BaseModule}
}
@NgModule({})
export class TestModule {
static forRoot(): ModuleWithProviders {
@ -72,18 +72,18 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return; external file', async() => {
writeFile('/module.ts', `
import {NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
`);
writeFile('/index.ts', `
import {NgModule, ModuleWithProviders} from '@angular/core';
import {BaseModule} from './module';
export function getProvider() {
return {ngModule: BaseModule}
}
@NgModule({})
export class TestModule {
static forRoot(): ModuleWithProviders {
@ -99,14 +99,14 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for function return without explicit type', async() => {
writeFile('/index.ts', `
import {NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
export function getProvider() {
return {ngModule: BaseModule}
}
@NgModule({})
export class TestModule {
static forRoot() {
@ -122,12 +122,12 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variable', async() => {
writeFile('/index.ts', `
import {ModuleWithProviders, NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule};
@NgModule({})
export class TestModule {
static forRoot(): ModuleWithProviders {
@ -143,12 +143,12 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variable without explicit type', async() => {
writeFile('/index.ts', `
import {NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule};
@NgModule({})
export class TestModule {
static forRoot() {
@ -164,12 +164,12 @@ describe('ModuleWithProviders migration', () => {
it('should not add generic type for const variable with invalid base object', async() => {
writeFile('/index.ts', `
import {NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
export const myModuleWithProviders = {ngModule: BaseModule, otherKey: 'a'};
@NgModule({})
export class TestModule {
static forRoot() {
@ -185,24 +185,24 @@ describe('ModuleWithProviders migration', () => {
it('should add generic type for const variables and functions with incomplete type', async() => {
writeFile('/index.ts', `
import {ModuleWithProviders, NgModule} from '@angular/core';
@NgModule({})
export class BaseModule {}
export const myModuleWithProviders: ModuleWithProviders = {ngModule: BaseModule};
export function mwpFunction(): ModuleWithProviders {
return myModuleWithProviders;
}
export class MwpClass {
mwp: ModuleWithProviders = myModuleWithProviders;
private _mwp: ModuleWithProviders = myModuleWithProviders;
getMwp(): ModuleWithProviders {
return myModuleWithProviders;
}
static initMwp(): ModuleWithProviders {
return myModuleWithProviders;
}
@ -217,7 +217,7 @@ describe('ModuleWithProviders migration', () => {
it('should not add generic type for const variables without initialization', async() => {
writeFile('/index.ts', `
import {ModuleWithProviders} from '@angular/core';
export const myModuleWithProviders: ModuleWithProviders;
`);
@ -230,6 +230,6 @@ describe('ModuleWithProviders migration', () => {
}
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() {
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));
}
async function runMigration() {
await runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
function runMigration() {
return runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
}
describe('ViewChild', () => {
@ -533,13 +533,13 @@ describe('static-queries migration with template strategy', () => {
read?: any;
}): any;
}
export declare const ViewChild: ViewChildDecorator;
`);
writeFile('/index.ts', `
import {NgModule, Component, ViewChild} from '@angular/core';
@Component({
template: '<ng-template><p #myRef></p></ng-template>'
})
@ -551,7 +551,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', `
import {NgModule} from '@angular/core';
import {MyComp} from './index';
@NgModule({declarations: [MyComp]})
export class MyModule {}
`);
@ -568,7 +568,7 @@ describe('static-queries migration with template strategy', () => {
async() => {
writeFile('/index.ts', `
import {NgModule, Component, ViewChild} from '@angular/core';
@Component({
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
// tries to call a function called "hello()" on this variable.
myVar: boolean = false;
@ViewChild('myRef') query: any;
}
`);
@ -584,7 +584,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', `
import {NgModule} from '@angular/core';
import {MyComp} from './index';
@NgModule({declarations: [MyComp]})
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() => {
writeFile('/index.ts', `
import {Component, ViewChild} from '@angular/core';
@Component({
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 {
// ...
}
@ -617,7 +617,7 @@ describe('static-queries migration with template strategy', () => {
writeFile('/my-module.ts', `
import {NgModule} from '@angular/core';
import {MyComp} from './index';
@NgModule({declarations: [MyComp]})
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() => {
writeFile('/index.ts', `
import {Component, NgModule, ViewChild} from '@angular/core';
const myOptionsVar = {};
@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));
}
async function runMigration() {
await runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
function runMigration() {
return runner.runSchematicAsync('migration-v8-static-queries', {}, tree).toPromise();
}
function createQueryTests(queryType: 'ViewChild' | 'ContentChild') {
@ -686,12 +686,12 @@ describe('static-queries migration with usage strategy', () => {
resolve(): Promise;
reject(): Promise;
}
interface Promise {
then(cb: Function): Promise;
catch(cb: Function): Promise;
}
declare var Promise: PromiseConstructor;
`);
writeFile('/index.ts', `
@ -1437,15 +1437,15 @@ describe('static-queries migration with usage strategy', () => {
writeFile('/index.ts', `
import {Component, ${queryType}} from '@angular/core';
import {thirdPartySync} from 'my-lib';
@Component({template: '<span>Template</span>'})
export class MyComponent {
@${queryType}('test') query: any;
@${queryType}('test') query2: any;
ngOnInit() {
const myVarFn = () => this.query2.doSomething();
thirdPartySync(() => this.query.doSomething());
thirdPartySync(myVarFn);
}
@ -1473,12 +1473,12 @@ describe('static-queries migration with usage strategy', () => {
writeFile('/index.ts', `
import {Component, ${queryType}} from '@angular/core';
import {ThirdParty} from 'my-lib';
@Component({template: '<span>Template</span>'})
export class MyComponent {
@${queryType}('test') query: any;
ngOnInit() {
ngOnInit() {
new ThirdParty(() => this.query.doSomething());
}
}
@ -1533,11 +1533,11 @@ describe('static-queries migration with usage strategy', () => {
@Component({template: '<span>Test</span>'})
export class MyComponent {
@${queryType}('test') query: any;
ngOnInit() {
this.myFunction();
}
myFunction(unused?: string, cb = () => this.query.doSomething) {
cb();
}

View File

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

View File

@ -22,7 +22,7 @@ export function createMigrationCompilerHost(
const treeRelativePath = relative(basePath, fileName);
const fakeOutput = fakeRead ? fakeRead(treeRelativePath) : null;
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.
// See: https://github.com/angular/angular/pull/30719
return buffer ? buffer.toString().replace(/^\uFEFF/, '') : undefined;