Skip to content

Commit 594f639

Browse files
committed
allow to pass functions to rules.use and return arrays
1 parent 122e7dc commit 594f639

File tree

8 files changed

+101
-18
lines changed

8 files changed

+101
-18
lines changed

lib/RuleSet.js

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ module.exports = class RuleSet {
228228
}
229229

230230
static normalizeUse(use, ident) {
231+
if(typeof use === "function") {
232+
return data => RuleSet.normalizeUse(use(data), ident);
233+
}
231234
if(Array.isArray(use)) {
232235
return use
233236
.map((item, idx) => RuleSet.normalizeUse(item, `${ident}-${idx}`))
@@ -236,14 +239,6 @@ module.exports = class RuleSet {
236239
return [RuleSet.normalizeUseItem(use, ident)];
237240
}
238241

239-
static normalizeUseItemFunction(use, data) {
240-
const result = use(data);
241-
if(typeof result === "string") {
242-
return RuleSet.normalizeUseItem(result);
243-
}
244-
return result;
245-
}
246-
247242
static normalizeUseItemString(useItemString) {
248243
const idx = useItemString.indexOf("?");
249244
if(idx >= 0) {
@@ -258,9 +253,6 @@ module.exports = class RuleSet {
258253
}
259254

260255
static normalizeUseItem(item, ident) {
261-
if(typeof item === "function")
262-
return item;
263-
264256
if(typeof item === "string") {
265257
return RuleSet.normalizeUseItemString(item);
266258
}
@@ -385,13 +377,20 @@ module.exports = class RuleSet {
385377
});
386378

387379
if(rule.use) {
388-
rule.use.forEach((use) => {
389-
result.push({
390-
type: "use",
391-
value: typeof use === "function" ? RuleSet.normalizeUseItemFunction(use, data) : use,
392-
enforce: rule.enforce
393-
});
394-
});
380+
const process = use => {
381+
if(typeof use === "function") {
382+
process(use(data));
383+
} else if(Array.isArray(use)) {
384+
use.forEach(process);
385+
} else {
386+
result.push({
387+
type: "use",
388+
value: use,
389+
enforce: rule.enforce
390+
});
391+
}
392+
};
393+
process(rule.use);
395394
}
396395

397396
if(rule.rules) {
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 = ["ab"];
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module.exports = [require("./a")];
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// never used
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
it("should match only one rule in a oneOf block", function() {
2+
var ab = require("./ab");
3+
ab.should.be.eql([
4+
"ab",
5+
"?first"
6+
]);
7+
});
8+
it("should match with issuer and any option value", function() {
9+
var a = require("./a");
10+
var b = require("./b");
11+
a.should.be.eql([
12+
"a",
13+
"?third",
14+
]);
15+
b.should.be.eql([[
16+
"a",
17+
"second-3",
18+
"?second-2",
19+
"?second-1",
20+
]]);
21+
});
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: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
module.exports = {
2+
module: {
3+
rules: [
4+
{ oneOf: [
5+
{
6+
test: {
7+
and: [
8+
/a.\.js$/,
9+
/b\.js$/
10+
]
11+
},
12+
loader: "./loader?first"
13+
},
14+
{
15+
test: [
16+
require.resolve("./a"),
17+
require.resolve("./c"),
18+
],
19+
issuer: require.resolve("./b"),
20+
use: data => ([
21+
"./loader?second-1",
22+
{
23+
loader: "./loader",
24+
options: "second-2"
25+
},
26+
{
27+
loader: "./loader",
28+
options: {
29+
get: function() {
30+
return "second-3";
31+
}
32+
}
33+
}
34+
])
35+
},
36+
{
37+
test: {
38+
or: [
39+
require.resolve("./a"),
40+
require.resolve("./c"),
41+
]
42+
},
43+
loader: "./loader",
44+
options: "third"
45+
}
46+
] }
47+
]
48+
}
49+
};
50+

0 commit comments

Comments
 (0)