diff --git a/packages/@ngtools/webpack/src/paths-plugin.ts b/packages/@ngtools/webpack/src/paths-plugin.ts index 305bd3aa071b..7c873edfcfc7 100644 --- a/packages/@ngtools/webpack/src/paths-plugin.ts +++ b/packages/@ngtools/webpack/src/paths-plugin.ts @@ -96,7 +96,7 @@ export class PathsPlugin implements Tapable { aliasPattern = new RegExp(`^${excapedAlias}$`); } else { let withStarCapturing = excapedAlias.replace('\\*', '(.*)'); - aliasPattern = new RegExp(`^${withStarCapturing}`); + aliasPattern = new RegExp(`^${withStarCapturing}$`); } this.mappings.push({ @@ -122,22 +122,38 @@ export class PathsPlugin implements Tapable { } resolve(resolver: ResolverPlugin, mapping: any, request: any, callback: Callback): any { + if (mapping.alias === '*') { + return callback(); + } + let innerRequest = getInnerRequest(resolver, request); if (!innerRequest) { return callback(); } - let match = innerRequest.match(mapping.aliasPattern); - if (!match) { + let newRequestStr: string; + + let moduleNames = + ts.nodeModuleNameResolver(innerRequest, mapping.alias, this._compilerOptions, this._host); + if (!moduleNames.resolvedModule) { return callback(); + } else { + newRequestStr = moduleNames.resolvedModule.resolvedFileName; } - let newRequestStr = mapping.target; - if (!mapping.onlyModule) { - newRequestStr = newRequestStr.replace('*', match[1]); + let match = innerRequest.match(mapping.aliasPattern); + if (!match && !newRequestStr) { + return callback(); } - if (newRequestStr[0] === '.') { - newRequestStr = path.resolve(this._absoluteBaseUrl, newRequestStr); + + if (!newRequestStr) { + newRequestStr = mapping.target; + if (!mapping.onlyModule) { + newRequestStr = newRequestStr.replace('*', match[1]); + } + if (newRequestStr[0] === '.') { + newRequestStr = path.resolve(this._absoluteBaseUrl, newRequestStr); + } } let newRequest = Object.assign({}, request, { @@ -163,7 +179,7 @@ export class PathsPlugin implements Tapable { } createPlugin(resolver: ResolverPlugin, mapping: any): any { - return (request: any, callback: Callback) => { + return (request: Request, callback: Callback) => { try { this.resolve(resolver, mapping, request, callback); } catch (err) { diff --git a/tests/e2e/tests/build/ts-paths.ts b/tests/e2e/tests/build/ts-paths.ts index 8a39a803a1e8..46e7c2f55157 100644 --- a/tests/e2e/tests/build/ts-paths.ts +++ b/tests/e2e/tests/build/ts-paths.ts @@ -13,6 +13,10 @@ export default function() { ], '@shared/*': [ 'app/shared/*' + ], + '*': [ + '*', + 'app/shared/*' ] }; }) @@ -25,12 +29,14 @@ export default function() { import { meaning } from 'app/shared/meaning'; import { meaning as meaning2 } from '@shared'; import { meaning as meaning3 } from '@shared/meaning'; + import { meaning as meaning4 } from 'meaning'; // need to use imports otherwise they are ignored and // no error is outputted, even if baseUrl/paths don't work console.log(meaning) console.log(meaning2) console.log(meaning3) + console.log(meaning4) `)) .then(() => ng('build')); }