Skip to content

Commit 88ceebe

Browse files
feat: add wildcards support for aliases
2 parents 4fbcfa1 + 35b67ce commit 88ceebe

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

lib/AliasPlugin.js

+35-6
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,24 @@ module.exports = class AliasPlugin {
5858
.tapAsync("AliasPlugin", (request, resolveContext, callback) => {
5959
const innerRequest = request.request || request.path;
6060
if (!innerRequest) return callback();
61+
6162
forEachBail(
6263
this.options,
6364
(item, callback) => {
6465
/** @type {boolean} */
6566
let shouldStop = false;
66-
if (
67+
68+
const matchRequest =
6769
innerRequest === item.name ||
6870
(!item.onlyModule &&
6971
(request.request
7072
? innerRequest.startsWith(`${item.name}/`)
71-
: isSubPath(innerRequest, item.name)))
72-
) {
73-
/** @type {string} */
74-
const remainingRequest = innerRequest.slice(item.name.length);
73+
: isSubPath(innerRequest, item.name)));
74+
75+
const splitName = item.name.split("*");
76+
const matchWildcard = !item.onlyModule && splitName.length === 2;
77+
78+
if (matchRequest || matchWildcard) {
7579
/**
7680
* @param {Alias} alias alias
7781
* @param {(err?: null|Error, result?: null|ResolveRequest) => void} callback callback
@@ -90,12 +94,34 @@ module.exports = class AliasPlugin {
9094
}
9195
return callback(null, ignoreObj);
9296
}
97+
98+
let newRequestStr;
99+
100+
const [prefix, suffix] = splitName;
101+
if (
102+
matchWildcard &&
103+
innerRequest.startsWith(prefix) &&
104+
innerRequest.endsWith(suffix)
105+
) {
106+
const match = innerRequest.slice(
107+
prefix.length,
108+
innerRequest.length - suffix.length
109+
);
110+
newRequestStr = item.alias.toString().replace("*", match);
111+
}
112+
93113
if (
114+
matchRequest &&
94115
innerRequest !== alias &&
95116
!innerRequest.startsWith(alias + "/")
96117
) {
118+
/** @type {string} */
119+
const remainingRequest = innerRequest.slice(item.name.length);
120+
newRequestStr = alias + remainingRequest;
121+
}
122+
123+
if (newRequestStr !== undefined) {
97124
shouldStop = true;
98-
const newRequestStr = alias + remainingRequest;
99125
/** @type {ResolveRequest} */
100126
const obj = {
101127
...request,
@@ -122,6 +148,7 @@ module.exports = class AliasPlugin {
122148
}
123149
return callback();
124150
};
151+
125152
/**
126153
* @param {null|Error} [err] error
127154
* @param {null|ResolveRequest} [result] result
@@ -135,6 +162,7 @@ module.exports = class AliasPlugin {
135162
if (shouldStop) return callback(null, null);
136163
return callback();
137164
};
165+
138166
if (Array.isArray(item.alias)) {
139167
return forEachBail(
140168
item.alias,
@@ -145,6 +173,7 @@ module.exports = class AliasPlugin {
145173
return resolveWithAlias(item.alias, stoppingCallback);
146174
}
147175
}
176+
148177
return callback();
149178
},
150179
callback

test/alias.test.js

+13
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ describe("alias", () => {
4040
// alias configuration should work
4141
"#": "/c/dir",
4242
"@": "/c/dir",
43+
"@*": "/*",
44+
"@e*": "/e/*",
45+
"@e*file": "/e*file",
4346
ignored: false
4447
},
4548
modules: "/",
@@ -73,6 +76,16 @@ describe("alias", () => {
7376
expect(resolver.resolveSync({}, "/", "@")).toEqual("/c/dir/index");
7477
expect(resolver.resolveSync({}, "/", "@/index")).toEqual("/c/dir/index");
7578
});
79+
80+
it("should resolve wildcard alias", () => {
81+
expect(resolver.resolveSync({}, "/", "@a")).toEqual("/a/index");
82+
expect(resolver.resolveSync({}, "/", "@a/dir")).toEqual("/a/dir/index");
83+
expect(resolver.resolveSync({}, "/", "@e/dir/file")).toEqual("/e/dir/file");
84+
expect(resolver.resolveSync({}, "/", "@e/anotherDir")).toEqual(
85+
"/e/anotherDir/index"
86+
);
87+
expect(resolver.resolveSync({}, "/", "@e/dir/file")).toEqual("/e/dir/file");
88+
});
7689
it("should resolve an ignore module", () => {
7790
expect(resolver.resolveSync({}, "/", "ignored")).toEqual(false);
7891
});

0 commit comments

Comments
 (0)