@featurevisor/sdk 0.36.0 → 0.38.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.
@@ -84,10 +84,10 @@
84
84
  <span class="cline-any cline-yes">2x</span>
85
85
  <span class="cline-any cline-neutral">&nbsp;</span>
86
86
  <span class="cline-any cline-yes">2x</span>
87
- <span class="cline-any cline-yes">19x</span>
88
- <span class="cline-any cline-yes">19x</span>
87
+ <span class="cline-any cline-yes">30x</span>
88
+ <span class="cline-any cline-yes">30x</span>
89
89
  <span class="cline-any cline-neutral">&nbsp;</span>
90
- <span class="cline-any cline-yes">19x</span>
90
+ <span class="cline-any cline-yes">30x</span>
91
91
  <span class="cline-any cline-neutral">&nbsp;</span>
92
92
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as murmurhash from "murmurhash";
93
93
  &nbsp;
@@ -109,7 +109,7 @@ export function getBucketedNumber(bucketKey: string): number {
109
109
  <div class='footer quiet pad2 space-top1 center small'>
110
110
  Code coverage generated by
111
111
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
112
- at 2023-07-13T20:52:46.032Z
112
+ at 2023-07-16T19:53:34.344Z
113
113
  </div>
114
114
  <script src="prettify.js"></script>
115
115
  <script>
@@ -281,72 +281,72 @@
281
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
282
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { compareVersions } from "compare-versions";
283
283
  &nbsp;
284
- import { Attributes, Condition, PlainCondition } from "@featurevisor/types";
284
+ import { Context, Condition, PlainCondition } from "@featurevisor/types";
285
285
  &nbsp;
286
- export function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {
286
+ export function conditionIsMatched(condition: PlainCondition, context: Context): boolean {
287
287
  const { attribute, operator, value } = condition;
288
288
  &nbsp;
289
289
  if (operator === "equals") {
290
- return attributes[attribute] === value;
290
+ return context[attribute] === value;
291
291
  } else if (operator === "notEquals") {
292
- return attributes[attribute] !== value;
292
+ return context[attribute] !== value;
293
293
  } else if (operator === "before" || operator === "after") {
294
294
  // date comparisons
295
- const valueInAttributes = attributes[attribute] as string | Date;
295
+ const valueInContext = context[attribute] as string | Date;
296
296
  &nbsp;
297
- const dateInAttributes =
298
- valueInAttributes instanceof Date ? valueInAttributes : new Date(valueInAttributes);
297
+ const dateInContext =
298
+ valueInContext instanceof Date ? valueInContext : new Date(valueInContext);
299
299
  const dateInCondition = value instanceof Date ? <span class="branch-0 cbranch-no" title="branch not covered" >value </span>: new Date(value as string);
300
300
  &nbsp;
301
301
  return operator === "before"
302
- ? dateInAttributes &lt; dateInCondition
303
- : dateInAttributes &gt; dateInCondition;
304
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof attributes[attribute] === "string" &amp;&amp; Array.isArray(value)) {
302
+ ? dateInContext &lt; dateInCondition
303
+ : dateInContext &gt; dateInCondition;
304
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof context[attribute] === "string" &amp;&amp; Array.isArray(value)) {
305
305
  // array
306
- const valueInAttributes = <span class="cstat-no" title="statement not covered" >attributes[attribute] as string;</span>
306
+ const valueInContext = <span class="cstat-no" title="statement not covered" >context[attribute] as string;</span>
307
307
  &nbsp;
308
308
  <span class="cstat-no" title="statement not covered" > if (operator === "in") {</span>
309
- <span class="cstat-no" title="statement not covered" > return value.indexOf(valueInAttributes) !== -1;</span>
309
+ <span class="cstat-no" title="statement not covered" > return value.indexOf(valueInContext) !== -1;</span>
310
310
  } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "notIn") {</span>
311
- <span class="cstat-no" title="statement not covered" > return value.indexOf(valueInAttributes) === -1;</span>
311
+ <span class="cstat-no" title="statement not covered" > return value.indexOf(valueInContext) === -1;</span>
312
312
  }
313
- } else if (typeof attributes[attribute] === "string" &amp;&amp; typeof value === "string") {
313
+ } else if (typeof context[attribute] === "string" &amp;&amp; typeof value === "string") {
314
314
  // string
315
- const valueInAttributes = attributes[attribute] as string;
315
+ const valueInContext = context[attribute] as string;
316
316
  &nbsp;
317
317
  <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "contains") {
318
- <span class="cstat-no" title="statement not covered" > return valueInAttributes.indexOf(value) !== -1;</span>
318
+ <span class="cstat-no" title="statement not covered" > return valueInContext.indexOf(value) !== -1;</span>
319
319
  } else <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "notContains") {
320
- <span class="cstat-no" title="statement not covered" > return valueInAttributes.indexOf(value) === -1;</span>
320
+ <span class="cstat-no" title="statement not covered" > return valueInContext.indexOf(value) === -1;</span>
321
321
  } else <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "startsWith") {
322
- <span class="cstat-no" title="statement not covered" > return valueInAttributes.startsWith(value);</span>
322
+ <span class="cstat-no" title="statement not covered" > return valueInContext.startsWith(value);</span>
323
323
  } else <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "endsWith") {
324
- <span class="cstat-no" title="statement not covered" > return valueInAttributes.endsWith(value);</span>
324
+ <span class="cstat-no" title="statement not covered" > return valueInContext.endsWith(value);</span>
325
325
  } else if (operator === "semverEquals") {
326
- return compareVersions(valueInAttributes, value) === 0;
326
+ return compareVersions(valueInContext, value) === 0;
327
327
  } else if (operator === "semverNotEquals") {
328
- return compareVersions(valueInAttributes, value) !== 0;
328
+ return compareVersions(valueInContext, value) !== 0;
329
329
  } else if (operator === "semverGreaterThan") {
330
- return compareVersions(valueInAttributes, value) === 1;
330
+ return compareVersions(valueInContext, value) === 1;
331
331
  } else if (operator === "semverGreaterThanOrEquals") {
332
- return compareVersions(valueInAttributes, value) &gt;= 0;
332
+ return compareVersions(valueInContext, value) &gt;= 0;
333
333
  } else if (operator === "semverLessThan") {
334
- return compareVersions(valueInAttributes, value) === -1;
334
+ return compareVersions(valueInContext, value) === -1;
335
335
  } else if (operator === "semverLessThanOrEquals") {
336
- return compareVersions(valueInAttributes, value) &lt;= 0;
336
+ return compareVersions(valueInContext, value) &lt;= 0;
337
337
  }
338
- } else if (typeof attributes[attribute] === "number" &amp;&amp; typeof value === "number") {
338
+ } else if (typeof context[attribute] === "number" &amp;&amp; typeof value === "number") {
339
339
  // numeric
340
- const valueInAttributes = attributes[attribute] as number;
340
+ const valueInContext = context[attribute] as number;
341
341
  &nbsp;
342
342
  if (operator === "greaterThan") {
343
- return valueInAttributes &gt; value;
343
+ return valueInContext &gt; value;
344
344
  } else <span class="missing-if-branch" title="if path not taken" >I</span>if (operator === "greaterThanOrEquals") {
345
- <span class="cstat-no" title="statement not covered" > return valueInAttributes &gt;= value;</span>
345
+ <span class="cstat-no" title="statement not covered" > return valueInContext &gt;= value;</span>
346
346
  } else if (operator === "lessThan") {
347
- return valueInAttributes &lt; value;
347
+ return valueInContext &lt; value;
348
348
  } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span><span class="missing-if-branch" title="else path not taken" >E</span>if (operator === "lessThanOrEquals") {</span>
349
- <span class="cstat-no" title="statement not covered" > return valueInAttributes &lt;= value;</span>
349
+ <span class="cstat-no" title="statement not covered" > return valueInContext &lt;= value;</span>
350
350
  }
351
351
  }
352
352
  &nbsp;
@@ -355,18 +355,18 @@ export function conditionIsMatched(condition: PlainCondition, attributes: Attrib
355
355
  &nbsp;
356
356
  export function allConditionsAreMatched(
357
357
  conditions: Condition[] | Condition,
358
- attributes: Attributes,
358
+ context: Context,
359
359
  ): boolean {
360
360
  if ("attribute" in conditions) {
361
- return conditionIsMatched(conditions, attributes);
361
+ return conditionIsMatched(conditions, context);
362
362
  }
363
363
  &nbsp;
364
364
  if ("and" in conditions &amp;&amp; Array.isArray(conditions.and)) {
365
- return conditions.and.every((c) =&gt; allConditionsAreMatched(c, attributes));
365
+ return conditions.and.every((c) =&gt; allConditionsAreMatched(c, context));
366
366
  }
367
367
  &nbsp;
368
368
  if ("or" in conditions &amp;&amp; Array.isArray(conditions.or)) {
369
- return conditions.or.some((c) =&gt; allConditionsAreMatched(c, attributes));
369
+ return conditions.or.some((c) =&gt; allConditionsAreMatched(c, context));
370
370
  }
371
371
  &nbsp;
372
372
  if ("not" in conditions &amp;&amp; Array.isArray(conditions.not)) {
@@ -376,13 +376,13 @@ export function allConditionsAreMatched(
376
376
  {
377
377
  and: conditions.not,
378
378
  },
379
- attributes,
379
+ context,
380
380
  ) === false,
381
381
  );
382
382
  }
383
383
  &nbsp;
384
384
  if (Array.isArray(conditions)) {
385
- return conditions.every((c) =&gt; allConditionsAreMatched(c, attributes));
385
+ return conditions.every((c) =&gt; allConditionsAreMatched(c, context));
386
386
  }
387
387
  &nbsp;
388
388
  <span class="cstat-no" title="statement not covered" > return false;</span>
@@ -394,7 +394,7 @@ export function allConditionsAreMatched(
394
394
  <div class='footer quiet pad2 space-top1 center small'>
395
395
  Code coverage generated by
396
396
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
397
- at 2023-07-13T20:52:46.032Z
397
+ at 2023-07-16T19:53:34.344Z
398
398
  </div>
399
399
  <script src="prettify.js"></script>
400
400
  <script>
@@ -200,13 +200,13 @@
200
200
  <span class="cline-any cline-neutral">&nbsp;</span>
201
201
  <span class="cline-any cline-neutral">&nbsp;</span>
202
202
  <span class="cline-any cline-neutral">&nbsp;</span>
203
- <span class="cline-any cline-yes">9x</span>
203
+ <span class="cline-any cline-yes">20x</span>
204
204
  <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-yes">9x</span>
205
+ <span class="cline-any cline-yes">20x</span>
206
206
  <span class="cline-any cline-no">&nbsp;</span>
207
207
  <span class="cline-any cline-neutral">&nbsp;</span>
208
208
  <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-yes">9x</span>
209
+ <span class="cline-any cline-yes">20x</span>
210
210
  <span class="cline-any cline-neutral">&nbsp;</span>
211
211
  <span class="cline-any cline-neutral">&nbsp;</span>
212
212
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
@@ -289,7 +289,7 @@ export class DatafileReader {
289
289
  <div class='footer quiet pad2 space-top1 center small'>
290
290
  Code coverage generated by
291
291
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
292
- at 2023-07-13T20:52:46.032Z
292
+ at 2023-07-16T19:53:34.344Z
293
293
  </div>
294
294
  <script src="prettify.js"></script>
295
295
  <script>
@@ -229,7 +229,7 @@ export class Emitter {
229
229
  <div class='footer quiet pad2 space-top1 center small'>
230
230
  Code coverage generated by
231
231
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
232
- at 2023-07-13T20:52:46.032Z
232
+ at 2023-07-16T19:53:34.344Z
233
233
  </div>
234
234
  <script src="prettify.js"></script>
235
235
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">65.38% </span>
26
+ <span class="strong">67.74% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>17/26</span>
28
+ <span class='fraction'>21/31</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">69.23% </span>
33
+ <span class="strong">66.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>9/13</span>
35
+ <span class='fraction'>12/18</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">80% </span>
40
+ <span class="strong">85.71% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/5</span>
42
+ <span class='fraction'>6/7</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">65.38% </span>
47
+ <span class="strong">67.74% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>17/26</span>
49
+ <span class='fraction'>21/31</span>
50
50
  </div>
51
51
 
52
52
 
@@ -145,7 +145,27 @@
145
145
  <a name='L80'></a><a href='#L80'>80</a>
146
146
  <a name='L81'></a><a href='#L81'>81</a>
147
147
  <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
149
169
  <span class="cline-any cline-neutral">&nbsp;</span>
150
170
  <span class="cline-any cline-yes">1x</span>
151
171
  <span class="cline-any cline-yes">1x</span>
@@ -156,16 +176,36 @@
156
176
  <span class="cline-any cline-neutral">&nbsp;</span>
157
177
  <span class="cline-any cline-neutral">&nbsp;</span>
158
178
  <span class="cline-any cline-yes">9x</span>
159
- <span class="cline-any cline-yes">9x</span>
179
+ <span class="cline-any cline-yes">11x</span>
160
180
  <span class="cline-any cline-neutral">&nbsp;</span>
181
+ <span class="cline-any cline-yes">11x</span>
161
182
  <span class="cline-any cline-yes">9x</span>
162
- <span class="cline-any cline-yes">9x</span>
163
183
  <span class="cline-any cline-neutral">&nbsp;</span>
164
184
  <span class="cline-any cline-neutral">&nbsp;</span>
165
185
  <span class="cline-any cline-neutral">&nbsp;</span>
166
186
  <span class="cline-any cline-no">&nbsp;</span>
167
187
  <span class="cline-any cline-neutral">&nbsp;</span>
168
188
  <span class="cline-any cline-neutral">&nbsp;</span>
189
+ <span class="cline-any cline-yes">1x</span>
190
+ <span class="cline-any cline-neutral">&nbsp;</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">11x</span>
195
+ <span class="cline-any cline-yes">11x</span>
196
+ <span class="cline-any cline-neutral">&nbsp;</span>
197
+ <span class="cline-any cline-neutral">&nbsp;</span>
198
+ <span class="cline-any cline-neutral">&nbsp;</span>
199
+ <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-neutral">&nbsp;</span>
201
+ <span class="cline-any cline-neutral">&nbsp;</span>
202
+ <span class="cline-any cline-no">&nbsp;</span>
203
+ <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-neutral">&nbsp;</span>
205
+ <span class="cline-any cline-yes">11x</span>
206
+ <span class="cline-any cline-neutral">&nbsp;</span>
207
+ <span class="cline-any cline-neutral">&nbsp;</span>
208
+ <span class="cline-any cline-neutral">&nbsp;</span>
169
209
  <span class="cline-any cline-neutral">&nbsp;</span>
170
210
  <span class="cline-any cline-neutral">&nbsp;</span>
171
211
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -211,8 +251,8 @@
211
251
  <span class="cline-any cline-neutral">&nbsp;</span>
212
252
  <span class="cline-any cline-neutral">&nbsp;</span>
213
253
  <span class="cline-any cline-neutral">&nbsp;</span>
214
- <span class="cline-any cline-yes">9x</span>
215
- <span class="cline-any cline-yes">9x</span>
254
+ <span class="cline-any cline-yes">20x</span>
255
+ <span class="cline-any cline-yes">20x</span>
216
256
  <span class="cline-any cline-neutral">&nbsp;</span>
217
257
  <span class="cline-any cline-neutral">&nbsp;</span>
218
258
  <span class="cline-any cline-no">&nbsp;</span>
@@ -227,7 +267,7 @@
227
267
  <span class="cline-any cline-no">&nbsp;</span>
228
268
  <span class="cline-any cline-neutral">&nbsp;</span>
229
269
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Allocation, Attributes, Traffic, Feature, Force } from "@featurevisor/types";
270
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Allocation, Context, Traffic, Feature, Force } from "@featurevisor/types";
231
271
  import { DatafileReader } from "./datafileReader";
232
272
  import { allGroupSegmentsAreMatched } from "./segments";
233
273
  import { allConditionsAreMatched } from "./conditions";
@@ -248,6 +288,26 @@ export function getMatchedAllocation(
248
288
  <span class="cstat-no" title="statement not covered" > return undefined;</span>
249
289
  }
250
290
  &nbsp;
291
+ export function getMatchedTraffic(
292
+ traffic: Traffic[],
293
+ context: Context,
294
+ datafileReader: DatafileReader,
295
+ ): Traffic | undefined {
296
+ return traffic.find((t) =&gt; {
297
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
298
+ !allGroupSegmentsAreMatched(
299
+ typeof t.segments === "string" &amp;&amp; t.segments !== "*" ? <span class="branch-0 cbranch-no" title="branch not covered" >JSON.parse(t.segments) </span>: t.segments,
300
+ context,
301
+ datafileReader,
302
+ )
303
+ ) {
304
+ <span class="cstat-no" title="statement not covered" > return false;</span>
305
+ }
306
+ &nbsp;
307
+ return true;
308
+ });
309
+ }
310
+ &nbsp;
251
311
  export interface MatchedTrafficAndAllocation {
252
312
  matchedTraffic: Traffic | undefined;
253
313
  matchedAllocation: Allocation | undefined;
@@ -255,7 +315,7 @@ export interface MatchedTrafficAndAllocation {
255
315
  &nbsp;
256
316
  export function getMatchedTrafficAndAllocation(
257
317
  traffic: Traffic[],
258
- attributes: Attributes,
318
+ context: Context,
259
319
  bucketValue: number,
260
320
  datafileReader: DatafileReader,
261
321
  logger: Logger,
@@ -266,7 +326,7 @@ export function getMatchedTrafficAndAllocation(
266
326
  <span class="missing-if-branch" title="if path not taken" >I</span>if (
267
327
  !allGroupSegmentsAreMatched(
268
328
  typeof t.segments === "string" &amp;&amp; t.segments !== "*" ? <span class="branch-0 cbranch-no" title="branch not covered" >JSON.parse(t.segments) </span>: t.segments,
269
- attributes,
329
+ context,
270
330
  datafileReader,
271
331
  )
272
332
  ) {
@@ -290,7 +350,7 @@ export function getMatchedTrafficAndAllocation(
290
350
  &nbsp;
291
351
  export function findForceFromFeature(
292
352
  feature: Feature,
293
- attributes: Attributes,
353
+ context: Context,
294
354
  datafileReader: DatafileReader,
295
355
  ): Force | undefined {
296
356
  if (!feature.force) {
@@ -299,11 +359,11 @@ export function findForceFromFeature(
299
359
  &nbsp;
300
360
  <span class="cstat-no" title="statement not covered" > return feature.force.find(<span class="fstat-no" title="function not covered" >(f</span>: Force) =&gt; {</span>
301
361
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (f.conditions) {</span>
302
- <span class="cstat-no" title="statement not covered" > return allConditionsAreMatched(f.conditions, attributes);</span>
362
+ <span class="cstat-no" title="statement not covered" > return allConditionsAreMatched(f.conditions, context);</span>
303
363
  }
304
364
  &nbsp;
305
365
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (f.segments) {</span>
306
- <span class="cstat-no" title="statement not covered" > return allGroupSegmentsAreMatched(f.segments, attributes, datafileReader);</span>
366
+ <span class="cstat-no" title="statement not covered" > return allGroupSegmentsAreMatched(f.segments, context, datafileReader);</span>
307
367
  }
308
368
  &nbsp;
309
369
  <span class="cstat-no" title="statement not covered" > return false;</span>
@@ -316,7 +376,7 @@ export function findForceFromFeature(
316
376
  <div class='footer quiet pad2 space-top1 center small'>
317
377
  Code coverage generated by
318
378
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
319
- at 2023-07-13T20:52:46.032Z
379
+ at 2023-07-16T19:53:34.344Z
320
380
  </div>
321
381
  <script src="prettify.js"></script>
322
382
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">57.63% </span>
26
+ <span class="strong">57.67% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>302/524</span>
28
+ <span class='fraction'>338/586</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">47.7% </span>
33
+ <span class="strong">48.75% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>135/283</span>
35
+ <span class='fraction'>157/322</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">55.1% </span>
40
+ <span class="strong">59.18% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>54/98</span>
42
+ <span class='fraction'>58/98</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">57.84% </span>
47
+ <span class="strong">57.76% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>295/510</span>
49
+ <span class='fraction'>331/573</span>
50
50
  </div>
51
51
 
52
52
 
@@ -140,32 +140,32 @@
140
140
 
141
141
  <tr>
142
142
  <td class="file medium" data-value="feature.ts"><a href="feature.ts.html">feature.ts</a></td>
143
- <td data-value="65.38" class="pic medium">
144
- <div class="chart"><div class="cover-fill" style="width: 65%"></div><div class="cover-empty" style="width: 35%"></div></div>
143
+ <td data-value="67.74" class="pic medium">
144
+ <div class="chart"><div class="cover-fill" style="width: 67%"></div><div class="cover-empty" style="width: 33%"></div></div>
145
145
  </td>
146
- <td data-value="65.38" class="pct medium">65.38%</td>
147
- <td data-value="26" class="abs medium">17/26</td>
148
- <td data-value="69.23" class="pct medium">69.23%</td>
149
- <td data-value="13" class="abs medium">9/13</td>
150
- <td data-value="80" class="pct high">80%</td>
151
- <td data-value="5" class="abs high">4/5</td>
152
- <td data-value="65.38" class="pct medium">65.38%</td>
153
- <td data-value="26" class="abs medium">17/26</td>
146
+ <td data-value="67.74" class="pct medium">67.74%</td>
147
+ <td data-value="31" class="abs medium">21/31</td>
148
+ <td data-value="66.66" class="pct medium">66.66%</td>
149
+ <td data-value="18" class="abs medium">12/18</td>
150
+ <td data-value="85.71" class="pct high">85.71%</td>
151
+ <td data-value="7" class="abs high">6/7</td>
152
+ <td data-value="67.74" class="pct medium">67.74%</td>
153
+ <td data-value="31" class="abs medium">21/31</td>
154
154
  </tr>
155
155
 
156
156
  <tr>
157
157
  <td class="file medium" data-value="instance.ts"><a href="instance.ts.html">instance.ts</a></td>
158
- <td data-value="50" class="pic medium">
158
+ <td data-value="50.9" class="pic medium">
159
159
  <div class="chart"><div class="cover-fill" style="width: 50%"></div><div class="cover-empty" style="width: 50%"></div></div>
160
160
  </td>
161
- <td data-value="50" class="pct medium">50%</td>
162
- <td data-value="330" class="abs medium">165/330</td>
163
- <td data-value="33.72" class="pct low">33.72%</td>
164
- <td data-value="169" class="abs low">57/169</td>
165
- <td data-value="43.39" class="pct low">43.39%</td>
166
- <td data-value="53" class="abs low">23/53</td>
167
- <td data-value="50.77" class="pct medium">50.77%</td>
168
- <td data-value="323" class="abs medium">164/323</td>
161
+ <td data-value="50.9" class="pct medium">50.9%</td>
162
+ <td data-value="387" class="abs medium">197/387</td>
163
+ <td data-value="37.43" class="pct low">37.43%</td>
164
+ <td data-value="203" class="abs low">76/203</td>
165
+ <td data-value="49.01" class="pct low">49.01%</td>
166
+ <td data-value="51" class="abs low">25/51</td>
167
+ <td data-value="51.44" class="pct medium">51.44%</td>
168
+ <td data-value="381" class="abs medium">196/381</td>
169
169
  </tr>
170
170
 
171
171
  <tr>
@@ -206,7 +206,7 @@
206
206
  <div class='footer quiet pad2 space-top1 center small'>
207
207
  Code coverage generated by
208
208
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
209
- at 2023-07-13T20:52:46.032Z
209
+ at 2023-07-16T19:53:34.344Z
210
210
  </div>
211
211
  <script src="prettify.js"></script>
212
212
  <script>