Skip to content

Commit 106995e

Browse files
authored
Merge pull request webpack#3445 from webpack/feature/include_loader_alias_query
feature(alias): allow loader query to be used for aliased loader
2 parents 6758a30 + adb1a1b commit 106995e

9 files changed

Lines changed: 97 additions & 15 deletions

File tree

lib/NormalModuleFactory.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ function loaderToIdent(data) {
2222
return data.loader + "?" + JSON.stringify(data.options);
2323
}
2424

25+
function identToLoaderRequest(resultString) {
26+
var idx = resultString.indexOf("?");
27+
var options;
28+
29+
if(idx >= 0) {
30+
options = resultString.substr(idx + 1);
31+
resultString = resultString.substr(0, idx);
32+
33+
return {
34+
loader: resultString,
35+
options: options
36+
};
37+
} else {
38+
return {
39+
loader: resultString
40+
}
41+
}
42+
}
43+
2544
function NormalModuleFactory(context, resolvers, options) {
2645
Tapable.call(this);
2746
this.resolvers = resolvers;
@@ -88,18 +107,7 @@ function NormalModuleFactory(context, resolvers, options) {
88107
var noPostAutoLoaders = /^-!/.test(request);
89108
var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!");
90109
var resource = elements.pop();
91-
elements = elements.map(function(element) {
92-
var idx = element.indexOf("?");
93-
var options;
94-
if(idx >= 0) {
95-
options = element.substr(idx + 1);
96-
element = element.substr(0, idx);
97-
}
98-
return {
99-
loader: element,
100-
options: options
101-
};
102-
});
110+
elements = elements.map(identToLoaderRequest);
103111

104112
async.parallel([
105113
function(callback) {
@@ -239,9 +247,11 @@ NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray
239247
});
240248
}
241249
if(err) return callback(err);
242-
return callback(null, objectAssign({}, item, {
243-
loader: result
244-
}));
250+
251+
var optionsOnly = item.options ? {
252+
options: item.options
253+
} : undefined;
254+
return callback(null, objectAssign({}, item, identToLoaderRequest(result), optionsOnly));
245255
});
246256
}, callback);
247257
};

test/ConfigTestCases.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var webpack = require("../lib/webpack");
1111
describe("ConfigTestCases", function() {
1212
var casesPath = path.join(__dirname, "configCases");
1313
var categories = fs.readdirSync(casesPath);
14+
1415
categories = categories.map(function(cat) {
1516
return {
1617
name: cat,

test/configCases/loaders/issue-3320/a.js

Whitespace-only changes.

test/configCases/loaders/issue-3320/b.js

Whitespace-only changes.

test/configCases/loaders/issue-3320/b2.js

Whitespace-only changes.

test/configCases/loaders/issue-3320/b3.js

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
it("should resolve aliased loader module with query", function() {
2+
var foo = require('./a');
3+
4+
foo.should.be.eql("someMessage");
5+
});
6+
7+
it("should favor explicit loader query over aliased query (options in rule)", function() {
8+
var foo = require('./b');
9+
10+
foo.should.be.eql("someOtherMessage");
11+
});
12+
13+
it("should favor explicit loader query over aliased query (inline query in rule)", function() {
14+
var foo = require('./b2');
15+
16+
foo.should.be.eql("someOtherMessage");
17+
});
18+
19+
it("should favor explicit loader query over aliased query (inline query in rule.use)", function() {
20+
var foo = require('./b3');
21+
22+
foo.should.be.eql("someOtherMessage");
23+
});

test/configCases/loaders/issue-3320/node_modules/any-loader.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module.exports = {
2+
resolveLoader: {
3+
alias: {
4+
"some-loader": 'any-loader?foo=someMessage'
5+
}
6+
},
7+
module: {
8+
rules: [
9+
{
10+
test: /a\.js$/,
11+
use: [
12+
{
13+
loader: "some-loader"
14+
}
15+
]
16+
},
17+
{
18+
test: /b\.js$/,
19+
use: [
20+
{
21+
loader: 'some-loader',
22+
options: {
23+
foo: "someOtherMessage"
24+
}
25+
}
26+
]
27+
},
28+
{
29+
test: /b2\.js$/,
30+
loader: 'some-loader?foo=someOtherMessage'
31+
},
32+
{
33+
test: /b3\.js$/,
34+
use: [
35+
'some-loader?foo=someOtherMessage'
36+
]
37+
}
38+
]
39+
}
40+
}

0 commit comments

Comments
 (0)