@@ -8,6 +8,18 @@ import {
8
8
} from "./utils" ;
9
9
import { OR , AND , NOT } from "./constants" ;
10
10
11
+ const UNSUPPORTED_PREDICATES = [
12
+ "and" ,
13
+ "or" ,
14
+ "ternary" ,
15
+ "every" ,
16
+ "some" ,
17
+ "curry" ,
18
+ "partial" ,
19
+ "complement" ,
20
+ "mod" ,
21
+ ] ;
22
+
11
23
export function predicatesFromRule ( rule , schema ) {
12
24
if ( isObject ( rule ) ) {
13
25
return flatMap ( Object . keys ( rule ) , p => {
@@ -80,18 +92,6 @@ export function listAllPredicates(conditions, schema) {
80
92
return allPredicates . filter ( ( v , i , a ) => allPredicates . indexOf ( v ) === i ) ;
81
93
}
82
94
83
- const UNSUPPORTED_PREDICATES = [
84
- "and" ,
85
- "or" ,
86
- "ternary" ,
87
- "every" ,
88
- "some" ,
89
- "curry" ,
90
- "partial" ,
91
- "complement" ,
92
- "mod" ,
93
- ] ;
94
-
95
95
export function listInvalidPredicates ( conditions , schema ) {
96
96
let refPredicates = listAllPredicates ( conditions , schema ) ;
97
97
return refPredicates . filter (
@@ -106,30 +106,44 @@ export function validatePredicates(conditions, schema) {
106
106
}
107
107
}
108
108
109
+ export function fieldsFromPredicates ( predicate ) {
110
+ if ( Array . isArray ( predicate ) ) {
111
+ return flatMap ( predicate , fieldsFromPredicates ) ;
112
+ } else if ( isObject ( predicate ) ) {
113
+ return flatMap ( Object . keys ( predicate ) , field => {
114
+ let predicateValue = predicate [ field ] ;
115
+ return fieldsFromPredicates ( predicateValue ) ;
116
+ } ) ;
117
+ } else if ( typeof predicate === "string" && predicate . startsWith ( "$" ) ) {
118
+ return [ predicate . substr ( 1 ) ] ;
119
+ } else {
120
+ return [ ] ;
121
+ }
122
+ }
123
+
109
124
export function fieldsFromCondition ( condition ) {
110
125
return flatMap ( Object . keys ( condition ) , ref => {
126
+ let refCondition = condition [ ref ] ;
111
127
if ( ref === OR || ref === AND ) {
112
- return flatMap ( condition [ ref ] , w => fieldsFromCondition ( w ) ) ;
128
+ return flatMap ( refCondition , fieldsFromCondition ) ;
113
129
} else if ( ref === NOT ) {
114
- return fieldsFromCondition ( condition [ ref ] ) ;
115
- } else if ( ref . indexOf ( "." ) === - 1 ) {
116
- return [ ref ] ;
130
+ return fieldsFromCondition ( refCondition ) ;
117
131
} else {
118
- return [ ] ;
132
+ return [ ref ] . concat ( fieldsFromPredicates ( refCondition ) ) ;
119
133
}
120
134
} ) ;
121
135
}
122
136
123
137
export function listAllFields ( conditions ) {
124
- let allFields = flatMap ( conditions , condition =>
125
- fieldsFromCondition ( condition )
126
- ) ;
127
- return allFields . filter ( ( v , i , a ) => allFields . indexOf ( v ) === i ) ;
138
+ let allFields = flatMap ( conditions , fieldsFromCondition ) ;
139
+ return allFields
140
+ . filter ( field => field . indexOf ( "." ) === - 1 )
141
+ . filter ( ( v , i , a ) => allFields . indexOf ( v ) === i ) ;
128
142
}
129
143
130
144
export function listInvalidFields ( conditions , schema ) {
131
- let ruleFields = listAllFields ( conditions ) ;
132
- return ruleFields . filter ( field => schema . properties [ field ] === undefined ) ;
145
+ let allFields = listAllFields ( conditions ) ;
146
+ return allFields . filter ( field => schema . properties [ field ] === undefined ) ;
133
147
}
134
148
135
149
export function validateConditionFields ( conditions , schema ) {
0 commit comments