@featurevisor/sdk 1.16.0 → 1.17.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.
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">89.68% </span>
26
+ <span class="strong">89.71% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>374/417</span>
28
+ <span class='fraction'>375/418</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">89.78% </span>
47
+ <span class="strong">89.8% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>369/411</span>
49
+ <span class='fraction'>370/412</span>
50
50
  </div>
51
51
 
52
52
 
@@ -1363,7 +1363,68 @@
1363
1363
  <a name='L1298'></a><a href='#L1298'>1298</a>
1364
1364
  <a name='L1299'></a><a href='#L1299'>1299</a>
1365
1365
  <a name='L1300'></a><a href='#L1300'>1300</a>
1366
- <a name='L1301'></a><a href='#L1301'>1301</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <a name='L1301'></a><a href='#L1301'>1301</a>
1367
+ <a name='L1302'></a><a href='#L1302'>1302</a>
1368
+ <a name='L1303'></a><a href='#L1303'>1303</a>
1369
+ <a name='L1304'></a><a href='#L1304'>1304</a>
1370
+ <a name='L1305'></a><a href='#L1305'>1305</a>
1371
+ <a name='L1306'></a><a href='#L1306'>1306</a>
1372
+ <a name='L1307'></a><a href='#L1307'>1307</a>
1373
+ <a name='L1308'></a><a href='#L1308'>1308</a>
1374
+ <a name='L1309'></a><a href='#L1309'>1309</a>
1375
+ <a name='L1310'></a><a href='#L1310'>1310</a>
1376
+ <a name='L1311'></a><a href='#L1311'>1311</a>
1377
+ <a name='L1312'></a><a href='#L1312'>1312</a>
1378
+ <a name='L1313'></a><a href='#L1313'>1313</a>
1379
+ <a name='L1314'></a><a href='#L1314'>1314</a>
1380
+ <a name='L1315'></a><a href='#L1315'>1315</a>
1381
+ <a name='L1316'></a><a href='#L1316'>1316</a>
1382
+ <a name='L1317'></a><a href='#L1317'>1317</a>
1383
+ <a name='L1318'></a><a href='#L1318'>1318</a>
1384
+ <a name='L1319'></a><a href='#L1319'>1319</a>
1385
+ <a name='L1320'></a><a href='#L1320'>1320</a>
1386
+ <a name='L1321'></a><a href='#L1321'>1321</a>
1387
+ <a name='L1322'></a><a href='#L1322'>1322</a>
1388
+ <a name='L1323'></a><a href='#L1323'>1323</a>
1389
+ <a name='L1324'></a><a href='#L1324'>1324</a>
1390
+ <a name='L1325'></a><a href='#L1325'>1325</a>
1391
+ <a name='L1326'></a><a href='#L1326'>1326</a>
1392
+ <a name='L1327'></a><a href='#L1327'>1327</a>
1393
+ <a name='L1328'></a><a href='#L1328'>1328</a>
1394
+ <a name='L1329'></a><a href='#L1329'>1329</a>
1395
+ <a name='L1330'></a><a href='#L1330'>1330</a>
1396
+ <a name='L1331'></a><a href='#L1331'>1331</a>
1397
+ <a name='L1332'></a><a href='#L1332'>1332</a>
1398
+ <a name='L1333'></a><a href='#L1333'>1333</a>
1399
+ <a name='L1334'></a><a href='#L1334'>1334</a>
1400
+ <a name='L1335'></a><a href='#L1335'>1335</a>
1401
+ <a name='L1336'></a><a href='#L1336'>1336</a>
1402
+ <a name='L1337'></a><a href='#L1337'>1337</a>
1403
+ <a name='L1338'></a><a href='#L1338'>1338</a>
1404
+ <a name='L1339'></a><a href='#L1339'>1339</a>
1405
+ <a name='L1340'></a><a href='#L1340'>1340</a>
1406
+ <a name='L1341'></a><a href='#L1341'>1341</a>
1407
+ <a name='L1342'></a><a href='#L1342'>1342</a>
1408
+ <a name='L1343'></a><a href='#L1343'>1343</a>
1409
+ <a name='L1344'></a><a href='#L1344'>1344</a>
1410
+ <a name='L1345'></a><a href='#L1345'>1345</a>
1411
+ <a name='L1346'></a><a href='#L1346'>1346</a>
1412
+ <a name='L1347'></a><a href='#L1347'>1347</a>
1413
+ <a name='L1348'></a><a href='#L1348'>1348</a>
1414
+ <a name='L1349'></a><a href='#L1349'>1349</a>
1415
+ <a name='L1350'></a><a href='#L1350'>1350</a>
1416
+ <a name='L1351'></a><a href='#L1351'>1351</a>
1417
+ <a name='L1352'></a><a href='#L1352'>1352</a>
1418
+ <a name='L1353'></a><a href='#L1353'>1353</a>
1419
+ <a name='L1354'></a><a href='#L1354'>1354</a>
1420
+ <a name='L1355'></a><a href='#L1355'>1355</a>
1421
+ <a name='L1356'></a><a href='#L1356'>1356</a>
1422
+ <a name='L1357'></a><a href='#L1357'>1357</a>
1423
+ <a name='L1358'></a><a href='#L1358'>1358</a>
1424
+ <a name='L1359'></a><a href='#L1359'>1359</a>
1425
+ <a name='L1360'></a><a href='#L1360'>1360</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-neutral">&nbsp;</span>
1427
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
1428
  <span class="cline-any cline-neutral">&nbsp;</span>
1368
1429
  <span class="cline-any cline-neutral">&nbsp;</span>
1369
1430
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1491,6 +1552,10 @@
1491
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
1492
1553
  <span class="cline-any cline-neutral">&nbsp;</span>
1493
1554
  <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-neutral">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
1559
  <span class="cline-any cline-yes">5x</span>
1495
1560
  <span class="cline-any cline-yes">5x</span>
1496
1561
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1734,6 +1799,9 @@
1734
1799
  <span class="cline-any cline-neutral">&nbsp;</span>
1735
1800
  <span class="cline-any cline-neutral">&nbsp;</span>
1736
1801
  <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1804
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
1805
  <span class="cline-any cline-yes">95x</span>
1738
1806
  <span class="cline-any cline-neutral">&nbsp;</span>
1739
1807
  <span class="cline-any cline-yes">95x</span>
@@ -1741,6 +1809,11 @@
1741
1809
  <span class="cline-any cline-yes">95x</span>
1742
1810
  <span class="cline-any cline-yes">2x</span>
1743
1811
  <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-yes">2x</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1744
1817
  <span class="cline-any cline-neutral">&nbsp;</span>
1745
1818
  <span class="cline-any cline-yes">93x</span>
1746
1819
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1749,6 +1822,9 @@
1749
1822
  <span class="cline-any cline-neutral">&nbsp;</span>
1750
1823
  <span class="cline-any cline-neutral">&nbsp;</span>
1751
1824
  <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1752
1828
  <span class="cline-any cline-yes">5x</span>
1753
1829
  <span class="cline-any cline-neutral">&nbsp;</span>
1754
1830
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1888,6 +1964,11 @@
1888
1964
  <span class="cline-any cline-neutral">&nbsp;</span>
1889
1965
  <span class="cline-any cline-yes">67x</span>
1890
1966
  <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-neutral">&nbsp;</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-neutral">&nbsp;</span>
1970
+ <span class="cline-any cline-neutral">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
1972
  <span class="cline-any cline-yes">67x</span>
1892
1973
  <span class="cline-any cline-yes">9x</span>
1893
1974
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1895,6 +1976,8 @@
1895
1976
  <span class="cline-any cline-neutral">&nbsp;</span>
1896
1977
  <span class="cline-any cline-neutral">&nbsp;</span>
1897
1978
  <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1898
1981
  <span class="cline-any cline-yes">9x</span>
1899
1982
  <span class="cline-any cline-neutral">&nbsp;</span>
1900
1983
  <span class="cline-any cline-yes">9x</span>
@@ -1935,6 +2018,7 @@
1935
2018
  <span class="cline-any cline-neutral">&nbsp;</span>
1936
2019
  <span class="cline-any cline-neutral">&nbsp;</span>
1937
2020
  <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
2022
  <span class="cline-any cline-yes">2x</span>
1939
2023
  <span class="cline-any cline-neutral">&nbsp;</span>
1940
2024
  <span class="cline-any cline-yes">2x</span>
@@ -1968,6 +2052,9 @@
1968
2052
  <span class="cline-any cline-neutral">&nbsp;</span>
1969
2053
  <span class="cline-any cline-neutral">&nbsp;</span>
1970
2054
  <span class="cline-any cline-neutral">&nbsp;</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1971
2058
  <span class="cline-any cline-yes">1x</span>
1972
2059
  <span class="cline-any cline-neutral">&nbsp;</span>
1973
2060
  <span class="cline-any cline-yes">1x</span>
@@ -1981,6 +2068,7 @@
1981
2068
  <span class="cline-any cline-neutral">&nbsp;</span>
1982
2069
  <span class="cline-any cline-neutral">&nbsp;</span>
1983
2070
  <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1984
2072
  <span class="cline-any cline-yes">1x</span>
1985
2073
  <span class="cline-any cline-neutral">&nbsp;</span>
1986
2074
  <span class="cline-any cline-yes">1x</span>
@@ -1997,6 +2085,7 @@
1997
2085
  <span class="cline-any cline-neutral">&nbsp;</span>
1998
2086
  <span class="cline-any cline-neutral">&nbsp;</span>
1999
2087
  <span class="cline-any cline-neutral">&nbsp;</span>
2088
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
2089
  <span class="cline-any cline-yes">1x</span>
2001
2090
  <span class="cline-any cline-neutral">&nbsp;</span>
2002
2091
  <span class="cline-any cline-yes">1x</span>
@@ -2013,6 +2102,7 @@
2013
2102
  <span class="cline-any cline-neutral">&nbsp;</span>
2014
2103
  <span class="cline-any cline-neutral">&nbsp;</span>
2015
2104
  <span class="cline-any cline-neutral">&nbsp;</span>
2105
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
2106
  <span class="cline-any cline-yes">48x</span>
2017
2107
  <span class="cline-any cline-neutral">&nbsp;</span>
2018
2108
  <span class="cline-any cline-yes">48x</span>
@@ -2027,6 +2117,7 @@
2027
2117
  <span class="cline-any cline-neutral">&nbsp;</span>
2028
2118
  <span class="cline-any cline-neutral">&nbsp;</span>
2029
2119
  <span class="cline-any cline-neutral">&nbsp;</span>
2120
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
2121
  <span class="cline-any cline-yes">5x</span>
2031
2122
  <span class="cline-any cline-neutral">&nbsp;</span>
2032
2123
  <span class="cline-any cline-yes">5x</span>
@@ -2146,6 +2237,11 @@
2146
2237
  <span class="cline-any cline-neutral">&nbsp;</span>
2147
2238
  <span class="cline-any cline-yes">18x</span>
2148
2239
  <span class="cline-any cline-neutral">&nbsp;</span>
2240
+ <span class="cline-any cline-neutral">&nbsp;</span>
2241
+ <span class="cline-any cline-neutral">&nbsp;</span>
2242
+ <span class="cline-any cline-neutral">&nbsp;</span>
2243
+ <span class="cline-any cline-neutral">&nbsp;</span>
2244
+ <span class="cline-any cline-neutral">&nbsp;</span>
2149
2245
  <span class="cline-any cline-yes">18x</span>
2150
2246
  <span class="cline-any cline-yes">1x</span>
2151
2247
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2156,6 +2252,8 @@
2156
2252
  <span class="cline-any cline-neutral">&nbsp;</span>
2157
2253
  <span class="cline-any cline-neutral">&nbsp;</span>
2158
2254
  <span class="cline-any cline-neutral">&nbsp;</span>
2255
+ <span class="cline-any cline-neutral">&nbsp;</span>
2256
+ <span class="cline-any cline-neutral">&nbsp;</span>
2159
2257
  <span class="cline-any cline-yes">1x</span>
2160
2258
  <span class="cline-any cline-neutral">&nbsp;</span>
2161
2259
  <span class="cline-any cline-yes">1x</span>
@@ -2187,6 +2285,8 @@
2187
2285
  <span class="cline-any cline-neutral">&nbsp;</span>
2188
2286
  <span class="cline-any cline-neutral">&nbsp;</span>
2189
2287
  <span class="cline-any cline-neutral">&nbsp;</span>
2288
+ <span class="cline-any cline-neutral">&nbsp;</span>
2289
+ <span class="cline-any cline-neutral">&nbsp;</span>
2190
2290
  <span class="cline-any cline-yes">1x</span>
2191
2291
  <span class="cline-any cline-neutral">&nbsp;</span>
2192
2292
  <span class="cline-any cline-yes">1x</span>
@@ -2205,6 +2305,9 @@
2205
2305
  <span class="cline-any cline-neutral">&nbsp;</span>
2206
2306
  <span class="cline-any cline-neutral">&nbsp;</span>
2207
2307
  <span class="cline-any cline-neutral">&nbsp;</span>
2308
+ <span class="cline-any cline-neutral">&nbsp;</span>
2309
+ <span class="cline-any cline-neutral">&nbsp;</span>
2310
+ <span class="cline-any cline-neutral">&nbsp;</span>
2208
2311
  <span class="cline-any cline-yes">16x</span>
2209
2312
  <span class="cline-any cline-neutral">&nbsp;</span>
2210
2313
  <span class="cline-any cline-yes">16x</span>
@@ -2219,6 +2322,7 @@
2219
2322
  <span class="cline-any cline-neutral">&nbsp;</span>
2220
2323
  <span class="cline-any cline-neutral">&nbsp;</span>
2221
2324
  <span class="cline-any cline-neutral">&nbsp;</span>
2325
+ <span class="cline-any cline-neutral">&nbsp;</span>
2222
2326
  <span class="cline-any cline-no">&nbsp;</span>
2223
2327
  <span class="cline-any cline-neutral">&nbsp;</span>
2224
2328
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2413,6 +2517,11 @@
2413
2517
  <span class="cline-any cline-neutral">&nbsp;</span>
2414
2518
  <span class="cline-any cline-yes">23x</span>
2415
2519
  <span class="cline-any cline-neutral">&nbsp;</span>
2520
+ <span class="cline-any cline-neutral">&nbsp;</span>
2521
+ <span class="cline-any cline-neutral">&nbsp;</span>
2522
+ <span class="cline-any cline-neutral">&nbsp;</span>
2523
+ <span class="cline-any cline-neutral">&nbsp;</span>
2524
+ <span class="cline-any cline-neutral">&nbsp;</span>
2416
2525
  <span class="cline-any cline-yes">23x</span>
2417
2526
  <span class="cline-any cline-yes">1x</span>
2418
2527
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2422,6 +2531,8 @@
2422
2531
  <span class="cline-any cline-neutral">&nbsp;</span>
2423
2532
  <span class="cline-any cline-neutral">&nbsp;</span>
2424
2533
  <span class="cline-any cline-neutral">&nbsp;</span>
2534
+ <span class="cline-any cline-neutral">&nbsp;</span>
2535
+ <span class="cline-any cline-neutral">&nbsp;</span>
2425
2536
  <span class="cline-any cline-yes">1x</span>
2426
2537
  <span class="cline-any cline-neutral">&nbsp;</span>
2427
2538
  <span class="cline-any cline-yes">1x</span>
@@ -2454,6 +2565,8 @@
2454
2565
  <span class="cline-any cline-neutral">&nbsp;</span>
2455
2566
  <span class="cline-any cline-neutral">&nbsp;</span>
2456
2567
  <span class="cline-any cline-neutral">&nbsp;</span>
2568
+ <span class="cline-any cline-neutral">&nbsp;</span>
2569
+ <span class="cline-any cline-neutral">&nbsp;</span>
2457
2570
  <span class="cline-any cline-yes">2x</span>
2458
2571
  <span class="cline-any cline-neutral">&nbsp;</span>
2459
2572
  <span class="cline-any cline-yes">2x</span>
@@ -2508,6 +2621,8 @@
2508
2621
  <span class="cline-any cline-neutral">&nbsp;</span>
2509
2622
  <span class="cline-any cline-neutral">&nbsp;</span>
2510
2623
  <span class="cline-any cline-neutral">&nbsp;</span>
2624
+ <span class="cline-any cline-neutral">&nbsp;</span>
2625
+ <span class="cline-any cline-neutral">&nbsp;</span>
2511
2626
  <span class="cline-any cline-yes">4x</span>
2512
2627
  <span class="cline-any cline-neutral">&nbsp;</span>
2513
2628
  <span class="cline-any cline-yes">4x</span>
@@ -2525,6 +2640,8 @@
2525
2640
  <span class="cline-any cline-neutral">&nbsp;</span>
2526
2641
  <span class="cline-any cline-neutral">&nbsp;</span>
2527
2642
  <span class="cline-any cline-neutral">&nbsp;</span>
2643
+ <span class="cline-any cline-neutral">&nbsp;</span>
2644
+ <span class="cline-any cline-neutral">&nbsp;</span>
2528
2645
  <span class="cline-any cline-yes">3x</span>
2529
2646
  <span class="cline-any cline-neutral">&nbsp;</span>
2530
2647
  <span class="cline-any cline-yes">3x</span>
@@ -2544,6 +2661,7 @@
2544
2661
  <span class="cline-any cline-neutral">&nbsp;</span>
2545
2662
  <span class="cline-any cline-neutral">&nbsp;</span>
2546
2663
  <span class="cline-any cline-neutral">&nbsp;</span>
2664
+ <span class="cline-any cline-neutral">&nbsp;</span>
2547
2665
  <span class="cline-any cline-yes">13x</span>
2548
2666
  <span class="cline-any cline-neutral">&nbsp;</span>
2549
2667
  <span class="cline-any cline-yes">13x</span>
@@ -2682,6 +2800,8 @@
2682
2800
  RuleKey,
2683
2801
  VariableKey,
2684
2802
  VariableSchema,
2803
+ Force,
2804
+ Required,
2685
2805
  } from "@featurevisor/types";
2686
2806
  &nbsp;
2687
2807
  import { createLogger, Logger, LogLevel } from "./logger";
@@ -2769,11 +2889,15 @@ export interface Evaluation {
2769
2889
  reason: EvaluationReason;
2770
2890
  &nbsp;
2771
2891
  // common
2892
+ bucketKey?: BucketKey;
2772
2893
  bucketValue?: BucketValue;
2773
2894
  ruleKey?: RuleKey;
2774
2895
  error?: Error;
2775
2896
  enabled?: boolean;
2776
2897
  traffic?: Traffic;
2898
+ forceIndex?: number;
2899
+ force?: Force;
2900
+ required?: Required[];
2777
2901
  sticky?: OverrideFeature;
2778
2902
  initial?: OverrideFeature;
2779
2903
  &nbsp;
@@ -3033,16 +3157,27 @@ export class FeaturevisorInstance {
3033
3157
  return result;
3034
3158
  }
3035
3159
  &nbsp;
3036
- private getBucketValue(feature: Feature, context: Context): BucketValue {
3160
+ private getBucketValue(
3161
+ feature: Feature,
3162
+ context: Context,
3163
+ ): { bucketKey: BucketKey; bucketValue: BucketValue } {
3037
3164
  const bucketKey = this.getBucketKey(feature, context);
3038
3165
  &nbsp;
3039
3166
  const value = getBucketedNumber(bucketKey);
3040
3167
  &nbsp;
3041
3168
  if (this.configureBucketValue) {
3042
- return this.configureBucketValue(feature, context, value);
3169
+ const configuredValue = this.configureBucketValue(feature, context, value);
3170
+ &nbsp;
3171
+ return {
3172
+ bucketKey,
3173
+ bucketValue: configuredValue,
3174
+ };
3043
3175
  }
3044
3176
  &nbsp;
3045
- return value;
3177
+ return {
3178
+ bucketKey,
3179
+ bucketValue: value,
3180
+ };
3046
3181
  }
3047
3182
  &nbsp;
3048
3183
  /**
@@ -3135,8 +3270,8 @@ export class FeaturevisorInstance {
3135
3270
  evaluation = {
3136
3271
  featureKey: key,
3137
3272
  reason: EvaluationReason.STICKY,
3138
- enabled: this.stickyFeatures[key].enabled,
3139
3273
  sticky: this.stickyFeatures[key],
3274
+ enabled: this.stickyFeatures[key].enabled,
3140
3275
  };
3141
3276
  &nbsp;
3142
3277
  this.logger.debug("using sticky enabled", evaluation);
@@ -3155,8 +3290,8 @@ export class FeaturevisorInstance {
3155
3290
  evaluation = {
3156
3291
  featureKey: key,
3157
3292
  reason: EvaluationReason.INITIAL,
3158
- enabled: this.initialFeatures[key].enabled,
3159
3293
  initial: this.initialFeatures[key],
3294
+ enabled: this.initialFeatures[key].enabled,
3160
3295
  };
3161
3296
  &nbsp;
3162
3297
  this.logger.debug("using initial enabled", evaluation);
@@ -3186,12 +3321,19 @@ export class FeaturevisorInstance {
3186
3321
  const finalContext = this.interceptContext ? this.interceptContext(context) : context;
3187
3322
  &nbsp;
3188
3323
  // forced
3189
- const force = findForceFromFeature(feature, context, this.datafileReader, this.logger);
3324
+ const { force, forceIndex } = findForceFromFeature(
3325
+ feature,
3326
+ context,
3327
+ this.datafileReader,
3328
+ this.logger,
3329
+ );
3190
3330
  &nbsp;
3191
3331
  if (force &amp;&amp; typeof force.enabled !== "undefined") {
3192
3332
  evaluation = {
3193
3333
  featureKey: feature.key,
3194
3334
  reason: EvaluationReason.FORCED,
3335
+ forceIndex,
3336
+ force,
3195
3337
  enabled: force.enabled,
3196
3338
  };
3197
3339
  &nbsp;
@@ -3232,6 +3374,7 @@ export class FeaturevisorInstance {
3232
3374
  evaluation = {
3233
3375
  featureKey: feature.key,
3234
3376
  reason: EvaluationReason.REQUIRED,
3377
+ required: feature.required,
3235
3378
  enabled: requiredFeaturesAreEnabled,
3236
3379
  };
3237
3380
  &nbsp;
@@ -3242,7 +3385,7 @@ export class FeaturevisorInstance {
3242
3385
  }
3243
3386
  &nbsp;
3244
3387
  // bucketing
3245
- const bucketValue = this.getBucketValue(feature, finalContext);
3388
+ const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
3246
3389
  &nbsp;
3247
3390
  const matchedTraffic = getMatchedTraffic(
3248
3391
  feature.traffic,
@@ -3263,9 +3406,12 @@ export class FeaturevisorInstance {
3263
3406
  evaluation = {
3264
3407
  featureKey: feature.key,
3265
3408
  reason: EvaluationReason.ALLOCATED,
3409
+ bucketKey,
3410
+ bucketValue,
3411
+ ruleKey: matchedTraffic.key,
3412
+ traffic: matchedTraffic,
3266
3413
  enabled:
3267
3414
  typeof matchedTraffic.enabled === "undefined" ? true : <span class="branch-1 cbranch-no" title="branch not covered" >matchedTraffic.enabled,</span>
3268
- bucketValue,
3269
3415
  };
3270
3416
  &nbsp;
3271
3417
  this.logger.debug("matched", evaluation);
@@ -3277,8 +3423,9 @@ export class FeaturevisorInstance {
3277
3423
  evaluation = {
3278
3424
  featureKey: feature.key,
3279
3425
  reason: EvaluationReason.OUT_OF_RANGE,
3280
- enabled: false,
3426
+ bucketKey,
3281
3427
  bucketValue,
3428
+ enabled: false,
3282
3429
  };
3283
3430
  &nbsp;
3284
3431
  this.logger.debug("not matched", evaluation);
@@ -3291,10 +3438,11 @@ export class FeaturevisorInstance {
3291
3438
  evaluation = {
3292
3439
  featureKey: feature.key,
3293
3440
  reason: EvaluationReason.OVERRIDE,
3294
- enabled: matchedTraffic.enabled,
3441
+ bucketKey,
3295
3442
  bucketValue,
3296
3443
  ruleKey: matchedTraffic.key,
3297
3444
  traffic: matchedTraffic,
3445
+ enabled: matchedTraffic.enabled,
3298
3446
  };
3299
3447
  &nbsp;
3300
3448
  this.logger.debug("override from rule", evaluation);
@@ -3307,10 +3455,11 @@ export class FeaturevisorInstance {
3307
3455
  evaluation = {
3308
3456
  featureKey: feature.key,
3309
3457
  reason: EvaluationReason.RULE,
3310
- enabled: true,
3458
+ bucketKey,
3311
3459
  bucketValue,
3312
3460
  ruleKey: matchedTraffic.key,
3313
3461
  traffic: matchedTraffic,
3462
+ enabled: true,
3314
3463
  };
3315
3464
  &nbsp;
3316
3465
  this.logger.debug("matched traffic", evaluation);
@@ -3322,9 +3471,10 @@ export class FeaturevisorInstance {
3322
3471
  // nothing matched
3323
3472
  evaluation = {
3324
3473
  featureKey: feature.key,
3325
- reason: EvaluationReason.ERROR,
3326
- enabled: false,
3474
+ reason: EvaluationReason.ERROR, // @TODO: any better reason?
3475
+ bucketKey,
3327
3476
  bucketValue,
3477
+ enabled: false,
3328
3478
  };
3329
3479
  &nbsp;
3330
3480
  this.logger.debug("nothing matched", evaluation);
@@ -3444,7 +3594,12 @@ export class FeaturevisorInstance {
3444
3594
  const finalContext = this.interceptContext ? this.interceptContext(context) : context;
3445
3595
  &nbsp;
3446
3596
  // forced
3447
- const force = findForceFromFeature(feature, context, this.datafileReader, this.logger);
3597
+ const { force, forceIndex } = findForceFromFeature(
3598
+ feature,
3599
+ context,
3600
+ this.datafileReader,
3601
+ this.logger,
3602
+ );
3448
3603
  &nbsp;
3449
3604
  if (force &amp;&amp; force.variation) {
3450
3605
  const variation = feature.variations.find((v) =&gt; v.value === force.variation);
@@ -3453,6 +3608,8 @@ export class FeaturevisorInstance {
3453
3608
  evaluation = {
3454
3609
  featureKey: feature.key,
3455
3610
  reason: EvaluationReason.FORCED,
3611
+ forceIndex,
3612
+ force,
3456
3613
  variation,
3457
3614
  };
3458
3615
  &nbsp;
@@ -3463,7 +3620,7 @@ export class FeaturevisorInstance {
3463
3620
  }
3464
3621
  &nbsp;
3465
3622
  // bucketing
3466
- const bucketValue = this.getBucketValue(feature, finalContext);
3623
+ const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
3467
3624
  &nbsp;
3468
3625
  const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(
3469
3626
  feature.traffic,
@@ -3482,9 +3639,11 @@ export class FeaturevisorInstance {
3482
3639
  evaluation = {
3483
3640
  featureKey: feature.key,
3484
3641
  reason: EvaluationReason.RULE,
3485
- variation,
3642
+ bucketKey,
3486
3643
  bucketValue,
3487
3644
  ruleKey: matchedTraffic.key,
3645
+ traffic: matchedTraffic,
3646
+ variation,
3488
3647
  };
3489
3648
  &nbsp;
3490
3649
  this.logger.debug("override from rule", evaluation);
@@ -3501,7 +3660,10 @@ export class FeaturevisorInstance {
3501
3660
  evaluation = {
3502
3661
  featureKey: feature.key,
3503
3662
  reason: EvaluationReason.ALLOCATED,
3663
+ bucketKey,
3504
3664
  bucketValue,
3665
+ ruleKey: matchedTraffic.key,
3666
+ traffic: matchedTraffic,
3505
3667
  variation,
3506
3668
  };
3507
3669
  &nbsp;
@@ -3515,7 +3677,8 @@ export class FeaturevisorInstance {
3515
3677
  // nothing matched
3516
3678
  <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3517
3679
  featureKey: feature.key,
3518
- reason: EvaluationReason.ERROR,
3680
+ reason: EvaluationReason.ERROR, // @TODO: any better reason?
3681
+ bucketKey,
3519
3682
  bucketValue,
3520
3683
  };
3521
3684
  &nbsp;
@@ -3711,12 +3874,19 @@ export class FeaturevisorInstance {
3711
3874
  const finalContext = this.interceptContext ? <span class="branch-0 cbranch-no" title="branch not covered" >this.interceptContext(context) </span>: context;
3712
3875
  &nbsp;
3713
3876
  // forced
3714
- const force = findForceFromFeature(feature, context, this.datafileReader, this.logger);
3877
+ const { force, forceIndex } = findForceFromFeature(
3878
+ feature,
3879
+ context,
3880
+ this.datafileReader,
3881
+ this.logger,
3882
+ );
3715
3883
  &nbsp;
3716
3884
  if (force &amp;&amp; force.variables &amp;&amp; typeof force.variables[variableKey] !== "undefined") {
3717
3885
  evaluation = {
3718
3886
  featureKey: feature.key,
3719
3887
  reason: EvaluationReason.FORCED,
3888
+ forceIndex,
3889
+ force,
3720
3890
  variableKey,
3721
3891
  variableSchema,
3722
3892
  variableValue: force.variables[variableKey],
@@ -3728,7 +3898,7 @@ export class FeaturevisorInstance {
3728
3898
  }
3729
3899
  &nbsp;
3730
3900
  // bucketing
3731
- const bucketValue = this.getBucketValue(feature, finalContext);
3901
+ const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
3732
3902
  &nbsp;
3733
3903
  const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(
3734
3904
  feature.traffic,
@@ -3747,11 +3917,13 @@ export class FeaturevisorInstance {
3747
3917
  evaluation = {
3748
3918
  featureKey: feature.key,
3749
3919
  reason: EvaluationReason.RULE,
3920
+ bucketKey,
3921
+ bucketValue,
3922
+ ruleKey: matchedTraffic.key,
3923
+ traffic: matchedTraffic,
3750
3924
  variableKey,
3751
3925
  variableSchema,
3752
3926
  variableValue: matchedTraffic.variables[variableKey],
3753
- bucketValue,
3754
- ruleKey: matchedTraffic.key,
3755
3927
  };
3756
3928
  &nbsp;
3757
3929
  this.logger.debug("override from rule", evaluation);
@@ -3801,11 +3973,13 @@ export class FeaturevisorInstance {
3801
3973
  evaluation = {
3802
3974
  featureKey: feature.key,
3803
3975
  reason: EvaluationReason.OVERRIDE,
3976
+ bucketKey,
3977
+ bucketValue,
3978
+ ruleKey: matchedTraffic.key,
3979
+ traffic: matchedTraffic,
3804
3980
  variableKey,
3805
3981
  variableSchema,
3806
3982
  variableValue: override.value,
3807
- bucketValue,
3808
- ruleKey: matchedTraffic.key,
3809
3983
  };
3810
3984
  &nbsp;
3811
3985
  this.logger.debug("variable override", evaluation);
@@ -3818,11 +3992,13 @@ export class FeaturevisorInstance {
3818
3992
  evaluation = {
3819
3993
  featureKey: feature.key,
3820
3994
  reason: EvaluationReason.ALLOCATED,
3995
+ bucketKey,
3996
+ bucketValue,
3997
+ ruleKey: matchedTraffic.key,
3998
+ traffic: matchedTraffic,
3821
3999
  variableKey,
3822
4000
  variableSchema,
3823
4001
  variableValue: variableFromVariation.value,
3824
- bucketValue,
3825
- ruleKey: matchedTraffic.key,
3826
4002
  };
3827
4003
  &nbsp;
3828
4004
  this.logger.debug("allocated variable", evaluation);
@@ -3838,10 +4014,11 @@ export class FeaturevisorInstance {
3838
4014
  evaluation = {
3839
4015
  featureKey: feature.key,
3840
4016
  reason: EvaluationReason.DEFAULTED,
4017
+ bucketKey,
4018
+ bucketValue,
3841
4019
  variableKey,
3842
4020
  variableSchema,
3843
4021
  variableValue: variableSchema.defaultValue,
3844
- bucketValue,
3845
4022
  };
3846
4023
  &nbsp;
3847
4024
  this.logger.debug("using default value", evaluation);
@@ -3970,7 +4147,7 @@ export function createInstance(options: InstanceOptions): FeaturevisorInstance {
3970
4147
  <div class='footer quiet pad2 space-top1 center small'>
3971
4148
  Code coverage generated by
3972
4149
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3973
- at 2024-04-05T16:04:58.225Z
4150
+ at 2024-04-07T21:40:20.948Z
3974
4151
  </div>
3975
4152
  <script src="prettify.js"></script>
3976
4153
  <script>
@@ -340,7 +340,7 @@ export function createLogger(options: CreateLoggerOptions = {}): Logger {
340
340
  <div class='footer quiet pad2 space-top1 center small'>
341
341
  Code coverage generated by
342
342
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
343
- at 2024-04-05T16:04:58.225Z
343
+ at 2024-04-07T21:40:20.948Z
344
344
  </div>
345
345
  <script src="prettify.js"></script>
346
346
  <script>
@@ -244,7 +244,7 @@ export function allGroupSegmentsAreMatched(
244
244
  <div class='footer quiet pad2 space-top1 center small'>
245
245
  Code coverage generated by
246
246
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
247
- at 2024-04-05T16:04:58.225Z
247
+ at 2024-04-07T21:40:20.948Z
248
248
  </div>
249
249
  <script src="prettify.js"></script>
250
250
  <script>