| 
									
										
										
										
											2018-08-09 15:59:10 +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-03-20 13:47:58 +00:00
										 |  |  | import {AbsoluteFsPath} from '@angular/compiler-cli/src/ngtsc/path'; | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | import {readFileSync} from 'fs'; | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  | import * as mockFs from 'mock-fs'; | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  | import {getEntryPointInfo} from '../../src/packages/entry_point'; | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  | import {MockLogger} from '../helpers/mock_logger'; | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('getEntryPointInfo()', () => { | 
					
						
							|  |  |  |   beforeEach(createMockFileSystem); | 
					
						
							|  |  |  |   afterEach(restoreRealFileSystem); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   const _ = AbsoluteFsPath.from; | 
					
						
							|  |  |  |   const SOME_PACKAGE = _('/some_package'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |   it('should return an object containing absolute paths to the formats of the specified entry-point', | 
					
						
							|  |  |  |      () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |        const entryPoint = | 
					
						
							|  |  |  |            getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/valid_entry_point')); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |        expect(entryPoint).toEqual({ | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |          name: 'some-package/valid_entry_point', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          package: SOME_PACKAGE, | 
					
						
							|  |  |  |          path: _('/some_package/valid_entry_point'), | 
					
						
							|  |  |  |          typings: _(`/some_package/valid_entry_point/valid_entry_point.d.ts`), | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |          packageJson: loadPackageJson('/some_package/valid_entry_point'), | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |        }); | 
					
						
							|  |  |  |      }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should return null if there is no package.json at the entry-point path', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_package_json')); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     expect(entryPoint).toBe(null); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |   it('should return null if there is no typings or types field in the package.json', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_typings')); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     expect(entryPoint).toBe(null); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |   it('should return null if there is no esm2015 nor fesm2015 field in the package.json', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_esm2015')); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     expect(entryPoint).toBe(null); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should return null if there is no metadata.json file next to the typing file', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_metadata.json')); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     expect(entryPoint).toBe(null); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should work if the typings field is named `types', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = getEntryPointInfo( | 
					
						
							|  |  |  |         new MockLogger(), SOME_PACKAGE, _('/some_package/types_rather_than_typings')); | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |     expect(entryPoint).toEqual({ | 
					
						
							|  |  |  |       name: 'some-package/types_rather_than_typings', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       package: SOME_PACKAGE, | 
					
						
							|  |  |  |       path: _('/some_package/types_rather_than_typings'), | 
					
						
							|  |  |  |       typings: _(`/some_package/types_rather_than_typings/types_rather_than_typings.d.ts`), | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       packageJson: loadPackageJson('/some_package/types_rather_than_typings'), | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should work with Angular Material style package.json', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/material_style')); | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |     expect(entryPoint).toEqual({ | 
					
						
							|  |  |  |       name: 'some_package/material_style', | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       package: SOME_PACKAGE, | 
					
						
							|  |  |  |       path: _('/some_package/material_style'), | 
					
						
							|  |  |  |       typings: _(`/some_package/material_style/material_style.d.ts`), | 
					
						
							|  |  |  |       packageJson: JSON.parse(readFileSync('/some_package/material_style/package.json', 'utf8')), | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-10-18 15:08:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should return null if the package.json is not valid JSON', () => { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |     const entryPoint = | 
					
						
							|  |  |  |         getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/unexpected_symbols')); | 
					
						
							| 
									
										
										
										
											2018-10-18 15:08:08 +02:00
										 |  |  |     expect(entryPoint).toBe(null); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createMockFileSystem() { | 
					
						
							|  |  |  |   mockFs({ | 
					
						
							|  |  |  |     '/some_package': { | 
					
						
							|  |  |  |       'valid_entry_point': { | 
					
						
							|  |  |  |         'package.json': createPackageJson('valid_entry_point'), | 
					
						
							|  |  |  |         'valid_entry_point.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       'missing_package_json': { | 
					
						
							|  |  |  |         // no package.json!
 | 
					
						
							|  |  |  |         'missing_package_json.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       'missing_typings': { | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |         'package.json': createPackageJson('missing_typings', {excludes: ['typings']}), | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |         'missing_typings.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |       'types_rather_than_typings': { | 
					
						
							|  |  |  |         'package.json': createPackageJson('types_rather_than_typings', {}, 'types'), | 
					
						
							|  |  |  |         'types_rather_than_typings.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |       'missing_esm2015': { | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |         'package.json': createPackageJson('missing_fesm2015', {excludes: ['esm2015', 'fesm2015']}), | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |         'missing_esm2015.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       'missing_metadata': { | 
					
						
							|  |  |  |         'package.json': createPackageJson('missing_metadata'), | 
					
						
							|  |  |  |         // no metadata.json!
 | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |       }, | 
					
						
							|  |  |  |       'material_style': { | 
					
						
							|  |  |  |         'package.json': `{
 | 
					
						
							|  |  |  |           "name": "some_package/material_style", | 
					
						
							|  |  |  |           "typings": "./material_style.d.ts", | 
					
						
							|  |  |  |           "main": "./bundles/material_style.umd.js", | 
					
						
							|  |  |  |           "module": "./esm5/material_style.es5.js", | 
					
						
							|  |  |  |           "es2015": "./esm2015/material_style.js" | 
					
						
							|  |  |  |         }`,
 | 
					
						
							| 
									
										
										
										
											2018-10-18 15:08:08 +02:00
										 |  |  |         'material_style.metadata.json': 'some meta data', | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       'unexpected_symbols': { | 
					
						
							|  |  |  |         // package.json might not be a valid JSON
 | 
					
						
							|  |  |  |         // for example, @schematics/angular contains a package.json blueprint
 | 
					
						
							|  |  |  |         // with unexpected symbols
 | 
					
						
							|  |  |  |         'package.json': | 
					
						
							|  |  |  |             '{"devDependencies": {<% if (!minimal) { %>"@types/jasmine": "~2.8.8" <% } %>}}', | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function restoreRealFileSystem() { | 
					
						
							|  |  |  |   mockFs.restore(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  | function createPackageJson( | 
					
						
							|  |  |  |     packageName: string, {excludes}: {excludes?: string[]} = {}, | 
					
						
							|  |  |  |     typingsProp: string = 'typings'): string { | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |   const packageJson: any = { | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |     name: `some-package/${packageName}`, | 
					
						
							|  |  |  |     [typingsProp]: `./${packageName}.d.ts`, | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |     fesm2015: `./fesm2015/${packageName}.js`, | 
					
						
							|  |  |  |     esm2015: `./esm2015/${packageName}.js`, | 
					
						
							|  |  |  |     fesm5: `./fesm2015/${packageName}.js`, | 
					
						
							|  |  |  |     esm5: `./esm2015/${packageName}.js`, | 
					
						
							|  |  |  |     main: `./bundles/${packageName}.umd.js`, | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-10-10 14:18:01 +01:00
										 |  |  |   if (excludes) { | 
					
						
							|  |  |  |     excludes.forEach(exclude => delete packageJson[exclude]); | 
					
						
							| 
									
										
										
										
											2018-08-09 15:59:10 +01:00
										 |  |  |   } | 
					
						
							|  |  |  |   return JSON.stringify(packageJson); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function loadPackageJson(packagePath: string) { | 
					
						
							|  |  |  |   return JSON.parse(readFileSync(packagePath + '/package.json', 'utf8')); | 
					
						
							|  |  |  | } |