@featurevisor/sdk 1.16.0 → 1.20.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/.eslintcache +1 -1
- package/CHANGELOG.md +22 -0
- package/coverage/clover.xml +401 -393
- package/coverage/coverage-final.json +2 -2
- package/coverage/lcov-report/bucket.ts.html +1 -1
- package/coverage/lcov-report/conditions.ts.html +1 -1
- package/coverage/lcov-report/datafileReader.ts.html +1 -1
- package/coverage/lcov-report/emitter.ts.html +1 -1
- package/coverage/lcov-report/feature.ts.html +88 -22
- package/coverage/lcov-report/index.html +23 -23
- package/coverage/lcov-report/instance.ts.html +212 -32
- package/coverage/lcov-report/logger.ts.html +1 -1
- package/coverage/lcov-report/segments.ts.html +1 -1
- package/coverage/lcov.info +665 -655
- package/dist/index.js +1 -1
- package/dist/index.js.gz +0 -0
- package/dist/index.js.map +1 -1
- package/lib/feature.d.ts +5 -1
- package/lib/feature.js +19 -8
- package/lib/feature.js.map +1 -1
- package/lib/instance.d.ts +6 -1
- package/lib/instance.js +62 -27
- package/lib/instance.js.map +1 -1
- package/package.json +2 -2
- package/src/feature.ts +31 -9
- package/src/instance.ts +86 -26
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">89.
|
|
26
|
+
<span class="strong">89.73% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>376/419</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.
|
|
47
|
+
<span class="strong">89.83% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>371/413</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -1363,7 +1363,69 @@
|
|
|
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
|
|
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>
|
|
1426
|
+
<a name='L1361'></a><a href='#L1361'>1361</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1367
1429
|
<span class="cline-any cline-neutral"> </span>
|
|
1368
1430
|
<span class="cline-any cline-neutral"> </span>
|
|
1369
1431
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1461,6 +1523,11 @@
|
|
|
1461
1523
|
<span class="cline-any cline-yes">1x</span>
|
|
1462
1524
|
<span class="cline-any cline-yes">1x</span>
|
|
1463
1525
|
<span class="cline-any cline-yes">1x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1464
1531
|
<span class="cline-any cline-neutral"> </span>
|
|
1465
1532
|
<span class="cline-any cline-neutral"> </span>
|
|
1466
1533
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1734,6 +1801,9 @@
|
|
|
1734
1801
|
<span class="cline-any cline-neutral"> </span>
|
|
1735
1802
|
<span class="cline-any cline-neutral"> </span>
|
|
1736
1803
|
<span class="cline-any cline-neutral"> </span>
|
|
1804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
1807
|
<span class="cline-any cline-yes">95x</span>
|
|
1738
1808
|
<span class="cline-any cline-neutral"> </span>
|
|
1739
1809
|
<span class="cline-any cline-yes">95x</span>
|
|
@@ -1741,6 +1811,11 @@
|
|
|
1741
1811
|
<span class="cline-any cline-yes">95x</span>
|
|
1742
1812
|
<span class="cline-any cline-yes">2x</span>
|
|
1743
1813
|
<span class="cline-any cline-neutral"> </span>
|
|
1814
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1744
1819
|
<span class="cline-any cline-neutral"> </span>
|
|
1745
1820
|
<span class="cline-any cline-yes">93x</span>
|
|
1746
1821
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1749,6 +1824,9 @@
|
|
|
1749
1824
|
<span class="cline-any cline-neutral"> </span>
|
|
1750
1825
|
<span class="cline-any cline-neutral"> </span>
|
|
1751
1826
|
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
1830
|
<span class="cline-any cline-yes">5x</span>
|
|
1753
1831
|
<span class="cline-any cline-neutral"> </span>
|
|
1754
1832
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1888,6 +1966,11 @@
|
|
|
1888
1966
|
<span class="cline-any cline-neutral"> </span>
|
|
1889
1967
|
<span class="cline-any cline-yes">67x</span>
|
|
1890
1968
|
<span class="cline-any cline-neutral"> </span>
|
|
1969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1891
1974
|
<span class="cline-any cline-yes">67x</span>
|
|
1892
1975
|
<span class="cline-any cline-yes">9x</span>
|
|
1893
1976
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1895,6 +1978,8 @@
|
|
|
1895
1978
|
<span class="cline-any cline-neutral"> </span>
|
|
1896
1979
|
<span class="cline-any cline-neutral"> </span>
|
|
1897
1980
|
<span class="cline-any cline-neutral"> </span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1898
1983
|
<span class="cline-any cline-yes">9x</span>
|
|
1899
1984
|
<span class="cline-any cline-neutral"> </span>
|
|
1900
1985
|
<span class="cline-any cline-yes">9x</span>
|
|
@@ -1935,6 +2020,7 @@
|
|
|
1935
2020
|
<span class="cline-any cline-neutral"> </span>
|
|
1936
2021
|
<span class="cline-any cline-neutral"> </span>
|
|
1937
2022
|
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
2024
|
<span class="cline-any cline-yes">2x</span>
|
|
1939
2025
|
<span class="cline-any cline-neutral"> </span>
|
|
1940
2026
|
<span class="cline-any cline-yes">2x</span>
|
|
@@ -1968,6 +2054,9 @@
|
|
|
1968
2054
|
<span class="cline-any cline-neutral"> </span>
|
|
1969
2055
|
<span class="cline-any cline-neutral"> </span>
|
|
1970
2056
|
<span class="cline-any cline-neutral"> </span>
|
|
2057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1971
2060
|
<span class="cline-any cline-yes">1x</span>
|
|
1972
2061
|
<span class="cline-any cline-neutral"> </span>
|
|
1973
2062
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -1981,6 +2070,7 @@
|
|
|
1981
2070
|
<span class="cline-any cline-neutral"> </span>
|
|
1982
2071
|
<span class="cline-any cline-neutral"> </span>
|
|
1983
2072
|
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
2074
|
<span class="cline-any cline-yes">1x</span>
|
|
1985
2075
|
<span class="cline-any cline-neutral"> </span>
|
|
1986
2076
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -1997,6 +2087,7 @@
|
|
|
1997
2087
|
<span class="cline-any cline-neutral"> </span>
|
|
1998
2088
|
<span class="cline-any cline-neutral"> </span>
|
|
1999
2089
|
<span class="cline-any cline-neutral"> </span>
|
|
2090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2000
2091
|
<span class="cline-any cline-yes">1x</span>
|
|
2001
2092
|
<span class="cline-any cline-neutral"> </span>
|
|
2002
2093
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -2013,6 +2104,7 @@
|
|
|
2013
2104
|
<span class="cline-any cline-neutral"> </span>
|
|
2014
2105
|
<span class="cline-any cline-neutral"> </span>
|
|
2015
2106
|
<span class="cline-any cline-neutral"> </span>
|
|
2107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2016
2108
|
<span class="cline-any cline-yes">48x</span>
|
|
2017
2109
|
<span class="cline-any cline-neutral"> </span>
|
|
2018
2110
|
<span class="cline-any cline-yes">48x</span>
|
|
@@ -2027,6 +2119,7 @@
|
|
|
2027
2119
|
<span class="cline-any cline-neutral"> </span>
|
|
2028
2120
|
<span class="cline-any cline-neutral"> </span>
|
|
2029
2121
|
<span class="cline-any cline-neutral"> </span>
|
|
2122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
2123
|
<span class="cline-any cline-yes">5x</span>
|
|
2031
2124
|
<span class="cline-any cline-neutral"> </span>
|
|
2032
2125
|
<span class="cline-any cline-yes">5x</span>
|
|
@@ -2146,6 +2239,11 @@
|
|
|
2146
2239
|
<span class="cline-any cline-neutral"> </span>
|
|
2147
2240
|
<span class="cline-any cline-yes">18x</span>
|
|
2148
2241
|
<span class="cline-any cline-neutral"> </span>
|
|
2242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2149
2247
|
<span class="cline-any cline-yes">18x</span>
|
|
2150
2248
|
<span class="cline-any cline-yes">1x</span>
|
|
2151
2249
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -2156,6 +2254,8 @@
|
|
|
2156
2254
|
<span class="cline-any cline-neutral"> </span>
|
|
2157
2255
|
<span class="cline-any cline-neutral"> </span>
|
|
2158
2256
|
<span class="cline-any cline-neutral"> </span>
|
|
2257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2159
2259
|
<span class="cline-any cline-yes">1x</span>
|
|
2160
2260
|
<span class="cline-any cline-neutral"> </span>
|
|
2161
2261
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -2187,6 +2287,8 @@
|
|
|
2187
2287
|
<span class="cline-any cline-neutral"> </span>
|
|
2188
2288
|
<span class="cline-any cline-neutral"> </span>
|
|
2189
2289
|
<span class="cline-any cline-neutral"> </span>
|
|
2290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2190
2292
|
<span class="cline-any cline-yes">1x</span>
|
|
2191
2293
|
<span class="cline-any cline-neutral"> </span>
|
|
2192
2294
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -2205,6 +2307,9 @@
|
|
|
2205
2307
|
<span class="cline-any cline-neutral"> </span>
|
|
2206
2308
|
<span class="cline-any cline-neutral"> </span>
|
|
2207
2309
|
<span class="cline-any cline-neutral"> </span>
|
|
2310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2208
2313
|
<span class="cline-any cline-yes">16x</span>
|
|
2209
2314
|
<span class="cline-any cline-neutral"> </span>
|
|
2210
2315
|
<span class="cline-any cline-yes">16x</span>
|
|
@@ -2219,6 +2324,7 @@
|
|
|
2219
2324
|
<span class="cline-any cline-neutral"> </span>
|
|
2220
2325
|
<span class="cline-any cline-neutral"> </span>
|
|
2221
2326
|
<span class="cline-any cline-neutral"> </span>
|
|
2327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2222
2328
|
<span class="cline-any cline-no"> </span>
|
|
2223
2329
|
<span class="cline-any cline-neutral"> </span>
|
|
2224
2330
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2413,6 +2519,11 @@
|
|
|
2413
2519
|
<span class="cline-any cline-neutral"> </span>
|
|
2414
2520
|
<span class="cline-any cline-yes">23x</span>
|
|
2415
2521
|
<span class="cline-any cline-neutral"> </span>
|
|
2522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2416
2527
|
<span class="cline-any cline-yes">23x</span>
|
|
2417
2528
|
<span class="cline-any cline-yes">1x</span>
|
|
2418
2529
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -2422,6 +2533,8 @@
|
|
|
2422
2533
|
<span class="cline-any cline-neutral"> </span>
|
|
2423
2534
|
<span class="cline-any cline-neutral"> </span>
|
|
2424
2535
|
<span class="cline-any cline-neutral"> </span>
|
|
2536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2425
2538
|
<span class="cline-any cline-yes">1x</span>
|
|
2426
2539
|
<span class="cline-any cline-neutral"> </span>
|
|
2427
2540
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -2454,6 +2567,8 @@
|
|
|
2454
2567
|
<span class="cline-any cline-neutral"> </span>
|
|
2455
2568
|
<span class="cline-any cline-neutral"> </span>
|
|
2456
2569
|
<span class="cline-any cline-neutral"> </span>
|
|
2570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2457
2572
|
<span class="cline-any cline-yes">2x</span>
|
|
2458
2573
|
<span class="cline-any cline-neutral"> </span>
|
|
2459
2574
|
<span class="cline-any cline-yes">2x</span>
|
|
@@ -2508,6 +2623,8 @@
|
|
|
2508
2623
|
<span class="cline-any cline-neutral"> </span>
|
|
2509
2624
|
<span class="cline-any cline-neutral"> </span>
|
|
2510
2625
|
<span class="cline-any cline-neutral"> </span>
|
|
2626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2511
2628
|
<span class="cline-any cline-yes">4x</span>
|
|
2512
2629
|
<span class="cline-any cline-neutral"> </span>
|
|
2513
2630
|
<span class="cline-any cline-yes">4x</span>
|
|
@@ -2525,6 +2642,8 @@
|
|
|
2525
2642
|
<span class="cline-any cline-neutral"> </span>
|
|
2526
2643
|
<span class="cline-any cline-neutral"> </span>
|
|
2527
2644
|
<span class="cline-any cline-neutral"> </span>
|
|
2645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2528
2647
|
<span class="cline-any cline-yes">3x</span>
|
|
2529
2648
|
<span class="cline-any cline-neutral"> </span>
|
|
2530
2649
|
<span class="cline-any cline-yes">3x</span>
|
|
@@ -2544,6 +2663,7 @@
|
|
|
2544
2663
|
<span class="cline-any cline-neutral"> </span>
|
|
2545
2664
|
<span class="cline-any cline-neutral"> </span>
|
|
2546
2665
|
<span class="cline-any cline-neutral"> </span>
|
|
2666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2547
2667
|
<span class="cline-any cline-yes">13x</span>
|
|
2548
2668
|
<span class="cline-any cline-neutral"> </span>
|
|
2549
2669
|
<span class="cline-any cline-yes">13x</span>
|
|
@@ -2682,6 +2802,8 @@
|
|
|
2682
2802
|
RuleKey,
|
|
2683
2803
|
VariableKey,
|
|
2684
2804
|
VariableSchema,
|
|
2805
|
+
Force,
|
|
2806
|
+
Required,
|
|
2685
2807
|
} from "@featurevisor/types";
|
|
2686
2808
|
|
|
2687
2809
|
import { createLogger, Logger, LogLevel } from "./logger";
|
|
@@ -2750,6 +2872,7 @@ export type DatafileFetchHandler = (datafileUrl: string) => Promise<Datafi
|
|
|
2750
2872
|
export enum EvaluationReason {
|
|
2751
2873
|
NOT_FOUND = "not_found",
|
|
2752
2874
|
NO_VARIATIONS = "no_variations",
|
|
2875
|
+
NO_MATCH = "no_match",
|
|
2753
2876
|
DISABLED = "disabled",
|
|
2754
2877
|
REQUIRED = "required",
|
|
2755
2878
|
OUT_OF_RANGE = "out_of_range",
|
|
@@ -2769,11 +2892,15 @@ export interface Evaluation {
|
|
|
2769
2892
|
reason: EvaluationReason;
|
|
2770
2893
|
|
|
2771
2894
|
// common
|
|
2895
|
+
bucketKey?: BucketKey;
|
|
2772
2896
|
bucketValue?: BucketValue;
|
|
2773
2897
|
ruleKey?: RuleKey;
|
|
2774
2898
|
error?: Error;
|
|
2775
2899
|
enabled?: boolean;
|
|
2776
2900
|
traffic?: Traffic;
|
|
2901
|
+
forceIndex?: number;
|
|
2902
|
+
force?: Force;
|
|
2903
|
+
required?: Required[];
|
|
2777
2904
|
sticky?: OverrideFeature;
|
|
2778
2905
|
initial?: OverrideFeature;
|
|
2779
2906
|
|
|
@@ -3033,16 +3160,27 @@ export class FeaturevisorInstance {
|
|
|
3033
3160
|
return result;
|
|
3034
3161
|
}
|
|
3035
3162
|
|
|
3036
|
-
private getBucketValue(
|
|
3163
|
+
private getBucketValue(
|
|
3164
|
+
feature: Feature,
|
|
3165
|
+
context: Context,
|
|
3166
|
+
): { bucketKey: BucketKey; bucketValue: BucketValue } {
|
|
3037
3167
|
const bucketKey = this.getBucketKey(feature, context);
|
|
3038
3168
|
|
|
3039
3169
|
const value = getBucketedNumber(bucketKey);
|
|
3040
3170
|
|
|
3041
3171
|
if (this.configureBucketValue) {
|
|
3042
|
-
|
|
3172
|
+
const configuredValue = this.configureBucketValue(feature, context, value);
|
|
3173
|
+
|
|
3174
|
+
return {
|
|
3175
|
+
bucketKey,
|
|
3176
|
+
bucketValue: configuredValue,
|
|
3177
|
+
};
|
|
3043
3178
|
}
|
|
3044
3179
|
|
|
3045
|
-
return
|
|
3180
|
+
return {
|
|
3181
|
+
bucketKey,
|
|
3182
|
+
bucketValue: value,
|
|
3183
|
+
};
|
|
3046
3184
|
}
|
|
3047
3185
|
|
|
3048
3186
|
/**
|
|
@@ -3135,8 +3273,8 @@ export class FeaturevisorInstance {
|
|
|
3135
3273
|
evaluation = {
|
|
3136
3274
|
featureKey: key,
|
|
3137
3275
|
reason: EvaluationReason.STICKY,
|
|
3138
|
-
enabled: this.stickyFeatures[key].enabled,
|
|
3139
3276
|
sticky: this.stickyFeatures[key],
|
|
3277
|
+
enabled: this.stickyFeatures[key].enabled,
|
|
3140
3278
|
};
|
|
3141
3279
|
|
|
3142
3280
|
this.logger.debug("using sticky enabled", evaluation);
|
|
@@ -3155,8 +3293,8 @@ export class FeaturevisorInstance {
|
|
|
3155
3293
|
evaluation = {
|
|
3156
3294
|
featureKey: key,
|
|
3157
3295
|
reason: EvaluationReason.INITIAL,
|
|
3158
|
-
enabled: this.initialFeatures[key].enabled,
|
|
3159
3296
|
initial: this.initialFeatures[key],
|
|
3297
|
+
enabled: this.initialFeatures[key].enabled,
|
|
3160
3298
|
};
|
|
3161
3299
|
|
|
3162
3300
|
this.logger.debug("using initial enabled", evaluation);
|
|
@@ -3186,12 +3324,19 @@ export class FeaturevisorInstance {
|
|
|
3186
3324
|
const finalContext = this.interceptContext ? this.interceptContext(context) : context;
|
|
3187
3325
|
|
|
3188
3326
|
// forced
|
|
3189
|
-
const force = findForceFromFeature(
|
|
3327
|
+
const { force, forceIndex } = findForceFromFeature(
|
|
3328
|
+
feature,
|
|
3329
|
+
context,
|
|
3330
|
+
this.datafileReader,
|
|
3331
|
+
this.logger,
|
|
3332
|
+
);
|
|
3190
3333
|
|
|
3191
3334
|
if (force && typeof force.enabled !== "undefined") {
|
|
3192
3335
|
evaluation = {
|
|
3193
3336
|
featureKey: feature.key,
|
|
3194
3337
|
reason: EvaluationReason.FORCED,
|
|
3338
|
+
forceIndex,
|
|
3339
|
+
force,
|
|
3195
3340
|
enabled: force.enabled,
|
|
3196
3341
|
};
|
|
3197
3342
|
|
|
@@ -3232,6 +3377,7 @@ export class FeaturevisorInstance {
|
|
|
3232
3377
|
evaluation = {
|
|
3233
3378
|
featureKey: feature.key,
|
|
3234
3379
|
reason: EvaluationReason.REQUIRED,
|
|
3380
|
+
required: feature.required,
|
|
3235
3381
|
enabled: requiredFeaturesAreEnabled,
|
|
3236
3382
|
};
|
|
3237
3383
|
|
|
@@ -3242,7 +3388,7 @@ export class FeaturevisorInstance {
|
|
|
3242
3388
|
}
|
|
3243
3389
|
|
|
3244
3390
|
// bucketing
|
|
3245
|
-
const bucketValue = this.getBucketValue(feature, finalContext);
|
|
3391
|
+
const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
|
|
3246
3392
|
|
|
3247
3393
|
const matchedTraffic = getMatchedTraffic(
|
|
3248
3394
|
feature.traffic,
|
|
@@ -3263,9 +3409,12 @@ export class FeaturevisorInstance {
|
|
|
3263
3409
|
evaluation = {
|
|
3264
3410
|
featureKey: feature.key,
|
|
3265
3411
|
reason: EvaluationReason.ALLOCATED,
|
|
3412
|
+
bucketKey,
|
|
3413
|
+
bucketValue,
|
|
3414
|
+
ruleKey: matchedTraffic.key,
|
|
3415
|
+
traffic: matchedTraffic,
|
|
3266
3416
|
enabled:
|
|
3267
3417
|
typeof matchedTraffic.enabled === "undefined" ? true : <span class="branch-1 cbranch-no" title="branch not covered" >matchedTraffic.enabled,</span>
|
|
3268
|
-
bucketValue,
|
|
3269
3418
|
};
|
|
3270
3419
|
|
|
3271
3420
|
this.logger.debug("matched", evaluation);
|
|
@@ -3277,8 +3426,9 @@ export class FeaturevisorInstance {
|
|
|
3277
3426
|
evaluation = {
|
|
3278
3427
|
featureKey: feature.key,
|
|
3279
3428
|
reason: EvaluationReason.OUT_OF_RANGE,
|
|
3280
|
-
|
|
3429
|
+
bucketKey,
|
|
3281
3430
|
bucketValue,
|
|
3431
|
+
enabled: false,
|
|
3282
3432
|
};
|
|
3283
3433
|
|
|
3284
3434
|
this.logger.debug("not matched", evaluation);
|
|
@@ -3291,10 +3441,11 @@ export class FeaturevisorInstance {
|
|
|
3291
3441
|
evaluation = {
|
|
3292
3442
|
featureKey: feature.key,
|
|
3293
3443
|
reason: EvaluationReason.OVERRIDE,
|
|
3294
|
-
|
|
3444
|
+
bucketKey,
|
|
3295
3445
|
bucketValue,
|
|
3296
3446
|
ruleKey: matchedTraffic.key,
|
|
3297
3447
|
traffic: matchedTraffic,
|
|
3448
|
+
enabled: matchedTraffic.enabled,
|
|
3298
3449
|
};
|
|
3299
3450
|
|
|
3300
3451
|
this.logger.debug("override from rule", evaluation);
|
|
@@ -3307,10 +3458,11 @@ export class FeaturevisorInstance {
|
|
|
3307
3458
|
evaluation = {
|
|
3308
3459
|
featureKey: feature.key,
|
|
3309
3460
|
reason: EvaluationReason.RULE,
|
|
3310
|
-
|
|
3461
|
+
bucketKey,
|
|
3311
3462
|
bucketValue,
|
|
3312
3463
|
ruleKey: matchedTraffic.key,
|
|
3313
3464
|
traffic: matchedTraffic,
|
|
3465
|
+
enabled: true,
|
|
3314
3466
|
};
|
|
3315
3467
|
|
|
3316
3468
|
this.logger.debug("matched traffic", evaluation);
|
|
@@ -3322,9 +3474,10 @@ export class FeaturevisorInstance {
|
|
|
3322
3474
|
// nothing matched
|
|
3323
3475
|
evaluation = {
|
|
3324
3476
|
featureKey: feature.key,
|
|
3325
|
-
reason: EvaluationReason.
|
|
3326
|
-
|
|
3477
|
+
reason: EvaluationReason.NO_MATCH,
|
|
3478
|
+
bucketKey,
|
|
3327
3479
|
bucketValue,
|
|
3480
|
+
enabled: false,
|
|
3328
3481
|
};
|
|
3329
3482
|
|
|
3330
3483
|
this.logger.debug("nothing matched", evaluation);
|
|
@@ -3444,7 +3597,12 @@ export class FeaturevisorInstance {
|
|
|
3444
3597
|
const finalContext = this.interceptContext ? this.interceptContext(context) : context;
|
|
3445
3598
|
|
|
3446
3599
|
// forced
|
|
3447
|
-
const force = findForceFromFeature(
|
|
3600
|
+
const { force, forceIndex } = findForceFromFeature(
|
|
3601
|
+
feature,
|
|
3602
|
+
context,
|
|
3603
|
+
this.datafileReader,
|
|
3604
|
+
this.logger,
|
|
3605
|
+
);
|
|
3448
3606
|
|
|
3449
3607
|
if (force && force.variation) {
|
|
3450
3608
|
const variation = feature.variations.find((v) => v.value === force.variation);
|
|
@@ -3453,6 +3611,8 @@ export class FeaturevisorInstance {
|
|
|
3453
3611
|
evaluation = {
|
|
3454
3612
|
featureKey: feature.key,
|
|
3455
3613
|
reason: EvaluationReason.FORCED,
|
|
3614
|
+
forceIndex,
|
|
3615
|
+
force,
|
|
3456
3616
|
variation,
|
|
3457
3617
|
};
|
|
3458
3618
|
|
|
@@ -3463,7 +3623,7 @@ export class FeaturevisorInstance {
|
|
|
3463
3623
|
}
|
|
3464
3624
|
|
|
3465
3625
|
// bucketing
|
|
3466
|
-
const bucketValue = this.getBucketValue(feature, finalContext);
|
|
3626
|
+
const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
|
|
3467
3627
|
|
|
3468
3628
|
const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(
|
|
3469
3629
|
feature.traffic,
|
|
@@ -3482,9 +3642,11 @@ export class FeaturevisorInstance {
|
|
|
3482
3642
|
evaluation = {
|
|
3483
3643
|
featureKey: feature.key,
|
|
3484
3644
|
reason: EvaluationReason.RULE,
|
|
3485
|
-
|
|
3645
|
+
bucketKey,
|
|
3486
3646
|
bucketValue,
|
|
3487
3647
|
ruleKey: matchedTraffic.key,
|
|
3648
|
+
traffic: matchedTraffic,
|
|
3649
|
+
variation,
|
|
3488
3650
|
};
|
|
3489
3651
|
|
|
3490
3652
|
this.logger.debug("override from rule", evaluation);
|
|
@@ -3501,7 +3663,10 @@ export class FeaturevisorInstance {
|
|
|
3501
3663
|
evaluation = {
|
|
3502
3664
|
featureKey: feature.key,
|
|
3503
3665
|
reason: EvaluationReason.ALLOCATED,
|
|
3666
|
+
bucketKey,
|
|
3504
3667
|
bucketValue,
|
|
3668
|
+
ruleKey: matchedTraffic.key,
|
|
3669
|
+
traffic: matchedTraffic,
|
|
3505
3670
|
variation,
|
|
3506
3671
|
};
|
|
3507
3672
|
|
|
@@ -3515,7 +3680,8 @@ export class FeaturevisorInstance {
|
|
|
3515
3680
|
// nothing matched
|
|
3516
3681
|
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3517
3682
|
featureKey: feature.key,
|
|
3518
|
-
reason: EvaluationReason.
|
|
3683
|
+
reason: EvaluationReason.NO_MATCH,
|
|
3684
|
+
bucketKey,
|
|
3519
3685
|
bucketValue,
|
|
3520
3686
|
};
|
|
3521
3687
|
|
|
@@ -3711,12 +3877,19 @@ export class FeaturevisorInstance {
|
|
|
3711
3877
|
const finalContext = this.interceptContext ? <span class="branch-0 cbranch-no" title="branch not covered" >this.interceptContext(context) </span>: context;
|
|
3712
3878
|
|
|
3713
3879
|
// forced
|
|
3714
|
-
const force = findForceFromFeature(
|
|
3880
|
+
const { force, forceIndex } = findForceFromFeature(
|
|
3881
|
+
feature,
|
|
3882
|
+
context,
|
|
3883
|
+
this.datafileReader,
|
|
3884
|
+
this.logger,
|
|
3885
|
+
);
|
|
3715
3886
|
|
|
3716
3887
|
if (force && force.variables && typeof force.variables[variableKey] !== "undefined") {
|
|
3717
3888
|
evaluation = {
|
|
3718
3889
|
featureKey: feature.key,
|
|
3719
3890
|
reason: EvaluationReason.FORCED,
|
|
3891
|
+
forceIndex,
|
|
3892
|
+
force,
|
|
3720
3893
|
variableKey,
|
|
3721
3894
|
variableSchema,
|
|
3722
3895
|
variableValue: force.variables[variableKey],
|
|
@@ -3728,7 +3901,7 @@ export class FeaturevisorInstance {
|
|
|
3728
3901
|
}
|
|
3729
3902
|
|
|
3730
3903
|
// bucketing
|
|
3731
|
-
const bucketValue = this.getBucketValue(feature, finalContext);
|
|
3904
|
+
const { bucketKey, bucketValue } = this.getBucketValue(feature, finalContext);
|
|
3732
3905
|
|
|
3733
3906
|
const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(
|
|
3734
3907
|
feature.traffic,
|
|
@@ -3747,11 +3920,13 @@ export class FeaturevisorInstance {
|
|
|
3747
3920
|
evaluation = {
|
|
3748
3921
|
featureKey: feature.key,
|
|
3749
3922
|
reason: EvaluationReason.RULE,
|
|
3923
|
+
bucketKey,
|
|
3924
|
+
bucketValue,
|
|
3925
|
+
ruleKey: matchedTraffic.key,
|
|
3926
|
+
traffic: matchedTraffic,
|
|
3750
3927
|
variableKey,
|
|
3751
3928
|
variableSchema,
|
|
3752
3929
|
variableValue: matchedTraffic.variables[variableKey],
|
|
3753
|
-
bucketValue,
|
|
3754
|
-
ruleKey: matchedTraffic.key,
|
|
3755
3930
|
};
|
|
3756
3931
|
|
|
3757
3932
|
this.logger.debug("override from rule", evaluation);
|
|
@@ -3801,11 +3976,13 @@ export class FeaturevisorInstance {
|
|
|
3801
3976
|
evaluation = {
|
|
3802
3977
|
featureKey: feature.key,
|
|
3803
3978
|
reason: EvaluationReason.OVERRIDE,
|
|
3979
|
+
bucketKey,
|
|
3980
|
+
bucketValue,
|
|
3981
|
+
ruleKey: matchedTraffic.key,
|
|
3982
|
+
traffic: matchedTraffic,
|
|
3804
3983
|
variableKey,
|
|
3805
3984
|
variableSchema,
|
|
3806
3985
|
variableValue: override.value,
|
|
3807
|
-
bucketValue,
|
|
3808
|
-
ruleKey: matchedTraffic.key,
|
|
3809
3986
|
};
|
|
3810
3987
|
|
|
3811
3988
|
this.logger.debug("variable override", evaluation);
|
|
@@ -3818,11 +3995,13 @@ export class FeaturevisorInstance {
|
|
|
3818
3995
|
evaluation = {
|
|
3819
3996
|
featureKey: feature.key,
|
|
3820
3997
|
reason: EvaluationReason.ALLOCATED,
|
|
3998
|
+
bucketKey,
|
|
3999
|
+
bucketValue,
|
|
4000
|
+
ruleKey: matchedTraffic.key,
|
|
4001
|
+
traffic: matchedTraffic,
|
|
3821
4002
|
variableKey,
|
|
3822
4003
|
variableSchema,
|
|
3823
4004
|
variableValue: variableFromVariation.value,
|
|
3824
|
-
bucketValue,
|
|
3825
|
-
ruleKey: matchedTraffic.key,
|
|
3826
4005
|
};
|
|
3827
4006
|
|
|
3828
4007
|
this.logger.debug("allocated variable", evaluation);
|
|
@@ -3838,10 +4017,11 @@ export class FeaturevisorInstance {
|
|
|
3838
4017
|
evaluation = {
|
|
3839
4018
|
featureKey: feature.key,
|
|
3840
4019
|
reason: EvaluationReason.DEFAULTED,
|
|
4020
|
+
bucketKey,
|
|
4021
|
+
bucketValue,
|
|
3841
4022
|
variableKey,
|
|
3842
4023
|
variableSchema,
|
|
3843
4024
|
variableValue: variableSchema.defaultValue,
|
|
3844
|
-
bucketValue,
|
|
3845
4025
|
};
|
|
3846
4026
|
|
|
3847
4027
|
this.logger.debug("using default value", evaluation);
|
|
@@ -3970,7 +4150,7 @@ export function createInstance(options: InstanceOptions): FeaturevisorInstance {
|
|
|
3970
4150
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
3971
4151
|
Code coverage generated by
|
|
3972
4152
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3973
|
-
at 2024-04-
|
|
4153
|
+
at 2024-04-30T18:08:48.599Z
|
|
3974
4154
|
</div>
|
|
3975
4155
|
<script src="prettify.js"></script>
|
|
3976
4156
|
<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-
|
|
343
|
+
at 2024-04-30T18:08:48.599Z
|
|
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-
|
|
247
|
+
at 2024-04-30T18:08:48.599Z
|
|
248
248
|
</div>
|
|
249
249
|
<script src="prettify.js"></script>
|
|
250
250
|
<script>
|