| 
									
										
										
										
											2018-09-25 15:35:03 -07: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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-03 12:23:00 +02:00
										 |  |  | import {CustomTransformers} from '@angular/compiler-cli'; | 
					
						
							| 
									
										
										
										
											2019-02-19 17:36:26 -08:00
										 |  |  | import {setAugmentHostForTest} from '@angular/compiler-cli/src/transformers/compiler_host'; | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | import * as fs from 'fs'; | 
					
						
							|  |  |  | import * as path from 'path'; | 
					
						
							|  |  |  | import * as ts from 'typescript'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 17:54:43 +01:00
										 |  |  | import {createCompilerHost, createProgram} from '../../ngtools2'; | 
					
						
							|  |  |  | import {main, mainDiagnosticsForTest, readNgcCommandLineAndConfiguration} from '../../src/main'; | 
					
						
							|  |  |  | import {LazyRoute} from '../../src/ngtsc/routing'; | 
					
						
							| 
									
										
										
										
											2019-01-25 19:49:08 +01:00
										 |  |  | import {resolveNpmTreeArtifact} from '../runfile_helpers'; | 
					
						
							|  |  |  | import {TestSupport, setup} from '../test_support'; | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | function setupFakeCore(support: TestSupport): void { | 
					
						
							|  |  |  |   if (!process.env.TEST_SRCDIR) { | 
					
						
							|  |  |  |     throw new Error('`setupFakeCore` must be run within a Bazel test'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-01-25 19:49:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const fakeNpmPackageDir = | 
					
						
							|  |  |  |       resolveNpmTreeArtifact('angular/packages/compiler-cli/test/ngtsc/fake_core/npm_package'); | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const nodeModulesPath = path.join(support.basePath, 'node_modules'); | 
					
						
							|  |  |  |   const angularCoreDirectory = path.join(nodeModulesPath, '@angular/core'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-25 19:49:08 +01:00
										 |  |  |   fs.symlinkSync(fakeNpmPackageDir, angularCoreDirectory, 'dir'); | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Manages a temporary testing directory structure and environment for testing ngtsc by feeding it | 
					
						
							|  |  |  |  * TypeScript code. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export class NgtscTestEnvironment { | 
					
						
							|  |  |  |   private constructor(private support: TestSupport, readonly outDir: string) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get basePath(): string { return this.support.basePath; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Set up a new testing environment. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   static setup(): NgtscTestEnvironment { | 
					
						
							|  |  |  |     const support = setup(); | 
					
						
							|  |  |  |     const outDir = path.join(support.basePath, 'built'); | 
					
						
							|  |  |  |     process.chdir(support.basePath); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setupFakeCore(support); | 
					
						
							| 
									
										
										
										
											2019-02-19 17:36:26 -08:00
										 |  |  |     setAugmentHostForTest(null); | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const env = new NgtscTestEnvironment(support, outDir); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     env.write('tsconfig-base.json', `{
 | 
					
						
							|  |  |  |       "compilerOptions": { | 
					
						
							| 
									
										
										
										
											2019-02-22 18:06:25 -08:00
										 |  |  |         "emitDecoratorMetadata": true, | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |         "experimentalDecorators": true, | 
					
						
							|  |  |  |         "skipLibCheck": true, | 
					
						
							|  |  |  |         "noImplicitAny": true, | 
					
						
							|  |  |  |         "strictNullChecks": true, | 
					
						
							|  |  |  |         "outDir": "built", | 
					
						
							|  |  |  |         "rootDir": ".", | 
					
						
							|  |  |  |         "baseUrl": ".", | 
					
						
							|  |  |  |         "declaration": true, | 
					
						
							|  |  |  |         "target": "es5", | 
					
						
							| 
									
										
										
										
											2019-01-25 19:49:08 +01:00
										 |  |  |         "newLine": "lf", | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |         "module": "es2015", | 
					
						
							|  |  |  |         "moduleResolution": "node", | 
					
						
							|  |  |  |         "lib": ["es6", "dom"], | 
					
						
							|  |  |  |         "typeRoots": ["node_modules/@types"] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       "angularCompilerOptions": { | 
					
						
							| 
									
										
										
										
											2019-02-08 11:37:21 +00:00
										 |  |  |         "enableIvy": true | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     }`);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return env; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   assertExists(fileName: string) { | 
					
						
							|  |  |  |     if (!fs.existsSync(path.resolve(this.outDir, fileName))) { | 
					
						
							|  |  |  |       throw new Error(`Expected ${fileName} to be emitted (outDir: ${this.outDir})`); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   assertDoesNotExist(fileName: string) { | 
					
						
							|  |  |  |     if (fs.existsSync(path.resolve(this.outDir, fileName))) { | 
					
						
							|  |  |  |       throw new Error(`Did not expect ${fileName} to be emitted (outDir: ${this.outDir})`); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getContents(fileName: string): string { | 
					
						
							|  |  |  |     this.assertExists(fileName); | 
					
						
							|  |  |  |     const modulePath = path.resolve(this.outDir, fileName); | 
					
						
							|  |  |  |     return fs.readFileSync(modulePath, 'utf8'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   write(fileName: string, content: string) { this.support.write(fileName, content); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 10:37:06 -08:00
										 |  |  |   tsconfig(extraOpts: {[key: string]: string | boolean} = {}, extraRootDirs?: string[]): void { | 
					
						
							|  |  |  |     const tsconfig: {[key: string]: any} = { | 
					
						
							|  |  |  |       extends: './tsconfig-base.json', | 
					
						
							| 
									
										
										
										
											2019-02-08 11:37:21 +00:00
										 |  |  |       angularCompilerOptions: {...extraOpts, enableIvy: true}, | 
					
						
							| 
									
										
										
										
											2018-11-30 10:37:06 -08:00
										 |  |  |     }; | 
					
						
							|  |  |  |     if (extraRootDirs !== undefined) { | 
					
						
							|  |  |  |       tsconfig.compilerOptions = { | 
					
						
							|  |  |  |         rootDirs: ['.', ...extraRootDirs], | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     this.write('tsconfig.json', JSON.stringify(tsconfig, null, 2)); | 
					
						
							| 
									
										
										
										
											2019-02-19 17:36:26 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (extraOpts['_useHostForImportGeneration'] === true) { | 
					
						
							|  |  |  |       const cwd = process.cwd(); | 
					
						
							|  |  |  |       setAugmentHostForTest({ | 
					
						
							|  |  |  |         fileNameToModuleName: (importedFilePath: string) => { | 
					
						
							|  |  |  |           return 'root' + importedFilePath.substr(cwd.length).replace(/(\.d)?.ts$/, ''); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Run the compiler to completion, and assert that no errors occurred. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2019-01-03 12:23:00 +02:00
										 |  |  |   driveMain(customTransformers?: CustomTransformers): void { | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |     const errorSpy = jasmine.createSpy('consoleError').and.callFake(console.error); | 
					
						
							| 
									
										
										
										
											2019-01-03 12:23:00 +02:00
										 |  |  |     const exitCode = main(['-p', this.basePath], errorSpy, undefined, customTransformers); | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  |     expect(errorSpy).not.toHaveBeenCalled(); | 
					
						
							|  |  |  |     expect(exitCode).toBe(0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Run the compiler to completion, and return any `ts.Diagnostic` errors that may have occurred. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   driveDiagnostics(): ReadonlyArray<ts.Diagnostic> { | 
					
						
							|  |  |  |     // Cast is safe as ngtsc mode only produces ts.Diagnostics.
 | 
					
						
							|  |  |  |     return mainDiagnosticsForTest(['-p', this.basePath]) as ReadonlyArray<ts.Diagnostic>; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 17:54:43 +01:00
										 |  |  |   driveRoutes(entryPoint?: string): LazyRoute[] { | 
					
						
							|  |  |  |     const {rootNames, options} = readNgcCommandLineAndConfiguration(['-p', this.basePath]); | 
					
						
							|  |  |  |     const host = createCompilerHost({options}); | 
					
						
							|  |  |  |     const program = createProgram({rootNames, host, options}); | 
					
						
							|  |  |  |     return program.listLazyRoutes(entryPoint); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-09-25 15:35:03 -07:00
										 |  |  | } |