Skip to content

Commit d1d2aa0

Browse files
committed
fix(@ngtools/webpack): fix paths mapping recursive support
Some path mappings (see issue) were not resolving properly when they were used in deep paths. Fixes #7341
1 parent 29988d5 commit d1d2aa0

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

packages/@ngtools/webpack/src/paths-plugin.ts

+23-15
Original file line numberDiff line numberDiff line change
@@ -122,29 +122,37 @@ export class PathsPlugin implements Tapable {
122122

123123
this._nmf.plugin('before-resolve', (request: NormalModuleFactoryRequest,
124124
callback: Callback<any>) => {
125+
// Only work on TypeScript issuers.
126+
if (!request.contextInfo.issuer || !request.contextInfo.issuer.endsWith('.ts')) {
127+
return callback(null, request);
128+
}
129+
125130
for (let mapping of this._mappings) {
126131
const match = request.request.match(mapping.aliasPattern);
127132
if (!match) { continue; }
128-
129133
let newRequestStr = mapping.target;
130134
if (!mapping.onlyModule) {
131135
newRequestStr = newRequestStr.replace('*', match[1]);
132136
}
133-
134-
const moduleResolver: ts.ResolvedModuleWithFailedLookupLocations =
135-
ts.nodeModuleNameResolver(
136-
newRequestStr,
137-
this._absoluteBaseUrl,
138-
this._compilerOptions,
139-
this._host
140-
);
141-
const moduleFilePath = moduleResolver.resolvedModule ?
142-
moduleResolver.resolvedModule.resolvedFileName : '';
143-
137+
const moduleResolver = ts.resolveModuleName(
138+
request.request,
139+
request.contextInfo.issuer,
140+
this._compilerOptions,
141+
this._host
142+
);
143+
let moduleFilePath = moduleResolver.resolvedModule
144+
&& moduleResolver.resolvedModule.resolvedFileName;
145+
146+
// If TypeScript gives us a .d.ts it's probably a node module and we need to let webpack
147+
// do the resolution.
148+
if (moduleFilePath && moduleFilePath.endsWith('.d.ts')) {
149+
moduleFilePath = moduleFilePath.replace(/\.d\.ts$/, '.js');
150+
if (!this._host.fileExists(moduleFilePath)) {
151+
continue;
152+
}
153+
}
144154
if (moduleFilePath) {
145-
return callback(null, Object.assign({}, request, {
146-
request: moduleFilePath.includes('.d.ts') ? newRequestStr : moduleFilePath
147-
}));
155+
return callback(null, Object.assign({}, request, { request: moduleFilePath }));
148156
}
149157
}
150158

tests/e2e/tests/build/ts-paths.ts

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,37 @@
11
import {updateTsConfig} from '../../utils/project';
2-
import {writeMultipleFiles, appendToFile, createDir} from '../../utils/fs';
2+
import {writeMultipleFiles, appendToFile, createDir, replaceInFile} from '../../utils/fs';
33
import {ng} from '../../utils/process';
44
import {stripIndents} from 'common-tags';
55

66

77
export default function() {
88
return updateTsConfig(json => {
9-
json['compilerOptions']['baseUrl'] = '.';
9+
json['compilerOptions']['baseUrl'] = './';
1010
json['compilerOptions']['paths'] = {
1111
'@shared': [
1212
'app/shared'
1313
],
1414
'@shared/*': [
1515
'app/shared/*'
1616
],
17-
'*': [
18-
'*',
19-
'app/shared/*'
17+
'@root/*': [
18+
'./*'
2019
]
2120
};
2221
})
2322
.then(() => createDir('src/app/shared'))
2423
.then(() => writeMultipleFiles({
2524
'src/meaning-too.ts': 'export var meaning = 42;',
2625
'src/app/shared/meaning.ts': 'export var meaning = 42;',
27-
'src/app/shared/index.ts': `export * from './meaning'`
26+
'src/app/shared/index.ts': `export * from './meaning'`,
27+
}))
28+
.then(() => replaceInFile('src/app/app.module.ts', './app.component', '@root/app/app.component'))
29+
.then(() => ng('build'))
30+
.then(() => updateTsConfig(json => {
31+
json['compilerOptions']['paths']['*'] = [
32+
'*',
33+
'app/shared/*'
34+
];
2835
}))
2936
.then(() => appendToFile('src/app/app.component.ts', stripIndents`
3037
import { meaning } from 'app/shared/meaning';

0 commit comments

Comments
 (0)