Skip to content

Commit e123468

Browse files
author
Pat Herlihy
committed
fix(webpack): Aliased module paths now properly map to the correct aurelia-loader module id
1 parent 5177bb3 commit e123468

2 files changed

Lines changed: 53 additions & 4 deletions

File tree

dist/PreserveModuleNamePlugin.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PreserveModuleNamePlugin {
2626
if (m.constructor.name === "ConcatenatedModule")
2727
modulesBeforeConcat.splice(i--, 1, ...m["modules"]);
2828
}
29-
for (let module of getPreservedModules(modules)) {
29+
for (let module of getPreservedModules(modules, alias)) {
3030
// Even though it's imported by Aurelia, it's still possible that the module
3131
// became the _root_ of a ConcatenatedModule.
3232
// We use `constructor.name` rather than `instanceof` for compat. with Webpack 2.
@@ -59,7 +59,7 @@ class PreserveModuleNamePlugin {
5959
}
6060
exports.PreserveModuleNamePlugin = PreserveModuleNamePlugin;
6161
;
62-
function getPreservedModules(modules) {
62+
function getPreservedModules(modules, aliases) {
6363
return new Set(modules.filter(m => {
6464
// Some modules might have [preserveModuleName] already set, see ConventionDependenciesPlugin.
6565
let value = m[exports.preserveModuleName];
@@ -73,6 +73,29 @@ function getPreservedModules(modules) {
7373
m[exports.preserveModuleName] = req;
7474
return true;
7575
}
76+
// Since its relative, link it with the module alias if possible
77+
const reasonRequest = r.module && r.module.rawRequest;
78+
const moduleDependency = r.dependency && r.dependency.module;
79+
const moduleRequest = moduleDependency && removeLoaders(moduleDependency.request);
80+
if (req && aliases && reasonRequest && moduleRequest) {
81+
const aliasMatches = Object.keys(aliases).filter((alias) => {
82+
const aliasPath = aliases[alias];
83+
const matchPath = !!(moduleRequest.match(new RegExp(`^${aliasPath}`)));
84+
const matchKey = !!(reasonRequest.match(new RegExp(`^${alias}`)));
85+
// We want to match against the alias file path AND the path that is being requested
86+
// This allows us to use relative files inside aliased files
87+
return (matchPath && matchKey);
88+
});
89+
// Invalid?
90+
if (aliasMatches.length > 1) {
91+
throw new Error(`Incorrect alias usage. "${reasonRequest}" is duplicated in ${aliasMatches}`);
92+
}
93+
else if (aliasMatches.length === 1) {
94+
const aliasKey = aliasMatches[0];
95+
m[exports.preserveModuleName] = moduleRequest.replace(aliases[aliasKey], aliasKey);
96+
return true;
97+
}
98+
}
7699
}
77100
return !!value;
78101
}));

src/PreserveModuleNamePlugin.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class PreserveModuleNamePlugin {
2828
modulesBeforeConcat.splice(i--, 1, ...m["modules"]);
2929
}
3030

31-
for (let module of getPreservedModules(modules)) {
31+
for (let module of getPreservedModules(modules, alias)) {
3232
// Even though it's imported by Aurelia, it's still possible that the module
3333
// became the _root_ of a ConcatenatedModule.
3434
// We use `constructor.name` rather than `instanceof` for compat. with Webpack 2.
@@ -66,7 +66,7 @@ export class PreserveModuleNamePlugin {
6666
}
6767
};
6868

69-
function getPreservedModules(modules: Webpack.Module[]) {
69+
function getPreservedModules(modules: Webpack.Module[], aliases: {[key: string]: string } | null) {
7070
return new Set(
7171
modules.filter(m => {
7272
// Some modules might have [preserveModuleName] already set, see ConventionDependenciesPlugin.
@@ -80,6 +80,32 @@ function getPreservedModules(modules: Webpack.Module[]) {
8080
m[preserveModuleName] = req;
8181
return true;
8282
}
83+
84+
// Since its relative, link it with the module alias if possible
85+
const reasonRequest: string | null | undefined = r.module && r.module.rawRequest;
86+
const moduleDependency: ModuleDependency | null = r.dependency && (r.dependency.module as any);
87+
const moduleRequest: string | null | undefined = moduleDependency && removeLoaders(moduleDependency.request);
88+
if (req && aliases && reasonRequest && moduleRequest) {
89+
const aliasMatches: string[] = Object.keys(aliases).filter((alias: string): boolean => {
90+
const aliasPath = aliases[alias];
91+
const matchPath = !!(moduleRequest.match(new RegExp(`^${aliasPath}`)));
92+
const matchKey = !!(reasonRequest.match(new RegExp(`^${alias}`)));
93+
94+
// We want to match against the alias file path AND the path that is being requested
95+
// This allows us to use relative files inside aliased files
96+
return (matchPath && matchKey);
97+
});
98+
99+
// Invalid?
100+
if (aliasMatches.length > 1) {
101+
throw new Error(`Incorrect alias usage. "${reasonRequest}" is duplicated in ${aliasMatches}`);
102+
}
103+
else if (aliasMatches.length === 1) {
104+
const aliasKey: string = aliasMatches[0];
105+
m[exports.preserveModuleName] = moduleRequest.replace(aliases[aliasKey], aliasKey);
106+
return true;
107+
}
108+
}
83109
}
84110
return !!value;
85111
})

0 commit comments

Comments
 (0)