Skip to content

Commit 96aa6b2

Browse files
committed
Fix, predicates run against condition arrays and the elements
1 parent 029798e commit 96aa6b2

File tree

4 files changed

+42
-23
lines changed

4 files changed

+42
-23
lines changed

src/checkField.js

+27-21
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,38 @@ import { isObject } from "./utils";
33

44
import { OR, AND, NOT } from "./constants";
55

6-
export default function checkField(fieldVal, rule) {
7-
if (Array.isArray(fieldVal)) {
8-
// Simple rule - like emptyString
9-
return fieldVal.some(val => checkField(val, rule));
10-
} else if (isObject(rule)) {
11-
// Complicated rule - like { greater then 10 }
12-
return Object.keys(rule).every(p => {
13-
let subRule = rule[p];
14-
if (p === OR || p === AND) {
15-
if (Array.isArray(subRule)) {
16-
if (p === OR) {
17-
return subRule.some(rule => checkField(fieldVal, rule));
18-
} else {
19-
return subRule.every(rule => checkField(fieldVal, rule));
20-
}
6+
const parseObjectRule = (rule, fieldVal) => {
7+
return Object.keys(rule).every(p => {
8+
let subRule = rule[p];
9+
if (p === OR || p === AND) {
10+
if (Array.isArray(subRule)) {
11+
if (p === OR) {
12+
return subRule.some(rule => checkField(fieldVal, rule));
2113
} else {
22-
return false;
14+
return subRule.every(rule => checkField(fieldVal, rule));
2315
}
24-
} else if (p === NOT) {
25-
return !checkField(fieldVal, subRule);
26-
} else if (predicate[p]) {
27-
return predicate[p](fieldVal, subRule);
2816
} else {
2917
return false;
3018
}
31-
});
19+
} else if (p === NOT) {
20+
return !checkField(fieldVal, subRule);
21+
} else if (predicate[p]) {
22+
return predicate[p](fieldVal, subRule);
23+
} else {
24+
return false;
25+
}
26+
});
27+
};
28+
29+
export default function checkField(fieldVal, rule) {
30+
if (Array.isArray(fieldVal)) {
31+
return isObject(rule)
32+
? fieldVal.some(val => checkField(val, rule)) || parseObjectRule(rule)
33+
: fieldVal.some(val => checkField(val, rule)) ||
34+
predicate[rule](fieldVal);
35+
} else if (isObject(rule)) {
36+
// Complicated rule - like { greater then 10 }
37+
return parseObjectRule(rule, fieldVal);
3238
} else {
3339
return predicate[rule](fieldVal);
3440
}

src/conditionsMeet.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ export default function conditionsMeet(conditions, formData) {
2020
} else {
2121
let refVal = selectn(ref, formData);
2222
if (Array.isArray(refVal)) {
23-
return refVal.some(val => conditionsMeet(refCondition, val));
23+
return (
24+
refVal.some(val => conditionsMeet(refCondition, val)) ||
25+
checkField(refVal, refCondition)
26+
);
2427
} else {
2528
return checkField(refVal, refCondition);
2629
}

test/checkField.test.js

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ test("invalid rule", () => {
7777
});
7878

7979
test("check array", () => {
80+
expect(checkField([], "empty")).toBeTruthy();
81+
expect(checkField([""], "empty")).toBeTruthy();
8082
expect(checkField([1, 2, 3, 4], { less: 50, greater: 5 })).toBeFalsy();
8183
expect(checkField([1, 2, 3, 4, 5, 6], { less: 50, greater: 5 })).toBeTruthy();
8284

test/conditionsMeet.test.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,19 @@ test("sanity checkField", function() {
55
expect(() => conditionsMeet({}, 0)).toThrow();
66
});
77

8+
test("run predicate against array and contents", () => {
9+
let condition = {
10+
options: "empty",
11+
};
12+
expect(conditionsMeet(condition, [""])).toBeTruthy();
13+
expect(conditionsMeet(condition, [])).toBeTruthy();
14+
});
15+
816
test("single line", () => {
917
let condition = {
1018
firstName: "empty",
1119
};
12-
expect(conditionsMeet(condition, {})).toBeTruthy();
20+
expect(conditionsMeet(condition, [])).toBeTruthy();
1321
expect(conditionsMeet(condition, { firstName: "some" })).toBeFalsy();
1422
expect(conditionsMeet(condition, { firstName: "" })).toBeTruthy();
1523
expect(conditionsMeet(condition, { firstName: undefined })).toBeTruthy();

0 commit comments

Comments
 (0)