@pega/cosmos-react-condition-builder 4.0.1 → 5.0.0-dev.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { Condition, Field } from '../ConditionBuilder.types';
|
|
2
|
+
type EvaluatorData = string | number | boolean | bigint | null | undefined | Date | EvaluateDataObj | EvaluatorData[];
|
|
3
|
+
type EvaluateDataObj = {
|
|
4
|
+
[key: string]: EvaluatorData;
|
|
5
|
+
};
|
|
2
6
|
/**
|
|
3
7
|
* Evaluates a condition tree for the given data document
|
|
4
8
|
* NOTE: The output is nondeterministic if:
|
|
@@ -8,7 +12,6 @@ import { Condition, Field } from '../ConditionBuilder.types';
|
|
|
8
12
|
* - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields
|
|
9
13
|
* - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`
|
|
10
14
|
*/
|
|
11
|
-
export default function evaluateCondition(condition: Condition, data:
|
|
12
|
-
|
|
13
|
-
}, fields: Field[]): boolean;
|
|
15
|
+
export default function evaluateCondition(condition: Condition, data: EvaluateDataObj, fields: Field[], delimiter?: string): boolean;
|
|
16
|
+
export {};
|
|
14
17
|
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAuB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAuB,MAAM,2BAA2B,CAAC;AAMjG,KAAK,aAAa,GACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,SAAS,GACT,IAAI,GACJ,eAAe,GACf,aAAa,EAAE,CAAC;AACpB,KAAK,eAAe,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AA8UxD;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACvC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAoBT"}
|
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
// cspell:words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH
|
|
2
|
-
import { hasProp } from '@pega/cosmos-react-core';
|
|
2
|
+
import { deepGet, hasProp } from '@pega/cosmos-react-core';
|
|
3
3
|
import { getItem } from './utils';
|
|
4
4
|
import transformComplexCondition from './transformer';
|
|
5
|
+
const isStringArray = (value) => {
|
|
6
|
+
if (!Array.isArray(value))
|
|
7
|
+
return false;
|
|
8
|
+
return value.every(item => typeof item === 'string');
|
|
9
|
+
};
|
|
10
|
+
const isNumberArray = (value) => {
|
|
11
|
+
if (!Array.isArray(value))
|
|
12
|
+
return false;
|
|
13
|
+
return value.every(item => typeof item === 'number');
|
|
14
|
+
};
|
|
15
|
+
const isDateInputParam = (value) => {
|
|
16
|
+
return typeof value === 'string' || typeof value === 'number' || value instanceof Date;
|
|
17
|
+
};
|
|
5
18
|
const QUOTE = '"';
|
|
6
19
|
/** Evaluates leaf conditions with BOOLEAN fields */
|
|
7
20
|
function evaluateBoolCondition(lhsValue, comparator, rhsValue // undefined for IS_TRUE/IS_FALSE comparators
|
|
@@ -99,6 +112,13 @@ function getDateParts(date) {
|
|
|
99
112
|
ss: date.getSeconds().toString().padStart(2, '0')
|
|
100
113
|
};
|
|
101
114
|
}
|
|
115
|
+
/** Returns the value of a given field from data obj */
|
|
116
|
+
function resolveValueFromData(path, data, delimiter) {
|
|
117
|
+
if (!delimiter || !path.includes(delimiter)) {
|
|
118
|
+
return data[path];
|
|
119
|
+
}
|
|
120
|
+
return deepGet(data, path.split(delimiter));
|
|
121
|
+
}
|
|
102
122
|
/** Evaluates leaf conditions with Date-functions */
|
|
103
123
|
function evaluateDateFuncCondition(lhsValue, fieldType, comparator, rhs) {
|
|
104
124
|
if (fieldType === 'DATE_ONLY')
|
|
@@ -177,16 +197,16 @@ function evaluateDateFuncCondition(lhsValue, fieldType, comparator, rhs) {
|
|
|
177
197
|
return evaluateNumericCondition(lhsNumVal, comparator, rhsNumVal);
|
|
178
198
|
}
|
|
179
199
|
/** Evaluates a leaf node in a condition tree for the given data document */
|
|
180
|
-
function evaluateLeafCondition(leaf, data, fields) {
|
|
200
|
+
function evaluateLeafCondition(leaf, data, fields, delimiter) {
|
|
181
201
|
// For safety against any malformed nodes or unexpected types/formats in data-values
|
|
182
202
|
try {
|
|
183
203
|
const { lhs, comparator, rhs } = leaf;
|
|
184
204
|
// Determine LHS and RHS values
|
|
185
|
-
const lhsValue =
|
|
205
|
+
const lhsValue = resolveValueFromData(lhs.field, data, delimiter);
|
|
186
206
|
let rhsValue;
|
|
187
207
|
if (rhs) {
|
|
188
208
|
if (hasProp(rhs, 'field')) {
|
|
189
|
-
rhsValue =
|
|
209
|
+
rhsValue = resolveValueFromData(rhs.field, data, delimiter); // If RHS is another field
|
|
190
210
|
}
|
|
191
211
|
else if (hasProp(rhs, 'value')) {
|
|
192
212
|
rhsValue = rhs.value; // If RHS is a single value
|
|
@@ -195,7 +215,7 @@ function evaluateLeafCondition(leaf, data, fields) {
|
|
|
195
215
|
rhsValue = true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.
|
|
196
216
|
}
|
|
197
217
|
else if (hasProp(rhs, 'parameterId')) {
|
|
198
|
-
rhsValue =
|
|
218
|
+
rhsValue = resolveValueFromData(rhs.parameterId, data, delimiter); // If RHS is of type PARAMETER
|
|
199
219
|
}
|
|
200
220
|
else if (hasProp(rhs, 'values')) {
|
|
201
221
|
rhsValue = rhs.values; // If RHS is a list of values
|
|
@@ -219,24 +239,38 @@ function evaluateLeafCondition(leaf, data, fields) {
|
|
|
219
239
|
}
|
|
220
240
|
switch (field.type) {
|
|
221
241
|
case 'BOOLEAN':
|
|
222
|
-
return
|
|
242
|
+
return typeof lhsValue === 'boolean' &&
|
|
243
|
+
(rhsValue === undefined || typeof rhsValue === 'boolean')
|
|
244
|
+
? evaluateBoolCondition(lhsValue, comparator, rhsValue)
|
|
245
|
+
: false;
|
|
223
246
|
case 'TEXT':
|
|
224
|
-
return
|
|
247
|
+
return typeof lhsValue === 'string' &&
|
|
248
|
+
(typeof rhsValue === 'string' || isStringArray(rhsValue))
|
|
249
|
+
? evaluateTextCondition(lhsValue, comparator, rhsValue)
|
|
250
|
+
: false;
|
|
225
251
|
case 'NUMBER':
|
|
226
252
|
case 'TIME_ONLY':
|
|
227
|
-
return
|
|
253
|
+
return typeof lhsValue === 'number' &&
|
|
254
|
+
(typeof rhsValue === 'number' || isNumberArray(rhsValue))
|
|
255
|
+
? evaluateNumericCondition(lhsValue, comparator, rhsValue)
|
|
256
|
+
: false;
|
|
228
257
|
case 'DATE_TIME':
|
|
229
258
|
case 'DATE_ONLY': {
|
|
230
259
|
if (rhs && hasProp(rhs, 'dateFunction')) {
|
|
231
|
-
return
|
|
260
|
+
return typeof lhsValue === 'string'
|
|
261
|
+
? evaluateDateFuncCondition(lhsValue, field.type, comparator, rhs)
|
|
262
|
+
: false;
|
|
232
263
|
}
|
|
233
264
|
if (rhs && hasProp(rhs, 'relativeDate')) {
|
|
234
265
|
return true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.
|
|
235
266
|
}
|
|
236
267
|
// Both the values are expected to be in an ISO-8601 format
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
268
|
+
if (isDateInputParam(lhsValue) && isDateInputParam(rhsValue)) {
|
|
269
|
+
const lhsAsTicks = new Date(lhsValue).getTime();
|
|
270
|
+
const rhsAsTicks = new Date(rhsValue).getTime();
|
|
271
|
+
return evaluateNumericCondition(lhsAsTicks, comparator, rhsAsTicks);
|
|
272
|
+
}
|
|
273
|
+
return false;
|
|
240
274
|
}
|
|
241
275
|
default:
|
|
242
276
|
return false; // Not needed
|
|
@@ -255,23 +289,23 @@ function evaluateLeafCondition(leaf, data, fields) {
|
|
|
255
289
|
* - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields
|
|
256
290
|
* - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`
|
|
257
291
|
*/
|
|
258
|
-
export default function evaluateCondition(condition, data, fields) {
|
|
292
|
+
export default function evaluateCondition(condition, data, fields, delimiter) {
|
|
259
293
|
// For safety against any malformed trees
|
|
260
294
|
try {
|
|
261
295
|
// Update relative date conditions to be LT/GT date range conditions
|
|
262
296
|
const updatedCondition = transformComplexCondition(condition, fields);
|
|
263
297
|
if (hasProp(updatedCondition, 'AND')) {
|
|
264
298
|
// Return true if all the child nodes are true
|
|
265
|
-
return updatedCondition.AND.every(child => evaluateCondition(child, data, fields));
|
|
299
|
+
return updatedCondition.AND.every(child => evaluateCondition(child, data, fields, delimiter));
|
|
266
300
|
}
|
|
267
301
|
if (hasProp(updatedCondition, 'OR')) {
|
|
268
302
|
// Return true if any one of the child nodes is true
|
|
269
|
-
return updatedCondition.OR.some(child => evaluateCondition(child, data, fields));
|
|
303
|
+
return updatedCondition.OR.some(child => evaluateCondition(child, data, fields, delimiter));
|
|
270
304
|
}
|
|
271
305
|
if (hasProp(updatedCondition, 'NOT')) {
|
|
272
|
-
return !evaluateCondition(updatedCondition.NOT, data, fields);
|
|
306
|
+
return !evaluateCondition(updatedCondition.NOT, data, fields, delimiter);
|
|
273
307
|
}
|
|
274
|
-
return evaluateLeafCondition(updatedCondition.condition, data, fields);
|
|
308
|
+
return evaluateLeafCondition(updatedCondition.condition, data, fields, delimiter);
|
|
275
309
|
}
|
|
276
310
|
catch {
|
|
277
311
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field, RhsWithDateFunction } from '../ConditionBuilder.types';\n\nimport { getItem } from './utils';\nimport { Comparator, FieldType } from './types';\nimport transformComplexCondition from './transformer';\n\nconst QUOTE = '\"';\n/** Evaluates leaf conditions with BOOLEAN fields */\nfunction evaluateBoolCondition(\n lhsValue: boolean,\n comparator: Comparator,\n rhsValue?: boolean // undefined for IS_TRUE/IS_FALSE comparators\n): boolean {\n switch (comparator) {\n case 'IS_TRUE':\n return lhsValue === true;\n case 'IS_FALSE':\n return lhsValue === false;\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with TEXT fields */\nfunction evaluateTextCondition(\n lhsValue: string,\n comparator: Comparator,\n rhsValue: string | string[]\n): boolean {\n lhsValue = lhsValue.toLowerCase(); // Converting to lowerCase to perform case-insensitive comparisons\n\n // For IN/NOT_IN comparators, the rhsValue is of type `string[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs = rhsValue\n .map(v => {\n v = v.toLowerCase().trim();\n // Handle text in quotes\n if (v.startsWith(QUOTE) && v.endsWith(QUOTE)) {\n v = v.slice(1, -1);\n }\n return v;\n })\n .includes(lhsValue); // Converting to lowerCase to perform case-insensitive comparisons\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n // Converting to lowerCase to perform case-insensitive comparisons\n rhsValue = rhsValue.toLowerCase().trim();\n\n // Handle if rhs is in quotes\n if (rhsValue.startsWith(QUOTE) && rhsValue.endsWith(QUOTE)) {\n rhsValue = rhsValue.slice(1, -1);\n }\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'STARTS_WITH':\n return lhsValue.startsWith(rhsValue);\n case 'NOT_STARTS_WITH':\n return !lhsValue.startsWith(rhsValue);\n case 'ENDS_WITH':\n return lhsValue.endsWith(rhsValue);\n case 'NOT_ENDS_WITH':\n return !lhsValue.endsWith(rhsValue);\n case 'CONTAINS':\n return lhsValue.includes(rhsValue);\n case 'NOT_CONTAINS':\n return !lhsValue.includes(rhsValue);\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with NUMBER fields */\nfunction evaluateNumericCondition(\n lhsValue: number,\n comparator: Comparator,\n rhsValue: number | number[]\n): boolean {\n // For IN/NOT_IN comparators, the rhsValue is of type `number[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs: boolean = rhsValue.includes(lhsValue);\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'GT':\n return lhsValue > rhsValue;\n case 'GTE':\n return lhsValue >= rhsValue;\n case 'LT':\n return lhsValue < rhsValue;\n case 'LTE':\n return lhsValue <= rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Returns different date parts in local time from the given date object */\nfunction getDateParts(date: Date): {\n YYYY: string;\n QQ: string;\n MM: string;\n DD: string;\n HH: string;\n mm: string;\n ss: string;\n} {\n return {\n YYYY: date.getFullYear().toString().padStart(4, '0'),\n QQ: (3 * Math.floor(date.getMonth() / 3) + 1).toString().padStart(2, '0'), // MM value for the quarter's starting month\n MM: (date.getMonth() + 1).toString().padStart(2, '0'),\n DD: date.getDate().toString().padStart(2, '0'),\n HH: date.getHours().toString().padStart(2, '0'),\n mm: date.getMinutes().toString().padStart(2, '0'),\n ss: date.getSeconds().toString().padStart(2, '0')\n };\n}\n\n/** Evaluates leaf conditions with Date-functions */\nfunction evaluateDateFuncCondition(\n lhsValue: string,\n fieldType: FieldType,\n comparator: Comparator,\n rhs: RhsWithDateFunction\n): boolean {\n if (fieldType === 'DATE_ONLY') lhsValue += 'T00:00:00'; // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDateObj = new Date(lhsValue);\n const {\n YYYY: lhsYYYY,\n QQ: lhsQQ,\n MM: lhsMM,\n DD: lhsDD,\n HH: lhsHH,\n mm: lhsMinute,\n ss: lhsSecond\n } = getDateParts(lhsDateObj);\n\n // Determine a numeric representation of the values for the given date function\n let lhsNumVal = 0;\n let rhsNumVal = 0;\n switch (rhs.dateFunction) {\n case 'YEARS':\n // Using YYYY as a number\n lhsNumVal = Number(lhsYYYY);\n rhsNumVal = Number((rhs.value as string).slice(0, 4));\n break;\n case 'QUARTERS':\n // Using YYYYQQ as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsQQ}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'MONTHS':\n // Using YYYYMM as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'WEEKS': {\n // Identify the start of week for the given LHS\n const lhsDayStart = new Date(`${lhsYYYY}-${lhsMM}-${lhsDD}T00:00:00`); // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDay = lhsDayStart.getDay() || 7; // 'getDay()' returns 0 for Sundays\n const lhsWeekStart = new Date(lhsDayStart.getTime() - (lhsDay - 1) * 24 * 60 * 60 * 1000);\n const { YYYY: weekStartYYYY, MM: weekStartMM, DD: weekStartDD } = getDateParts(lhsWeekStart);\n\n // Using YYYYMMDD of the week-start-day as a number\n lhsNumVal = Number(`${weekStartYYYY}${weekStartMM}${weekStartDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n }\n case 'DAYS':\n // Using YYYYMMDD as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n case 'HOURS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T/g, '').slice(0, 10));\n break;\n case 'MINUTES':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}${lhsMinute}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T|:/g, '').slice(0, 12));\n break;\n case 'SECONDS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}${lhsMinute}${lhsSecond}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T|:/g, '').slice(0, 14));\n break;\n case 'HOURS_OF_DAY':\n lhsNumVal = Number(lhsHH);\n rhsNumVal = Number(rhs.value);\n break;\n case 'MONTHS_OF_YEAR':\n lhsNumVal = Number(lhsMM);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_MONTH':\n lhsNumVal = Number(lhsDD);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_WEEK':\n lhsNumVal = lhsDateObj.getDay() || 7; // 'getDay()' returns 0 for Sundays\n rhsNumVal = rhs.value as number;\n break;\n default: // Not needed\n }\n\n // Compare the numeric representations\n return evaluateNumericCondition(lhsNumVal, comparator, rhsNumVal);\n}\n\n/** Evaluates a leaf node in a condition tree for the given data document */\nfunction evaluateLeafCondition(\n leaf: LeafCondition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed nodes or unexpected types/formats in data-values\n try {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine LHS and RHS values\n const lhsValue: any = data[lhs.field];\n let rhsValue: any;\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n rhsValue = data[rhs.field]; // If RHS is another field\n } else if (hasProp(rhs, 'value')) {\n rhsValue = rhs.value; // If RHS is a single value\n } else if (hasProp(rhs, 'relativeDate')) {\n rhsValue = true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n } else if (hasProp(rhs, 'parameterId')) {\n rhsValue = data[rhs.parameterId]; // If RHS is of type PARAMETER\n } else if (hasProp(rhs, 'values')) {\n rhsValue = rhs.values; // If RHS is a list of values\n } else {\n rhsValue = { start: rhs.start, end: rhs.end }; // If RHS is a definition of range\n }\n }\n\n // Handle NULL comparators common to all field-types\n const isNullValue = lhsValue === null || lhsValue === undefined;\n if (comparator === 'IS_NULL') {\n return isNullValue;\n }\n if (comparator === 'IS_NOT_NULL') {\n return !isNullValue;\n }\n\n // For all other comparators, evaluate separately by field-type\n const field = getItem(fields, lhs.field);\n if (field === undefined || !hasProp(field, 'type')) {\n return false; // If the corresponding field is not found in the input fields\n }\n switch (field.type) {\n case 'BOOLEAN':\n return evaluateBoolCondition(lhsValue, comparator, rhsValue);\n case 'TEXT':\n return evaluateTextCondition(lhsValue, comparator, rhsValue);\n case 'NUMBER':\n case 'TIME_ONLY':\n return evaluateNumericCondition(lhsValue, comparator, rhsValue);\n case 'DATE_TIME':\n case 'DATE_ONLY': {\n if (rhs && hasProp(rhs, 'dateFunction')) {\n return evaluateDateFuncCondition(lhsValue, field.type, comparator, rhs);\n }\n\n if (rhs && hasProp(rhs, 'relativeDate')) {\n return true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n }\n\n // Both the values are expected to be in an ISO-8601 format\n const lhsAsTicks = new Date(lhsValue).getTime();\n const rhsAsTicks = new Date(rhsValue).getTime();\n return evaluateNumericCondition(lhsAsTicks, comparator, rhsAsTicks);\n }\n default:\n return false; // Not needed\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Evaluates a condition tree for the given data document\n * NOTE: The output is nondeterministic if:\n * - any of the nodes in the input Condition are in an unexpected format (invalid keys, comparators etc.)\n * - any null/undefined values are encountered in the input data, unless they are used with an IS_NULL/IS_NOT_NULL comparator\n * - stringified values are encountered for BOOLEAN/NUMBER fields\n * - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields\n * - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`\n */\nexport default function evaluateCondition(\n condition: Condition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed trees\n try {\n // Update relative date conditions to be LT/GT date range conditions\n const updatedCondition: Condition = transformComplexCondition(condition, fields);\n if (hasProp(updatedCondition, 'AND')) {\n // Return true if all the child nodes are true\n return updatedCondition.AND.every(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'OR')) {\n // Return true if any one of the child nodes is true\n return updatedCondition.OR.some(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'NOT')) {\n return !evaluateCondition(updatedCondition.NOT, data, fields);\n }\n return evaluateLeafCondition(updatedCondition.condition, data, fields);\n } catch {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH\nimport { deepGet, hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field, RhsWithDateFunction } from '../ConditionBuilder.types';\n\nimport { getItem } from './utils';\nimport { Comparator, FieldType } from './types';\nimport transformComplexCondition from './transformer';\n\ntype EvaluatorData =\n | string\n | number\n | boolean\n | bigint\n | null\n | undefined\n | Date\n | EvaluateDataObj\n | EvaluatorData[];\ntype EvaluateDataObj = { [key: string]: EvaluatorData };\n\nconst isStringArray = (value: EvaluatorData): value is string[] => {\n if (!Array.isArray(value)) return false;\n return value.every(item => typeof item === 'string');\n};\n\nconst isNumberArray = (value: EvaluatorData): value is number[] => {\n if (!Array.isArray(value)) return false;\n return value.every(item => typeof item === 'number');\n};\n\nconst isDateInputParam = (value: EvaluatorData): value is string | number | Date => {\n return typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n};\n\nconst QUOTE = '\"';\n/** Evaluates leaf conditions with BOOLEAN fields */\nfunction evaluateBoolCondition(\n lhsValue: boolean,\n comparator: Comparator,\n rhsValue?: boolean // undefined for IS_TRUE/IS_FALSE comparators\n): boolean {\n switch (comparator) {\n case 'IS_TRUE':\n return lhsValue === true;\n case 'IS_FALSE':\n return lhsValue === false;\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with TEXT fields */\nfunction evaluateTextCondition(\n lhsValue: string,\n comparator: Comparator,\n rhsValue: string | string[]\n): boolean {\n lhsValue = lhsValue.toLowerCase(); // Converting to lowerCase to perform case-insensitive comparisons\n\n // For IN/NOT_IN comparators, the rhsValue is of type `string[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs = rhsValue\n .map(v => {\n v = v.toLowerCase().trim();\n // Handle text in quotes\n if (v.startsWith(QUOTE) && v.endsWith(QUOTE)) {\n v = v.slice(1, -1);\n }\n return v;\n })\n .includes(lhsValue); // Converting to lowerCase to perform case-insensitive comparisons\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n // Converting to lowerCase to perform case-insensitive comparisons\n rhsValue = rhsValue.toLowerCase().trim();\n\n // Handle if rhs is in quotes\n if (rhsValue.startsWith(QUOTE) && rhsValue.endsWith(QUOTE)) {\n rhsValue = rhsValue.slice(1, -1);\n }\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'STARTS_WITH':\n return lhsValue.startsWith(rhsValue);\n case 'NOT_STARTS_WITH':\n return !lhsValue.startsWith(rhsValue);\n case 'ENDS_WITH':\n return lhsValue.endsWith(rhsValue);\n case 'NOT_ENDS_WITH':\n return !lhsValue.endsWith(rhsValue);\n case 'CONTAINS':\n return lhsValue.includes(rhsValue);\n case 'NOT_CONTAINS':\n return !lhsValue.includes(rhsValue);\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with NUMBER fields */\nfunction evaluateNumericCondition(\n lhsValue: number,\n comparator: Comparator,\n rhsValue: number | number[]\n): boolean {\n // For IN/NOT_IN comparators, the rhsValue is of type `number[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs: boolean = rhsValue.includes(lhsValue);\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'GT':\n return lhsValue > rhsValue;\n case 'GTE':\n return lhsValue >= rhsValue;\n case 'LT':\n return lhsValue < rhsValue;\n case 'LTE':\n return lhsValue <= rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Returns different date parts in local time from the given date object */\nfunction getDateParts(date: Date): {\n YYYY: string;\n QQ: string;\n MM: string;\n DD: string;\n HH: string;\n mm: string;\n ss: string;\n} {\n return {\n YYYY: date.getFullYear().toString().padStart(4, '0'),\n QQ: (3 * Math.floor(date.getMonth() / 3) + 1).toString().padStart(2, '0'), // MM value for the quarter's starting month\n MM: (date.getMonth() + 1).toString().padStart(2, '0'),\n DD: date.getDate().toString().padStart(2, '0'),\n HH: date.getHours().toString().padStart(2, '0'),\n mm: date.getMinutes().toString().padStart(2, '0'),\n ss: date.getSeconds().toString().padStart(2, '0')\n };\n}\n\n/** Returns the value of a given field from data obj */\nfunction resolveValueFromData(\n path: string,\n data: EvaluateDataObj,\n delimiter?: string\n): EvaluatorData {\n if (!delimiter || !path.includes(delimiter)) {\n return data[path];\n }\n\n return deepGet(data, path.split(delimiter));\n}\n\n/** Evaluates leaf conditions with Date-functions */\nfunction evaluateDateFuncCondition(\n lhsValue: string,\n fieldType: FieldType,\n comparator: Comparator,\n rhs: RhsWithDateFunction\n): boolean {\n if (fieldType === 'DATE_ONLY') lhsValue += 'T00:00:00'; // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDateObj = new Date(lhsValue);\n const {\n YYYY: lhsYYYY,\n QQ: lhsQQ,\n MM: lhsMM,\n DD: lhsDD,\n HH: lhsHH,\n mm: lhsMinute,\n ss: lhsSecond\n } = getDateParts(lhsDateObj);\n\n // Determine a numeric representation of the values for the given date function\n let lhsNumVal = 0;\n let rhsNumVal = 0;\n switch (rhs.dateFunction) {\n case 'YEARS':\n // Using YYYY as a number\n lhsNumVal = Number(lhsYYYY);\n rhsNumVal = Number((rhs.value as string).slice(0, 4));\n break;\n case 'QUARTERS':\n // Using YYYYQQ as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsQQ}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'MONTHS':\n // Using YYYYMM as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'WEEKS': {\n // Identify the start of week for the given LHS\n const lhsDayStart = new Date(`${lhsYYYY}-${lhsMM}-${lhsDD}T00:00:00`); // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDay = lhsDayStart.getDay() || 7; // 'getDay()' returns 0 for Sundays\n const lhsWeekStart = new Date(lhsDayStart.getTime() - (lhsDay - 1) * 24 * 60 * 60 * 1000);\n const { YYYY: weekStartYYYY, MM: weekStartMM, DD: weekStartDD } = getDateParts(lhsWeekStart);\n\n // Using YYYYMMDD of the week-start-day as a number\n lhsNumVal = Number(`${weekStartYYYY}${weekStartMM}${weekStartDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n }\n case 'DAYS':\n // Using YYYYMMDD as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n case 'HOURS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T/g, '').slice(0, 10));\n break;\n case 'MINUTES':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}${lhsMinute}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T|:/g, '').slice(0, 12));\n break;\n case 'SECONDS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}${lhsMinute}${lhsSecond}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T|:/g, '').slice(0, 14));\n break;\n case 'HOURS_OF_DAY':\n lhsNumVal = Number(lhsHH);\n rhsNumVal = Number(rhs.value);\n break;\n case 'MONTHS_OF_YEAR':\n lhsNumVal = Number(lhsMM);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_MONTH':\n lhsNumVal = Number(lhsDD);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_WEEK':\n lhsNumVal = lhsDateObj.getDay() || 7; // 'getDay()' returns 0 for Sundays\n rhsNumVal = rhs.value as number;\n break;\n default: // Not needed\n }\n\n // Compare the numeric representations\n return evaluateNumericCondition(lhsNumVal, comparator, rhsNumVal);\n}\n\n/** Evaluates a leaf node in a condition tree for the given data document */\nfunction evaluateLeafCondition(\n leaf: LeafCondition,\n data: EvaluateDataObj,\n fields: Field[],\n delimiter?: string\n): boolean {\n // For safety against any malformed nodes or unexpected types/formats in data-values\n try {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine LHS and RHS values\n const lhsValue = resolveValueFromData(lhs.field, data, delimiter);\n let rhsValue: EvaluatorData;\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n rhsValue = resolveValueFromData(rhs.field, data, delimiter); // If RHS is another field\n } else if (hasProp(rhs, 'value')) {\n rhsValue = rhs.value; // If RHS is a single value\n } else if (hasProp(rhs, 'relativeDate')) {\n rhsValue = true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n } else if (hasProp(rhs, 'parameterId')) {\n rhsValue = resolveValueFromData(rhs.parameterId, data, delimiter); // If RHS is of type PARAMETER\n } else if (hasProp(rhs, 'values')) {\n rhsValue = rhs.values; // If RHS is a list of values\n } else {\n rhsValue = { start: rhs.start, end: rhs.end }; // If RHS is a definition of range\n }\n }\n\n // Handle NULL comparators common to all field-types\n const isNullValue = lhsValue === null || lhsValue === undefined;\n if (comparator === 'IS_NULL') {\n return isNullValue;\n }\n if (comparator === 'IS_NOT_NULL') {\n return !isNullValue;\n }\n\n // For all other comparators, evaluate separately by field-type\n const field = getItem(fields, lhs.field);\n if (field === undefined || !hasProp(field, 'type')) {\n return false; // If the corresponding field is not found in the input fields\n }\n switch (field.type) {\n case 'BOOLEAN':\n return typeof lhsValue === 'boolean' &&\n (rhsValue === undefined || typeof rhsValue === 'boolean')\n ? evaluateBoolCondition(lhsValue, comparator, rhsValue)\n : false;\n case 'TEXT':\n return typeof lhsValue === 'string' &&\n (typeof rhsValue === 'string' || isStringArray(rhsValue))\n ? evaluateTextCondition(lhsValue, comparator, rhsValue)\n : false;\n case 'NUMBER':\n case 'TIME_ONLY':\n return typeof lhsValue === 'number' &&\n (typeof rhsValue === 'number' || isNumberArray(rhsValue))\n ? evaluateNumericCondition(lhsValue, comparator, rhsValue)\n : false;\n case 'DATE_TIME':\n case 'DATE_ONLY': {\n if (rhs && hasProp(rhs, 'dateFunction')) {\n return typeof lhsValue === 'string'\n ? evaluateDateFuncCondition(lhsValue, field.type, comparator, rhs)\n : false;\n }\n\n if (rhs && hasProp(rhs, 'relativeDate')) {\n return true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n }\n\n // Both the values are expected to be in an ISO-8601 format\n if (isDateInputParam(lhsValue) && isDateInputParam(rhsValue)) {\n const lhsAsTicks = new Date(lhsValue).getTime();\n const rhsAsTicks = new Date(rhsValue).getTime();\n return evaluateNumericCondition(lhsAsTicks, comparator, rhsAsTicks);\n }\n return false;\n }\n default:\n return false; // Not needed\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Evaluates a condition tree for the given data document\n * NOTE: The output is nondeterministic if:\n * - any of the nodes in the input Condition are in an unexpected format (invalid keys, comparators etc.)\n * - any null/undefined values are encountered in the input data, unless they are used with an IS_NULL/IS_NOT_NULL comparator\n * - stringified values are encountered for BOOLEAN/NUMBER fields\n * - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields\n * - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`\n */\nexport default function evaluateCondition(\n condition: Condition,\n data: EvaluateDataObj,\n fields: Field[],\n delimiter?: string\n): boolean {\n // For safety against any malformed trees\n try {\n // Update relative date conditions to be LT/GT date range conditions\n const updatedCondition: Condition = transformComplexCondition(condition, fields);\n if (hasProp(updatedCondition, 'AND')) {\n // Return true if all the child nodes are true\n return updatedCondition.AND.every(child => evaluateCondition(child, data, fields, delimiter));\n }\n if (hasProp(updatedCondition, 'OR')) {\n // Return true if any one of the child nodes is true\n return updatedCondition.OR.some(child => evaluateCondition(child, data, fields, delimiter));\n }\n if (hasProp(updatedCondition, 'NOT')) {\n return !evaluateCondition(updatedCondition.NOT, data, fields, delimiter);\n }\n return evaluateLeafCondition(updatedCondition.condition, data, fields, delimiter);\n } catch {\n return false;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pega/cosmos-react-condition-builder",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-dev.1.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/pegasystems/cosmos-react.git",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"build": "tsc -b"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@pega/cosmos-react-core": "
|
|
26
|
+
"@pega/cosmos-react-core": "5.0.0-dev.1.0",
|
|
27
27
|
"@types/react": "^16.14.24 || ^17.0.38",
|
|
28
28
|
"@types/react-dom": "^16.9.14 || ^17.0.11",
|
|
29
29
|
"@types/styled-components": "^5.1.26",
|