219 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | 
 | ||
|  | /** | ||
|  |  * @license | ||
|  |  * Copyright Google Inc. All Rights Reserved. | ||
|  |  * | ||
|  |  * Use of this source code is governed by an MIT-style license that can be | ||
|  |  * found in the LICENSE file at https://angular.io/license
 | ||
|  |  */ | ||
|  | 
 | ||
|  | import {MockDirectory, emitLibrary, mergeMaps, setup} from '../aot/test_util'; | ||
|  | 
 | ||
|  | import {backPatch, expectEmit} from './mock_compile'; | ||
|  | 
 | ||
|  | describe('r3_back_patch_compiler', () => { | ||
|  |   const angularFiles = setup({ | ||
|  |     compileAngular: true, | ||
|  |     compileAnimations: false, | ||
|  |     compileCommon: true, | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should back-patch a component in a library', () => { | ||
|  |     const libraries = { | ||
|  |       lib1: { | ||
|  |         src: { | ||
|  |           'component.ts': `
 | ||
|  |             import {Component} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Component({ | ||
|  |               selector: 'lib1-cmp', | ||
|  |               template: '<h1> Hello, {{name}}!</h1>' | ||
|  |             }) | ||
|  |             export class Lib1Component { | ||
|  |               name: string; | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'directive.ts': `
 | ||
|  |             import {Directive, HostBinding} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Directive({selector: '[lib1-dir]'}) | ||
|  |             export class Lib1Directive { | ||
|  |               @HostBinding('id') dirId = 'some id'; | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'service.ts': `
 | ||
|  |             import {Injectable} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Injectable() | ||
|  |             export class Lib1Service { | ||
|  |               getSomeInfo() { return 'some info'; } | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'pipe.ts': `
 | ||
|  |             import {Pipe} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Pipe({name: 'lib1Pipe', pure: true}) | ||
|  |             export class Lib1Pipe { | ||
|  |               transform(v: any) { return v; } | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'module.ts': `
 | ||
|  |             import {NgModule} from '@angular/core'; | ||
|  | 
 | ||
|  |             import {Lib1Component} from './component'; | ||
|  |             import {Lib1Directive} from './directive'; | ||
|  |             import {Lib1Service} from './service'; | ||
|  |             import {Lib1Pipe} from './pipe'; | ||
|  | 
 | ||
|  |             @NgModule({ | ||
|  |               exports: [Lib1Component, Lib1Directive, Lib1Pipe], | ||
|  |               declarations: [Lib1Component, Lib1Directive, Lib1Pipe], | ||
|  |               providers: [Lib1Service] | ||
|  |             }) | ||
|  |             export class Lib1Module {} | ||
|  |           `
 | ||
|  |         } | ||
|  |       }, | ||
|  |       lib2: { | ||
|  |         src: { | ||
|  |           'component.ts': `
 | ||
|  |             import {Component} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Component({ | ||
|  |               selector: 'lib2-cmp', | ||
|  |               template: '<h1> Hello, {{name}}!</h1>' | ||
|  |             }) | ||
|  |             export class Lib2Component { | ||
|  |               name: string; | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'directive.ts': `
 | ||
|  |             import {Directive, HostBinding} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Directive({selector: '[lib2-dir]'}) | ||
|  |             export class Lib2Directive { | ||
|  |               @HostBinding('id') dirId = 'some id'; | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'service.ts': `
 | ||
|  |             import {Injectable} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Injectable() | ||
|  |             export class Lib2Service { | ||
|  |               getSomeInfo() { return 'some info'; } | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'pipe.ts': `
 | ||
|  |             import {Pipe} from '@angular/core'; | ||
|  | 
 | ||
|  |             @Pipe({name: 'lib2Pipe', pure: true}) | ||
|  |             export class Lib2Pipe { | ||
|  |               transform(v: any) { return v; } | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'module.ts': `
 | ||
|  |             import {NgModule} from '@angular/core'; | ||
|  | 
 | ||
|  |             import {Lib1Module} from '../../lib1/src/module'; | ||
|  |             import {Lib2Component} from './component'; | ||
|  |             import {Lib2Directive} from './directive'; | ||
|  |             import {Lib2Service} from './service'; | ||
|  |             import {Lib2Pipe} from './pipe'; | ||
|  | 
 | ||
|  |             @NgModule({ | ||
|  |               imports: [Lib1Module], | ||
|  |               exports: [Lib2Component, Lib2Directive, Lib2Pipe], | ||
|  |               declarations: [Lib2Component, Lib2Directive, Lib2Pipe], | ||
|  |               providers: [Lib2Service] | ||
|  |             }) | ||
|  |             export class Lib2Module {} | ||
|  |           `
 | ||
|  |         } | ||
|  |       }, | ||
|  |     }; | ||
|  |     const app = { | ||
|  |       app: { | ||
|  |         src: { | ||
|  |           'app.component.ts': `
 | ||
|  |             import {Component} from '@angular/core'; | ||
|  |             import {Lib1Service} from '../../lib1/src/service'; | ||
|  |             import {Lib2Service} from '../../lib2/src/service'; | ||
|  | 
 | ||
|  |             @Component({ | ||
|  |               selector: 'app-cmp', | ||
|  |               template: \`
 | ||
|  |                 <lib1-cmp lib2-dir>{{'v' | lib1Pipe | lib2Pipe}}</lib1-cmp> | ||
|  |                 <lib2-cmp lib1-dir>{{'v' | lib2Pipe | lib2Pipe}}</lib2-cmp> | ||
|  |               \`
 | ||
|  |             }) | ||
|  |             export class AppComponent { | ||
|  |               constructor(public lib1s: Lib1Service, public lib2s: Lib2Service) {} | ||
|  |             } | ||
|  |           `,
 | ||
|  |           'app.module.ts': `
 | ||
|  |             import {NgModule} from '@angular/core'; | ||
|  |             import {Lib1Module} from '../../lib1/src/module'; | ||
|  |             import {Lib2Module} from '../../lib2/src/module'; | ||
|  | 
 | ||
|  |             import {AppComponent} from './app.component'; | ||
|  | 
 | ||
|  |             @NgModule({ | ||
|  |               imports: [Lib1Module, Lib2Module], | ||
|  |               declarations: [AppComponent] | ||
|  |             }) | ||
|  |             export class AppModule { | ||
|  |             } | ||
|  |           `
 | ||
|  |         } | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     const lib1_module_back_patch = `
 | ||
|  |       export function ngBackPatch__lib1_src_module_Lib1Module() { | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib1_c$.Lib1Component.ngComponentDef = $r3$.ɵdefineComponent(…); | ||
|  | 
 | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib1_d$.Lib1Directive.ngDirectiveDef = $r3$.ɵdefineDirective(…); | ||
|  | 
 | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib1_p$.Lib1Pipe.ngPipeDef = $r3$.ɵdefinePipe(…); | ||
|  |       } | ||
|  |     `;
 | ||
|  | 
 | ||
|  |     const lib2_module_back_patch = `
 | ||
|  |       export function ngBackPatch__lib2_src_module_Lib2Module() { | ||
|  |         // @__BUILD_OPTIMIZER_REMOVE__
 | ||
|  |         ngBackPatch__lib1_src_module_Lib1Module(); | ||
|  | 
 | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib2_c$.Lib2Component.ngComponentDef = $r3$.ɵdefineComponent(…); | ||
|  | 
 | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib2_d$.Lib2Directive.ngDirectiveDef = $r3$.ɵdefineDirective(…); | ||
|  | 
 | ||
|  |         // @__BUILD_OPTIMIZER_COLOCATE__
 | ||
|  |         $lib1_p$.Lib2Pipe.ngPipeDef = $r3$.ɵdefinePipe(…); | ||
|  |       } | ||
|  |     `;
 | ||
|  | 
 | ||
|  |     const app_module_back_patch = `
 | ||
|  |       export function ngBackPatch__app_src_app_AppModule() { | ||
|  |         // @__BUILD_OPTIMIZER_REMOVE__
 | ||
|  |         ngBackPatch__lib1_src_module_Lib1Module(); | ||
|  |         // @__BUILD_OPTIMIZER_REMOVE__
 | ||
|  |         ngBackPatch__lib2_src_module_Lib2Module(); | ||
|  |       } | ||
|  |     `;
 | ||
|  | 
 | ||
|  |     const context = mergeMaps(emitLibrary(angularFiles, libraries), angularFiles); | ||
|  | 
 | ||
|  |     const result = backPatch(app, context); | ||
|  | 
 | ||
|  |     expectEmit(result.source, lib1_module_back_patch, 'Invalid lib1 back-patch'); | ||
|  |     expectEmit(result.source, lib2_module_back_patch, 'Invalid lib2 back-patch'); | ||
|  |     expectEmit(result.source, app_module_back_patch, 'Invalid app module back-patch'); | ||
|  |   }); | ||
|  | 
 | ||
|  | }); |