fix(compiler-cli): ngcc - cope with processing entry-points multiple times (#29657)
With the new API, where you can choose to only process the first matching format, it is possible to process an entry-point multiple times, if you pass in a different format each time. Previously, ngcc would always try to process the typings files for the entry-point along with processing the first format of the current execution of ngcc. But this meant that it would be trying to process the typings a second time. Now we only process the typings if they have not already been processed as part of processing another format in another even if it was in a different execution of ngcc. PR Close #29657
This commit is contained in:
parent
c5799491e7
commit
6b39c9cf32
|
@ -110,6 +110,8 @@ export function mainNgcc({basePath, targetEntryPointPath,
|
||||||
const entryPointPackageJson = entryPoint.packageJson;
|
const entryPointPackageJson = entryPoint.packageJson;
|
||||||
const entryPointPackageJsonPath = AbsoluteFsPath.from(resolve(entryPoint.path, 'package.json'));
|
const entryPointPackageJsonPath = AbsoluteFsPath.from(resolve(entryPoint.path, 'package.json'));
|
||||||
|
|
||||||
|
const hasProcessedDts = hasBeenProcessed(entryPointPackageJson, 'typings');
|
||||||
|
|
||||||
for (let i = 0; i < propertiesToConsider.length; i++) {
|
for (let i = 0; i < propertiesToConsider.length; i++) {
|
||||||
const property = propertiesToConsider[i] as EntryPointJsonProperty;
|
const property = propertiesToConsider[i] as EntryPointJsonProperty;
|
||||||
const formatPath = entryPointPackageJson[property];
|
const formatPath = entryPointPackageJson[property];
|
||||||
|
@ -124,12 +126,14 @@ export function mainNgcc({basePath, targetEntryPointPath,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isFirstFormat = compiledFormats.size === 0;
|
||||||
|
const processDts = !hasProcessedDts && isFirstFormat;
|
||||||
|
|
||||||
// We don't break if this if statement fails because we still want to mark
|
// We don't break if this if statement fails because we still want to mark
|
||||||
// the property as processed even if its underlying format has been built already.
|
// the property as processed even if its underlying format has been built already.
|
||||||
if (!compiledFormats.has(formatPath) && (compileAllFormats || compiledFormats.size === 0)) {
|
if (!compiledFormats.has(formatPath) && (compileAllFormats || isFirstFormat)) {
|
||||||
const bundle = makeEntryPointBundle(
|
const bundle = makeEntryPointBundle(
|
||||||
entryPoint.path, formatPath, entryPoint.typings, isCore, property, format,
|
entryPoint.path, formatPath, entryPoint.typings, isCore, property, format, processDts);
|
||||||
compiledFormats.size === 0);
|
|
||||||
if (bundle) {
|
if (bundle) {
|
||||||
logger.info(`Compiling ${entryPoint.name} : ${property} as ${format}`);
|
logger.info(`Compiling ${entryPoint.name} : ${property} as ${format}`);
|
||||||
const transformedFiles = transformer.transform(bundle);
|
const transformedFiles = transformer.transform(bundle);
|
||||||
|
@ -147,6 +151,9 @@ export function mainNgcc({basePath, targetEntryPointPath,
|
||||||
// previous property.
|
// previous property.
|
||||||
if (compiledFormats.has(formatPath)) {
|
if (compiledFormats.has(formatPath)) {
|
||||||
markAsProcessed(entryPointPackageJson, entryPointPackageJsonPath, property);
|
markAsProcessed(entryPointPackageJson, entryPointPackageJsonPath, property);
|
||||||
|
if (processDts) {
|
||||||
|
markAsProcessed(entryPointPackageJson, entryPointPackageJsonPath, 'typings');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ describe('ngcc main()', () => {
|
||||||
esm2015: '0.0.0-PLACEHOLDER',
|
esm2015: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
fesm2015: '0.0.0-PLACEHOLDER',
|
fesm2015: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
// * `common` is a dependency of `common/http`, so is compiled.
|
// * `common` is a dependency of `common/http`, so is compiled.
|
||||||
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
||||||
|
@ -50,6 +51,7 @@ describe('ngcc main()', () => {
|
||||||
esm2015: '0.0.0-PLACEHOLDER',
|
esm2015: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
fesm2015: '0.0.0-PLACEHOLDER',
|
fesm2015: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
// * `core` is a dependency of `common`, so is compiled.
|
// * `core` is a dependency of `common`, so is compiled.
|
||||||
expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({
|
||||||
|
@ -59,6 +61,7 @@ describe('ngcc main()', () => {
|
||||||
esm2015: '0.0.0-PLACEHOLDER',
|
esm2015: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
fesm2015: '0.0.0-PLACEHOLDER',
|
fesm2015: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
|
|
||||||
// * `common/testing` is not a dependency of `common/http` so is not compiled.
|
// * `common/testing` is not a dependency of `common/http` so is not compiled.
|
||||||
|
@ -94,21 +97,25 @@ describe('ngcc main()', () => {
|
||||||
esm5: '0.0.0-PLACEHOLDER',
|
esm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
||||||
esm5: '0.0.0-PLACEHOLDER',
|
esm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({
|
||||||
esm5: '0.0.0-PLACEHOLDER',
|
esm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({
|
||||||
esm5: '0.0.0-PLACEHOLDER',
|
esm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -127,18 +134,43 @@ describe('ngcc main()', () => {
|
||||||
expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common').__processed_by_ivy_ngcc__).toEqual({
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common/testing').__processed_by_ivy_ngcc__).toEqual({
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({
|
expect(loadPackage('@angular/common/http').__processed_by_ivy_ngcc__).toEqual({
|
||||||
fesm5: '0.0.0-PLACEHOLDER',
|
fesm5: '0.0.0-PLACEHOLDER',
|
||||||
module: '0.0.0-PLACEHOLDER',
|
module: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should cope with compiling the same entry-point multiple times with different formats',
|
||||||
|
() => {
|
||||||
|
mainNgcc({
|
||||||
|
basePath: '/node_modules',
|
||||||
|
propertiesToConsider: ['module'],
|
||||||
|
compileAllFormats: false
|
||||||
|
});
|
||||||
|
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.
|
||||||
|
mainNgcc(
|
||||||
|
{basePath: '/node_modules', propertiesToConsider: ['esm5'], compileAllFormats: false});
|
||||||
|
expect(loadPackage('@angular/core').__processed_by_ivy_ngcc__).toEqual({
|
||||||
|
esm5: '0.0.0-PLACEHOLDER',
|
||||||
|
module: '0.0.0-PLACEHOLDER',
|
||||||
|
typings: '0.0.0-PLACEHOLDER',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue