This allows CLI usage to filter excessive log messages and integrations like webpack plugins to provide their own logger. // FW-1198 PR Close #29591
164 lines
6.0 KiB
TypeScript
164 lines
6.0 KiB
TypeScript
/**
|
|
* @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
|
|
*/
|
|
|
|
import {AbsoluteFsPath} from '@angular/compiler-cli/src/ngtsc/path';
|
|
import {readFileSync} from 'fs';
|
|
import * as mockFs from 'mock-fs';
|
|
|
|
import {getEntryPointInfo} from '../../src/packages/entry_point';
|
|
import {MockLogger} from '../helpers/mock_logger';
|
|
|
|
describe('getEntryPointInfo()', () => {
|
|
beforeEach(createMockFileSystem);
|
|
afterEach(restoreRealFileSystem);
|
|
|
|
const _ = AbsoluteFsPath.from;
|
|
const SOME_PACKAGE = _('/some_package');
|
|
|
|
it('should return an object containing absolute paths to the formats of the specified entry-point',
|
|
() => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/valid_entry_point'));
|
|
expect(entryPoint).toEqual({
|
|
name: 'some-package/valid_entry_point',
|
|
package: SOME_PACKAGE,
|
|
path: _('/some_package/valid_entry_point'),
|
|
typings: _(`/some_package/valid_entry_point/valid_entry_point.d.ts`),
|
|
packageJson: loadPackageJson('/some_package/valid_entry_point'),
|
|
});
|
|
});
|
|
|
|
it('should return null if there is no package.json at the entry-point path', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_package_json'));
|
|
expect(entryPoint).toBe(null);
|
|
});
|
|
|
|
it('should return null if there is no typings or types field in the package.json', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_typings'));
|
|
expect(entryPoint).toBe(null);
|
|
});
|
|
|
|
it('should return null if there is no esm2015 nor fesm2015 field in the package.json', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_esm2015'));
|
|
expect(entryPoint).toBe(null);
|
|
});
|
|
|
|
it('should return null if there is no metadata.json file next to the typing file', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/missing_metadata.json'));
|
|
expect(entryPoint).toBe(null);
|
|
});
|
|
|
|
it('should work if the typings field is named `types', () => {
|
|
const entryPoint = getEntryPointInfo(
|
|
new MockLogger(), SOME_PACKAGE, _('/some_package/types_rather_than_typings'));
|
|
expect(entryPoint).toEqual({
|
|
name: 'some-package/types_rather_than_typings',
|
|
package: SOME_PACKAGE,
|
|
path: _('/some_package/types_rather_than_typings'),
|
|
typings: _(`/some_package/types_rather_than_typings/types_rather_than_typings.d.ts`),
|
|
packageJson: loadPackageJson('/some_package/types_rather_than_typings'),
|
|
});
|
|
});
|
|
|
|
it('should work with Angular Material style package.json', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/material_style'));
|
|
expect(entryPoint).toEqual({
|
|
name: 'some_package/material_style',
|
|
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')),
|
|
});
|
|
});
|
|
|
|
it('should return null if the package.json is not valid JSON', () => {
|
|
const entryPoint =
|
|
getEntryPointInfo(new MockLogger(), SOME_PACKAGE, _('/some_package/unexpected_symbols'));
|
|
expect(entryPoint).toBe(null);
|
|
});
|
|
});
|
|
|
|
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': {
|
|
'package.json': createPackageJson('missing_typings', {excludes: ['typings']}),
|
|
'missing_typings.metadata.json': 'some meta data',
|
|
},
|
|
'types_rather_than_typings': {
|
|
'package.json': createPackageJson('types_rather_than_typings', {}, 'types'),
|
|
'types_rather_than_typings.metadata.json': 'some meta data',
|
|
},
|
|
'missing_esm2015': {
|
|
'package.json': createPackageJson('missing_fesm2015', {excludes: ['esm2015', 'fesm2015']}),
|
|
'missing_esm2015.metadata.json': 'some meta data',
|
|
},
|
|
'missing_metadata': {
|
|
'package.json': createPackageJson('missing_metadata'),
|
|
// no metadata.json!
|
|
},
|
|
'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"
|
|
}`,
|
|
'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" <% } %>}}',
|
|
},
|
|
}
|
|
});
|
|
}
|
|
|
|
function restoreRealFileSystem() {
|
|
mockFs.restore();
|
|
}
|
|
|
|
function createPackageJson(
|
|
packageName: string, {excludes}: {excludes?: string[]} = {},
|
|
typingsProp: string = 'typings'): string {
|
|
const packageJson: any = {
|
|
name: `some-package/${packageName}`,
|
|
[typingsProp]: `./${packageName}.d.ts`,
|
|
fesm2015: `./fesm2015/${packageName}.js`,
|
|
esm2015: `./esm2015/${packageName}.js`,
|
|
fesm5: `./fesm2015/${packageName}.js`,
|
|
esm5: `./esm2015/${packageName}.js`,
|
|
main: `./bundles/${packageName}.umd.js`,
|
|
};
|
|
if (excludes) {
|
|
excludes.forEach(exclude => delete packageJson[exclude]);
|
|
}
|
|
return JSON.stringify(packageJson);
|
|
}
|
|
|
|
export function loadPackageJson(packagePath: string) {
|
|
return JSON.parse(readFileSync(packagePath + '/package.json', 'utf8'));
|
|
}
|