@featurevisor/sdk 1.35.3 → 2.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/README.md +2 -381
- package/coverage/clover.xml +707 -645
- package/coverage/coverage-final.json +11 -9
- package/coverage/lcov-report/{segments.ts.html → bucketer.ts.html} +155 -77
- package/coverage/lcov-report/child.ts.html +940 -0
- package/coverage/lcov-report/conditions.ts.html +107 -158
- package/coverage/lcov-report/datafileReader.ts.html +763 -103
- package/coverage/lcov-report/emitter.ts.html +77 -59
- package/coverage/lcov-report/evaluate.ts.html +689 -416
- package/coverage/lcov-report/events.ts.html +334 -0
- package/coverage/lcov-report/helpers.ts.html +184 -0
- package/coverage/lcov-report/{bucket.ts.html → hooks.ts.html} +86 -239
- package/coverage/lcov-report/index.html +119 -89
- package/coverage/lcov-report/instance.ts.html +341 -773
- package/coverage/lcov-report/logger.ts.html +64 -64
- package/coverage/lcov.info +1433 -1226
- package/dist/bucketer.d.ts +11 -0
- package/dist/child.d.ts +26 -0
- package/dist/compareVersions.d.ts +4 -0
- package/dist/conditions.d.ts +4 -4
- package/dist/datafileReader.d.ts +26 -6
- package/dist/emitter.d.ts +8 -9
- package/dist/evaluate.d.ts +31 -29
- package/dist/events.d.ts +5 -0
- package/dist/helpers.d.ts +5 -0
- package/dist/hooks.d.ts +45 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.gz +0 -0
- package/dist/index.mjs.map +1 -1
- package/dist/instance.d.ts +40 -72
- package/dist/logger.d.ts +6 -5
- package/dist/murmurhash.d.ts +1 -0
- package/jest.config.js +2 -0
- package/lib/bucketer.d.ts +11 -0
- package/lib/child.d.ts +26 -0
- package/lib/compareVersions.d.ts +4 -0
- package/lib/conditions.d.ts +4 -4
- package/lib/datafileReader.d.ts +26 -6
- package/lib/emitter.d.ts +8 -9
- package/lib/evaluate.d.ts +31 -29
- package/lib/events.d.ts +5 -0
- package/lib/helpers.d.ts +5 -0
- package/lib/hooks.d.ts +45 -0
- package/lib/index.d.ts +3 -2
- package/lib/instance.d.ts +40 -72
- package/lib/logger.d.ts +6 -5
- package/lib/murmurhash.d.ts +1 -0
- package/package.json +3 -5
- package/src/bucketer.spec.ts +165 -0
- package/src/bucketer.ts +84 -0
- package/src/child.spec.ts +267 -0
- package/src/child.ts +285 -0
- package/src/compareVersions.ts +93 -0
- package/src/conditions.spec.ts +563 -353
- package/src/conditions.ts +46 -63
- package/src/datafileReader.spec.ts +396 -84
- package/src/datafileReader.ts +280 -60
- package/src/emitter.spec.ts +27 -86
- package/src/emitter.ts +38 -32
- package/src/evaluate.ts +349 -258
- package/src/events.spec.ts +154 -0
- package/src/events.ts +83 -0
- package/src/helpers.ts +33 -0
- package/src/hooks.ts +88 -0
- package/src/index.ts +3 -2
- package/src/instance.spec.ts +305 -489
- package/src/instance.ts +247 -391
- package/src/logger.spec.ts +212 -134
- package/src/logger.ts +36 -36
- package/src/murmurhash.ts +71 -0
- package/coverage/lcov-report/feature.ts.html +0 -508
- package/dist/bucket.d.ts +0 -30
- package/dist/feature.d.ts +0 -16
- package/dist/segments.d.ts +0 -5
- package/lib/bucket.d.ts +0 -30
- package/lib/feature.d.ts +0 -16
- package/lib/segments.d.ts +0 -5
- package/src/bucket.spec.ts +0 -37
- package/src/bucket.ts +0 -139
- package/src/feature.ts +0 -141
- package/src/segments.spec.ts +0 -468
- package/src/segments.ts +0 -58
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">98.63% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>72/73</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">96.
|
|
33
|
+
<span class="strong">96.1% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>74/77</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>3/3</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">98.61% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>71/72</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -173,37 +173,32 @@
|
|
|
173
173
|
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
174
|
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
175
|
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
194
177
|
<span class="cline-any cline-neutral"> </span>
|
|
195
178
|
<span class="cline-any cline-neutral"> </span>
|
|
179
|
+
<span class="cline-any cline-yes">6x</span>
|
|
196
180
|
<span class="cline-any cline-neutral"> </span>
|
|
181
|
+
<span class="cline-any cline-yes">6x</span>
|
|
182
|
+
<span class="cline-any cline-yes">929x</span>
|
|
183
|
+
<span class="cline-any cline-yes">917x</span>
|
|
197
184
|
<span class="cline-any cline-neutral"> </span>
|
|
198
185
|
<span class="cline-any cline-neutral"> </span>
|
|
199
|
-
<span class="cline-any cline-yes">
|
|
200
|
-
<span class="cline-any cline-
|
|
186
|
+
<span class="cline-any cline-yes">24x</span>
|
|
187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
189
|
+
<span class="cline-any cline-yes">6x</span>
|
|
201
190
|
<span class="cline-any cline-neutral"> </span>
|
|
202
|
-
<span class="cline-any cline-
|
|
203
|
-
<span class="cline-any cline-
|
|
204
|
-
<span class="cline-any cline-
|
|
191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
194
|
+
<span class="cline-any cline-yes">745x</span>
|
|
195
|
+
<span class="cline-any cline-yes">745x</span>
|
|
196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
197
|
+
<span class="cline-any cline-yes">745x</span>
|
|
198
|
+
<span class="cline-any cline-yes">657x</span>
|
|
199
|
+
<span class="cline-any cline-yes">88x</span>
|
|
205
200
|
<span class="cline-any cline-yes">2x</span>
|
|
206
|
-
<span class="cline-any cline-yes">
|
|
201
|
+
<span class="cline-any cline-yes">86x</span>
|
|
207
202
|
<span class="cline-any cline-neutral"> </span>
|
|
208
203
|
<span class="cline-any cline-yes">8x</span>
|
|
209
204
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -214,7 +209,8 @@
|
|
|
214
209
|
<span class="cline-any cline-yes">8x</span>
|
|
215
210
|
<span class="cline-any cline-neutral"> </span>
|
|
216
211
|
<span class="cline-any cline-neutral"> </span>
|
|
217
|
-
<span class="cline-any cline-yes">
|
|
212
|
+
<span class="cline-any cline-yes">78x</span>
|
|
213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
218
214
|
<span class="cline-any cline-neutral"> </span>
|
|
219
215
|
<span class="cline-any cline-neutral"> </span>
|
|
220
216
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -226,32 +222,38 @@
|
|
|
226
222
|
<span class="cline-any cline-yes">4x</span>
|
|
227
223
|
<span class="cline-any cline-yes">4x</span>
|
|
228
224
|
<span class="cline-any cline-neutral"> </span>
|
|
229
|
-
<span class="cline-any cline-yes">
|
|
225
|
+
<span class="cline-any cline-yes">70x</span>
|
|
230
226
|
<span class="cline-any cline-neutral"> </span>
|
|
231
|
-
<span class="cline-any cline-yes">
|
|
227
|
+
<span class="cline-any cline-yes">40x</span>
|
|
232
228
|
<span class="cline-any cline-neutral"> </span>
|
|
233
|
-
<span class="cline-any cline-yes">
|
|
234
|
-
<span class="cline-any cline-yes">3x</span>
|
|
235
|
-
<span class="cline-any cline-yes">22x</span>
|
|
229
|
+
<span class="cline-any cline-yes">40x</span>
|
|
236
230
|
<span class="cline-any cline-yes">3x</span>
|
|
237
|
-
<span class="cline-any cline-yes">
|
|
231
|
+
<span class="cline-any cline-yes">37x</span>
|
|
238
232
|
<span class="cline-any cline-yes">3x</span>
|
|
239
|
-
<span class="cline-any cline-yes">
|
|
233
|
+
<span class="cline-any cline-yes">34x</span>
|
|
234
|
+
<span class="cline-any cline-no"> </span>
|
|
235
|
+
<span class="cline-any cline-yes">34x</span>
|
|
240
236
|
<span class="cline-any cline-yes">3x</span>
|
|
241
|
-
<span class="cline-any cline-yes">
|
|
237
|
+
<span class="cline-any cline-yes">31x</span>
|
|
242
238
|
<span class="cline-any cline-yes">2x</span>
|
|
243
|
-
<span class="cline-any cline-yes">
|
|
239
|
+
<span class="cline-any cline-yes">29x</span>
|
|
244
240
|
<span class="cline-any cline-yes">2x</span>
|
|
245
|
-
<span class="cline-any cline-yes">
|
|
241
|
+
<span class="cline-any cline-yes">27x</span>
|
|
246
242
|
<span class="cline-any cline-yes">2x</span>
|
|
247
|
-
<span class="cline-any cline-yes">
|
|
243
|
+
<span class="cline-any cline-yes">25x</span>
|
|
248
244
|
<span class="cline-any cline-yes">3x</span>
|
|
249
|
-
<span class="cline-any cline-yes">
|
|
250
|
-
<span class="cline-any cline-yes">2x</span>
|
|
245
|
+
<span class="cline-any cline-yes">22x</span>
|
|
251
246
|
<span class="cline-any cline-yes">2x</span>
|
|
247
|
+
<span class="cline-any cline-yes">20x</span>
|
|
252
248
|
<span class="cline-any cline-yes">2x</span>
|
|
249
|
+
<span class="cline-any cline-yes">18x</span>
|
|
250
|
+
<span class="cline-any cline-yes">10x</span>
|
|
251
|
+
<span class="cline-any cline-yes">10x</span>
|
|
252
|
+
<span class="cline-any cline-yes">8x</span>
|
|
253
|
+
<span class="cline-any cline-yes">8x</span>
|
|
254
|
+
<span class="cline-any cline-yes">8x</span>
|
|
253
255
|
<span class="cline-any cline-neutral"> </span>
|
|
254
|
-
<span class="cline-any cline-yes">
|
|
256
|
+
<span class="cline-any cline-yes">30x</span>
|
|
255
257
|
<span class="cline-any cline-neutral"> </span>
|
|
256
258
|
<span class="cline-any cline-yes">12x</span>
|
|
257
259
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -264,75 +266,51 @@
|
|
|
264
266
|
<span class="cline-any cline-yes">4x</span>
|
|
265
267
|
<span class="cline-any cline-yes">4x</span>
|
|
266
268
|
<span class="cline-any cline-neutral"> </span>
|
|
267
|
-
<span class="cline-any cline-
|
|
268
|
-
<span class="cline-any cline-
|
|
269
|
-
<span class="cline-any cline-
|
|
270
|
-
<span class="cline-any cline-
|
|
271
|
-
<span class="cline-any cline-neutral"> </span>
|
|
272
|
-
<span class="cline-any cline-yes">3x</span>
|
|
273
|
-
<span class="cline-any cline-neutral"> </span>
|
|
274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
275
|
-
<span class="cline-any cline-neutral"> </span>
|
|
276
|
-
<span class="cline-any cline-neutral"> </span>
|
|
277
|
-
<span class="cline-any cline-yes">842x</span>
|
|
278
|
-
<span class="cline-any cline-yes">414x</span>
|
|
279
|
-
<span class="cline-any cline-yes">414x</span>
|
|
280
|
-
<span class="cline-any cline-neutral"> </span>
|
|
281
|
-
<span class="cline-any cline-no"> </span>
|
|
282
|
-
<span class="cline-any cline-neutral"> </span>
|
|
283
|
-
<span class="cline-any cline-neutral"> </span>
|
|
284
|
-
<span class="cline-any cline-neutral"> </span>
|
|
285
|
-
<span class="cline-any cline-neutral"> </span>
|
|
286
|
-
<span class="cline-any cline-neutral"> </span>
|
|
287
|
-
<span class="cline-any cline-neutral"> </span>
|
|
288
|
-
<span class="cline-any cline-neutral"> </span>
|
|
289
|
-
<span class="cline-any cline-no"> </span>
|
|
290
|
-
<span class="cline-any cline-neutral"> </span>
|
|
291
|
-
<span class="cline-any cline-neutral"> </span>
|
|
292
|
-
<span class="cline-any cline-neutral"> </span>
|
|
293
|
-
<span class="cline-any cline-yes">428x</span>
|
|
294
|
-
<span class="cline-any cline-yes">37x</span>
|
|
295
|
-
<span class="cline-any cline-neutral"> </span>
|
|
296
|
-
<span class="cline-any cline-neutral"> </span>
|
|
297
|
-
<span class="cline-any cline-yes">405x</span>
|
|
298
|
-
<span class="cline-any cline-yes">38x</span>
|
|
299
|
-
<span class="cline-any cline-neutral"> </span>
|
|
300
|
-
<span class="cline-any cline-neutral"> </span>
|
|
301
|
-
<span class="cline-any cline-yes">383x</span>
|
|
269
|
+
<span class="cline-any cline-yes">18x</span>
|
|
270
|
+
<span class="cline-any cline-yes">6x</span>
|
|
271
|
+
<span class="cline-any cline-yes">12x</span>
|
|
272
|
+
<span class="cline-any cline-yes">6x</span>
|
|
302
273
|
<span class="cline-any cline-yes">6x</span>
|
|
303
274
|
<span class="cline-any cline-neutral"> </span>
|
|
304
|
-
<span class="cline-any cline-yes">
|
|
305
|
-
<span class="cline-any cline-neutral"> </span>
|
|
306
|
-
<span class="cline-any cline-neutral"> </span>
|
|
307
|
-
<span class="cline-any cline-neutral"> </span>
|
|
308
|
-
<span class="cline-any cline-neutral"> </span>
|
|
309
|
-
<span class="cline-any cline-neutral"> </span>
|
|
310
|
-
<span class="cline-any cline-neutral"> </span>
|
|
311
|
-
<span class="cline-any cline-neutral"> </span>
|
|
275
|
+
<span class="cline-any cline-yes">4x</span>
|
|
312
276
|
<span class="cline-any cline-neutral"> </span>
|
|
277
|
+
<span class="cline-any cline-yes">4x</span>
|
|
278
|
+
<span class="cline-any cline-yes">2x</span>
|
|
279
|
+
<span class="cline-any cline-yes">2x</span>
|
|
280
|
+
<span class="cline-any cline-yes">2x</span>
|
|
313
281
|
<span class="cline-any cline-neutral"> </span>
|
|
314
|
-
<span class="cline-any cline-yes">377x</span>
|
|
315
|
-
<span class="cline-any cline-yes">380x</span>
|
|
316
282
|
<span class="cline-any cline-neutral"> </span>
|
|
317
283
|
<span class="cline-any cline-neutral"> </span>
|
|
318
|
-
<span class="cline-any cline-
|
|
284
|
+
<span class="cline-any cline-yes">2x</span>
|
|
319
285
|
<span class="cline-any cline-neutral"> </span>
|
|
320
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {
|
|
286
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { Context, PlainCondition, AttributeValue } from "@featurevisor/types";
|
|
321
287
|
|
|
322
|
-
import {
|
|
288
|
+
import { GetRegex } from "./datafileReader";
|
|
289
|
+
import { compareVersions } from "./compareVersions";
|
|
323
290
|
|
|
324
|
-
|
|
291
|
+
export function getValueFromContext(obj, path): AttributeValue {
|
|
292
|
+
if (path.indexOf(".") === -1) {
|
|
293
|
+
return obj[path];
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return path.split(".").reduce((o, i) => (o ? o[i] : undefined), obj);
|
|
297
|
+
}
|
|
325
298
|
|
|
326
|
-
export function conditionIsMatched(
|
|
327
|
-
|
|
299
|
+
export function conditionIsMatched(
|
|
300
|
+
condition: PlainCondition,
|
|
301
|
+
context: Context,
|
|
302
|
+
getRegex: GetRegex,
|
|
303
|
+
): boolean {
|
|
304
|
+
const { attribute, operator, value, regexFlags } = condition;
|
|
305
|
+
const contextValueFromPath = getValueFromContext(context, attribute) as AttributeValue;
|
|
328
306
|
|
|
329
307
|
if (operator === "equals") {
|
|
330
|
-
return
|
|
308
|
+
return contextValueFromPath === value;
|
|
331
309
|
} else if (operator === "notEquals") {
|
|
332
|
-
return
|
|
310
|
+
return contextValueFromPath !== value;
|
|
333
311
|
} else if (operator === "before" || operator === "after") {
|
|
334
312
|
// date comparisons
|
|
335
|
-
const valueInContext =
|
|
313
|
+
const valueInContext = contextValueFromPath as string | Date;
|
|
336
314
|
|
|
337
315
|
const dateInContext =
|
|
338
316
|
valueInContext instanceof Date ? valueInContext : new Date(valueInContext);
|
|
@@ -343,26 +321,27 @@ export function conditionIsMatched(condition: PlainCondition, context: Context):
|
|
|
343
321
|
: dateInContext > dateInCondition;
|
|
344
322
|
} else if (
|
|
345
323
|
Array.isArray(value) &&
|
|
346
|
-
(["string", "number"].indexOf(typeof
|
|
324
|
+
(["string", "number"].indexOf(typeof contextValueFromPath) !== -1 ||
|
|
325
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > contextValueFromPath === null)</span>
|
|
347
326
|
) {
|
|
348
|
-
// array
|
|
349
|
-
const valueInContext =
|
|
327
|
+
// in / notIn (where condition value is an array)
|
|
328
|
+
const valueInContext = contextValueFromPath as string;
|
|
350
329
|
|
|
351
330
|
if (operator === "in") {
|
|
352
331
|
return value.indexOf(valueInContext) !== -1;
|
|
353
332
|
} else if (operator === "notIn") {
|
|
354
333
|
return value.indexOf(valueInContext) === -1;
|
|
355
334
|
}
|
|
356
|
-
} else if (typeof
|
|
335
|
+
} else if (typeof contextValueFromPath === "string" && typeof value === "string") {
|
|
357
336
|
// string
|
|
358
|
-
const valueInContext =
|
|
337
|
+
const valueInContext = contextValueFromPath as string;
|
|
359
338
|
|
|
360
339
|
if (operator === "contains") {
|
|
361
340
|
return valueInContext.indexOf(value) !== -1;
|
|
362
341
|
} else if (operator === "notContains") {
|
|
363
342
|
return valueInContext.indexOf(value) === -1;
|
|
364
|
-
} else if (operator === "startsWith") {
|
|
365
|
-
return valueInContext.startsWith(value)
|
|
343
|
+
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "startsWith") {
|
|
344
|
+
<span class="cstat-no" title="statement not covered" > return valueInContext.startsWith(value);</span>
|
|
366
345
|
} else if (operator === "endsWith") {
|
|
367
346
|
return valueInContext.endsWith(value);
|
|
368
347
|
} else if (operator === "semverEquals") {
|
|
@@ -377,10 +356,16 @@ export function conditionIsMatched(condition: PlainCondition, context: Context):
|
|
|
377
356
|
return compareVersions(valueInContext, value) === -1;
|
|
378
357
|
} else if (operator === "semverLessThanOrEquals") {
|
|
379
358
|
return compareVersions(valueInContext, value) <= 0;
|
|
359
|
+
} else if (operator === "matches") {
|
|
360
|
+
const regex = getRegex(value, regexFlags || "");
|
|
361
|
+
return regex.test(valueInContext);
|
|
362
|
+
} else if (operator === "notMatches") {
|
|
363
|
+
const regex = getRegex(value, regexFlags || "");
|
|
364
|
+
return !regex.test(valueInContext);
|
|
380
365
|
}
|
|
381
|
-
} else if (typeof
|
|
366
|
+
} else if (typeof contextValueFromPath === "number" && typeof value === "number") {
|
|
382
367
|
// numeric
|
|
383
|
-
const valueInContext =
|
|
368
|
+
const valueInContext = contextValueFromPath as number;
|
|
384
369
|
|
|
385
370
|
if (operator === "greaterThan") {
|
|
386
371
|
return valueInContext > value;
|
|
@@ -391,58 +376,22 @@ export function conditionIsMatched(condition: PlainCondition, context: Context):
|
|
|
391
376
|
} else if (operator === "lessThanOrEquals") {
|
|
392
377
|
return valueInContext <= value;
|
|
393
378
|
}
|
|
394
|
-
}
|
|
379
|
+
} else if (operator === "exists") {
|
|
380
|
+
return typeof contextValueFromPath !== "undefined";
|
|
381
|
+
} else if (operator === "notExists") {
|
|
382
|
+
return typeof contextValueFromPath === "undefined";
|
|
383
|
+
} else if (Array.isArray(contextValueFromPath) && typeof value === "string") {
|
|
384
|
+
// includes / notIncludes (where context value is an array)
|
|
385
|
+
const valueInContext = contextValueFromPath as string[];
|
|
395
386
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
conditions: Condition[] | Condition,
|
|
401
|
-
context: Context,
|
|
402
|
-
logger: Logger,
|
|
403
|
-
): boolean {
|
|
404
|
-
if ("attribute" in conditions) {
|
|
405
|
-
try {
|
|
406
|
-
return conditionIsMatched(conditions, context);
|
|
407
|
-
} catch (e) {
|
|
408
|
-
<span class="cstat-no" title="statement not covered" > logger.warn(e.message, {</span>
|
|
409
|
-
error: e,
|
|
410
|
-
details: {
|
|
411
|
-
condition: conditions,
|
|
412
|
-
context,
|
|
413
|
-
},
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
387
|
+
if (operator === "includes") {
|
|
388
|
+
return valueInContext.indexOf(value) > -1;
|
|
389
|
+
} else if (operator === "notIncludes") {
|
|
390
|
+
return valueInContext.indexOf(value) === -1;
|
|
417
391
|
}
|
|
418
392
|
}
|
|
419
393
|
|
|
420
|
-
|
|
421
|
-
return conditions.and.every((c) => allConditionsAreMatched(c, context, logger));
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if ("or" in conditions && Array.isArray(conditions.or)) {
|
|
425
|
-
return conditions.or.some((c) => allConditionsAreMatched(c, context, logger));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
if ("not" in conditions && Array.isArray(conditions.not)) {
|
|
429
|
-
return conditions.not.every(
|
|
430
|
-
() =>
|
|
431
|
-
allConditionsAreMatched(
|
|
432
|
-
{
|
|
433
|
-
and: conditions.not,
|
|
434
|
-
},
|
|
435
|
-
context,
|
|
436
|
-
logger,
|
|
437
|
-
) === false,
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
if (Array.isArray(conditions)) {
|
|
442
|
-
return conditions.every((c) => allConditionsAreMatched(c, context, logger));
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
394
|
+
return false;
|
|
446
395
|
}
|
|
447
396
|
</pre></td></tr></table></pre>
|
|
448
397
|
|
|
@@ -451,7 +400,7 @@ export function allConditionsAreMatched(
|
|
|
451
400
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
452
401
|
Code coverage generated by
|
|
453
402
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
454
|
-
at 2025-
|
|
403
|
+
at 2025-07-13T22:31:55.309Z
|
|
455
404
|
</div>
|
|
456
405
|
<script src="prettify.js"></script>
|
|
457
406
|
<script>
|