condcal-cjs 1.0.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.
- package/index.js +260 -0
- package/package.json +15 -0
package/index.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
const REGEX_CONDITION = /((Date|Number|)(\(|)([\w- ]{1,})(==|!=|>|>=|<|<=)([\w- ]{1,})(\)|))(&&|\|\||){1,}/g;
|
|
2
|
+
|
|
3
|
+
// OLD
|
|
4
|
+
//const REGEX_QUOTATIONS = /(\(\([a-zA-Z0-9=<>&() ]{1,}\)=\([a-zA-Z0-9.+\-*/]{1,}\)\))(\^\^|){1,}/g;
|
|
5
|
+
//const REGEX_CONDITION_VALUE = /\(\((\(|)((Date|Number|)([a-zA-Z0-9=<>&() ]{1,}))(\)|)\)=\(([a-zA-Z0-9.+\-*/]{1,})\)\)/;
|
|
6
|
+
|
|
7
|
+
// NEW
|
|
8
|
+
const REGEX_QUOTATIONS = /(\(\({1}[a-zA-Z0-9=<>&()\- ]{1,}\){1}=\({1}[a-zA-Z0-9.+\-*/()]{1,}\){1}\))(\^\^|){1,}/g
|
|
9
|
+
const REGEX_CONDITION_VALUE = /\(\((\(|)((Date|Number|)([a-zA-Z0-9=<>&()\- ]{1,}))(\)|)\)=\(([a-zA-Z0-9.+\-*/()]{1,})\)\)/;
|
|
10
|
+
|
|
11
|
+
// COMPUTATION
|
|
12
|
+
const REGEX_HAS_PARENTHESIS = /\((.{1,})\)/g;
|
|
13
|
+
const REGEX_PARENTHESIS = /\((((-|)\d{1,}((?=\.)\.\d{1,}|)((?=[+\-*/])[+\-*/]{1})){1,}(-|)\d{1,}((?=\.)\.\d{1,}|))\)/g;
|
|
14
|
+
const REGEX_MUL_DIV = /(((?=[+\-*/])[+\-]{0,}|(?=^)[+\-]{0,})\d+(\.(?=\d)|)\d{0,})([*/]{1})(((?=[+\-*/])[+\-]{0,}|)\d+(\.(?=\d)|)\d{0,})/g;
|
|
15
|
+
const REGEX_ADD_SUB = /(((?=[+\-*/])[+\-]{0,}|(?=^)[+\-]{0,})\d+(\.(?=\d)|)\d{0,})([+\-]{1})(((?=[+\-*/])[+\-]{0,}|)\d+(\.(?=\d)|)\d{0,})/g;
|
|
16
|
+
const REGEX_MATH_FUNCTIONS = /()/g;
|
|
17
|
+
|
|
18
|
+
const REGEX_VARIABLES_TO_NUMBERS = /[a-zA-Z]{1,}/g;
|
|
19
|
+
|
|
20
|
+
var moment = require('moment');
|
|
21
|
+
|
|
22
|
+
var checkCondition = (condition, params) => {
|
|
23
|
+
let allGrants = [];
|
|
24
|
+
|
|
25
|
+
let result;
|
|
26
|
+
while (result = REGEX_CONDITION.exec(condition)) {
|
|
27
|
+
let granted = false;
|
|
28
|
+
|
|
29
|
+
let paramName1 = result[4], paramName2 = result[6], operation = result[5];
|
|
30
|
+
|
|
31
|
+
let type = 'Text';
|
|
32
|
+
if (result[2]) { type = result[2]; }
|
|
33
|
+
|
|
34
|
+
let param1 = "", param2 = "";
|
|
35
|
+
|
|
36
|
+
if (params[paramName1]) param1 = params[paramName1];
|
|
37
|
+
else param1 = paramName1;
|
|
38
|
+
|
|
39
|
+
if (params[paramName2]) param2 = params[paramName2];
|
|
40
|
+
else param2 = paramName2;
|
|
41
|
+
|
|
42
|
+
if (type === 'Text') {
|
|
43
|
+
if (operation === '==') {
|
|
44
|
+
if (param1 === param2) {
|
|
45
|
+
granted = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
} else if (type === 'Number') {
|
|
49
|
+
let paramDouble1 = 0, paramDouble2 = 0;
|
|
50
|
+
try {
|
|
51
|
+
paramDouble1 = parseFloat(param1);
|
|
52
|
+
paramDouble2 = parseFloat(param2);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.log('error', e);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (operation === '==') {
|
|
58
|
+
if (paramDouble1 === paramDouble2) {
|
|
59
|
+
granted = true;
|
|
60
|
+
}
|
|
61
|
+
} else if (operation === '>') {
|
|
62
|
+
if (paramDouble1 > paramDouble2) {
|
|
63
|
+
granted = true;
|
|
64
|
+
}
|
|
65
|
+
} else if (operation === '>=') {
|
|
66
|
+
if (paramDouble1 >= paramDouble2) {
|
|
67
|
+
granted = true;
|
|
68
|
+
}
|
|
69
|
+
} else if (operation === '<') {
|
|
70
|
+
if (paramDouble1 < paramDouble2) {
|
|
71
|
+
granted = true;
|
|
72
|
+
}
|
|
73
|
+
} else if (operation === '<=') {
|
|
74
|
+
if (paramDouble1 <= paramDouble2) {
|
|
75
|
+
granted = true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} else if (type === 'Date') {
|
|
79
|
+
let paramDate1 = null, paramDate2 = null;
|
|
80
|
+
try {
|
|
81
|
+
paramDate1 = new Date(param1);
|
|
82
|
+
paramDate2 = new Date(param2);
|
|
83
|
+
} catch (e) {
|
|
84
|
+
console.log('err', e);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (operation === '==') {
|
|
88
|
+
if (moment(paramDate1).isSame(paramDate2)) {
|
|
89
|
+
granted = true;
|
|
90
|
+
}
|
|
91
|
+
} else if (operation === '>') {
|
|
92
|
+
if (moment(paramDate1).isAfter(paramDate2)) {
|
|
93
|
+
granted = true;
|
|
94
|
+
}
|
|
95
|
+
} else if (operation === '>=') {
|
|
96
|
+
if (moment(paramDate1).isSameOrAfter(paramDate2)) {
|
|
97
|
+
granted = true;
|
|
98
|
+
}
|
|
99
|
+
} else if (operation === '<') {
|
|
100
|
+
if (moment(paramDate1).isBefore(paramDate2)) {
|
|
101
|
+
granted = true;
|
|
102
|
+
}
|
|
103
|
+
} else if (operation === '<=') {
|
|
104
|
+
if (moment(paramDate1).isSameOrBefore(paramDate2)) {
|
|
105
|
+
granted = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
allGrants.push(granted);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let allGranted = true;
|
|
114
|
+
for (let i = 0; i < allGrants.length; i++) {
|
|
115
|
+
if (!allGrants[i]) allGranted = false;
|
|
116
|
+
}
|
|
117
|
+
return allGranted;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
var getValueInCondition = (formula, params) => {
|
|
121
|
+
// CONVERTING VARIABLES TO NUMBERS
|
|
122
|
+
let nFormula = formula;
|
|
123
|
+
|
|
124
|
+
let matches = [];
|
|
125
|
+
let result;
|
|
126
|
+
while (result = REGEX_VARIABLES_TO_NUMBERS.exec(nFormula)) {
|
|
127
|
+
matches.push({
|
|
128
|
+
text: result[0],
|
|
129
|
+
startIndex: result.index
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
for (let i = matches.length - 1; i >= 0; i--) {
|
|
134
|
+
let match = matches[i];
|
|
135
|
+
|
|
136
|
+
let value = 0;
|
|
137
|
+
try {
|
|
138
|
+
if (params[match.text]) value = params[match.text];
|
|
139
|
+
} catch (e) {
|
|
140
|
+
console.log('err', e);
|
|
141
|
+
}
|
|
142
|
+
nFormula = nFormula.substring(0, match.startIndex) + nFormula.substring(match.startIndex + match.text.length);
|
|
143
|
+
nFormula = nFormula.substring(0, match.startIndex) + value + nFormula.substring(match.startIndex);
|
|
144
|
+
}
|
|
145
|
+
return this.getValueInParenthesis(nFormula);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
var getValueInParenthesis = (formula) => {
|
|
149
|
+
let nFormula = formula;
|
|
150
|
+
|
|
151
|
+
let resultParenthesis, resultHasParenthesis;
|
|
152
|
+
while (resultHasParenthesis = REGEX_HAS_PARENTHESIS.exec(nFormula)) {
|
|
153
|
+
let matches = [];
|
|
154
|
+
|
|
155
|
+
while (resultParenthesis = REGEX_PARENTHESIS.exec(nFormula)) {
|
|
156
|
+
matches.push({
|
|
157
|
+
text: resultParenthesis[0],
|
|
158
|
+
value: resultParenthesis[1],
|
|
159
|
+
startIndex: resultParenthesis.index
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
for (let i = matches.length - 1; i >= 0; i--) {
|
|
164
|
+
let match = matches[i];
|
|
165
|
+
|
|
166
|
+
let value = this.getValueInParenthesis(match.value);
|
|
167
|
+
|
|
168
|
+
nFormula = nFormula.substring(0, match.startIndex) + nFormula.substring(match.startIndex + match.text.length);
|
|
169
|
+
nFormula = nFormula.substring(0, match.startIndex) + value + nFormula.substring(match.startIndex);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let value = 0;
|
|
174
|
+
let concat = '';
|
|
175
|
+
|
|
176
|
+
// MULTIPLICATION & DIVISION
|
|
177
|
+
let resultMulDiv = new RegExp(REGEX_MUL_DIV).exec(nFormula);
|
|
178
|
+
while (resultMulDiv) {
|
|
179
|
+
let param1 = 0, param2 = 0;
|
|
180
|
+
try {
|
|
181
|
+
param1 = parseFloat(resultMulDiv[1]);
|
|
182
|
+
param2 = parseFloat(resultMulDiv[5]);
|
|
183
|
+
} catch (e) {
|
|
184
|
+
console.log('err', e);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (resultMulDiv[4] === '*') {
|
|
188
|
+
value = param1 * param2;
|
|
189
|
+
} else if (resultMulDiv[4] === '/') {
|
|
190
|
+
value = param1 / param2;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
concat = (value >= 0) ? ('+' + value) : (value + '');
|
|
194
|
+
|
|
195
|
+
nFormula = nFormula.substring(0, resultMulDiv.index) + nFormula.substring(resultMulDiv.index + resultMulDiv[0].length);
|
|
196
|
+
nFormula = nFormula.substring(0, resultMulDiv.index) + concat + nFormula.substring(resultMulDiv.index);
|
|
197
|
+
|
|
198
|
+
resultMulDiv = new RegExp(REGEX_MUL_DIV).exec(nFormula);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ADDITION & SUBSTRACTION
|
|
202
|
+
let resultAddSub = new RegExp(REGEX_ADD_SUB).exec(nFormula);
|
|
203
|
+
while (resultAddSub) {
|
|
204
|
+
let param1 = 0, param2 = 0;
|
|
205
|
+
try {
|
|
206
|
+
param1 = parseFloat(resultAddSub[1]);
|
|
207
|
+
param2 = parseFloat(resultAddSub[5]);
|
|
208
|
+
} catch (e) {
|
|
209
|
+
console.log('err', e);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (resultAddSub[4] === '+') {
|
|
213
|
+
value = param1 + param2;
|
|
214
|
+
} else if (resultAddSub[4] === '-') {
|
|
215
|
+
value = param1 - param2;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
concat = (value >= 0) ? ('+' + value) : (value + '');
|
|
219
|
+
|
|
220
|
+
nFormula = nFormula.substring(0, resultAddSub.index) + nFormula.substring(resultAddSub.index + resultAddSub[0].length);
|
|
221
|
+
nFormula = nFormula.substring(0, resultAddSub.index) + concat + nFormula.substring(resultAddSub.index);
|
|
222
|
+
|
|
223
|
+
resultAddSub = new RegExp(REGEX_ADD_SUB).exec(nFormula);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
let finalValue = 0;
|
|
227
|
+
try {
|
|
228
|
+
finalValue = parseFloat(nFormula);
|
|
229
|
+
} catch (e) {
|
|
230
|
+
console.log('err', e);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return finalValue;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
module.exports = {
|
|
237
|
+
getValue: (condCal, parameters) => {
|
|
238
|
+
let v = 0;
|
|
239
|
+
|
|
240
|
+
let pattern = new RegExp(REGEX_QUOTATIONS);
|
|
241
|
+
let result;
|
|
242
|
+
while (result = pattern.exec(condCal)) {
|
|
243
|
+
let conditionResult = REGEX_CONDITION_VALUE.exec(result[1]);
|
|
244
|
+
|
|
245
|
+
if (conditionResult) {
|
|
246
|
+
let condition = conditionResult[2], value = conditionResult[6];
|
|
247
|
+
|
|
248
|
+
if (checkCondition(condition, parameters)) {
|
|
249
|
+
v = getValueInCondition(value, parameters);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return v;
|
|
255
|
+
},
|
|
256
|
+
|
|
257
|
+
checkCondition: checkCondition,
|
|
258
|
+
getValueInCondition: getValueInCondition,
|
|
259
|
+
getValueInParenthesis: getValueInParenthesis
|
|
260
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "condcal-cjs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [],
|
|
10
|
+
"author": "",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"moment": "^2.30.1"
|
|
14
|
+
}
|
|
15
|
+
}
|