| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 14:00:03 -07:00
										 |  |  | import {AotCompiler, AotCompilerHost, AotCompilerOptions, CompileSummaryKind, GeneratedFile, toTypeScript} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  | import {compile, MockDirectory, setup} from './test_util'; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('aot summaries for jit', () => { | 
					
						
							|  |  |  |   let angularFiles = setup(); | 
					
						
							| 
									
										
										
										
											2017-08-16 09:00:03 -07:00
										 |  |  |   let angularSummaryFiles: MockDirectory; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     angularSummaryFiles = compile(angularFiles, {useSummaries: false, emit: true}).outDir; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |   function compileApp( | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |       rootDir: MockDirectory, options: {useSummaries?: boolean}&AotCompilerOptions = {}): | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |       {genFiles: GeneratedFile[], outDir: MockDirectory} { | 
					
						
							| 
									
										
										
										
											2017-08-16 09:00:03 -07:00
										 |  |  |     return compile( | 
					
						
							|  |  |  |         [rootDir, options.useSummaries ? angularSummaryFiles : angularFiles], | 
					
						
							|  |  |  |         {...options, enableSummariesForJit: true}); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |   it('should create @Injectable summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Injectable } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Injectable() | 
					
						
							|  |  |  |         export class MyService { | 
					
						
							|  |  |  |           constructor(d: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toContain(`import * as i0 from '/app/app.module'`); | 
					
						
							|  |  |  |     expect(genSource).toContain('export function MyServiceNgSummary()'); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.Injectable = 3
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:3,\s*type:\{\s*reference:i0.MyService/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i0.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should create @Pipe summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Pipe, NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Pipe({name: 'myPipe'}) | 
					
						
							|  |  |  |         export class MyPipe { | 
					
						
							|  |  |  |           constructor(d: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({declarations: [MyPipe]}) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toContain(`import * as i0 from '/app/app.module'`); | 
					
						
							|  |  |  |     expect(genSource).toContain('export function MyPipeNgSummary()'); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.Pipe = 1
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:0,\s*type:\{\s*reference:i0.MyPipe/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i0.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should create @Directive summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Directive, NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Directive({selector: '[myDir]'}) | 
					
						
							|  |  |  |         export class MyDirective { | 
					
						
							|  |  |  |           constructor(a: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({declarations: [MyDirective]}) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toContain(`import * as i0 from '/app/app.module'`); | 
					
						
							|  |  |  |     expect(genSource).toContain('export function MyDirectiveNgSummary()'); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.Directive = 1
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:1,\s*type:\{\s*reference:i0.MyDirective/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i0.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should create @NgModule summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule() | 
					
						
							|  |  |  |         export class MyModule { | 
					
						
							|  |  |  |           constructor(d: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toContain(`import * as i0 from '/app/app.module'`); | 
					
						
							|  |  |  |     expect(genSource).toContain('export function MyModuleNgSummary()'); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.NgModule = 2
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:2,\s*type:\{\s*reference:i0.MyModule/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i0.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should embed useClass provider summaries in @Directive summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.service.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Injectable } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Injectable() | 
					
						
							|  |  |  |         export class MyService { | 
					
						
							|  |  |  |           constructor(d: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `,
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Directive, NgModule } from '@angular/core'; | 
					
						
							|  |  |  |         import { MyService } from './app.service'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Directive({ | 
					
						
							|  |  |  |           selector: '[myDir]', | 
					
						
							|  |  |  |           providers: [MyService] | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         export class MyDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({declarations: [MyDirective]}) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/useClass:\{\s*reference:i1.MyService/); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.Injectable = 3
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:3,\s*type:\{\s*reference:i1.MyService/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i1.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should embed useClass provider summaries into @NgModule summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.service.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Injectable } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         export class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Injectable() | 
					
						
							|  |  |  |         export class MyService { | 
					
						
							|  |  |  |           constructor(d: Dep) {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `,
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  |         import { MyService } from './app.service'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({ | 
					
						
							|  |  |  |           providers: [MyService] | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/useClass:\{\s*reference:i1.MyService/); | 
					
						
							|  |  |  |     // Note: CompileSummaryKind.Injectable = 3
 | 
					
						
							|  |  |  |     expect(genSource).toMatch(/summaryKind:3,\s*type:\{\s*reference:i1.MyService/); | 
					
						
							|  |  |  |     expect(genSource).toContain('token:{identifier:{reference:i1.Dep}}'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should reference declared @Directive and @Pipe summaries in @NgModule summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { Directive, Pipe, NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Directive({selector: '[myDir]'}) | 
					
						
							|  |  |  |         export class MyDirective {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @Pipe({name: 'myPipe'}) | 
					
						
							|  |  |  |         export class MyPipe {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({declarations: [MyDirective, MyPipe]}) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     expect(genSource).toMatch( | 
					
						
							|  |  |  |         /export function MyModuleNgSummary()[^;]*,\s*MyDirectiveNgSummary,\s*MyPipeNgSummary\s*\]\s*;/); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |   it('should reference imported @NgModule summaries in @NgModule summaries', () => { | 
					
						
							|  |  |  |     const appDir = { | 
					
						
							|  |  |  |       'app.module.ts': `
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |         import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule() | 
					
						
							|  |  |  |         export class MyImportedModule {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @NgModule({imports: [MyImportedModule]}) | 
					
						
							|  |  |  |         export class MyModule {} | 
					
						
							|  |  |  |       `
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     }; | 
					
						
							|  |  |  |     const rootDir = {'app': appDir}; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genFile = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         compileApp(rootDir).genFiles.find(f => f.genFileUrl === '/app/app.module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     const genSource = toTypeScript(genFile); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |     expect(genSource).toMatch( | 
					
						
							|  |  |  |         /export function MyModuleNgSummary()[^;]*,\s*MyImportedModuleNgSummary\s*\]\s*;/); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should create and use reexports for imported NgModules ' + | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |          'across compilation units if symbol re-exports are enabled', | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |      () => { | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |        const lib1In = { | 
					
						
							|  |  |  |          'lib1': { | 
					
						
							|  |  |  |            'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule() | 
					
						
							|  |  |  |           export class Lib1Module {} | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |            'reexport.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule() | 
					
						
							|  |  |  |           export class ReexportModule {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           export const reexports: any[] = [ ReexportModule ]; | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  |        }; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |        const {outDir: lib2In, genFiles: lib1Gen} = compileApp(lib1In, { | 
					
						
							|  |  |  |          useSummaries: true, | 
					
						
							|  |  |  |          createExternalSymbolFactoryReexports: true, | 
					
						
							|  |  |  |        }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |        lib2In['lib2'] = { | 
					
						
							|  |  |  |          'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  |           import { Lib1Module } from '../lib1/module'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({ | 
					
						
							|  |  |  |             imports: [Lib1Module] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class Lib2Module {} | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |          'reexport.ts': `
 | 
					
						
							|  |  |  |         import { reexports as reexports_lib1 } from '../lib1/reexport'; | 
					
						
							|  |  |  |         export const reexports: any[] = [ reexports_lib1 ]; | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |        }; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |        const {outDir: lib3In, genFiles: lib2Gen} = compileApp(lib2In, { | 
					
						
							|  |  |  |          useSummaries: true, | 
					
						
							|  |  |  |          createExternalSymbolFactoryReexports: true, | 
					
						
							|  |  |  |        }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |        const lib2ModuleNgSummary = lib2Gen.find(f => f.genFileUrl === '/lib2/module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |        const lib2ReexportNgSummary = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |            lib2Gen.find(f => f.genFileUrl === '/lib2/reexport.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |        // ngsummaries should add reexports for imported NgModules from a direct dependency
 | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        expect(toTypeScript(lib2ModuleNgSummary)) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |            .toContain( | 
					
						
							|  |  |  |                `export {Lib1ModuleNgSummary as Lib1Module_1NgSummary} from '/lib1/module.ngsummary'`); | 
					
						
							|  |  |  |        // ngsummaries should add reexports for reexported values from a direct dependency
 | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        expect(toTypeScript(lib2ReexportNgSummary)) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |            .toContain( | 
					
						
							|  |  |  |                `export {ReexportModuleNgSummary as ReexportModule_2NgSummary} from '/lib1/reexport.ngsummary'`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        lib3In['lib3'] = { | 
					
						
							|  |  |  |          'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  |           import { Lib2Module } from '../lib2/module'; | 
					
						
							|  |  |  |           import { reexports } from '../lib2/reexport'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({ | 
					
						
							|  |  |  |             imports: [Lib2Module, reexports] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class Lib3Module {} | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |          'reexport.ts': `
 | 
					
						
							|  |  |  |         import { reexports as reexports_lib2 } from '../lib2/reexport'; | 
					
						
							|  |  |  |         export const reexports: any[] = [ reexports_lib2 ]; | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |        }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |        const lib3Gen = compileApp(lib3In, { | 
					
						
							|  |  |  |                          useSummaries: true, | 
					
						
							|  |  |  |                          createExternalSymbolFactoryReexports: true | 
					
						
							|  |  |  |                        }).genFiles; | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |        const lib3ModuleNgSummary = lib3Gen.find(f => f.genFileUrl === '/lib3/module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |        const lib3ReexportNgSummary = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |            lib3Gen.find(f => f.genFileUrl === '/lib3/reexport.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |        // ngsummary.ts files should use the reexported values from direct and deep deps
 | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        const lib3ModuleNgSummarySource = toTypeScript(lib3ModuleNgSummary); | 
					
						
							|  |  |  |        expect(lib3ModuleNgSummarySource).toContain(`import * as i4 from '/lib2/module.ngsummary'`); | 
					
						
							|  |  |  |        expect(lib3ModuleNgSummarySource) | 
					
						
							| 
									
										
										
										
											2017-05-11 10:28:48 -07:00
										 |  |  |            .toContain(`import * as i5 from '/lib2/reexport.ngsummary'`); | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        expect(lib3ModuleNgSummarySource) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |            .toMatch( | 
					
						
							| 
									
										
										
										
											2017-05-11 10:28:48 -07:00
										 |  |  |                /export function Lib3ModuleNgSummary()[^;]*,\s*i4.Lib1Module_1NgSummary,\s*i4.Lib2ModuleNgSummary,\s*i5.ReexportModule_2NgSummary\s*\]\s*;/); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |        // ngsummaries should add reexports for imported NgModules from a deep dependency
 | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        expect(lib3ModuleNgSummarySource) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |            .toContain( | 
					
						
							|  |  |  |                `export {Lib1Module_1NgSummary as Lib1Module_1NgSummary,Lib2ModuleNgSummary as Lib2Module_2NgSummary} from '/lib2/module.ngsummary'`); | 
					
						
							|  |  |  |        // ngsummaries should add reexports for reexported values from a deep dependency
 | 
					
						
							| 
									
										
										
										
											2017-05-17 11:21:08 -07:00
										 |  |  |        expect(toTypeScript(lib3ReexportNgSummary)) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |            .toContain( | 
					
						
							|  |  |  |                `export {ReexportModule_2NgSummary as ReexportModule_3NgSummary} from '/lib2/reexport.ngsummary'`); | 
					
						
							| 
									
										
										
										
											2017-05-17 15:39:08 -07:00
										 |  |  |      }); | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should not create reexports for external symbols imported by NgModules', () => { | 
					
						
							|  |  |  |     const lib1In = { | 
					
						
							|  |  |  |       'lib1': { | 
					
						
							|  |  |  |         'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule() | 
					
						
							|  |  |  |           export class Lib1Module {}`,
 | 
					
						
							|  |  |  |         'reexport.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule() | 
					
						
							|  |  |  |           export class ReexportModule {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           export const reexports: any[] = [ ReexportModule ];`,
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     const {outDir: lib1Out} = compileApp(lib1In, {useSummaries: true}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const lib2In = { | 
					
						
							|  |  |  |       ...lib1Out, | 
					
						
							|  |  |  |       'lib2': { | 
					
						
							|  |  |  |         'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  |           import { Lib1Module } from '../lib1/module'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({ | 
					
						
							|  |  |  |             imports: [Lib1Module] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class Lib2Module {}`,
 | 
					
						
							|  |  |  |         'reexport.ts': `
 | 
					
						
							|  |  |  |           import { reexports as reexports_lib1 } from '../lib1/reexport'; | 
					
						
							|  |  |  |           export const reexports: any[] = [ reexports_lib1 ];`,
 | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const {outDir: lib2Out, genFiles: lib2Gen} = compileApp(lib2In, {useSummaries: true}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |     const lib2ModuleNgSummary = lib2Gen.find(f => f.genFileUrl === '/lib2/module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |     const lib2ReexportNgSummary = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         lib2Gen.find(f => f.genFileUrl === '/lib2/reexport.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // ngsummaries should not add reexports by default for imported NgModules from a direct
 | 
					
						
							|  |  |  |     // dependency
 | 
					
						
							|  |  |  |     expect(toTypeScript(lib2ModuleNgSummary)) | 
					
						
							|  |  |  |         .toContain( | 
					
						
							|  |  |  |             `export {Lib1ModuleNgSummary as Lib1ModuleNgSummary} from '/lib1/module.ngsummary'`); | 
					
						
							|  |  |  |     // ngsummaries should not add reexports by default for reexported values from a direct
 | 
					
						
							|  |  |  |     // dependency.
 | 
					
						
							|  |  |  |     expect(toTypeScript(lib2ReexportNgSummary)) | 
					
						
							|  |  |  |         .toContain( | 
					
						
							|  |  |  |             `export {ReexportModuleNgSummary as ReexportModuleNgSummary} from '/lib1/reexport.ngsummary'`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const lib3In = { | 
					
						
							|  |  |  |       ...lib1Out, | 
					
						
							|  |  |  |       ...lib2Out, | 
					
						
							|  |  |  |       'lib3': { | 
					
						
							|  |  |  |         'module.ts': `
 | 
					
						
							|  |  |  |           import { NgModule } from '@angular/core'; | 
					
						
							|  |  |  |           import { Lib2Module } from '../lib2/module'; | 
					
						
							|  |  |  |           import { reexports } from '../lib2/reexport'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({ | 
					
						
							|  |  |  |             imports: [Lib2Module, reexports] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class Lib3Module {} | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         'reexport.ts': `
 | 
					
						
							|  |  |  |           import { reexports as reexports_lib2 } from '../lib2/reexport'; | 
					
						
							|  |  |  |           export const reexports: any[] = [ reexports_lib2 ]; | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const lib3Gen = compileApp(lib3In, {useSummaries: true}).genFiles; | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |     const lib3ModuleNgSummary = lib3Gen.find(f => f.genFileUrl === '/lib3/module.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |     const lib3ReexportNgSummary = | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         lib3Gen.find(f => f.genFileUrl === '/lib3/reexport.ngsummary.ts')!; | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // ngsummary.ts files should use the external symbols which are manually re-exported from
 | 
					
						
							|  |  |  |     // "lib2" from their original symbol location. With re-exported external symbols this would
 | 
					
						
							|  |  |  |     // be different because there would be no *direct* dependency on "lib1" at all.
 | 
					
						
							|  |  |  |     const lib3ModuleNgSummarySource = toTypeScript(lib3ModuleNgSummary); | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource).toContain(`import * as i1 from '/lib1/module';`); | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource).toContain(`import * as i3 from '/lib1/reexport';`); | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource) | 
					
						
							|  |  |  |         .toMatch(/export function Lib3ModuleNgSummary\(\).*modules:\[{reference:i1\.Lib1Module,/s); | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource) | 
					
						
							|  |  |  |         .toMatch(/export function Lib3ModuleNgSummary\(\).*reference:i3\.ReexportModule,/s); | 
					
						
							|  |  |  |     // ngsummaries should re-export all used summaries directly. With external symbol re-exports
 | 
					
						
							| 
									
										
										
										
											2021-01-14 22:03:58 +03:00
										 |  |  |     // enabled, the "lib1" summaries would be re-exported through "lib2" in order to avoid
 | 
					
						
							| 
									
										
										
										
											2019-02-12 23:29:28 +01:00
										 |  |  |     // a *direct* dependency on "lib1".
 | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource) | 
					
						
							|  |  |  |         .toContain( | 
					
						
							|  |  |  |             `export {Lib1ModuleNgSummary as Lib1ModuleNgSummary} from '/lib1/module.ngsummary';`); | 
					
						
							|  |  |  |     expect(lib3ModuleNgSummarySource) | 
					
						
							|  |  |  |         .toContain( | 
					
						
							|  |  |  |             `export {ReexportModuleNgSummary as ReexportModuleNgSummary} from '/lib1/reexport.ngsummary';`); | 
					
						
							|  |  |  |     expect(toTypeScript(lib3ReexportNgSummary)) | 
					
						
							|  |  |  |         .toContain( | 
					
						
							|  |  |  |             `export {ReexportModuleNgSummary as ReexportModuleNgSummary} from '/lib1/reexport.ngsummary';`); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  | }); |