| 
									
										
										
										
											2018-07-16 08:49:56 +01: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-04-06 15:35:40 +01:00
										 |  |  | import {AbsoluteFsPath} from '@angular/compiler-cli/src/ngtsc/path'; | 
					
						
							|  |  |  | import {existsSync, readFileSync, readdirSync, statSync, writeFileSync} from 'fs'; | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | import * as mockFs from 'mock-fs'; | 
					
						
							| 
									
										
										
										
											2018-07-30 20:06:51 +03:00
										 |  |  | import {join} from 'path'; | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  | const Module = require('module'); | 
					
						
							| 
									
										
										
										
											2018-07-16 08:49:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | import {getAngularPackagesFromRunfiles, resolveNpmTreeArtifact} from '../../../test/runfile_helpers'; | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  | import {mainNgcc} from '../../src/main'; | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:40 +01:00
										 |  |  | import {markAsProcessed} from '../../src/packages/build_marker'; | 
					
						
							|  |  |  | import {EntryPointJsonProperty, EntryPointPackageJson, SUPPORTED_FORMAT_PROPERTIES} from '../../src/packages/entry_point'; | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  | import {MockLogger} from '../helpers/mock_logger'; | 
					
						
							| 
									
										
										
										
											2018-07-16 08:49:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:40 +01:00
										 |  |  | const _ = AbsoluteFsPath.from; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | describe('ngcc main()', () => { | 
					
						
							|  |  |  |   beforeEach(createMockFileSystem); | 
					
						
							|  |  |  |   afterEach(restoreRealFileSystem); | 
					
						
							| 
									
										
										
										
											2018-07-16 08:49:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-24 16:53:23 +03:00
										 |  |  |   it('should run ngcc without errors for esm2015', () => { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |     expect(() => mainNgcc({basePath: '/node_modules', propertiesToConsider: ['esm2015']})) | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         .not.toThrow(); | 
					
						
							| 
									
										
										
										
											2018-07-24 16:53:23 +03:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-07-25 13:06:32 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should run ngcc without errors for esm5', () => { | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |     expect(() => mainNgcc({ | 
					
						
							|  |  |  |              basePath: '/node_modules', | 
					
						
							|  |  |  |              propertiesToConsider: ['esm5'], | 
					
						
							|  |  |  |              logger: new MockLogger(), | 
					
						
							|  |  |  |            })) | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         .not.toThrow(); | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   describe('with targetEntryPointPath', () => { | 
					
						
							|  |  |  |     it('should only compile the given package entry-point (and its dependencies).', () => { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       mainNgcc({basePath: '/node_modules', targetEntryPointPath: '@angular/common/http'}); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         es2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm2015: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							|  |  |  |       // * `common` is a dependency of `common/http`, so is compiled.
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         es2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm2015: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							|  |  |  |       // * `core` is a dependency of `common`, so is compiled.
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         es2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         esm2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         fesm2015: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // * `common/testing` is not a dependency of `common/http` so is not compiled.
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toBeUndefined(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should mark a non-Angular package target as processed', () => { | 
					
						
							|  |  |  |       mainNgcc({basePath: '/node_modules', targetEntryPointPath: 'test-package'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // `test-package` has no Angular but is marked as processed.
 | 
					
						
							|  |  |  |       expect(loadPackage('test-package').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							|  |  |  |         es2015: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // * `core` is a dependency of `test-package`, but it is not processed, since test-package
 | 
					
						
							|  |  |  |       // was not processed.
 | 
					
						
							|  |  |  |       expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toBeUndefined(); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:40 +01:00
										 |  |  |   describe('early skipping of target entry-point', () => { | 
					
						
							|  |  |  |     describe('[compileAllFormats === true]', () => { | 
					
						
							|  |  |  |       it('should skip all processing if all the properties are marked as processed', () => { | 
					
						
							|  |  |  |         const logger = new MockLogger(); | 
					
						
							|  |  |  |         markPropertiesAsProcessed('@angular/common/http/testing', SUPPORTED_FORMAT_PROPERTIES); | 
					
						
							|  |  |  |         mainNgcc({ | 
					
						
							|  |  |  |           basePath: '/node_modules', | 
					
						
							|  |  |  |           targetEntryPointPath: '@angular/common/http/testing', logger, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         expect(logger.logs.info).toContain(['The target entry-point has already been processed']); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should process the target if any `propertyToConsider` is not marked as processed', () => { | 
					
						
							|  |  |  |         const logger = new MockLogger(); | 
					
						
							|  |  |  |         markPropertiesAsProcessed('@angular/common/http/testing', ['esm2015', 'fesm2015']); | 
					
						
							|  |  |  |         mainNgcc({ | 
					
						
							|  |  |  |           basePath: '/node_modules', | 
					
						
							|  |  |  |           targetEntryPointPath: '@angular/common/http/testing', | 
					
						
							|  |  |  |           propertiesToConsider: ['fesm2015', 'esm5', 'esm2015'], logger, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         expect(logger.logs.info).not.toContain([ | 
					
						
							|  |  |  |           'The target entry-point has already been processed' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('[compileAllFormats === false]', () => { | 
					
						
							|  |  |  |       it('should process the target if the first matching `propertyToConsider` is not marked as processed', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            const logger = new MockLogger(); | 
					
						
							|  |  |  |            markPropertiesAsProcessed('@angular/common/http/testing', ['esm2015']); | 
					
						
							|  |  |  |            mainNgcc({ | 
					
						
							|  |  |  |              basePath: '/node_modules', | 
					
						
							|  |  |  |              targetEntryPointPath: '@angular/common/http/testing', | 
					
						
							|  |  |  |              propertiesToConsider: ['esm5', 'esm2015'], | 
					
						
							|  |  |  |              compileAllFormats: false, logger, | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(logger.logs.info).not.toContain([ | 
					
						
							|  |  |  |              'The target entry-point has already been processed' | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should skip all processing if the first matching `propertyToConsider` is marked as processed', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            const logger = new MockLogger(); | 
					
						
							|  |  |  |            markPropertiesAsProcessed('@angular/common/http/testing', ['esm2015']); | 
					
						
							|  |  |  |            mainNgcc({ | 
					
						
							|  |  |  |              basePath: '/node_modules', | 
					
						
							|  |  |  |              targetEntryPointPath: '@angular/common/http/testing', | 
					
						
							|  |  |  |              // Simulate a property that does not exist on the package.json and will be ignored.
 | 
					
						
							|  |  |  |              propertiesToConsider: ['missing', 'esm2015', 'esm5'], | 
					
						
							|  |  |  |              compileAllFormats: false, logger, | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(logger.logs.info).toContain([ | 
					
						
							|  |  |  |              'The target entry-point has already been processed' | 
					
						
							|  |  |  |            ]); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function markPropertiesAsProcessed(packagePath: string, properties: EntryPointJsonProperty[]) { | 
					
						
							|  |  |  |     const basePath = '/node_modules'; | 
					
						
							|  |  |  |     const targetPackageJsonPath = _(join(basePath, packagePath, 'package.json')); | 
					
						
							|  |  |  |     const targetPackage = loadPackage(packagePath); | 
					
						
							|  |  |  |     markAsProcessed(targetPackage, targetPackageJsonPath, 'typings'); | 
					
						
							|  |  |  |     properties.forEach(property => markAsProcessed(targetPackage, targetPackageJsonPath, property)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   describe('with propertiesToConsider', () => { | 
					
						
							|  |  |  |     it('should only compile the entry-point formats given in the `propertiesToConsider` list', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          mainNgcc({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |            basePath: '/node_modules', | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |            propertiesToConsider: ['main', 'esm5', 'module', 'fesm5'], | 
					
						
							|  |  |  |            logger: new MockLogger(), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          // * the `main` property is UMD, which is not yet supported.
 | 
					
						
							|  |  |  |          // * none of the ES2015 formats are compiled as they are not on the `propertiesToConsider`
 | 
					
						
							|  |  |  |          // list.
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |          expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |            esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |          expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |            esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |          expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |            esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |          expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |            esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          }); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   describe('with compileAllFormats set to false', () => { | 
					
						
							|  |  |  |     it('should only compile the first matching format', () => { | 
					
						
							|  |  |  |       mainNgcc({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |         basePath: '/node_modules', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         propertiesToConsider: ['main', 'module', 'fesm5', 'esm5'], | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |         compileAllFormats: false, | 
					
						
							|  |  |  |         logger: new MockLogger(), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							|  |  |  |       // * The `main` is UMD, which is not yet supported, and so is not compiled.
 | 
					
						
							|  |  |  |       // * In the Angular packages fesm5 and module have the same underlying format,
 | 
					
						
							|  |  |  |       //   so both are marked as compiled.
 | 
					
						
							|  |  |  |       // * The `esm5` is not compiled because we stopped after the `fesm5` format.
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         fesm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |         module: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |         typings: '0.0.0-PLACEHOLDER', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should cope with compiling the same entry-point multiple times with different formats', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          mainNgcc({ | 
					
						
							|  |  |  |            basePath: '/node_modules', | 
					
						
							|  |  |  |            propertiesToConsider: ['module'], | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |            compileAllFormats: false, | 
					
						
							|  |  |  |            logger: new MockLogger(), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |          }); | 
					
						
							|  |  |  |          expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |          // If ngcc tries to write out the typings files again, this will throw an exception.
 | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |          mainNgcc({ | 
					
						
							|  |  |  |            basePath: '/node_modules', | 
					
						
							|  |  |  |            propertiesToConsider: ['esm5'], | 
					
						
							|  |  |  |            compileAllFormats: false, | 
					
						
							|  |  |  |            logger: new MockLogger(), | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2019-04-02 11:51:39 +01:00
										 |  |  |          expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({ | 
					
						
							|  |  |  |            esm5: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            module: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |            typings: '0.0.0-PLACEHOLDER', | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |        }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('with createNewEntryPointFormats', () => { | 
					
						
							|  |  |  |     it('should create new files rather than overwriting the originals', () => { | 
					
						
							|  |  |  |       const ANGULAR_CORE_IMPORT_REGEX = /import \* as ɵngcc\d+ from '@angular\/core';/; | 
					
						
							|  |  |  |       mainNgcc({ | 
					
						
							|  |  |  |         basePath: '/node_modules', | 
					
						
							|  |  |  |         createNewEntryPointFormats: true, | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |         propertiesToConsider: ['esm5'], | 
					
						
							|  |  |  |         logger: new MockLogger(), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Updates the package.json
 | 
					
						
							|  |  |  |       expect(loadPackage('@angular/common').esm5).toEqual('./esm5/common.js'); | 
					
						
							|  |  |  |       expect((loadPackage('@angular/common') as any).esm5_ivy_ngcc) | 
					
						
							|  |  |  |           .toEqual('__ivy_ngcc__/esm5/common.js'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Doesn't touch original files
 | 
					
						
							|  |  |  |       expect(readFileSync(`/node_modules/@angular/common/esm5/src/common_module.js`, 'utf8')) | 
					
						
							|  |  |  |           .not.toMatch(ANGULAR_CORE_IMPORT_REGEX); | 
					
						
							|  |  |  |       // Or create a backup of the original
 | 
					
						
							|  |  |  |       expect(existsSync(`/node_modules/@angular/common/esm5/src/common_module.js.__ivy_ngcc_bak`)) | 
					
						
							|  |  |  |           .toBe(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Creates new files
 | 
					
						
							|  |  |  |       expect(readFileSync( | 
					
						
							|  |  |  |                  `/node_modules/@angular/common/__ivy_ngcc__/esm5/src/common_module.js`, 'utf8')) | 
					
						
							|  |  |  |           .toMatch(ANGULAR_CORE_IMPORT_REGEX); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Copies over files (unchanged) that did not need compiling
 | 
					
						
							|  |  |  |       expect(existsSync(`/node_modules/@angular/common/__ivy_ngcc__/esm5/src/version.js`)); | 
					
						
							|  |  |  |       expect(readFileSync(`/node_modules/@angular/common/__ivy_ngcc__/esm5/src/version.js`, 'utf8')) | 
					
						
							|  |  |  |           .toEqual(readFileSync(`/node_modules/@angular/common/esm5/src/version.js`, 'utf8')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Overwrites .d.ts files (as usual)
 | 
					
						
							|  |  |  |       expect(readFileSync(`/node_modules/@angular/common/common.d.ts`, 'utf8')) | 
					
						
							|  |  |  |           .toMatch(ANGULAR_CORE_IMPORT_REGEX); | 
					
						
							|  |  |  |       expect(existsSync(`/node_modules/@angular/common/common.d.ts.__ivy_ngcc_bak`)).toBe(true); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('logger', () => { | 
					
						
							|  |  |  |     it('should log info message to the console by default', () => { | 
					
						
							|  |  |  |       const consoleInfoSpy = spyOn(console, 'info'); | 
					
						
							|  |  |  |       mainNgcc({basePath: '/node_modules', propertiesToConsider: ['esm2015']}); | 
					
						
							|  |  |  |       expect(consoleInfoSpy) | 
					
						
							|  |  |  |           .toHaveBeenCalledWith('Compiling @angular/common/http : esm2015 as esm2015'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should use a custom logger if provided', () => { | 
					
						
							| 
									
										
										
										
											2019-04-06 15:35:13 +01:00
										 |  |  |       const logger = new MockLogger(); | 
					
						
							|  |  |  |       mainNgcc({ | 
					
						
							|  |  |  |         basePath: '/node_modules', | 
					
						
							|  |  |  |         propertiesToConsider: ['esm2015'], logger, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       expect(logger.logs.info).toContain(['Compiling @angular/common/http : esm2015 as esm2015']); | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 13:06:32 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | function createMockFileSystem() { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   mockFs({ | 
					
						
							|  |  |  |     '/node_modules/@angular': loadAngularPackages(), | 
					
						
							|  |  |  |     '/node_modules/rxjs': loadDirectory(resolveNpmTreeArtifact('rxjs', 'index.js')), | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     '/node_modules/tslib': loadDirectory(resolveNpmTreeArtifact('tslib', 'tslib.js')), | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  |     '/node_modules/test-package': { | 
					
						
							|  |  |  |       'package.json': '{"name": "test-package", "es2015": "./index.js", "typings": "./index.d.ts"}', | 
					
						
							|  |  |  |       'index.js': | 
					
						
							|  |  |  |           'import {AppModule} from "@angular/common"; export class MyApp extends AppModule;', | 
					
						
							|  |  |  |       'index.d.s': | 
					
						
							|  |  |  |           'import {AppModule} from "@angular/common"; export declare class MyApp extends AppModule;', | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |   spyOn(Module, '_resolveFilename').and.callFake(mockResolve); | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-07-25 13:06:32 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  | function restoreRealFileSystem() { | 
					
						
							|  |  |  |   mockFs.restore(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-25 19:48:27 +01:00
										 |  |  | /** Load the built Angular packages into an in-memory structure. */ | 
					
						
							|  |  |  | function loadAngularPackages(): Directory { | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  |   const packagesDirectory: Directory = {}; | 
					
						
							| 
									
										
										
										
											2019-01-25 19:48:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   getAngularPackagesFromRunfiles().forEach( | 
					
						
							|  |  |  |       ({name, pkgPath}) => { packagesDirectory[name] = loadDirectory(pkgPath); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 11:32:01 +01:00
										 |  |  |   return packagesDirectory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Load real files from the filesystem into an "in-memory" structure, | 
					
						
							|  |  |  |  * which can be used with `mock-fs`. | 
					
						
							|  |  |  |  * @param directoryPath the path to the directory we want to load. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function loadDirectory(directoryPath: string): Directory { | 
					
						
							|  |  |  |   const directory: Directory = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   readdirSync(directoryPath).forEach(item => { | 
					
						
							|  |  |  |     const itemPath = join(directoryPath, item); | 
					
						
							|  |  |  |     if (statSync(itemPath).isDirectory()) { | 
					
						
							|  |  |  |       directory[item] = loadDirectory(itemPath); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       directory[item] = readFileSync(itemPath, 'utf-8'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return directory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface Directory { | 
					
						
							|  |  |  |   [pathSegment: string]: string|Directory; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * A mock implementation of the node.js Module._resolveFilename function, | 
					
						
							|  |  |  |  * which we are spying on to support mocking out the file-system in these tests. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param request the path to a module that needs resolving. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | function mockResolve(request: string): string|null { | 
					
						
							|  |  |  |   if (existsSync(request)) { | 
					
						
							|  |  |  |     const stat = statSync(request); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     if (stat.isFile()) { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       return request; | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     } else if (stat.isDirectory()) { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       const pIndex = mockResolve(request + '/index'); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |       if (pIndex && existsSync(pIndex)) { | 
					
						
							|  |  |  |         return pIndex; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   for (const ext of ['.js', '.d.ts']) { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     if (existsSync(request + ext)) { | 
					
						
							|  |  |  |       return request + ext; | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   if (request.indexOf('/node_modules') === 0) { | 
					
						
							|  |  |  |     // We already tried adding node_modules so give up.
 | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return mockResolve(join('/node_modules', request)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-01-25 19:44:49 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  | function loadPackage(packageName: string): EntryPointPackageJson { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   return JSON.parse(readFileSync(`/node_modules/${packageName}/package.json`, 'utf8')); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:59 +00:00
										 |  |  | } |