| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  | import {AttributeMarker} from '@angular/compiler/src/core'; | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | import {setup} from '@angular/compiler/test/aot/test_util'; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | import {compile, expectEmit} from './mock_compile'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-11 09:56:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-12 15:23:12 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * These tests are codified version of the tests in compiler_canonical_spec.ts. Every | 
					
						
							|  |  |  |  * test in compiler_canonical_spec.ts should have a corresponding test here. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | describe('compiler compliance', () => { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |   const angularFiles = setup({ | 
					
						
							| 
									
										
										
										
											2018-08-01 09:52:34 +02:00
										 |  |  |     compileAngular: false, | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     compileAnimations: false, | 
					
						
							| 
									
										
										
										
											2018-08-01 09:52:34 +02:00
										 |  |  |     compileFakeCore: true, | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('elements', () => { | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |     it('should handle SVG', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div class="my-app" title="Hello"><svg><circle cx="20" cy="30" r="50"/></svg><p>test</p></div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The factory should look like this:
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |         const $c1$ = ["title", "Hello", ${AttributeMarker.Classes}, "my-app"]; | 
					
						
							|  |  |  |         const $c2$ = ["cx", "20", "cy", "30", "r", "50"]; | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "div", $c1$); | 
					
						
							|  |  |  |             $r3$.ɵnamespaceSVG(); | 
					
						
							|  |  |  |             $r3$.ɵelementStart(1, "svg"); | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |             $r3$.ɵelement(2, "circle", $c2$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |             $r3$.ɵnamespaceHTML(); | 
					
						
							|  |  |  |             $r3$.ɵelementStart(3, "p"); | 
					
						
							|  |  |  |             $r3$.ɵtext(4, "test"); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle MathML', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div class="my-app" title="Hello"><math><infinity/></math><p>test</p></div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The factory should look like this:
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |         const $c1$ = ["title", "Hello", ${AttributeMarker.Classes}, "my-app"]; | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "div", $c1$); | 
					
						
							|  |  |  |             $r3$.ɵnamespaceMathML(); | 
					
						
							|  |  |  |             $r3$.ɵelementStart(1, "math"); | 
					
						
							|  |  |  |             $r3$.ɵelement(2, "infinity"); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |             $r3$.ɵnamespaceHTML(); | 
					
						
							|  |  |  |             $r3$.ɵelementStart(3, "p"); | 
					
						
							|  |  |  |             $r3$.ɵtext(4, "test"); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     it('should translate DOM structure', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div class="my-app" title="Hello">Hello <b>World</b>!</div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The factory should look like this:
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |         const $c1$ = ["title", "Hello", ${AttributeMarker.Classes}, "my-app"]; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "div", $c1$); | 
					
						
							|  |  |  |             $r3$.ɵtext(1, "Hello "); | 
					
						
							|  |  |  |             $r3$.ɵelementStart(2, "b"); | 
					
						
							|  |  |  |             $r3$.ɵtext(3, "World"); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |             $r3$.ɵtext(4, "!"); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |     // TODO(https://github.com/angular/angular/issues/24426): We need to support the parser actually
 | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |     // building the proper attributes based off of xmlns attributes.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |     xit('should support namspaced attributes', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |                 import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 @Component({ | 
					
						
							|  |  |  |                   selector: 'my-component', | 
					
						
							|  |  |  |                   template: \`<div xmlns:foo="http://someuri/foo" class="my-app" foo:bar="baz" title="Hello" foo:qux="quacks">Hello <b>World</b>!</div>\`
 | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |                 export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The factory should look like this:
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $e0_attrs$ = ["class", "my-app", 0, "http://someuri/foo", "foo:bar", "baz", "title", "Hello", 0, "http://someuri/foo", "foo:qux", "quacks"]; | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementStart(0, "div", $e0_attrs$); | 
					
						
							|  |  |  |               $r3$.ɵtext(1, "Hello "); | 
					
						
							|  |  |  |               $r3$.ɵelementStart(2, "b"); | 
					
						
							|  |  |  |               $r3$.ɵtext(3, "World"); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |               $r3$.ɵtext(4, "!"); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-08 10:21:20 +02:00
										 |  |  |     it('should support <ng-container>', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<ng-container><span>in a </span>container</ng-container>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |           … | 
					
						
							|  |  |  |           template: function MyComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-11-12 00:46:02 +01:00
										 |  |  |               i0.ɵelementContainerStart(0); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               i0.ɵelementStart(1, "span"); | 
					
						
							|  |  |  |               i0.ɵtext(2, "in a "); | 
					
						
							|  |  |  |               i0.ɵelementEnd(); | 
					
						
							|  |  |  |               i0.ɵtext(3, "container"); | 
					
						
							| 
									
										
										
										
											2018-11-12 00:46:02 +01:00
										 |  |  |               i0.ɵelementContainerEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-08 10:21:20 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should generate elementContainerStart/End instructions for empty <ng-container>', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<ng-container></ng-container>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |           … | 
					
						
							|  |  |  |           template: function MyComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-11-12 00:46:02 +01:00
										 |  |  |               i0.ɵelementContainerStart(0); | 
					
						
							|  |  |  |               i0.ɵelementContainerEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-08 10:21:20 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |     it('should bind to element properties', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div [id]="id"></div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 id = 'one'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |         const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "id"]; | 
					
						
							|  |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |             $r3$.ɵelement(0, "div", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementProperty(0, "id", $r3$.ɵbind(ctx.id)); | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 15:59:25 -07:00
										 |  |  |     it('should reserve slots for pure functions', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div
 | 
					
						
							|  |  |  |                   [ternary]="cond ? [a] : [0]" | 
					
						
							|  |  |  |                   [pipe]="value | pipe:1:2" | 
					
						
							|  |  |  |                   [and]="cond && [b]" | 
					
						
							|  |  |  |                   [or]="cond || [c]" | 
					
						
							|  |  |  |                 ></div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 id = 'one'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |       const $e0_attrs$ = []; | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-05-21 15:59:25 -07:00
										 |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         template: function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-05-21 15:59:25 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |             $r3$.ɵelement(0, "div", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵpipe(1,"pipe"); | 
					
						
							| 
									
										
										
										
											2018-05-21 15:59:25 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |             $r3$.ɵelementProperty(0, "ternary", $r3$.ɵbind((ctx.cond ? $r3$.ɵpureFunction1(8, $c0$, ctx.a): $c1$))); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementProperty(0, "pipe", $r3$.ɵbind($r3$.ɵpipeBind3(1, 4, ctx.value, 1, 2))); | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |             $r3$.ɵelementProperty(0, "and", $r3$.ɵbind((ctx.cond && $r3$.ɵpureFunction1(10, $c0$, ctx.b)))); | 
					
						
							|  |  |  |             $r3$.ɵelementProperty(0, "or", $r3$.ɵbind((ctx.cond || $r3$.ɵpureFunction1(12, $c0$, ctx.c)))); | 
					
						
							| 
									
										
										
										
											2018-05-21 15:59:25 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-10 14:53:10 -08:00
										 |  |  |     it('should reserve slots for pure functions in host binding function', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Input} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: '...', | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 '[@expansionHeight]': \`{
 | 
					
						
							|  |  |  |                     value: getExpandedState(), | 
					
						
							|  |  |  |                     params: { | 
					
						
							|  |  |  |                       collapsedHeight: collapsedHeight, | 
					
						
							|  |  |  |                       expandedHeight: expandedHeight | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }\`,
 | 
					
						
							|  |  |  |                 '[@expansionWidth]': \`{
 | 
					
						
							|  |  |  |                   value: getExpandedState(), | 
					
						
							|  |  |  |                   params: { | 
					
						
							|  |  |  |                     collapsedWidth: collapsedWidth, | 
					
						
							|  |  |  |                     expandedWidth: expandedWidth | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                 }\`
 | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent { | 
					
						
							|  |  |  |               @Input() expandedHeight: string; | 
					
						
							|  |  |  |               @Input() collapsedHeight: string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input() expandedWidth: string; | 
					
						
							|  |  |  |               @Input() collapsedWidth: string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               getExpandedState() { | 
					
						
							|  |  |  |                 return 'expanded'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const hostBindingsDef = `
 | 
					
						
							|  |  |  |         const $_c0$ = function (a0, a1) { return { collapsedHeight: a0, expandedHeight: a1 }; }; | 
					
						
							|  |  |  |         const $_c1$ = function (a0, a1) { return { value: a0, params: a1 }; }; | 
					
						
							|  |  |  |         const $_c2$ = function (a0, a1) { return { collapsedWidth: a0, expandedWidth: a1 }; }; | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         hostBindings: function MyComponent_HostBindings(rf, ctx, elIndex) { | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							|  |  |  |             $r3$.ɵallocHostVars(14); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-01-03 18:24:21 -08:00
										 |  |  |             $r3$.ɵcomponentHostSyntheticProperty(elIndex, "@expansionHeight", | 
					
						
							| 
									
										
										
										
											2018-12-10 14:53:10 -08:00
										 |  |  |               $r3$.ɵbind( | 
					
						
							|  |  |  |                 $r3$.ɵpureFunction2(5, $_c1$, ctx.getExpandedState(), | 
					
						
							|  |  |  |                   $r3$.ɵpureFunction2(2, $_c0$, ctx.collapsedHeight, ctx.expandedHeight) | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2018-12-11 11:58:34 -08:00
										 |  |  |               ), null, true | 
					
						
							| 
									
										
										
										
											2018-12-10 14:53:10 -08:00
										 |  |  |             ); | 
					
						
							| 
									
										
										
										
											2019-01-03 18:24:21 -08:00
										 |  |  |             $r3$.ɵcomponentHostSyntheticProperty(elIndex, "@expansionWidth", | 
					
						
							| 
									
										
										
										
											2018-12-10 14:53:10 -08:00
										 |  |  |               $r3$.ɵbind( | 
					
						
							|  |  |  |                 $r3$.ɵpureFunction2(11, $_c1$, ctx.getExpandedState(), | 
					
						
							|  |  |  |                   $r3$.ɵpureFunction2(8, $_c2$, ctx.collapsedWidth, ctx.expandedWidth) | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2018-12-11 11:58:34 -08:00
										 |  |  |               ), null, true | 
					
						
							| 
									
										
										
										
											2018-12-10 14:53:10 -08:00
										 |  |  |             ); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, hostBindingsDef, 'Incorrect "hostBindings" function'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |     it('should bind to class and style names', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<div [class.error]="error" [style.background-color]="color"></div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 error = true; | 
					
						
							|  |  |  |                 color = 'red'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |       const factory = | 
					
						
							|  |  |  |           'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |         const $e0_classBindings$ = ["error"]; | 
					
						
							|  |  |  |         const $e0_styleBindings$ = ["background-color"]; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         … | 
					
						
							|  |  |  |         MyComponent.ngComponentDef = i0.ɵdefineComponent({type:MyComponent,selectors:[["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyComponent_Factory(t){ | 
					
						
							|  |  |  |               return new (t || MyComponent)(); | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 0, | 
					
						
							|  |  |  |             template: function MyComponent_Template(rf,ctx){ | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementStart(0, "div"); | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |                 $r3$.ɵelementStyling($e0_classBindings$, $e0_styleBindings$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-09-27 15:07:51 -07:00
										 |  |  |                 $r3$.ɵelementStyleProp(0, 0, ctx.color); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementClassProp(0, 0, ctx.error); | 
					
						
							|  |  |  |                 $r3$.ɵelementStylingApply(0); | 
					
						
							| 
									
										
										
										
											2018-06-19 12:45:00 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, factory, 'Incorrect factory'); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('components & directives', () => { | 
					
						
							|  |  |  |     it('should instantiate directives', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({selector: 'child', template: 'child-view'}) | 
					
						
							|  |  |  |             export class ChildComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[some-directive]'}) | 
					
						
							|  |  |  |             export class SomeDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({selector: 'my-component', template: '<child some-directive></child>!'}) | 
					
						
							|  |  |  |             export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [ChildComponent, SomeDirective, MyComponent]}) | 
					
						
							|  |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // ChildComponent definition should be:
 | 
					
						
							|  |  |  |       const ChildComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         ChildComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: ChildComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["child"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |           factory: function ChildComponent_Factory(t) { return new (t || ChildComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |           consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           vars: 0, | 
					
						
							|  |  |  |           template:  function ChildComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵtext(0, "child-view"); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           }, | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // SomeDirective definition should be:
 | 
					
						
							|  |  |  |       const SomeDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         SomeDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: SomeDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["", "some-directive", ""]], | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |           factory: function SomeDirective_Factory(t) {return new (t || SomeDirective)(); } | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // MyComponent definition should be:
 | 
					
						
							|  |  |  |       const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         const $c1$ = ["some-directive", ""]; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |           factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |           consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           vars: 0, | 
					
						
							|  |  |  |           template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelement(0, "child", $c1$); | 
					
						
							|  |  |  |               $r3$.ɵtext(1, "!"); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           directives: [ChildComponent, SomeDirective], | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, ChildComponentDefinition, 'Incorrect ChildComponent.ngComponentDef'); | 
					
						
							|  |  |  |       expectEmit(source, SomeDirectiveDefinition, 'Incorrect SomeDirective.ngDirectiveDef'); | 
					
						
							|  |  |  |       expectEmit(source, MyComponentDefinition, 'Incorrect MyComponentDefinition.ngComponentDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |     it('should support complex selectors', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: 'div.foo[some-directive]:not([title]):not(.baz)'}) | 
					
						
							|  |  |  |             export class SomeDirective {} | 
					
						
							| 
									
										
										
										
											2018-04-13 16:47:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |             @Directive({selector: ':not(span[title]):not(.baz)'}) | 
					
						
							|  |  |  |             export class OtherDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [SomeDirective, OtherDirective]}) | 
					
						
							|  |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // SomeDirective definition should be:
 | 
					
						
							|  |  |  |       const SomeDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         SomeDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |           type: SomeDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["div", "some-directive", "", 8, "foo", 3, "title", "", 9, "baz"]], | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |           factory: function SomeDirective_Factory(t) {return new (t || SomeDirective)(); } | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // OtherDirective definition should be:
 | 
					
						
							|  |  |  |       const OtherDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         OtherDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |           type: OtherDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["", 5, "span", "title", "", 9, "baz"]], | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |           factory: function OtherDirective_Factory(t) {return new (t || OtherDirective)(); } | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:53 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, SomeDirectiveDefinition, 'Incorrect SomeDirective.ngDirectiveDef'); | 
					
						
							|  |  |  |       expectEmit(source, OtherDirectiveDefinition, 'Incorrect OtherDirective.ngDirectiveDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-22 15:38:28 +01:00
										 |  |  |     it('should support components without selector', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({template: '<router-outlet></router-outlet>'}) | 
					
						
							|  |  |  |             export class EmptyOutletComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [EmptyOutletComponent]}) | 
					
						
							|  |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // EmptyOutletComponent definition should be:
 | 
					
						
							|  |  |  |       const EmptyOutletComponentDefinition = `
 | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         EmptyOutletComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |           type: EmptyOutletComponent, | 
					
						
							|  |  |  |           selectors: [["ng-component"]], | 
					
						
							|  |  |  |           factory: function EmptyOutletComponent_Factory(t) { return new (t || EmptyOutletComponent)(); }, | 
					
						
							|  |  |  |           consts: 1, | 
					
						
							|  |  |  |           vars: 0, | 
					
						
							|  |  |  |           template: function EmptyOutletComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵelement(0, "router-outlet"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit( | 
					
						
							|  |  |  |           source, EmptyOutletComponentDefinition, 'Incorrect EmptyOutletComponent.ngComponentDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-09 17:55:23 +01:00
										 |  |  |     it('should not support directives without selector', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({}) | 
					
						
							|  |  |  |             export class EmptyOutletDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [EmptyOutletDirective]}) | 
					
						
							|  |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(() => compile(files, angularFiles)) | 
					
						
							|  |  |  |           .toThrowError('Directive EmptyOutletDirective has no selector, please add it!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should not support directives with empty selector', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: ''}) | 
					
						
							|  |  |  |             export class EmptyOutletDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [EmptyOutletDirective]}) | 
					
						
							|  |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(() => compile(files, angularFiles)) | 
					
						
							|  |  |  |           .toThrowError('Directive EmptyOutletDirective has no selector, please add it!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |     it('should not treat ElementRef, ViewContainerRef, or ChangeDetectorRef specially when injecting', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          const files = { | 
					
						
							|  |  |  |            app: { | 
					
						
							|  |  |  |              'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, ElementRef, ChangeDetectorRef, ViewContainerRef} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: '' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent { | 
					
						
							|  |  |  |               constructor(public el: ElementRef, public vcr: ViewContainerRef, public cdr: ChangeDetectorRef) {} | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  |          }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const MyComponentDefinition = `
 | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |           type: MyComponent, | 
					
						
							|  |  |  |           selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-09-27 15:07:51 -07:00
										 |  |  |           factory: function MyComponent_Factory(t) { | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |              return new (t || MyComponent)( | 
					
						
							| 
									
										
										
										
											2018-09-27 15:07:51 -07:00
										 |  |  |                 $r3$.ɵdirectiveInject(ElementRef), $r3$.ɵdirectiveInject(ViewContainerRef), | 
					
						
							|  |  |  |                 $r3$.ɵdirectiveInject(ChangeDetectorRef)); | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |           }, | 
					
						
							|  |  |  |           consts: 0, | 
					
						
							|  |  |  |           vars: 0, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           template:  function MyComponent_Template(rf, ctx) {}, | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |         });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const result = compile(files, angularFiles); | 
					
						
							|  |  |  |          const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          expectEmit(source, MyComponentDefinition, 'Incorrect MyComponent.ngComponentDef'); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     it('should support structural directives', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule, TemplateRef} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[if]'}) | 
					
						
							|  |  |  |             export class IfDirective { | 
					
						
							|  |  |  |               constructor(template: TemplateRef<any>) { } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: '<ul #foo><li *if>{{salutation}} {{foo}}</li></ul>' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent { | 
					
						
							|  |  |  |               salutation = 'Hello'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [IfDirective, MyComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const IfDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         IfDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: IfDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["", "if", ""]], | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |           factory: function IfDirective_Factory(t) { return new (t || IfDirective)($r3$.ɵdirectiveInject(TemplateRef)); } | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         });`;
 | 
					
						
							|  |  |  |       const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         const $c1$ = ["foo", ""]; | 
					
						
							|  |  |  |         const $c2$ = ["if", ""]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |         function MyComponent_li_2_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "li"); | 
					
						
							|  |  |  |             $r3$.ɵtext(1); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             const $myComp$ = $r3$.ɵnextContext(); | 
					
						
							|  |  |  |             const $foo$ = $r3$.ɵreference(1); | 
					
						
							|  |  |  |             $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2("", $myComp$.salutation, " ", $foo$, "")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |           factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |           consts: 3, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           vars: 0, | 
					
						
							|  |  |  |           template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementStart(0, "ul", null, $c1$); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(2, MyComponent_li_2_Template, 2, 2, "li", $c2$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           directives:[IfDirective], | 
					
						
							|  |  |  |            encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, IfDirectiveDefinition, 'Incorrect IfDirective.ngDirectiveDef'); | 
					
						
							|  |  |  |       expectEmit(source, MyComponentDefinition, 'Incorrect MyComponent.ngComponentDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |     describe('value composition', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support array literals', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-comp', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <p>{{ names[0] }}</p> | 
					
						
							|  |  |  |                   <p>{{ names[1] }}</p> | 
					
						
							|  |  |  |                 \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComp { | 
					
						
							|  |  |  |                 @Input() names: string[]; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-app', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                 <my-comp [names]="['Nancy', customName]"></my-comp> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyApp { | 
					
						
							|  |  |  |                 customName = 'Bess'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComp, MyApp]}) | 
					
						
							|  |  |  |               export class MyModule { } | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDeclaration = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "names"]; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           const $e0_ff$ = function ($v$) { return ["Nancy", $v$]; }; | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |             type: MyApp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-app"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 3, | 
					
						
							|  |  |  |             template:  function MyApp_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |                 $r3$.ɵelement(0, "my-comp", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-21 18:52:26 -07:00
										 |  |  |                 $r3$.ɵelementProperty(0, "names", $r3$.ɵbind($r3$.ɵpureFunction1(1, $e0_ff$, ctx.customName))); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |            directives: [MyComp], | 
					
						
							|  |  |  |            encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyAppDeclaration, 'Invalid array emit'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support 9+ bindings in array literals', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-comp', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   {{ names[0] }} | 
					
						
							|  |  |  |                   {{ names[1] }} | 
					
						
							|  |  |  |                   {{ names[3] }} | 
					
						
							|  |  |  |                   {{ names[4] }} | 
					
						
							|  |  |  |                   {{ names[5] }} | 
					
						
							|  |  |  |                   {{ names[6] }} | 
					
						
							|  |  |  |                   {{ names[7] }} | 
					
						
							|  |  |  |                   {{ names[8] }} | 
					
						
							|  |  |  |                   {{ names[9] }} | 
					
						
							|  |  |  |                   {{ names[10] }} | 
					
						
							|  |  |  |                   {{ names[11] }} | 
					
						
							|  |  |  |                 \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComp { | 
					
						
							|  |  |  |                 @Input() names: string[]; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-app', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                 <my-comp [names]="['start-', n0, n1, n2, n3, n4, '-middle-', n5, n6, n7, n8, '-end']"> | 
					
						
							|  |  |  |                 </my-comp> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyApp { | 
					
						
							|  |  |  |                 n0 = 'a'; | 
					
						
							|  |  |  |                 n1 = 'b'; | 
					
						
							|  |  |  |                 n2 = 'c'; | 
					
						
							|  |  |  |                 n3 = 'd'; | 
					
						
							|  |  |  |                 n4 = 'e'; | 
					
						
							|  |  |  |                 n5 = 'f'; | 
					
						
							|  |  |  |                 n6 = 'g'; | 
					
						
							|  |  |  |                 n7 = 'h'; | 
					
						
							|  |  |  |                 n8 = 'i'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComp, MyApp]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |               `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-09-06 18:50:57 -07:00
										 |  |  |           const $e0_attr$ = [${AttributeMarker.SelectOnly}, "names"]; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           const $e0_ff$ = function ($v0$, $v1$, $v2$, $v3$, $v4$, $v5$, $v6$, $v7$, $v8$) { | 
					
						
							|  |  |  |             return ["start-", $v0$, $v1$, $v2$, $v3$, $v4$, "-middle-", $v5$, $v6$, $v7$, $v8$, "-end"]; | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |             type: MyApp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-app"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 11, | 
					
						
							|  |  |  |             template:  function MyApp_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |                 $r3$.ɵelement(0, "my-comp", $e0_attr$); | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementProperty( | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                     0, "names", | 
					
						
							| 
									
										
										
										
											2018-08-21 18:52:26 -07:00
										 |  |  |                     $r3$.ɵbind($r3$.ɵpureFunctionV(1, $e0_ff$, [ctx.n0, ctx.n1, ctx.n2, ctx.n3, ctx.n4, ctx.n5, ctx.n6, ctx.n7, ctx.n8]))); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: [MyComp], | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyAppDefinition, 'Invalid array binding'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support object literals', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |                 import {Component, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 @Component({ | 
					
						
							|  |  |  |                   selector: 'object-comp', | 
					
						
							|  |  |  |                   template: \`
 | 
					
						
							|  |  |  |                     <p> {{ config['duration'] }} </p> | 
					
						
							|  |  |  |                     <p> {{ config.animation }} </p> | 
					
						
							|  |  |  |                   \`
 | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class ObjectComp { | 
					
						
							|  |  |  |                   @Input() config: {[key: string]: any}; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 @Component({ | 
					
						
							|  |  |  |                   selector: 'my-app', | 
					
						
							|  |  |  |                   template: \`
 | 
					
						
							|  |  |  |                   <object-comp [config]="{'duration': 500, animation: name}"></object-comp> | 
					
						
							|  |  |  |                 \`
 | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyApp { | 
					
						
							|  |  |  |                   name = 'slide'; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 @NgModule({declarations: [ObjectComp, MyApp]}) | 
					
						
							|  |  |  |                 export class MyModule {} | 
					
						
							|  |  |  |               `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "config"]; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           const $e0_ff$ = function ($v$) { return {"duration": 500, animation: $v$}; }; | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |             type: MyApp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-app"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 3, | 
					
						
							|  |  |  |             template:  function MyApp_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |                 $r3$.ɵelement(0, "object-comp", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-21 18:52:26 -07:00
										 |  |  |                 $r3$.ɵelementProperty(0, "config", $r3$.ɵbind($r3$.ɵpureFunction1(1, $e0_ff$, ctx.name))); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: [ObjectComp], | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyAppDefinition, 'Invalid object literal binding'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support expressions nested deeply in object/array literals', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'nested-comp', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <p> {{ config.animation }} </p> | 
					
						
							|  |  |  |                   <p> {{config.actions[0].opacity }} </p> | 
					
						
							|  |  |  |                   <p> {{config.actions[1].duration }} </p> | 
					
						
							|  |  |  |                 \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class NestedComp { | 
					
						
							|  |  |  |                 @Input() config: {[key: string]: any}; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-app', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                 <nested-comp [config]="{animation: name, actions: [{ opacity: 0, duration: 0}, {opacity: 1, duration: duration }]}"> | 
					
						
							|  |  |  |                 </nested-comp> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyApp { | 
					
						
							|  |  |  |                 name = 'slide'; | 
					
						
							|  |  |  |                 duration = 100; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [NestedComp, MyApp]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |               `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "config"]; | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           const $c0$ = {opacity: 0, duration: 0}; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           const $e0_ff$ = function ($v$) { return {opacity: 1, duration: $v$}; }; | 
					
						
							|  |  |  |           const $e0_ff_1$ = function ($v$) { return [$c0$, $v$]; }; | 
					
						
							|  |  |  |           const $e0_ff_2$ = function ($v1$, $v2$) { return {animation: $v1$, actions: $v2$}; }; | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |             type: MyApp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-app"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 8, | 
					
						
							|  |  |  |             template:  function MyApp_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |                 $r3$.ɵelement(0, "nested-comp", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementProperty( | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                     0, "config", | 
					
						
							| 
									
										
										
										
											2018-08-21 18:52:26 -07:00
										 |  |  |                     $r3$.ɵbind($r3$.ɵpureFunction2(5, $e0_ff_2$, ctx.name, $r3$.ɵpureFunction1(3, $e0_ff_1$, $r3$.ɵpureFunction1(1, $e0_ff$, ctx.duration))))); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: [NestedComp], | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-14 17:12:05 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyAppDefinition, 'Invalid array/object literal binding'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |     describe('content projection', () => { | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |       it('should support content projection in root template', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, Directive, NgModule, TemplateRef} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @Component({selector: 'simple', template: '<div><ng-content></ng-content></div>'}) | 
					
						
							|  |  |  |               export class SimpleComponent {} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'complex', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <div id="first"><ng-content select="span[title=toFirst]"></ng-content></div> | 
					
						
							|  |  |  |                   <div id="second"><ng-content SELECT="span[title=toSecond]"></ng-content></div>\` | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |               export class ComplexComponent { } | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @NgModule({declarations: [SimpleComponent, ComplexComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-app', | 
					
						
							|  |  |  |                 template: '<simple>content</simple> <complex></complex>' | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               }) | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               export class MyApp {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         const SimpleComponentDefinition = `
 | 
					
						
							|  |  |  |           SimpleComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             type: SimpleComponent, | 
					
						
							|  |  |  |             selectors: [["simple"]], | 
					
						
							|  |  |  |             factory: function SimpleComponent_Factory(t) { return new (t || SimpleComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-12-22 16:02:34 +00:00
										 |  |  |             ngContentSelectors: _c0, | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             consts: 2, | 
					
						
							|  |  |  |             vars: 0, | 
					
						
							|  |  |  |             template:  function SimpleComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							|  |  |  |                 $r3$.ɵprojectionDef(); | 
					
						
							|  |  |  |                 $r3$.ɵelementStart(0, "div"); | 
					
						
							|  |  |  |                 $r3$.ɵprojection(1); | 
					
						
							|  |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							|  |  |  |           });`;
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         const ComplexComponentDefinition = `
 | 
					
						
							|  |  |  |           const $c3$ = ["id","first"]; | 
					
						
							|  |  |  |           const $c4$ = ["id","second"]; | 
					
						
							|  |  |  |           const $c1$ = [[["span", "title", "tofirst"]], [["span", "title", "tosecond"]]]; | 
					
						
							|  |  |  |           const $c2$ = ["span[title=toFirst]", "span[title=toSecond]"]; | 
					
						
							|  |  |  |           … | 
					
						
							|  |  |  |           ComplexComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             type: ComplexComponent, | 
					
						
							|  |  |  |             selectors: [["complex"]], | 
					
						
							|  |  |  |             factory: function ComplexComponent_Factory(t) { return new (t || ComplexComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-12-22 16:02:34 +00:00
										 |  |  |             ngContentSelectors: _c4, | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             consts: 4, | 
					
						
							|  |  |  |             vars: 0, | 
					
						
							|  |  |  |             template:  function ComplexComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							|  |  |  |                 $r3$.ɵprojectionDef($c1$, $c2$); | 
					
						
							|  |  |  |                 $r3$.ɵelementStart(0, "div", $c3$); | 
					
						
							|  |  |  |                 $r3$.ɵprojection(1, 1); | 
					
						
							|  |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |                 $r3$.ɵelementStart(2, "div", $c4$); | 
					
						
							|  |  |  |                 $r3$.ɵprojection(3, 2); | 
					
						
							|  |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         expectEmit( | 
					
						
							|  |  |  |             result.source, SimpleComponentDefinition, 'Incorrect SimpleComponent definition'); | 
					
						
							|  |  |  |         expectEmit( | 
					
						
							|  |  |  |             result.source, ComplexComponentDefinition, 'Incorrect ComplexComponent definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support content projection in nested templates', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @Component({ | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <div id="second" *ngIf="visible"> | 
					
						
							|  |  |  |                     <ng-content SELECT="span[title=toFirst]"></ng-content> | 
					
						
							|  |  |  |                   </div> | 
					
						
							|  |  |  |                   <div id="third" *ngIf="visible"> | 
					
						
							|  |  |  |                     No ng-content, no instructions generated. | 
					
						
							|  |  |  |                   </div> | 
					
						
							|  |  |  |                   <ng-template> | 
					
						
							|  |  |  |                     '*' selector: <ng-content></ng-content> | 
					
						
							|  |  |  |                   </ng-template> | 
					
						
							|  |  |  |                 \`,
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               class Cmp {} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @NgModule({ declarations: [Cmp] }) | 
					
						
							|  |  |  |               class Module {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const output = `
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:51:47 -08:00
										 |  |  |           const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |           const $_c1$ = ["id", "second"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_div_0_Template(rf, ctx) { if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               $r3$.ɵelementStart(0, "div", $_c1$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵprojection(1, 1); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |           } } | 
					
						
							|  |  |  |           const $_c4$ = ["id", "third"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_div_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵelementStart(0, "div", $_c4$); | 
					
						
							|  |  |  |               $r3$.ɵtext(1, " No ng-content, no instructions generated. "); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_ng_template_2_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵtext(0, " '*' selector: "); | 
					
						
							|  |  |  |               $r3$.ɵprojection(1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           const $_c2$ = [[["span", "title", "tofirst"]]]; | 
					
						
							|  |  |  |           const $_c3$ = ["span[title=toFirst]"]; | 
					
						
							|  |  |  |           … | 
					
						
							|  |  |  |           template: function Cmp_Template(rf, ctx) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵprojectionDef($_c2$, $_c3$); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(0, Cmp_div_0_Template, 2, 0, "div", $_c0$); | 
					
						
							|  |  |  |               $r3$.ɵtemplate(1, Cmp_div_1_Template, 2, 0, "div", $_c0$); | 
					
						
							|  |  |  |               $r3$.ɵtemplate(2, Cmp_ng_template_2_Template, 2, 0, "ng-template"); | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & 2) { | 
					
						
							|  |  |  |               $r3$.ɵelementProperty(0, "ngIf", $r3$.ɵbind(ctx.visible)); | 
					
						
							|  |  |  |               $r3$.ɵelementProperty(1, "ngIf", $r3$.ɵbind(ctx.visible)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         `;
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         const {source} = compile(files, angularFiles); | 
					
						
							|  |  |  |         expectEmit(source, output, 'Invalid content projection instructions generated'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |       it('should support content projection in both the root and nested templates', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @Component({ | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <ng-content select="[id=toMainBefore]"></ng-content> | 
					
						
							|  |  |  |                   <ng-template> | 
					
						
							|  |  |  |                     <ng-content select="[id=toTemplate]"></ng-content> | 
					
						
							|  |  |  |                     <ng-template> | 
					
						
							|  |  |  |                       <ng-content select="[id=toNestedTemplate]"></ng-content> | 
					
						
							|  |  |  |                     </ng-template> | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |                   </ng-template> | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |                   <ng-template> | 
					
						
							|  |  |  |                     '*' selector in a template: <ng-content></ng-content> | 
					
						
							|  |  |  |                   </ng-template> | 
					
						
							|  |  |  |                   <ng-content select="[id=toMainAfter]"></ng-content> | 
					
						
							|  |  |  |                 \`,
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               class Cmp {} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               @NgModule({ declarations: [Cmp] }) | 
					
						
							|  |  |  |               class Module {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         const output = `
 | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_ng_template_1_ng_template_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               if (rf & 1) { | 
					
						
							|  |  |  |                 $r3$.ɵprojection(0, 4); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_ng_template_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵprojection(0, 3); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(1, Cmp_ng_template_1_ng_template_1_Template, 1, 0, "ng-template"); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function Cmp_ng_template_2_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵtext(0, " '*' selector in a template: "); | 
					
						
							|  |  |  |               $r3$.ɵprojection(1); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |           const $_c0$ = [[["", "id", "tomainbefore"]], [["", "id", "tomainafter"]], [["", "id", "totemplate"]], [["", "id", "tonestedtemplate"]]]; | 
					
						
							|  |  |  |           const $_c1$ = ["[id=toMainBefore]", "[id=toMainAfter]", "[id=toTemplate]", "[id=toNestedTemplate]"]; | 
					
						
							|  |  |  |           … | 
					
						
							|  |  |  |           template: function Cmp_Template(rf, ctx) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							|  |  |  |               $r3$.ɵprojectionDef($_c2$, $_c3$); | 
					
						
							|  |  |  |               $r3$.ɵprojection(0, 1); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(1, Cmp_ng_template_1_Template, 2, 0, "ng-template"); | 
					
						
							|  |  |  |               $r3$.ɵtemplate(2, Cmp_ng_template_2_Template, 2, 0, "ng-template"); | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |               $r3$.ɵprojection(3, 2); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-12-19 15:03:36 +01:00
										 |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {source} = compile(files, angularFiles); | 
					
						
							|  |  |  |         expectEmit(source, output, 'Invalid content projection instructions generated'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-11-30 15:01:37 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |     describe('queries', () => { | 
					
						
							|  |  |  |       const directive = { | 
					
						
							|  |  |  |         'some.directive.ts': `
 | 
					
						
							|  |  |  |           import {Directive} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @Directive({ | 
					
						
							|  |  |  |             selector: '[someDir]', | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class SomeDirective { } | 
					
						
							|  |  |  |         `
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |       it('should support view queries with directives', () => { | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...directive, | 
					
						
							|  |  |  |             'view_query.component.ts': `
 | 
					
						
							| 
									
										
										
										
											2018-12-05 21:21:19 -08:00
										 |  |  |             import {Component, NgModule, ViewChild, ViewChildren} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             import {SomeDirective} from './some.directive'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'view-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |                 <div someDir></div> | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ViewQueryComponent { | 
					
						
							|  |  |  |               @ViewChild(SomeDirective) someDir: SomeDirective; | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |               @ViewChildren(SomeDirective) someDirs: QueryList<SomeDirective>; | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [SomeDirective, ViewQueryComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |             `
 | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const ViewQueryComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           const $e0_attrs$ = ["someDir",""]; | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           ViewQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             type: ViewQueryComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["view-query-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function ViewQueryComponent_Factory(t) { return new (t || ViewQueryComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-07-24 11:56:35 +02:00
										 |  |  |             viewQuery: function ViewQueryComponent_Query(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 $r3$.ɵviewQuery(SomeDirective, true); | 
					
						
							|  |  |  |                 $r3$.ɵviewQuery(SomeDirective, true); | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-24 11:56:35 +02:00
										 |  |  |                 var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.someDir = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.someDirs = $tmp$)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             consts: 1, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 0, | 
					
						
							|  |  |  |             template:  function ViewQueryComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-24 11:56:35 +02:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 $r3$.ɵelement(0, "div", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-07-24 11:56:35 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: function () { return [SomeDirective]; }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, ViewQueryComponentDefinition, 'Invalid ViewQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |       it('should support view queries with local refs', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'view_query.component.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, ViewChild, ViewChildren, QueryList} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'view-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |                 <div #myRef></div> | 
					
						
							|  |  |  |                 <div #myRef1></div> | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ViewQueryComponent { | 
					
						
							|  |  |  |               @ViewChild('myRef') myRef: any; | 
					
						
							|  |  |  |               @ViewChildren('myRef1, myRef2, myRef3') myRefs: QueryList<any>; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [ViewQueryComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const ViewQueryComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |           const $e0_attrs$ = ["myRef"]; | 
					
						
							|  |  |  |           const $e1_attrs$ = ["myRef1", "myRef2", "myRef3"]; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |           … | 
					
						
							|  |  |  |           ViewQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |             viewQuery: function ViewQueryComponent_Query(rf, ctx) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 $r3$.ɵviewQuery($e0_attrs$, true); | 
					
						
							|  |  |  |                 $r3$.ɵviewQuery($e1_attrs$, true); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							|  |  |  |                 var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.myRef = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.myRefs = $tmp$)); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, ViewQueryComponentDefinition, 'Invalid ViewQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support view queries with read tokens specified', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             ...directive, | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |             'view_query.component.ts': `
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             import {Component, NgModule, ViewChild, ViewChildren, QueryList, ElementRef, TemplateRef} from '@angular/core'; | 
					
						
							|  |  |  |             import {SomeDirective} from './some.directive'; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'view-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |                 <div someDir></div> | 
					
						
							|  |  |  |                 <div #myRef></div> | 
					
						
							|  |  |  |                 <div #myRef1></div> | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ViewQueryComponent { | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |               @ViewChild('myRef', {read: TemplateRef}) myRef: TemplateRef; | 
					
						
							|  |  |  |               @ViewChildren('myRef1, myRef2, myRef3', {read: ElementRef}) myRefs: QueryList<ElementRef>; | 
					
						
							|  |  |  |               @ViewChild(SomeDirective, {read: ElementRef}) someDir: ElementRef; | 
					
						
							|  |  |  |               @ViewChildren(SomeDirective, {read: TemplateRef}) someDirs: QueryList<TemplateRef>; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [ViewQueryComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const ViewQueryComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |           const $e0_attrs$ = ["myRef"]; | 
					
						
							|  |  |  |           const $e1_attrs$ = ["myRef1", "myRef2", "myRef3"]; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |           … | 
					
						
							|  |  |  |           ViewQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |             viewQuery: function ViewQueryComponent_Query(rf, ctx) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 $r3$.ɵviewQuery($e0_attrs$, true, TemplateRef); | 
					
						
							|  |  |  |                 $r3$.ɵviewQuery(SomeDirective, true, ElementRef); | 
					
						
							|  |  |  |                 $r3$.ɵviewQuery($e1_attrs$, true, ElementRef); | 
					
						
							|  |  |  |                 $r3$.ɵviewQuery(SomeDirective, true, TemplateRef); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							|  |  |  |                 var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.myRef = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.someDir = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.myRefs = $tmp$)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadViewQuery())) && (ctx.someDirs = $tmp$)); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, ViewQueryComponentDefinition, 'Invalid ViewQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support content queries with directives', () => { | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...directive, | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |             'content_query.ts': `
 | 
					
						
							| 
									
										
										
										
											2018-07-18 09:42:42 +02:00
										 |  |  |             import {Component, ContentChild, ContentChildren, NgModule, QueryList} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             import {SomeDirective} from './some.directive'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'content-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div><ng-content></ng-content></div> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ContentQueryComponent { | 
					
						
							|  |  |  |               @ContentChild(SomeDirective) someDir: SomeDirective; | 
					
						
							| 
									
										
										
										
											2018-07-18 09:42:42 +02:00
										 |  |  |               @ContentChildren(SomeDirective) someDirList !: QueryList<SomeDirective>; | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-app', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <content-query-component> | 
					
						
							|  |  |  |                   <div someDir></div> | 
					
						
							|  |  |  |                 </content-query-component> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyApp { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [SomeDirective, ContentQueryComponent, MyApp]}) | 
					
						
							|  |  |  |             export class MyModule { } | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const ContentQueryComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           ContentQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             type: ContentQueryComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["content-query-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function ContentQueryComponent_Factory(t) { | 
					
						
							|  |  |  |               return new (t || ContentQueryComponent)(); | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             contentQueries: function ContentQueryComponent_ContentQueries(rf, ctx, dirIndex) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-23 11:54:43 -08:00
										 |  |  |               $r3$.ɵcontentQuery(dirIndex, SomeDirective, true); | 
					
						
							|  |  |  |               $r3$.ɵcontentQuery(dirIndex, SomeDirective, false); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.someDir = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.someDirList = $tmp$)); | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-12-22 16:02:34 +00:00
										 |  |  |             ngContentSelectors: _c0, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 0, | 
					
						
							|  |  |  |             template:  function ContentQueryComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵprojectionDef(); | 
					
						
							|  |  |  |                 $r3$.ɵelementStart(0, "div"); | 
					
						
							|  |  |  |                 $r3$.ɵprojection(1); | 
					
						
							|  |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-13 10:48:22 -08:00
										 |  |  |         expectEmit(source, ContentQueryComponentDefinition, 'Invalid ContentQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |       it('should support content queries with local refs', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'content_query.component.ts': `
 | 
					
						
							|  |  |  |             import {Component, ContentChild, ContentChildren, NgModule, QueryList} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'content-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div #myRef></div> | 
					
						
							|  |  |  |                 <div #myRef1></div> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ContentQueryComponent { | 
					
						
							|  |  |  |               @ContentChild('myRef') myRef: any; | 
					
						
							|  |  |  |               @ContentChildren('myRef1, myRef2, myRef3') myRefs: QueryList<any>; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             @NgModule({declarations: [ContentQueryComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |         const ContentQueryComponentDefinition = `
 | 
					
						
							|  |  |  |           const $e0_attrs$ = ["myRef"]; | 
					
						
							|  |  |  |           const $e1_attrs$ = ["myRef1", "myRef2", "myRef3"]; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |           ContentQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             … | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             contentQueries: function ContentQueryComponent_ContentQueries(rf, ctx, dirIndex) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-01-23 11:54:43 -08:00
										 |  |  |               $r3$.ɵcontentQuery(dirIndex, $e0_attrs$, true); | 
					
						
							|  |  |  |               $r3$.ɵcontentQuery(dirIndex, $e1_attrs$, false); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |               var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.myRef = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.myRefs = $tmp$)); | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             }, | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           });`;
 | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |         expectEmit(source, ContentQueryComponentDefinition, 'Invalid ContentQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |       it('should support content queries with read tokens specified', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...directive, | 
					
						
							|  |  |  |             'content_query.component.ts': `
 | 
					
						
							|  |  |  |             import {Component, ContentChild, ContentChildren, NgModule, QueryList, ElementRef, TemplateRef} from '@angular/core'; | 
					
						
							|  |  |  |             import {SomeDirective} from './some.directive'; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'content-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div someDir></div> | 
					
						
							|  |  |  |                 <div #myRef></div> | 
					
						
							|  |  |  |                 <div #myRef1></div> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ContentQueryComponent { | 
					
						
							|  |  |  |               @ContentChild('myRef', {read: TemplateRef}) myRef: TemplateRef; | 
					
						
							|  |  |  |               @ContentChildren('myRef1, myRef2, myRef3', {read: ElementRef}) myRefs: QueryList<ElementRef>; | 
					
						
							|  |  |  |               @ContentChild(SomeDirective, {read: ElementRef}) someDir: ElementRef; | 
					
						
							|  |  |  |               @ContentChildren(SomeDirective, {read: TemplateRef}) someDirs: QueryList<TemplateRef>; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             @NgModule({declarations: [ContentQueryComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |         const ContentQueryComponentDefinition = `
 | 
					
						
							|  |  |  |           const $e0_attrs$ = ["myRef"]; | 
					
						
							|  |  |  |           const $e1_attrs$ = ["myRef1", "myRef2", "myRef3"]; | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |           ContentQueryComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |             … | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             contentQueries: function ContentQueryComponent_ContentQueries(rf, ctx, dirIndex) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							|  |  |  |                 $r3$.ɵcontentQuery(dirIndex, $e0_attrs$, true, TemplateRef); | 
					
						
							| 
									
										
										
										
											2019-01-23 11:54:43 -08:00
										 |  |  |               $r3$.ɵcontentQuery(dirIndex, SomeDirective, true, ElementRef); | 
					
						
							|  |  |  |               $r3$.ɵcontentQuery(dirIndex, $e1_attrs$, false, ElementRef); | 
					
						
							|  |  |  |               $r3$.ɵcontentQuery(dirIndex, SomeDirective, false, TemplateRef); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |               var $tmp$; | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.myRef = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.someDir = $tmp$.first)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.myRefs = $tmp$)); | 
					
						
							|  |  |  |                 ($r3$.ɵqueryRefresh(($tmp$ = $r3$.ɵloadContentQuery())) && (ctx.someDirs = $tmp$)); | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |             }, | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           });`;
 | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 13:49:24 -07:00
										 |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, ContentQueryComponentDefinition, 'Invalid ContentQuery declaration'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-28 20:45:41 -08:00
										 |  |  |       it('should throw error if content queries share a property with inputs', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...directive, | 
					
						
							|  |  |  |             'content_query.ts': `
 | 
					
						
							|  |  |  |             import {Component, ContentChild, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'content-query-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div><ng-content></ng-content></div> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class ContentQueryComponent { | 
					
						
							|  |  |  |               @Input() @ContentChild('foo') foo: any; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-app', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <content-query-component> | 
					
						
							|  |  |  |                   <div #foo></div> | 
					
						
							|  |  |  |                 </content-query-component> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyApp { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [ContentQueryComponent, MyApp]}) | 
					
						
							|  |  |  |             export class MyModule { } | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(() => compile(files, angularFiles)) | 
					
						
							|  |  |  |             .toThrowError(/Cannot combine @Input decorators with query decorators/); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 17:20:43 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     describe('pipes', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |       it('should render pipes', () => { | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |                 import {Component, NgModule, Pipe, PipeTransform, OnDestroy} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @Pipe({ | 
					
						
							|  |  |  |                   name: 'myPipe', | 
					
						
							|  |  |  |                   pure: false | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyPipe implements PipeTransform, | 
					
						
							|  |  |  |                     OnDestroy { | 
					
						
							|  |  |  |                   transform(value: any, ...args: any[]) { return value; } | 
					
						
							|  |  |  |                   ngOnDestroy(): void {  } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @Pipe({ | 
					
						
							|  |  |  |                   name: 'myPurePipe', | 
					
						
							|  |  |  |                   pure: true, | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyPurePipe implements PipeTransform { | 
					
						
							|  |  |  |                   transform(value: any, ...args: any[]) { return value; } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @Component({ | 
					
						
							|  |  |  |                   selector: 'my-app', | 
					
						
							| 
									
										
										
										
											2019-02-10 11:41:00 +04:00
										 |  |  |                   template: '{{name | myPipe:size | myPurePipe:size }}<p>{{ name | myPipe:1:2:3:4:5 }} {{ name ? 1 : 2 | myPipe }}</p>' | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyApp { | 
					
						
							|  |  |  |                   name = 'World'; | 
					
						
							|  |  |  |                   size = 0; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @NgModule({declarations:[MyPipe, MyPurePipe, MyApp]}) | 
					
						
							|  |  |  |                 export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const MyPipeDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  |             MyPipe.ngPipeDef = $r3$.ɵdefinePipe({ | 
					
						
							|  |  |  |               name: "myPipe", | 
					
						
							|  |  |  |               type: MyPipe, | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |               factory: function MyPipe_Factory(t) { return new (t || MyPipe)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  |               pure: false | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyPurePipeDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             MyPurePipe.ngPipeDef = $r3$.ɵdefinePipe({ | 
					
						
							|  |  |  |               name: "myPurePipe", | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               type: MyPurePipe, | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |               factory: function MyPurePipe_Factory(t) { return new (t || MyPurePipe)(); }, | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               pure: true | 
					
						
							|  |  |  |             });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             const $c0$ = function ($a0$) { | 
					
						
							| 
									
										
										
										
											2018-05-22 10:48:11 -07:00
										 |  |  |               return [$a0$, 1, 2, 3, 4, 5]; | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             // ...
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               type: MyApp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               selectors: [["my-app"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |               factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							| 
									
										
										
										
											2019-02-10 11:41:00 +04:00
										 |  |  |               consts: 7, | 
					
						
							|  |  |  |               vars: 20, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |               template:  function MyApp_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |                 if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                   $r3$.ɵtext(0); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(1, "myPurePipe"); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(2, "myPipe"); | 
					
						
							|  |  |  |                   $r3$.ɵelementStart(3, "p"); | 
					
						
							|  |  |  |                   $r3$.ɵtext(4); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(5, "myPipe"); | 
					
						
							| 
									
										
										
										
											2019-02-10 11:41:00 +04:00
										 |  |  |                   $r3$.ɵpipe(6, "myPipe"); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                   $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |                 if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-02-10 11:41:00 +04:00
										 |  |  |                   $r3$.ɵtextBinding(0, $r3$.ɵinterpolation1("", $r3$.ɵpipeBind2(1, 3, $r3$.ɵpipeBind2(2, 6, ctx.name, ctx.size), ctx.size), "")); | 
					
						
							|  |  |  |                   $r3$.ɵtextBinding(4, $r3$.ɵinterpolation2("", $r3$.ɵpipeBindV(5, 9, $r3$.ɵpureFunction1(18, $c0$, ctx.name)), " ", (ctx.name ? 1 : $r3$.ɵpipeBind1(6, 16, 2)), "")); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-03-30 16:07:37 -07:00
										 |  |  |               }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |               pipes: [MyPurePipe, MyPipe], | 
					
						
							|  |  |  |               encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyPipeDefinition, 'Invalid pipe definition'); | 
					
						
							|  |  |  |         expectEmit(source, MyPurePipeDefinition, 'Invalid pure pipe definition'); | 
					
						
							|  |  |  |         expectEmit(source, MyAppDefinition, 'Invalid MyApp definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should use appropriate function for a given no of pipe arguments', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |                 import {Component, NgModule, Pipe, PipeTransform, OnDestroy} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @Pipe({ | 
					
						
							|  |  |  |                   name: 'myPipe', | 
					
						
							|  |  |  |                   pure: false | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyPipe implements PipeTransform, | 
					
						
							|  |  |  |                     OnDestroy { | 
					
						
							|  |  |  |                   transform(value: any, ...args: any[]) { return value; } | 
					
						
							|  |  |  |                   ngOnDestroy(): void {  } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @Component({ | 
					
						
							|  |  |  |                   selector: 'my-app', | 
					
						
							|  |  |  |                   template: '0:{{name | myPipe}}1:{{name | myPipe:1}}2:{{name | myPipe:1:2}}3:{{name | myPipe:1:2:3}}4:{{name | myPipe:1:2:3:4}}' | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 export class MyApp { | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                 @NgModule({declarations:[MyPipe, MyApp]}) | 
					
						
							|  |  |  |                 export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyAppDefinition = `
 | 
					
						
							|  |  |  |             // ...
 | 
					
						
							|  |  |  |             MyApp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |               type: MyApp, | 
					
						
							|  |  |  |               selectors: [["my-app"]], | 
					
						
							|  |  |  |               factory: function MyApp_Factory(t) { return new (t || MyApp)(); }, | 
					
						
							|  |  |  |               consts: 6, | 
					
						
							|  |  |  |               vars: 27, | 
					
						
							|  |  |  |               template:  function MyApp_Template(rf, ctx) { | 
					
						
							|  |  |  |                 if (rf & 1) { | 
					
						
							|  |  |  |                   $r3$.ɵtext(0); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(1, "myPipe"); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(2, "myPipe"); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(3, "myPipe"); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(4, "myPipe"); | 
					
						
							|  |  |  |                   $r3$.ɵpipe(5, "myPipe"); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (rf & 2) { | 
					
						
							|  |  |  |                   $r3$.ɵtextBinding(0, $r3$.ɵinterpolation5( | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  |                     "0:", i0.ɵpipeBind1(1, 5, ctx.name), | 
					
						
							|  |  |  |                     "1:", i0.ɵpipeBind2(2, 7, ctx.name, 1), | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |                     "2:", i0.ɵpipeBind3(3, 10, ctx.name, 1, 2), | 
					
						
							|  |  |  |                     "3:", i0.ɵpipeBind4(4, 14, ctx.name, 1, 2, 3), | 
					
						
							|  |  |  |                     "4:", i0.ɵpipeBindV(5, 19, $r3$.ɵpureFunction1(25, $c0$, ctx.name)), | 
					
						
							|  |  |  |                     "" | 
					
						
							|  |  |  |                   )); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |               pipes: [MyPipe], | 
					
						
							|  |  |  |               encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:51:21 +02:00
										 |  |  |             });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, MyAppDefinition, 'Invalid MyApp definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('local reference', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({selector: 'my-component', template: '<input #user>Hello {{user.value}}!'}) | 
					
						
							|  |  |  |             export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         const $c1$ = ["user", ""]; | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |           factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |           consts: 3, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           vars: 1, | 
					
						
							|  |  |  |           template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelement(0, "input", null, $c1$); | 
					
						
							|  |  |  |               $r3$.ɵtext(2); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               const $user$ = $r3$.ɵreference(1); | 
					
						
							|  |  |  |               $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1("Hello ", $user$.value, "!")); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           }, | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, MyComponentDefinition, 'Incorrect MyComponent.ngComponentDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |     it('local references in nested views', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule, TemplateRef} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[if]'}) | 
					
						
							|  |  |  |             export class IfDirective { | 
					
						
							|  |  |  |               constructor(template: TemplateRef<any>) { } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div #foo></div> | 
					
						
							|  |  |  |                 {{foo}} | 
					
						
							|  |  |  |                 <div *if> | 
					
						
							|  |  |  |                   {{foo}}-{{bar}} | 
					
						
							|  |  |  |                   <span *if>{{foo}}-{{bar}}-{{baz}}</span> | 
					
						
							|  |  |  |                   <span #bar></span> | 
					
						
							|  |  |  |                 </div> | 
					
						
							|  |  |  |                 <div #baz></div> | 
					
						
							|  |  |  |                 \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [IfDirective, MyComponent]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const MyComponentDefinition = `
 | 
					
						
							|  |  |  |         const $c1$ = ["foo", ""]; | 
					
						
							|  |  |  |         const $c2$ = ["if", ""]; | 
					
						
							|  |  |  |         const $c3$ = ["baz", ""]; | 
					
						
							|  |  |  |         const $c4$ = ["bar", ""]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |         function MyComponent_div_3_span_2_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "span"); | 
					
						
							|  |  |  |             $r3$.ɵtext(1); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵnextContext(); | 
					
						
							|  |  |  |             const $bar$ = $r3$.ɵreference(4); | 
					
						
							|  |  |  |             $r3$.ɵnextContext(); | 
					
						
							|  |  |  |             const $foo$ = $r3$.ɵreference(1); | 
					
						
							|  |  |  |             const $baz$ = $r3$.ɵreference(5); | 
					
						
							|  |  |  |             $r3$.ɵtextBinding(1, $r3$.ɵinterpolation3("", $foo$, "-", $bar$, "-", $baz$, "")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |         function MyComponent_div_3_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelementStart(0, "div"); | 
					
						
							|  |  |  |             $r3$.ɵtext(1); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |             $r3$.ɵtemplate(2, MyComponent_div_3_span_2_Template, 2, 3, "span", $c2$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             $r3$.ɵelement(3, "span", null, $c4$); | 
					
						
							|  |  |  |             $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |             const $bar$ = $r3$.ɵreference(4); | 
					
						
							|  |  |  |             $r3$.ɵnextContext(); | 
					
						
							|  |  |  |             const $foo$ = $r3$.ɵreference(1); | 
					
						
							|  |  |  |             $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2(" ", $foo$, "-", $bar$, " ")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							|  |  |  |           type: MyComponent, | 
					
						
							|  |  |  |           selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |           factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |           consts: 6, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           vars: 1, | 
					
						
							|  |  |  |           template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelement(0, "div", null, $c1$); | 
					
						
							|  |  |  |               $r3$.ɵtext(2); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(3, MyComponent_div_3_Template, 5, 2, "div", $c2$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelement(4, "div", null, $c3$); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               const $foo$ = $r3$.ɵreference(1); | 
					
						
							|  |  |  |               $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1(" ", $foo$, " ")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           directives:[IfDirective], | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |         });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, MyComponentDefinition, 'Incorrect MyComponent.ngComponentDef'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |     it('should support local refs mixed with context assignments', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <div *ngFor="let item of items"> | 
					
						
							|  |  |  |                      <div #foo></div> | 
					
						
							|  |  |  |                       <span *ngIf="showing"> | 
					
						
							|  |  |  |                         {{ foo }} - {{ item }} | 
					
						
							|  |  |  |                       </span> | 
					
						
							|  |  |  |                   </div>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-01 09:52:34 +02:00
										 |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |       const $c0$ = ["ngFor", "" , ${AttributeMarker.SelectOnly}, "ngForOf"]; | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |       const $c1$ = ["foo", ""]; | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |       const $c2$ = [${AttributeMarker.SelectOnly}, "ngIf"]; | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |       function MyComponent_div_0_span_3_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           $i0$.ɵelementStart(0, "span"); | 
					
						
							|  |  |  |           $i0$.ɵtext(1); | 
					
						
							|  |  |  |           $i0$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           const $item$ = $i0$.ɵnextContext().$implicit; | 
					
						
							|  |  |  |           const $foo$ = $i0$.ɵreference(2); | 
					
						
							|  |  |  |           $i0$.ɵtextBinding(1, $i0$.ɵinterpolation2(" ", $foo$, " - ", $item$, " ")); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |       function MyComponent_div_0_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           $i0$.ɵelementStart(0, "div"); | 
					
						
							|  |  |  |           $i0$.ɵelement(1, "div", null, $c1$); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           $i0$.ɵtemplate(3, MyComponent_div_0_span_3_Template, 2, 2, "span", $c2$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           $i0$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           const $app$ = $i0$.ɵnextContext(); | 
					
						
							|  |  |  |           $i0$.ɵelementProperty(3, "ngIf", $i0$.ɵbind($app$.showing)); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |       // ...
 | 
					
						
							|  |  |  |       template:function MyComponent_Template(rf, ctx){ | 
					
						
							|  |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           $i0$.ɵtemplate(0, MyComponent_div_0_Template, 4, 1, "div", $c0$); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |           $i0$.ɵelementProperty(0, "ngForOf", $i0$.ɵbind(ctx.items)); | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |     describe('lifecycle hooks', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Input, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let events: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({selector: 'lifecycle-comp', template: ''}) | 
					
						
							|  |  |  |             export class LifecycleComp { | 
					
						
							|  |  |  |               @Input('name') nameMin: string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngOnChanges() { events.push('changes' + this.nameMin); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngOnInit() { events.push('init' + this.nameMin); } | 
					
						
							|  |  |  |               ngDoCheck() { events.push('check' + this.nameMin); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngAfterContentInit() { events.push('content init' + this.nameMin); } | 
					
						
							|  |  |  |               ngAfterContentChecked() { events.push('content check' + this.nameMin); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngAfterViewInit() { events.push('view init' + this.nameMin); } | 
					
						
							|  |  |  |               ngAfterViewChecked() { events.push('view check' + this.nameMin); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngOnDestroy() { events.push(this.nameMin); } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'simple-layout', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <lifecycle-comp [name]="name1"></lifecycle-comp> | 
					
						
							|  |  |  |                 <lifecycle-comp [name]="name2"></lifecycle-comp> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class SimpleLayout { | 
					
						
							|  |  |  |               name1 = '1'; | 
					
						
							|  |  |  |               name2 = '2'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [LifecycleComp, SimpleLayout]}) | 
					
						
							|  |  |  |             export class LifecycleModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should gen hooks with a few simple components', () => { | 
					
						
							|  |  |  |         const LifecycleCompDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           LifecycleComp.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             type: LifecycleComp, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["lifecycle-comp"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function LifecycleComp_Factory(t) { return new (t || LifecycleComp)(); }, | 
					
						
							| 
									
										
										
										
											2018-10-25 23:05:15 -07:00
										 |  |  |             inputs: {nameMin: ["name", "nameMin"]}, | 
					
						
							| 
									
										
										
										
											2019-01-22 11:17:13 -08:00
										 |  |  |             features: [$r3$.ɵNgOnChangesFeature()], | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 0, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 0, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             template:  function LifecycleComp_Template(rf, ctx) {}, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const SimpleLayoutDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           SimpleLayout.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             type: SimpleLayout, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["simple-layout"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function SimpleLayout_Factory(t) { return new (t || SimpleLayout)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 2, | 
					
						
							|  |  |  |             template:  function SimpleLayout_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |                 $r3$.ɵelement(0, "lifecycle-comp", $e0_attrs$); | 
					
						
							|  |  |  |                 $r3$.ɵelement(1, "lifecycle-comp", $e1_attrs$); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementProperty(0, "name", $r3$.ɵbind(ctx.name1)); | 
					
						
							|  |  |  |                 $r3$.ɵelementProperty(1, "name", $r3$.ɵbind(ctx.name2)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: [LifecycleComp], | 
					
						
							|  |  |  |            encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expectEmit(source, LifecycleCompDefinition, 'Invalid LifecycleComp definition'); | 
					
						
							|  |  |  |         expectEmit(source, SimpleLayoutDefinition, 'Invalid SimpleLayout definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('template variables', () => { | 
					
						
							|  |  |  |       const shared = { | 
					
						
							|  |  |  |         shared: { | 
					
						
							|  |  |  |           'for_of.ts': `
 | 
					
						
							|  |  |  |             import {Directive, Input, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             export interface ForOfContext { | 
					
						
							|  |  |  |               $implicit: any; | 
					
						
							|  |  |  |               index: number; | 
					
						
							|  |  |  |               even: boolean; | 
					
						
							|  |  |  |               odd: boolean; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[forOf]'}) | 
					
						
							|  |  |  |             export class ForOfDirective { | 
					
						
							|  |  |  |               private previous: any[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               constructor(private view: ViewContainerRef, private template: TemplateRef<any>) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input() forOf: any[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngOnChanges(simpleChanges: SimpleChanges) { | 
					
						
							|  |  |  |                 if ('forOf' in simpleChanges) { | 
					
						
							|  |  |  |                   this.update(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               ngDoCheck(): void { | 
					
						
							|  |  |  |                 const previous = this.previous; | 
					
						
							|  |  |  |                 const current = this.forOf; | 
					
						
							|  |  |  |                 if (!previous || previous.length != current.length || | 
					
						
							|  |  |  |                     previous.some((value: any, index: number) => current[index] !== previous[index])) { | 
					
						
							|  |  |  |                   this.update(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               private update() { | 
					
						
							|  |  |  |                 // TODO(chuckj): Not implemented yet
 | 
					
						
							|  |  |  |                 // this.view.clear();
 | 
					
						
							|  |  |  |                 if (this.forOf) { | 
					
						
							|  |  |  |                   const current = this.forOf; | 
					
						
							|  |  |  |                   for (let i = 0; i < current.length; i++) { | 
					
						
							|  |  |  |                     const context = {$implicit: current[i], index: i, even: i % 2 == 0, odd: i % 2 == 1}; | 
					
						
							|  |  |  |                     // TODO(chuckj): Not implemented yet
 | 
					
						
							|  |  |  |                     // this.view.createEmbeddedView(this.template, context);
 | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   this.previous = [...this.forOf]; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |       it('should support embedded views in the SVG namespace', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...shared, | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |                   import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |                   import {ForOfDirective} from './shared/for_of'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   @Component({ | 
					
						
							|  |  |  |                     selector: 'my-component', | 
					
						
							|  |  |  |                     template: \`<svg><g *for="let item of items"><circle></circle></g></svg>\`
 | 
					
						
							|  |  |  |                   }) | 
					
						
							|  |  |  |                   export class MyComponent { | 
					
						
							|  |  |  |                     items = [{ data: 42 }, { data: 42 }]; | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   @NgModule({ | 
					
						
							|  |  |  |                     declarations: [MyComponent, ForOfDirective] | 
					
						
							|  |  |  |                   }) | 
					
						
							|  |  |  |                   export class MyModule {} | 
					
						
							|  |  |  |                 `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // TODO(benlesh): Enforce this when the directives are specified
 | 
					
						
							|  |  |  |         const ForDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               ForOfDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                 type: ForOfDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                 selectors: [["", "forOf", ""]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |                 factory: function ForOfDirective_Factory(t) { | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |                   return new (t || ForOfDirective)($r3$.ɵdirectiveInject(ViewContainerRef), $r3$.ɵdirectiveInject(TemplateRef)); | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2019-01-22 11:17:13 -08:00
										 |  |  |                 features: [$r3$.ɵNgOnChangesFeature()], | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                 inputs: {forOf: "forOf"} | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |               }); | 
					
						
							|  |  |  |             `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |               const $t1_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               function MyComponent__svg_g_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |                 if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                   $r3$.ɵnamespaceSVG(); | 
					
						
							|  |  |  |                   $r3$.ɵelementStart(0,"g"); | 
					
						
							|  |  |  |                   $r3$.ɵelement(1,"circle"); | 
					
						
							|  |  |  |                   $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |               … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                 type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                 selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |                 factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |                 consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |                 vars: 1, | 
					
						
							|  |  |  |                 template:  function MyComponent_Template(rf, ctx){ | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                   if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                     $r3$.ɵnamespaceSVG(); | 
					
						
							|  |  |  |                     $r3$.ɵelementStart(0,"svg"); | 
					
						
							| 
									
										
										
										
											2019-01-22 20:40:27 +01:00
										 |  |  |                     $r3$.ɵtemplate(1, MyComponent__svg_g_1_Template, 2, 0, "g", $t1_attrs$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                     $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                   } | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                   if (rf & 2) { $r3$.ɵelementProperty(1,"forOf",$r3$.ɵbind(ctx.items)); } | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |                 directives: function() { return [ForOfDirective]; }, | 
					
						
							|  |  |  |                 encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-06-08 09:00:01 -07:00
										 |  |  |               }); | 
					
						
							|  |  |  |             `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // TODO(benlesh): Enforce this when the directives are specified
 | 
					
						
							|  |  |  |         // expectEmit(source, ForDirectiveDefinition, 'Invalid directive definition');
 | 
					
						
							|  |  |  |         expectEmit(source, MyComponentDefinition, 'Invalid component definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |       it('should support a let variable and reference', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...shared, | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |               import {ForOfDirective} from './shared/for_of'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`<ul><li *for="let item of items">{{item.name}}</li></ul>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 items = [{name: 'one'}, {name: 'two'}]; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({ | 
					
						
							|  |  |  |                 declarations: [MyComponent, ForOfDirective] | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // TODO(chuckj): Enforce this when the directives are specified
 | 
					
						
							|  |  |  |         const ForDirectiveDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           ForOfDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             type: ForOfDirective, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["", "forOf", ""]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function ForOfDirective_Factory(t) { | 
					
						
							| 
									
										
										
										
											2018-09-21 18:38:13 -07:00
										 |  |  |               return new (t || ForOfDirective)($r3$.ɵdirectiveInject(ViewContainerRef), $r3$.ɵdirectiveInject(TemplateRef)); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-22 11:17:13 -08:00
										 |  |  |             features: [$r3$.ɵNgOnChangesFeature()], | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             inputs: {forOf: "forOf"} | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $t1_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function MyComponent_li_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementStart(0, "li"); | 
					
						
							|  |  |  |               $r3$.ɵtext(1); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |               const $item$ = ctx.$implicit; | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵtextBinding(1, $r3$.ɵinterpolation1("", $item$.name, "")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 1, | 
					
						
							|  |  |  |             template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementStart(0, "ul"); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |                 $r3$.ɵtemplate(1, MyComponent_li_1_Template, 2, 1, "li", $t1_attrs$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementProperty(1, "forOf", $r3$.ɵbind(ctx.items)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: function() { return [ForOfDirective]; }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // TODO(chuckj): Enforce this when the directives are specified
 | 
					
						
							|  |  |  |         // expectEmit(source, ForDirectiveDefinition, 'Invalid directive definition');
 | 
					
						
							|  |  |  |         expectEmit(source, MyComponentDefinition, 'Invalid component definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support accessing parent template variables', () => { | 
					
						
							|  |  |  |         const files = { | 
					
						
							|  |  |  |           app: { | 
					
						
							|  |  |  |             ...shared, | 
					
						
							|  |  |  |             'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |               import {ForOfDirective} from './shared/for_of'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                 <ul> | 
					
						
							|  |  |  |                   <li *for="let item of items"> | 
					
						
							|  |  |  |                     <div>{{item.name}}</div> | 
					
						
							|  |  |  |                     <ul> | 
					
						
							|  |  |  |                       <li *for="let info of item.infos"> | 
					
						
							|  |  |  |                         {{item.name}}: {{info.description}} | 
					
						
							|  |  |  |                       </li> | 
					
						
							|  |  |  |                     </ul> | 
					
						
							|  |  |  |                   </li> | 
					
						
							|  |  |  |                 </ul>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 items = [ | 
					
						
							|  |  |  |                   {name: 'one', infos: [{description: '11'}, {description: '12'}]}, | 
					
						
							|  |  |  |                   {name: 'two', infos: [{description: '21'}, {description: '22'}]} | 
					
						
							|  |  |  |                 ]; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({ | 
					
						
							|  |  |  |                 declarations: [MyComponent, ForOfDirective] | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const MyComponentDefinition = `
 | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |           const $t4_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function MyComponent_li_1_li_4_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementStart(0, "li"); | 
					
						
							|  |  |  |               $r3$.ɵtext(1); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |               const $info$ = ctx.$implicit; | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               const $item$ = $r3$.ɵnextContext().$implicit; | 
					
						
							|  |  |  |               $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2(" ", $item$.name, ": ", $info$.description, " ")); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |           function MyComponent_li_1_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementStart(0, "li"); | 
					
						
							|  |  |  |               $r3$.ɵelementStart(1, "div"); | 
					
						
							|  |  |  |               $r3$.ɵtext(2); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |               $r3$.ɵelementStart(3, "ul"); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |               $r3$.ɵtemplate(4, MyComponent_li_1_li_4_Template, 2, 2, "li", $t4_attrs$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵelementEnd(); | 
					
						
							|  |  |  |               $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |               const $item$ = ctx.$implicit; | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |               $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1("", IDENT.name, "")); | 
					
						
							|  |  |  |               $r3$.ɵelementProperty(4, "forOf", $r3$.ɵbind(IDENT.infos)); | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-08-03 12:20:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |             type: MyComponent, | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             selectors: [["my-component"]], | 
					
						
							| 
									
										
										
										
											2018-07-16 16:36:31 -07:00
										 |  |  |             factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }, | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |             consts: 2, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 1, | 
					
						
							|  |  |  |             template:  function MyComponent_Template(rf, ctx) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementStart(0, "ul"); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:17:38 +02:00
										 |  |  |                 $r3$.ɵtemplate(1, MyComponent_li_1_Template, 5, 2, "li", $c1$); | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-08-14 16:48:58 -07:00
										 |  |  |                 $r3$.ɵelementProperty(1, "forOf", $r3$.ɵbind(ctx.items)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-03-29 12:58:41 -07:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |             directives: function () { return [ForOfDirective]; }, | 
					
						
							|  |  |  |             encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |           });`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const result = compile(files, angularFiles); | 
					
						
							|  |  |  |         const source = result.source; | 
					
						
							|  |  |  |         expectEmit(source, MyComponentDefinition, 'Invalid component definition'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-10-25 11:13:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should instantiate directives in a closure when they are forward referenced', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Directive} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'host-binding-comp', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <my-forward-directive></my-forward-directive> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostBindingComp { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({ | 
					
						
							|  |  |  |               selector: 'my-forward-directive' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             class MyForwardDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostBindingComp, MyForwardDirective]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const MyAppDefinition = `
 | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         directives: function () { return [MyForwardDirective]; } | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  |       expectEmit(source, MyAppDefinition, 'Invalid component definition'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should instantiate pipes in a closure when they are forward referenced', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Pipe} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'host-binding-comp', | 
					
						
							|  |  |  |               template: \`
 | 
					
						
							|  |  |  |                 <div [attr.style]="{} | my_forward_pipe">...</div> | 
					
						
							|  |  |  |               \`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostBindingComp { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Pipe({ | 
					
						
							|  |  |  |               name: 'my_forward_pipe' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             class MyForwardPipe {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostBindingComp, MyForwardPipe]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const MyAppDefinition = `
 | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         pipes: function () { return [MyForwardPipe]; } | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  |       expectEmit(source, MyAppDefinition, 'Invalid component definition'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should split multiple `exportAs` values into an array', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[some-directive]', exportAs: 'someDir, otherDir'}) | 
					
						
							|  |  |  |             export class SomeDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 17:52:55 +01:00
										 |  |  |             @NgModule({declarations: [SomeDirective]}) | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |             export class MyModule{} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // SomeDirective definition should be:
 | 
					
						
							|  |  |  |       const SomeDirectiveDefinition = `
 | 
					
						
							|  |  |  |         SomeDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ | 
					
						
							|  |  |  |           type: SomeDirective, | 
					
						
							|  |  |  |           selectors: [["", "some-directive", ""]], | 
					
						
							|  |  |  |           factory: function SomeDirective_Factory(t) {return new (t || SomeDirective)(); }, | 
					
						
							|  |  |  |           exportAs: ["someDir", "otherDir"] | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, SomeDirectiveDefinition, 'Incorrect SomeDirective.ngDirectiveDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 17:31:12 -08:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-08-07 12:04:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 23:05:15 -07:00
										 |  |  |   describe('inherited base classes', () => { | 
					
						
							| 
									
										
										
										
											2018-08-07 12:04:39 -07:00
										 |  |  |     it('should add ngBaseDef if one or more @Input is present', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Input} from '@angular/core'; | 
					
						
							|  |  |  |             export class BaseClass { | 
					
						
							|  |  |  |               @Input() | 
					
						
							|  |  |  |               input1 = 'test'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input('alias2') | 
					
						
							|  |  |  |               input2 = 'whatever'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: \`<div>{{input1}} {{input2}}</div>\`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent extends BaseClass { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const expectedOutput = `
 | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       BaseClass.ngBaseDef = i0.ɵdefineBase({ | 
					
						
							|  |  |  |         inputs: { | 
					
						
							|  |  |  |           input1: "input1", | 
					
						
							|  |  |  |           input2: ["alias2", "input2"] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, expectedOutput, 'Invalid base definition'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should add ngBaseDef if one or more @Output is present', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Output, EventEmitter} from '@angular/core'; | 
					
						
							|  |  |  |             export class BaseClass { | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output1 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output2 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               clicked() { | 
					
						
							|  |  |  |                 this.output1.emit('test'); | 
					
						
							|  |  |  |                 this.output2.emit('test'); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: \`<button (click)="clicked()">Click Me</button>\`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent extends BaseClass { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const expectedOutput = `
 | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       BaseClass.ngBaseDef = i0.ɵdefineBase({ | 
					
						
							|  |  |  |         outputs: { | 
					
						
							|  |  |  |           output1: "output1", | 
					
						
							|  |  |  |           output2: "output2" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, expectedOutput, 'Invalid base definition'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should add ngBaseDef if a mixture of @Input and @Output props are present', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Input, Output, EventEmitter} from '@angular/core'; | 
					
						
							|  |  |  |             export class BaseClass { | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output1 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output2 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input() | 
					
						
							|  |  |  |               input1 = 'test'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input('whatever') | 
					
						
							|  |  |  |               input2 = 'blah'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               clicked() { | 
					
						
							|  |  |  |                 this.output1.emit('test'); | 
					
						
							|  |  |  |                 this.output2.emit('test'); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: \`<button (click)="clicked()">Click Me</button>\`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent extends BaseClass { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const expectedOutput = `
 | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       BaseClass.ngBaseDef = i0.ɵdefineBase({ | 
					
						
							|  |  |  |         inputs: { | 
					
						
							|  |  |  |           input1: "input1", | 
					
						
							|  |  |  |           input2: ["whatever", "input2"] | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         outputs: { | 
					
						
							|  |  |  |           output1: "output1", | 
					
						
							|  |  |  |           output2: "output2" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, expectedOutput, 'Invalid base definition'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should NOT add ngBaseDef if @Component is present', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule, Output, EventEmitter} from '@angular/core'; | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'whatever', | 
					
						
							|  |  |  |               template: '<button (click)="clicked()">Click {{input1}}</button>' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class BaseClass { | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output1 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input() | 
					
						
							|  |  |  |               input1 = 'whatever'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               clicked() { | 
					
						
							|  |  |  |                 this.output1.emit('test'); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: \`<div>What is this developer doing?</div>\`
 | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent extends BaseClass { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expect(result.source).not.toContain('ngBaseDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should NOT add ngBaseDef if @Directive is present', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule, Output, EventEmitter} from '@angular/core'; | 
					
						
							|  |  |  |             @Directive({ | 
					
						
							|  |  |  |               selector: 'whatever', | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class BaseClass { | 
					
						
							|  |  |  |               @Output() | 
					
						
							|  |  |  |               output1 = new EventEmitter<string>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Input() | 
					
						
							|  |  |  |               input1 = 'whatever'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               clicked() { | 
					
						
							|  |  |  |                 this.output1.emit('test'); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-component', | 
					
						
							|  |  |  |               template: '<button (click)="clicked()">Click {{input1}}</button>' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyComponent extends BaseClass { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({ | 
					
						
							|  |  |  |               declarations: [MyComponent] | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expect(result.source).not.toContain('ngBaseDef'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | }); |