Skip to content

Commit efa3fc0

Browse files
committed
added resourceQuery condition
added function use to schema
1 parent e3865e0 commit efa3fc0

14 files changed

Lines changed: 123 additions & 10 deletions

File tree

lib/NormalModuleFactory.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,16 @@ function NormalModuleFactory(context, resolvers, options) {
127127
var userRequest = loaders.map(loaderToIdent).concat([resource]).join("!");
128128

129129
var resourcePath = resource;
130+
var resourceQuery = "";
130131
var queryIndex = resourcePath.indexOf("?");
131-
if(queryIndex >= 0)
132+
if(queryIndex >= 0) {
133+
resourceQuery = resourcePath.substr(queryIndex);
132134
resourcePath = resourcePath.substr(0, queryIndex);
135+
}
133136

134137
var result = _this.ruleSet.exec({
135138
resource: resourcePath,
139+
resourceQuery: resourceQuery,
136140
issuer: contextInfo.issuer
137141
});
138142
var settings = {};

lib/RuleSet.js

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,8 @@
1515
test: <condition>, -> resource.test
1616
include: <condition>, -> resource.include
1717
exclude: <condition>, -> resource.exclude
18-
issuer: {
19-
test: <condition>,
20-
include: <condition>,
21-
exclude: <condition>,
22-
},
23-
issuer: <condition>, -> issuer.test
18+
resourceQuery: <condition>,
19+
issuer: <condition>,
2420
use: "loader", -> use[0].loader
2521
loader: <>, -> use[0].loader
2622
loaders: <>, -> use
@@ -58,6 +54,7 @@ normalized:
5854
5955
{
6056
resource: function(),
57+
resourceQuery: function(),
6158
issuer: function(),
6259
use: [
6360
{
@@ -131,6 +128,14 @@ RuleSet.normalizeRule = function(rule) {
131128
}
132129
}
133130

131+
if(rule.resourceQuery) {
132+
try {
133+
newRule.resourceQuery = RuleSet.normalizeCondition(rule.resourceQuery);
134+
} catch(error) {
135+
throw new Error(RuleSet.buildErrorMessage(rule.resourceQuery, error));
136+
}
137+
}
138+
134139
if(rule.issuer) {
135140
try {
136141
newRule.issuer = RuleSet.normalizeCondition(rule.issuer);
@@ -172,7 +177,7 @@ RuleSet.normalizeRule = function(rule) {
172177
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf);
173178

174179
var keys = Object.keys(rule).filter(function(key) {
175-
return ["resource", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
180+
return ["resource", "resourceQuery", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
176181
});
177182
keys.forEach(function(key) {
178183
newRule[key] = rule[key];
@@ -344,16 +349,20 @@ RuleSet.prototype._run = function _run(data, rule, result) {
344349
// test conditions
345350
if(rule.resource && !data.resource)
346351
return false;
352+
if(rule.resourceQuery && !data.resourceQuery)
353+
return false;
347354
if(rule.issuer && !data.issuer)
348355
return false;
349356
if(rule.resource && !rule.resource(data.resource))
350357
return false;
351358
if(data.issuer && rule.issuer && !rule.issuer(data.issuer))
352359
return false;
360+
if(data.resourceQuery && rule.resourceQuery && !rule.resourceQuery(data.resourceQuery))
361+
return false;
353362

354363
// apply
355364
var keys = Object.keys(rule).filter(function(key) {
356-
return ["resource", "issuer", "rules", "oneOf", "use", "enforce"].indexOf(key) < 0;
365+
return ["resource", "resourceQuery", "issuer", "rules", "oneOf", "use", "enforce"].indexOf(key) < 0;
357366
});
358367
keys.forEach(function(key) {
359368
result.push({

schemas/webpackOptionsSchema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,9 @@
567567
"resource": {
568568
"$ref": "#/definitions/ruleSet-condition"
569569
},
570+
"resourceQuery": {
571+
"$ref": "#/definitions/ruleSet-condition"
572+
},
570573
"rules": {
571574
"$ref": "#/definitions/ruleSet-rules"
572575
},
@@ -590,6 +593,9 @@
590593
{
591594
"$ref": "#/definitions/ruleSet-use-item"
592595
},
596+
{
597+
"instanceof": "Function"
598+
},
593599
{
594600
"items": {
595601
"$ref": "#/definitions/ruleSet-use-item"

test/Validation.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ describe("Validation", function() {
9393
},
9494
message: [
9595
" - configuration.module.rules[0].oneOf[0] has an unknown property 'paser'. These properties are valid:",
96-
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, query?, resource?, rules?, test?, use? }"
96+
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, query?, resource?, resourceQuery?, rules?, test?, use? }"
9797
]
9898
}, {
9999
name: "additional key on root",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = ["a"];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = ["b"];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require("./a" + __resourceQuery);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
it("should match a custom loader", function() {
2+
var a = require("./a");
3+
a.should.be.eql([
4+
"a",
5+
{
6+
issuer: "index.js",
7+
resource: "a.js",
8+
resourceQuery: ""
9+
}
10+
]);
11+
var b = require("./b?hello");
12+
b.should.be.eql([
13+
"b",
14+
{
15+
issuer: "index.js",
16+
resource: "b.js",
17+
resourceQuery: "?hello"
18+
}
19+
]);
20+
var ca = require("./call-a?hello");
21+
ca.should.be.eql([
22+
"a",
23+
{
24+
issuer: "call-a.js",
25+
resource: "a.js",
26+
resourceQuery: "?hello"
27+
},
28+
{
29+
issuer: "index.js",
30+
resource: "call-a.js",
31+
resourceQuery: "?hello"
32+
}
33+
]);
34+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = function(source) {
2+
var query = this.query;
3+
if(typeof query === "object" && typeof query.get === "function") {
4+
query = query.get();
5+
}
6+
return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");";
7+
};
8+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module.exports = {
2+
module: {
3+
rules: [
4+
{
5+
test: /[ab]\.js$/,
6+
use: function(data) {
7+
return {
8+
loader: "./loader",
9+
options: {
10+
resource: data.resource.replace(/^.*[\\\/]/g, ""),
11+
resourceQuery: data.resourceQuery,
12+
issuer: data.issuer.replace(/^.*[\\\/]/g, ""),
13+
}
14+
}
15+
}
16+
}
17+
]
18+
}
19+
}

0 commit comments

Comments
 (0)