fix(ivy): ngcc - prevent crash for packages without "main" property (#30950)

When determining the module type of a bundle pointed to by the "main"
property, ngcc needs to read the bundle to figure out if it is CommonJS
or UMD format. However, when the "main" property does not exist ngcc
would crash while determining the path to the main bundle file.

This commit fixes the crash by checking if the "main" property is present
at all, before attempting to derive a full path to the bundle file.

Fixes #30916
Fixes FW-1369

PR Close #30950
This commit is contained in:
JoostK 2019-06-10 14:52:11 +02:00 committed by Igor Minar
parent 7b0bee73de
commit 271d2b51a9
2 changed files with 18 additions and 1 deletions

View File

@ -123,7 +123,11 @@ export function getEntryPointFormat(
case 'esm5':
return 'esm5';
case 'main':
const pathToMain = AbsoluteFsPath.join(entryPoint.path, entryPoint.packageJson['main'] !);
const mainFile = entryPoint.packageJson['main'];
if (mainFile === undefined) {
return undefined;
}
const pathToMain = AbsoluteFsPath.join(entryPoint.path, mainFile);
return isUmdModule(fs, pathToMain) ? 'umd' : 'commonjs';
case 'module':
return 'esm5';

View File

@ -38,6 +38,19 @@ describe('ngcc main()', () => {
.not.toThrow();
});
it('should run ngcc without errors when "main" property is not present', () => {
mainNgcc({
basePath: '/dist',
propertiesToConsider: ['main', 'es2015'],
logger: new MockLogger(),
});
expect(loadPackage('local-package', '/dist').__processed_by_ivy_ngcc__).toEqual({
es2015: '0.0.0-PLACEHOLDER',
typings: '0.0.0-PLACEHOLDER',
});
});
describe('with targetEntryPointPath', () => {
it('should only compile the given package entry-point (and its dependencies).', () => {
const STANDARD_MARKERS = {