fix(ngcc): capture entry-point dependencies from typings as well as source (#34494)
ngcc computes a dependency graph of entry-points to ensure that entry-points are processed in the correct order. Previously only the imports in source files were analysed to determine the dependencies for each entry-point. This is not sufficient when an entry-point has a "type-only" dependency - for example only importing an interface from another entry-point. In this case the "type-only" import does not appear in the source code. It only appears in the typings files. This can cause a dependency to be missed on the entry-point. This commit fixes this by additionally processing the imports in the typings program, as well as the source program. Note that these missing dependencies could cause unexpected flakes when running ngcc in async mode on multiple processes due to the way that ngcc caches files when they are first read from disk. Fixes #34411 // FW-1781 PR Close #34494
This commit is contained in:

committed by
Alex Rickabaugh

parent
fa43184c0f
commit
c692757029
@ -14,7 +14,7 @@ import {ModuleResolver} from '../../src/dependencies/module_resolver';
|
||||
import {DirectoryWalkerEntryPointFinder} from '../../src/entry_point_finder/directory_walker_entry_point_finder';
|
||||
import {NgccConfiguration} from '../../src/packages/configuration';
|
||||
import {EntryPoint} from '../../src/packages/entry_point';
|
||||
import {PathMappings} from '../../src/utils';
|
||||
import {PathMappings, createDtsDependencyHost} from '../../src/utils';
|
||||
import {MockLogger} from '../helpers/mock_logger';
|
||||
|
||||
runInEachFileSystem(() => {
|
||||
@ -29,8 +29,9 @@ runInEachFileSystem(() => {
|
||||
fs = getFileSystem();
|
||||
_Abs = absoluteFrom;
|
||||
logger = new MockLogger();
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs));
|
||||
const dtsHost = createDtsDependencyHost(fs);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
config = new NgccConfiguration(fs, _Abs('/'));
|
||||
});
|
||||
|
||||
@ -152,8 +153,9 @@ runInEachFileSystem(() => {
|
||||
...createPackage(_Abs('/path_mapped/dist/pkg2/node_modules'), 'pkg4'),
|
||||
...createPackage(_Abs('/path_mapped/dist/lib/pkg3'), 'test'),
|
||||
]);
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings));
|
||||
const dtsHost = createDtsDependencyHost(fs, pathMappings);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
const finder = new DirectoryWalkerEntryPointFinder(
|
||||
fs, config, logger, resolver, basePath, pathMappings);
|
||||
const {entryPoints} = finder.findEntryPoints();
|
||||
@ -179,8 +181,9 @@ runInEachFileSystem(() => {
|
||||
...createPackage(_Abs('/path_mapped/node_modules'), 'test', []),
|
||||
...createPackage(_Abs('/path_mapped/dist'), 'pkg2'),
|
||||
]);
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings));
|
||||
const dtsHost = createDtsDependencyHost(fs, pathMappings);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
const finder = new DirectoryWalkerEntryPointFinder(
|
||||
fs, config, logger, resolver, basePath, pathMappings);
|
||||
const {entryPoints} = finder.findEntryPoints();
|
||||
|
@ -14,7 +14,7 @@ import {ModuleResolver} from '../../src/dependencies/module_resolver';
|
||||
import {TargetedEntryPointFinder} from '../../src/entry_point_finder/targeted_entry_point_finder';
|
||||
import {NgccConfiguration} from '../../src/packages/configuration';
|
||||
import {EntryPoint} from '../../src/packages/entry_point';
|
||||
import {PathMappings} from '../../src/utils';
|
||||
import {PathMappings, createDtsDependencyHost} from '../../src/utils';
|
||||
import {MockLogger} from '../helpers/mock_logger';
|
||||
|
||||
runInEachFileSystem(() => {
|
||||
@ -29,8 +29,9 @@ runInEachFileSystem(() => {
|
||||
fs = getFileSystem();
|
||||
_Abs = absoluteFrom;
|
||||
logger = new MockLogger();
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs));
|
||||
const dtsHost = createDtsDependencyHost(fs);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
config = new NgccConfiguration(fs, _Abs('/'));
|
||||
});
|
||||
|
||||
@ -184,8 +185,9 @@ runInEachFileSystem(() => {
|
||||
...createPackage(_Abs('/path_mapped/dist/lib/pkg3'), 'test'),
|
||||
...createPackage(_Abs('/path_mapped/dist'), 'pkg5'),
|
||||
]);
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings));
|
||||
const dtsHost = createDtsDependencyHost(fs, pathMappings);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
const finder = new TargetedEntryPointFinder(
|
||||
fs, config, logger, resolver, basePath, targetPath, pathMappings);
|
||||
const {entryPoints} = finder.findEntryPoints();
|
||||
@ -213,8 +215,9 @@ runInEachFileSystem(() => {
|
||||
...createPackage(_Abs('/path_mapped/node_modules'), 'test', []),
|
||||
...createPackage(_Abs('/path_mapped/dist'), 'pkg2'),
|
||||
]);
|
||||
resolver = new DependencyResolver(
|
||||
fs, logger, {esm2015: new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings))});
|
||||
const srcHost = new EsmDependencyHost(fs, new ModuleResolver(fs, pathMappings));
|
||||
const dtsHost = createDtsDependencyHost(fs, pathMappings);
|
||||
resolver = new DependencyResolver(fs, logger, {esm2015: srcHost}, dtsHost);
|
||||
const finder = new TargetedEntryPointFinder(
|
||||
fs, config, logger, resolver, basePath, targetPath, pathMappings);
|
||||
const {entryPoints} = finder.findEntryPoints();
|
||||
|
Reference in New Issue
Block a user