fix(ivy): ngcc - resolve path-mapped modules correctly (#31450)
Non-wild-card path-mappings were not being matched correctly. Further path-mapped secondary entry-points that were imported from the associated primary entry-point were not being martched correctly. Fixes #31274 PR Close #31450
This commit is contained in:
parent
9a2d1fab84
commit
50c4ec6687
|
@ -94,14 +94,13 @@ export class ModuleResolver {
|
||||||
const packagePath = this.findPackagePath(fromPath);
|
const packagePath = this.findPackagePath(fromPath);
|
||||||
if (packagePath !== null) {
|
if (packagePath !== null) {
|
||||||
for (const mappedPath of mappedPaths) {
|
for (const mappedPath of mappedPaths) {
|
||||||
const isRelative =
|
if (this.isEntryPoint(mappedPath)) {
|
||||||
mappedPath.startsWith(packagePath) && !mappedPath.includes('node_modules');
|
|
||||||
if (isRelative) {
|
|
||||||
return this.resolveAsRelativePath(mappedPath, fromPath);
|
|
||||||
} else if (this.isEntryPoint(mappedPath)) {
|
|
||||||
return new ResolvedExternalModule(mappedPath);
|
return new ResolvedExternalModule(mappedPath);
|
||||||
} else if (this.resolveAsRelativePath(mappedPath, fromPath)) {
|
}
|
||||||
return new ResolvedDeepImport(mappedPath);
|
const nonEntryPointImport = this.resolveAsRelativePath(mappedPath, fromPath);
|
||||||
|
if (nonEntryPointImport !== null) {
|
||||||
|
return isRelativeImport(packagePath, mappedPath) ? nonEntryPointImport :
|
||||||
|
new ResolvedDeepImport(mappedPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,7 +189,9 @@ export class ModuleResolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (bestMapping && bestMatch) ? this.computeMappedTemplates(bestMapping, bestMatch) : [];
|
return (bestMapping !== undefined && bestMatch !== undefined) ?
|
||||||
|
this.computeMappedTemplates(bestMapping, bestMatch) :
|
||||||
|
[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -203,10 +204,13 @@ export class ModuleResolver {
|
||||||
*/
|
*/
|
||||||
private matchMapping(path: string, mapping: ProcessedPathMapping): string|null {
|
private matchMapping(path: string, mapping: ProcessedPathMapping): string|null {
|
||||||
const {prefix, postfix, hasWildcard} = mapping.matcher;
|
const {prefix, postfix, hasWildcard} = mapping.matcher;
|
||||||
if (path.startsWith(prefix) && path.endsWith(postfix)) {
|
if (hasWildcard) {
|
||||||
return hasWildcard ? path.substring(prefix.length, path.length - postfix.length) : '';
|
return (path.startsWith(prefix) && path.endsWith(postfix)) ?
|
||||||
|
path.substring(prefix.length, path.length - postfix.length) :
|
||||||
|
null;
|
||||||
|
} else {
|
||||||
|
return (path === prefix) ? '' : null;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -277,3 +281,7 @@ interface PathMappingPattern {
|
||||||
postfix: string;
|
postfix: string;
|
||||||
hasWildcard: boolean;
|
hasWildcard: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isRelativeImport(from: AbsoluteFsPath, to: AbsoluteFsPath) {
|
||||||
|
return to.startsWith(from) && !to.includes('node_modules');
|
||||||
|
}
|
||||||
|
|
|
@ -43,6 +43,11 @@ runInEachFileSystem(() => {
|
||||||
name: _('/dist/package-4/sub-folder/index.js'),
|
name: _('/dist/package-4/sub-folder/index.js'),
|
||||||
contents: `import {X} from '@shared/package-4/x';`
|
contents: `import {X} from '@shared/package-4/x';`
|
||||||
},
|
},
|
||||||
|
{name: _('/dist/package-4/secondary-entry-point/x.js'), contents: `export class X {}`},
|
||||||
|
{
|
||||||
|
name: _('/dist/package-4/secondary-entry-point/package.json'),
|
||||||
|
contents: 'PACKAGE.JSON for secondary-entry-point'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: _('/dist/sub-folder/package-4/package.json'),
|
name: _('/dist/sub-folder/package-4/package.json'),
|
||||||
contents: 'PACKAGE.JSON for package-4'
|
contents: 'PACKAGE.JSON for package-4'
|
||||||
|
@ -199,6 +204,39 @@ runInEachFileSystem(() => {
|
||||||
_('/dist/package-4/sub-folder/index.js')))
|
_('/dist/package-4/sub-folder/index.js')))
|
||||||
.toEqual(new ResolvedExternalModule(_('/dist/sub-folder/package-5/post-fix')));
|
.toEqual(new ResolvedExternalModule(_('/dist/sub-folder/package-5/post-fix')));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should resolve primary entry-points if they match non-wildcards exactly', () => {
|
||||||
|
const resolver = new ModuleResolver(
|
||||||
|
getFileSystem(), {baseUrl: '/dist', paths: {'package-4': ['package-4']}});
|
||||||
|
expect(resolver.resolveModuleImport('package-4', _('/libs/local-package/index.js')))
|
||||||
|
.toEqual(new ResolvedExternalModule(_('/dist/package-4')));
|
||||||
|
expect(resolver.resolveModuleImport(
|
||||||
|
'package-4/secondary-entry-point', _('/libs/local-package/index.js')))
|
||||||
|
.toEqual(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should resolve secondary entry-points if wildcards match', () => {
|
||||||
|
const resolver = new ModuleResolver(getFileSystem(), {
|
||||||
|
baseUrl: '/dist',
|
||||||
|
paths: {'package-4': ['package-4'], 'package-4/*': ['package-4/*']}
|
||||||
|
});
|
||||||
|
expect(resolver.resolveModuleImport('package-4', _('/libs/local-package/index.js')))
|
||||||
|
.toEqual(new ResolvedExternalModule(_('/dist/package-4')));
|
||||||
|
expect(resolver.resolveModuleImport(
|
||||||
|
'package-4/secondary-entry-point', _('/libs/local-package/index.js')))
|
||||||
|
.toEqual(new ResolvedExternalModule(_('/dist/package-4/secondary-entry-point')));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should resolve secondary-entry-points referenced from their primary entry-point',
|
||||||
|
() => {
|
||||||
|
const resolver = new ModuleResolver(getFileSystem(), {
|
||||||
|
baseUrl: '/dist',
|
||||||
|
paths: {'package-4': ['package-4'], 'package-4/*': ['package-4/*']}
|
||||||
|
});
|
||||||
|
expect(resolver.resolveModuleImport(
|
||||||
|
'package-4/secondary-entry-point', _('/dist/package-4/index.js')))
|
||||||
|
.toEqual(new ResolvedExternalModule(_('/dist/package-4/secondary-entry-point')));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue