@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.
Files changed (85) hide show
  1. package/README.md +2 -381
  2. package/coverage/clover.xml +707 -645
  3. package/coverage/coverage-final.json +11 -9
  4. package/coverage/lcov-report/{segments.ts.html → bucketer.ts.html} +155 -77
  5. package/coverage/lcov-report/child.ts.html +940 -0
  6. package/coverage/lcov-report/conditions.ts.html +107 -158
  7. package/coverage/lcov-report/datafileReader.ts.html +763 -103
  8. package/coverage/lcov-report/emitter.ts.html +77 -59
  9. package/coverage/lcov-report/evaluate.ts.html +689 -416
  10. package/coverage/lcov-report/events.ts.html +334 -0
  11. package/coverage/lcov-report/helpers.ts.html +184 -0
  12. package/coverage/lcov-report/{bucket.ts.html → hooks.ts.html} +86 -239
  13. package/coverage/lcov-report/index.html +119 -89
  14. package/coverage/lcov-report/instance.ts.html +341 -773
  15. package/coverage/lcov-report/logger.ts.html +64 -64
  16. package/coverage/lcov.info +1433 -1226
  17. package/dist/bucketer.d.ts +11 -0
  18. package/dist/child.d.ts +26 -0
  19. package/dist/compareVersions.d.ts +4 -0
  20. package/dist/conditions.d.ts +4 -4
  21. package/dist/datafileReader.d.ts +26 -6
  22. package/dist/emitter.d.ts +8 -9
  23. package/dist/evaluate.d.ts +31 -29
  24. package/dist/events.d.ts +5 -0
  25. package/dist/helpers.d.ts +5 -0
  26. package/dist/hooks.d.ts +45 -0
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +1 -1
  31. package/dist/index.mjs.gz +0 -0
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/instance.d.ts +40 -72
  34. package/dist/logger.d.ts +6 -5
  35. package/dist/murmurhash.d.ts +1 -0
  36. package/jest.config.js +2 -0
  37. package/lib/bucketer.d.ts +11 -0
  38. package/lib/child.d.ts +26 -0
  39. package/lib/compareVersions.d.ts +4 -0
  40. package/lib/conditions.d.ts +4 -4
  41. package/lib/datafileReader.d.ts +26 -6
  42. package/lib/emitter.d.ts +8 -9
  43. package/lib/evaluate.d.ts +31 -29
  44. package/lib/events.d.ts +5 -0
  45. package/lib/helpers.d.ts +5 -0
  46. package/lib/hooks.d.ts +45 -0
  47. package/lib/index.d.ts +3 -2
  48. package/lib/instance.d.ts +40 -72
  49. package/lib/logger.d.ts +6 -5
  50. package/lib/murmurhash.d.ts +1 -0
  51. package/package.json +3 -5
  52. package/src/bucketer.spec.ts +165 -0
  53. package/src/bucketer.ts +84 -0
  54. package/src/child.spec.ts +267 -0
  55. package/src/child.ts +285 -0
  56. package/src/compareVersions.ts +93 -0
  57. package/src/conditions.spec.ts +563 -353
  58. package/src/conditions.ts +46 -63
  59. package/src/datafileReader.spec.ts +396 -84
  60. package/src/datafileReader.ts +280 -60
  61. package/src/emitter.spec.ts +27 -86
  62. package/src/emitter.ts +38 -32
  63. package/src/evaluate.ts +349 -258
  64. package/src/events.spec.ts +154 -0
  65. package/src/events.ts +83 -0
  66. package/src/helpers.ts +33 -0
  67. package/src/hooks.ts +88 -0
  68. package/src/index.ts +3 -2
  69. package/src/instance.spec.ts +305 -489
  70. package/src/instance.ts +247 -391
  71. package/src/logger.spec.ts +212 -134
  72. package/src/logger.ts +36 -36
  73. package/src/murmurhash.ts +71 -0
  74. package/coverage/lcov-report/feature.ts.html +0 -508
  75. package/dist/bucket.d.ts +0 -30
  76. package/dist/feature.d.ts +0 -16
  77. package/dist/segments.d.ts +0 -5
  78. package/lib/bucket.d.ts +0 -30
  79. package/lib/feature.d.ts +0 -16
  80. package/lib/segments.d.ts +0 -5
  81. package/src/bucket.spec.ts +0 -37
  82. package/src/bucket.ts +0 -139
  83. package/src/feature.ts +0 -141
  84. package/src/segments.spec.ts +0 -468
  85. 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">94.28% </span>
26
+ <span class="strong">98.63% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>66/70</span>
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.96% </span>
33
+ <span class="strong">96.1% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>64/66</span>
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'>6/6</span>
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">94.02% </span>
47
+ <span class="strong">98.61% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>63/67</span>
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">&nbsp;</span>
194
177
  <span class="cline-any cline-neutral">&nbsp;</span>
195
178
  <span class="cline-any cline-neutral">&nbsp;</span>
179
+ <span class="cline-any cline-yes">6x</span>
196
180
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
198
185
  <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">3x</span>
200
- <span class="cline-any cline-yes">414x</span>
186
+ <span class="cline-any cline-yes">24x</span>
187
+ <span class="cline-any cline-neutral">&nbsp;</span>
188
+ <span class="cline-any cline-neutral">&nbsp;</span>
189
+ <span class="cline-any cline-yes">6x</span>
201
190
  <span class="cline-any cline-neutral">&nbsp;</span>
202
- <span class="cline-any cline-yes">414x</span>
203
- <span class="cline-any cline-yes">359x</span>
204
- <span class="cline-any cline-yes">55x</span>
191
+ <span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
+ <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">53x</span>
201
+ <span class="cline-any cline-yes">86x</span>
207
202
  <span class="cline-any cline-neutral">&nbsp;</span>
208
203
  <span class="cline-any cline-yes">8x</span>
209
204
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -214,7 +209,8 @@
214
209
  <span class="cline-any cline-yes">8x</span>
215
210
  <span class="cline-any cline-neutral">&nbsp;</span>
216
211
  <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-yes">45x</span>
212
+ <span class="cline-any cline-yes">78x</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
218
214
  <span class="cline-any cline-neutral">&nbsp;</span>
219
215
  <span class="cline-any cline-neutral">&nbsp;</span>
220
216
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
229
- <span class="cline-any cline-yes">37x</span>
225
+ <span class="cline-any cline-yes">70x</span>
230
226
  <span class="cline-any cline-neutral">&nbsp;</span>
231
- <span class="cline-any cline-yes">25x</span>
227
+ <span class="cline-any cline-yes">40x</span>
232
228
  <span class="cline-any cline-neutral">&nbsp;</span>
233
- <span class="cline-any cline-yes">25x</span>
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">19x</span>
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">16x</span>
233
+ <span class="cline-any cline-yes">34x</span>
234
+ <span class="cline-any cline-no">&nbsp;</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">13x</span>
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">11x</span>
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">9x</span>
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">7x</span>
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">4x</span>
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">&nbsp;</span>
254
- <span class="cline-any cline-yes">12x</span>
256
+ <span class="cline-any cline-yes">30x</span>
255
257
  <span class="cline-any cline-neutral">&nbsp;</span>
256
258
  <span class="cline-any cline-yes">12x</span>
257
259
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
267
- <span class="cline-any cline-neutral">&nbsp;</span>
268
- <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-no">&nbsp;</span>
270
- <span class="cline-any cline-neutral">&nbsp;</span>
271
- <span class="cline-any cline-neutral">&nbsp;</span>
272
- <span class="cline-any cline-yes">3x</span>
273
- <span class="cline-any cline-neutral">&nbsp;</span>
274
- <span class="cline-any cline-neutral">&nbsp;</span>
275
- <span class="cline-any cline-neutral">&nbsp;</span>
276
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
281
- <span class="cline-any cline-no">&nbsp;</span>
282
- <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-neutral">&nbsp;</span>
284
- <span class="cline-any cline-neutral">&nbsp;</span>
285
- <span class="cline-any cline-neutral">&nbsp;</span>
286
- <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-neutral">&nbsp;</span>
288
- <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-no">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
304
- <span class="cline-any cline-yes">9x</span>
305
- <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-yes">4x</span>
312
276
  <span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">&nbsp;</span>
317
283
  <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-no">&nbsp;</span>
284
+ <span class="cline-any cline-yes">2x</span>
319
285
  <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { compareVersions } from "compare-versions";
286
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Context, PlainCondition, AttributeValue } from "@featurevisor/types";
321
287
  &nbsp;
322
- import { Context, Condition, PlainCondition } from "@featurevisor/types";
288
+ import { GetRegex } from "./datafileReader";
289
+ import { compareVersions } from "./compareVersions";
323
290
  &nbsp;
324
- import { Logger } from "./logger";
291
+ export function getValueFromContext(obj, path): AttributeValue {
292
+ if (path.indexOf(".") === -1) {
293
+ return obj[path];
294
+ }
295
+ &nbsp;
296
+ return path.split(".").reduce((o, i) =&gt; (o ? o[i] : undefined), obj);
297
+ }
325
298
  &nbsp;
326
- export function conditionIsMatched(condition: PlainCondition, context: Context): boolean {
327
- const { attribute, operator, value } = condition;
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
  &nbsp;
329
307
  if (operator === "equals") {
330
- return context[attribute] === value;
308
+ return contextValueFromPath === value;
331
309
  } else if (operator === "notEquals") {
332
- return context[attribute] !== value;
310
+ return contextValueFromPath !== value;
333
311
  } else if (operator === "before" || operator === "after") {
334
312
  // date comparisons
335
- const valueInContext = context[attribute] as string | Date;
313
+ const valueInContext = contextValueFromPath as string | Date;
336
314
  &nbsp;
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 &gt; dateInCondition;
344
322
  } else if (
345
323
  Array.isArray(value) &amp;&amp;
346
- (["string", "number"].indexOf(typeof context[attribute]) !== -1 || <span class="branch-2 cbranch-no" title="branch not covered" >context[attribute] === null)</span>
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 = context[attribute] as string;
327
+ // in / notIn (where condition value is an array)
328
+ const valueInContext = contextValueFromPath as string;
350
329
  &nbsp;
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 context[attribute] === "string" &amp;&amp; typeof value === "string") {
335
+ } else if (typeof contextValueFromPath === "string" &amp;&amp; typeof value === "string") {
357
336
  // string
358
- const valueInContext = context[attribute] as string;
337
+ const valueInContext = contextValueFromPath as string;
359
338
  &nbsp;
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) &lt;= 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 context[attribute] === "number" &amp;&amp; typeof value === "number") {
366
+ } else if (typeof contextValueFromPath === "number" &amp;&amp; typeof value === "number") {
382
367
  // numeric
383
- const valueInContext = context[attribute] as number;
368
+ const valueInContext = contextValueFromPath as number;
384
369
  &nbsp;
385
370
  if (operator === "greaterThan") {
386
371
  return valueInContext &gt; value;
@@ -391,58 +376,22 @@ export function conditionIsMatched(condition: PlainCondition, context: Context):
391
376
  } else if (operator === "lessThanOrEquals") {
392
377
  return valueInContext &lt;= 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) &amp;&amp; typeof value === "string") {
384
+ // includes / notIncludes (where context value is an array)
385
+ const valueInContext = contextValueFromPath as string[];
395
386
  &nbsp;
396
- <span class="cstat-no" title="statement not covered" > return false;</span>
397
- }
398
- &nbsp;
399
- export function allConditionsAreMatched(
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
- &nbsp;
416
- <span class="cstat-no" title="statement not covered" > return false;</span>
387
+ if (operator === "includes") {
388
+ return valueInContext.indexOf(value) &gt; -1;
389
+ } else if (operator === "notIncludes") {
390
+ return valueInContext.indexOf(value) === -1;
417
391
  }
418
392
  }
419
393
  &nbsp;
420
- if ("and" in conditions &amp;&amp; Array.isArray(conditions.and)) {
421
- return conditions.and.every((c) =&gt; allConditionsAreMatched(c, context, logger));
422
- }
423
- &nbsp;
424
- if ("or" in conditions &amp;&amp; Array.isArray(conditions.or)) {
425
- return conditions.or.some((c) =&gt; allConditionsAreMatched(c, context, logger));
426
- }
427
- &nbsp;
428
- if ("not" in conditions &amp;&amp; Array.isArray(conditions.not)) {
429
- return conditions.not.every(
430
- () =&gt;
431
- allConditionsAreMatched(
432
- {
433
- and: conditions.not,
434
- },
435
- context,
436
- logger,
437
- ) === false,
438
- );
439
- }
440
- &nbsp;
441
- if (Array.isArray(conditions)) {
442
- return conditions.every((c) =&gt; allConditionsAreMatched(c, context, logger));
443
- }
444
- &nbsp;
445
- <span class="cstat-no" title="statement not covered" > return false;</span>
394
+ return false;
446
395
  }
447
396
  &nbsp;</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-04-12T20:34:55.662Z
403
+ at 2025-07-13T22:31:55.309Z
455
404
  </div>
456
405
  <script src="prettify.js"></script>
457
406
  <script>