@featurevisor/sdk 0.34.0 → 0.35.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/CHANGELOG.md +11 -0
- package/coverage/clover.xml +333 -322
- 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 +13 -805
- package/coverage/lcov-report/index.html +28 -28
- package/coverage/lcov-report/instance.ts.html +1018 -109
- package/coverage/lcov-report/logger.ts.html +1 -1
- package/coverage/lcov-report/segments.ts.html +1 -1
- package/coverage/lcov.info +603 -578
- 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 +2 -9
- package/lib/feature.js +1 -169
- package/lib/feature.js.map +1 -1
- package/lib/instance.d.ts +26 -1
- package/lib/instance.js +313 -81
- package/lib/instance.js.map +1 -1
- package/package.json +3 -3
- package/src/feature.ts +2 -266
- package/src/instance.ts +398 -95
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">50% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>165/330</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">33.72% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>57/169</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">43.39% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>23/53</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">50.77% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>164/323</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -810,7 +810,314 @@
|
|
|
810
810
|
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
811
|
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
812
|
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
-
<a name='L748'></a><a href='#L748'>748</a
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
+
<a name='L854'></a><a href='#L854'>854</a>
|
|
920
|
+
<a name='L855'></a><a href='#L855'>855</a>
|
|
921
|
+
<a name='L856'></a><a href='#L856'>856</a>
|
|
922
|
+
<a name='L857'></a><a href='#L857'>857</a>
|
|
923
|
+
<a name='L858'></a><a href='#L858'>858</a>
|
|
924
|
+
<a name='L859'></a><a href='#L859'>859</a>
|
|
925
|
+
<a name='L860'></a><a href='#L860'>860</a>
|
|
926
|
+
<a name='L861'></a><a href='#L861'>861</a>
|
|
927
|
+
<a name='L862'></a><a href='#L862'>862</a>
|
|
928
|
+
<a name='L863'></a><a href='#L863'>863</a>
|
|
929
|
+
<a name='L864'></a><a href='#L864'>864</a>
|
|
930
|
+
<a name='L865'></a><a href='#L865'>865</a>
|
|
931
|
+
<a name='L866'></a><a href='#L866'>866</a>
|
|
932
|
+
<a name='L867'></a><a href='#L867'>867</a>
|
|
933
|
+
<a name='L868'></a><a href='#L868'>868</a>
|
|
934
|
+
<a name='L869'></a><a href='#L869'>869</a>
|
|
935
|
+
<a name='L870'></a><a href='#L870'>870</a>
|
|
936
|
+
<a name='L871'></a><a href='#L871'>871</a>
|
|
937
|
+
<a name='L872'></a><a href='#L872'>872</a>
|
|
938
|
+
<a name='L873'></a><a href='#L873'>873</a>
|
|
939
|
+
<a name='L874'></a><a href='#L874'>874</a>
|
|
940
|
+
<a name='L875'></a><a href='#L875'>875</a>
|
|
941
|
+
<a name='L876'></a><a href='#L876'>876</a>
|
|
942
|
+
<a name='L877'></a><a href='#L877'>877</a>
|
|
943
|
+
<a name='L878'></a><a href='#L878'>878</a>
|
|
944
|
+
<a name='L879'></a><a href='#L879'>879</a>
|
|
945
|
+
<a name='L880'></a><a href='#L880'>880</a>
|
|
946
|
+
<a name='L881'></a><a href='#L881'>881</a>
|
|
947
|
+
<a name='L882'></a><a href='#L882'>882</a>
|
|
948
|
+
<a name='L883'></a><a href='#L883'>883</a>
|
|
949
|
+
<a name='L884'></a><a href='#L884'>884</a>
|
|
950
|
+
<a name='L885'></a><a href='#L885'>885</a>
|
|
951
|
+
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
+
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
+
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
+
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
+
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
+
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
+
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
+
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
+
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
+
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
+
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
+
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
+
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
+
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
+
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
+
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
+
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
+
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
+
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
+
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
+
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
+
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
+
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
+
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
+
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
+
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
+
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
+
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
+
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
+
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
+
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
+
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
+
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
+
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
+
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
+
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
+
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
+
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
+
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
+
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
+
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
+
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
+
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
+
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
+
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
+
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
+
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
+
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
+
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
+
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
+
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
+
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
+
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
+
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
+
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
+
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
+
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
+
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
+
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
+
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
+
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
+
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
+
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
+
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
+
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
+
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
+
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
+
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
+
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
+
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
+
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
+
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
+
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
+
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
+
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
+
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
+
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
+
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
+
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
+
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
+
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
+
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
+
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
+
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
+
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
+
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
+
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
+
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
+
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
+
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
+
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
+
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
+
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
+
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
+
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
+
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
+
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
+
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
+
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
+
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
+
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
+
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
+
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
+
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
+
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
+
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
+
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
+
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
+
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
+
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
+
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
+
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
+
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
+
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
+
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
+
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
+
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
+
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
+
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
+
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
+
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
+
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
+
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
+
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
+
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
+
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
+
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
+
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
+
<a name='L1014'></a><a href='#L1014'>1014</a>
|
|
1080
|
+
<a name='L1015'></a><a href='#L1015'>1015</a>
|
|
1081
|
+
<a name='L1016'></a><a href='#L1016'>1016</a>
|
|
1082
|
+
<a name='L1017'></a><a href='#L1017'>1017</a>
|
|
1083
|
+
<a name='L1018'></a><a href='#L1018'>1018</a>
|
|
1084
|
+
<a name='L1019'></a><a href='#L1019'>1019</a>
|
|
1085
|
+
<a name='L1020'></a><a href='#L1020'>1020</a>
|
|
1086
|
+
<a name='L1021'></a><a href='#L1021'>1021</a>
|
|
1087
|
+
<a name='L1022'></a><a href='#L1022'>1022</a>
|
|
1088
|
+
<a name='L1023'></a><a href='#L1023'>1023</a>
|
|
1089
|
+
<a name='L1024'></a><a href='#L1024'>1024</a>
|
|
1090
|
+
<a name='L1025'></a><a href='#L1025'>1025</a>
|
|
1091
|
+
<a name='L1026'></a><a href='#L1026'>1026</a>
|
|
1092
|
+
<a name='L1027'></a><a href='#L1027'>1027</a>
|
|
1093
|
+
<a name='L1028'></a><a href='#L1028'>1028</a>
|
|
1094
|
+
<a name='L1029'></a><a href='#L1029'>1029</a>
|
|
1095
|
+
<a name='L1030'></a><a href='#L1030'>1030</a>
|
|
1096
|
+
<a name='L1031'></a><a href='#L1031'>1031</a>
|
|
1097
|
+
<a name='L1032'></a><a href='#L1032'>1032</a>
|
|
1098
|
+
<a name='L1033'></a><a href='#L1033'>1033</a>
|
|
1099
|
+
<a name='L1034'></a><a href='#L1034'>1034</a>
|
|
1100
|
+
<a name='L1035'></a><a href='#L1035'>1035</a>
|
|
1101
|
+
<a name='L1036'></a><a href='#L1036'>1036</a>
|
|
1102
|
+
<a name='L1037'></a><a href='#L1037'>1037</a>
|
|
1103
|
+
<a name='L1038'></a><a href='#L1038'>1038</a>
|
|
1104
|
+
<a name='L1039'></a><a href='#L1039'>1039</a>
|
|
1105
|
+
<a name='L1040'></a><a href='#L1040'>1040</a>
|
|
1106
|
+
<a name='L1041'></a><a href='#L1041'>1041</a>
|
|
1107
|
+
<a name='L1042'></a><a href='#L1042'>1042</a>
|
|
1108
|
+
<a name='L1043'></a><a href='#L1043'>1043</a>
|
|
1109
|
+
<a name='L1044'></a><a href='#L1044'>1044</a>
|
|
1110
|
+
<a name='L1045'></a><a href='#L1045'>1045</a>
|
|
1111
|
+
<a name='L1046'></a><a href='#L1046'>1046</a>
|
|
1112
|
+
<a name='L1047'></a><a href='#L1047'>1047</a>
|
|
1113
|
+
<a name='L1048'></a><a href='#L1048'>1048</a>
|
|
1114
|
+
<a name='L1049'></a><a href='#L1049'>1049</a>
|
|
1115
|
+
<a name='L1050'></a><a href='#L1050'>1050</a>
|
|
1116
|
+
<a name='L1051'></a><a href='#L1051'>1051</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
1121
|
<span class="cline-any cline-neutral"> </span>
|
|
815
1122
|
<span class="cline-any cline-neutral"> </span>
|
|
816
1123
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -831,6 +1138,9 @@
|
|
|
831
1138
|
<span class="cline-any cline-yes">1x</span>
|
|
832
1139
|
<span class="cline-any cline-yes">1x</span>
|
|
833
1140
|
<span class="cline-any cline-yes">1x</span>
|
|
1141
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1142
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
1144
|
<span class="cline-any cline-neutral"> </span>
|
|
835
1145
|
<span class="cline-any cline-neutral"> </span>
|
|
836
1146
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -849,13 +1159,13 @@
|
|
|
849
1159
|
<span class="cline-any cline-neutral"> </span>
|
|
850
1160
|
<span class="cline-any cline-neutral"> </span>
|
|
851
1161
|
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-yes">1x</span>
|
|
852
1163
|
<span class="cline-any cline-neutral"> </span>
|
|
853
1164
|
<span class="cline-any cline-neutral"> </span>
|
|
854
1165
|
<span class="cline-any cline-neutral"> </span>
|
|
855
1166
|
<span class="cline-any cline-neutral"> </span>
|
|
856
1167
|
<span class="cline-any cline-neutral"> </span>
|
|
857
1168
|
<span class="cline-any cline-neutral"> </span>
|
|
858
|
-
<span class="cline-any cline-yes">1x</span>
|
|
859
1169
|
<span class="cline-any cline-neutral"> </span>
|
|
860
1170
|
<span class="cline-any cline-neutral"> </span>
|
|
861
1171
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -869,13 +1179,39 @@
|
|
|
869
1179
|
<span class="cline-any cline-neutral"> </span>
|
|
870
1180
|
<span class="cline-any cline-neutral"> </span>
|
|
871
1181
|
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
1184
|
<span class="cline-any cline-neutral"> </span>
|
|
873
1185
|
<span class="cline-any cline-neutral"> </span>
|
|
874
1186
|
<span class="cline-any cline-neutral"> </span>
|
|
875
1187
|
<span class="cline-any cline-neutral"> </span>
|
|
876
1188
|
<span class="cline-any cline-neutral"> </span>
|
|
877
1189
|
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-yes">1x</span>
|
|
878
1193
|
<span class="cline-any cline-yes">1x</span>
|
|
1194
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1195
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1196
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1197
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1199
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1200
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1201
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
879
1215
|
<span class="cline-any cline-neutral"> </span>
|
|
880
1216
|
<span class="cline-any cline-neutral"> </span>
|
|
881
1217
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -902,7 +1238,10 @@
|
|
|
902
1238
|
<span class="cline-any cline-yes">1x</span>
|
|
903
1239
|
<span class="cline-any cline-no"> </span>
|
|
904
1240
|
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
1243
|
<span class="cline-any cline-neutral"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
906
1245
|
<span class="cline-any cline-neutral"> </span>
|
|
907
1246
|
<span class="cline-any cline-no"> </span>
|
|
908
1247
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -916,6 +1255,7 @@
|
|
|
916
1255
|
<span class="cline-any cline-neutral"> </span>
|
|
917
1256
|
<span class="cline-any cline-no"> </span>
|
|
918
1257
|
<span class="cline-any cline-neutral"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
1259
|
<span class="cline-any cline-no"> </span>
|
|
920
1260
|
<span class="cline-any cline-neutral"> </span>
|
|
921
1261
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1197,11 +1537,10 @@
|
|
|
1197
1537
|
<span class="cline-any cline-neutral"> </span>
|
|
1198
1538
|
<span class="cline-any cline-neutral"> </span>
|
|
1199
1539
|
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1202
1540
|
<span class="cline-any cline-yes">12x</span>
|
|
1203
1541
|
<span class="cline-any cline-yes">12x</span>
|
|
1204
1542
|
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
1544
|
<span class="cline-any cline-yes">12x</span>
|
|
1206
1545
|
<span class="cline-any cline-yes">2x</span>
|
|
1207
1546
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1211,8 +1550,12 @@
|
|
|
1211
1550
|
<span class="cline-any cline-neutral"> </span>
|
|
1212
1551
|
<span class="cline-any cline-neutral"> </span>
|
|
1213
1552
|
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
1554
|
<span class="cline-any cline-yes">2x</span>
|
|
1215
1555
|
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
1559
|
<span class="cline-any cline-neutral"> </span>
|
|
1217
1560
|
<span class="cline-any cline-neutral"> </span>
|
|
1218
1561
|
<span class="cline-any cline-yes">10x</span>
|
|
@@ -1221,23 +1564,31 @@
|
|
|
1221
1564
|
<span class="cline-any cline-neutral"> </span>
|
|
1222
1565
|
<span class="cline-any cline-neutral"> </span>
|
|
1223
1566
|
<span class="cline-any cline-neutral"> </span>
|
|
1224
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1225
1567
|
<span class="cline-any cline-neutral"> </span>
|
|
1226
1568
|
<span class="cline-any cline-yes">1x</span>
|
|
1569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
1570
|
<span class="cline-any cline-yes">1x</span>
|
|
1228
1571
|
<span class="cline-any cline-neutral"> </span>
|
|
1229
1572
|
<span class="cline-any cline-neutral"> </span>
|
|
1230
1573
|
<span class="cline-any cline-neutral"> </span>
|
|
1231
1574
|
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
1576
|
<span class="cline-any cline-yes">1x</span>
|
|
1233
1577
|
<span class="cline-any cline-neutral"> </span>
|
|
1578
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1234
1579
|
<span class="cline-any cline-neutral"> </span>
|
|
1235
1580
|
<span class="cline-any cline-neutral"> </span>
|
|
1236
1581
|
<span class="cline-any cline-yes">9x</span>
|
|
1237
1582
|
<span class="cline-any cline-neutral"> </span>
|
|
1583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1238
1584
|
<span class="cline-any cline-yes">9x</span>
|
|
1239
1585
|
<span class="cline-any cline-no"> </span>
|
|
1240
1586
|
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
1592
|
<span class="cline-any cline-no"> </span>
|
|
1242
1593
|
<span class="cline-any cline-neutral"> </span>
|
|
1243
1594
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1245,17 +1596,26 @@
|
|
|
1245
1596
|
<span class="cline-any cline-neutral"> </span>
|
|
1246
1597
|
<span class="cline-any cline-neutral"> </span>
|
|
1247
1598
|
<span class="cline-any cline-neutral"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
1600
|
<span class="cline-any cline-yes">9x</span>
|
|
1249
1601
|
<span class="cline-any cline-neutral"> </span>
|
|
1250
1602
|
<span class="cline-any cline-yes">9x</span>
|
|
1251
1603
|
<span class="cline-any cline-no"> </span>
|
|
1252
1604
|
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
1608
|
<span class="cline-any cline-neutral"> </span>
|
|
1254
1609
|
<span class="cline-any cline-neutral"> </span>
|
|
1255
1610
|
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1256
1614
|
<span class="cline-any cline-no"> </span>
|
|
1257
1615
|
<span class="cline-any cline-neutral"> </span>
|
|
1258
1616
|
<span class="cline-any cline-neutral"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
1619
|
<span class="cline-any cline-yes">9x</span>
|
|
1260
1620
|
<span class="cline-any cline-neutral"> </span>
|
|
1261
1621
|
<span class="cline-any cline-yes">9x</span>
|
|
@@ -1267,17 +1627,98 @@
|
|
|
1267
1627
|
<span class="cline-any cline-neutral"> </span>
|
|
1268
1628
|
<span class="cline-any cline-neutral"> </span>
|
|
1269
1629
|
<span class="cline-any cline-yes">9x</span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1270
1632
|
<span class="cline-any cline-no"> </span>
|
|
1271
1633
|
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-no"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1272
1638
|
<span class="cline-any cline-neutral"> </span>
|
|
1273
1639
|
<span class="cline-any cline-neutral"> </span>
|
|
1274
1640
|
<span class="cline-any cline-neutral"> </span>
|
|
1275
1641
|
<span class="cline-any cline-neutral"> </span>
|
|
1642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
1645
|
<span class="cline-any cline-no"> </span>
|
|
1277
1646
|
<span class="cline-any cline-neutral"> </span>
|
|
1278
1647
|
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1651
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1279
1654
|
<span class="cline-any cline-yes">9x</span>
|
|
1280
1655
|
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </span>
|
|
1692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1695
|
+
<span class="cline-any cline-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1709
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1710
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1713
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1717
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
1722
|
<span class="cline-any cline-no"> </span>
|
|
1282
1723
|
<span class="cline-any cline-neutral"> </span>
|
|
1283
1724
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1326,6 +1767,9 @@
|
|
|
1326
1767
|
<span class="cline-any cline-neutral"> </span>
|
|
1327
1768
|
<span class="cline-any cline-yes">1x</span>
|
|
1328
1769
|
<span class="cline-any cline-yes">1x</span>
|
|
1770
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1329
1773
|
<span class="cline-any cline-neutral"> </span>
|
|
1330
1774
|
<span class="cline-any cline-yes">1x</span>
|
|
1331
1775
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1355,6 +1799,7 @@
|
|
|
1355
1799
|
<span class="cline-any cline-neutral"> </span>
|
|
1356
1800
|
<span class="cline-any cline-neutral"> </span>
|
|
1357
1801
|
<span class="cline-any cline-neutral"> </span>
|
|
1802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
1803
|
<span class="cline-any cline-yes">1x</span>
|
|
1359
1804
|
<span class="cline-any cline-neutral"> </span>
|
|
1360
1805
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1396,10 +1841,86 @@
|
|
|
1396
1841
|
<span class="cline-any cline-neutral"> </span>
|
|
1397
1842
|
<span class="cline-any cline-neutral"> </span>
|
|
1398
1843
|
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-no"> </span>
|
|
1846
|
+
<span class="cline-any cline-no"> </span>
|
|
1847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1849
|
+
<span class="cline-any cline-no"> </span>
|
|
1850
|
+
<span class="cline-any cline-no"> </span>
|
|
1851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1852
|
+
<span class="cline-any cline-no"> </span>
|
|
1853
|
+
<span class="cline-any cline-no"> </span>
|
|
1854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1860
|
+
<span class="cline-any cline-no"> </span>
|
|
1861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1862
|
+
<span class="cline-any cline-no"> </span>
|
|
1863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1867
|
+
<span class="cline-any cline-no"> </span>
|
|
1868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1875
|
+
<span class="cline-any cline-no"> </span>
|
|
1876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1882
|
+
<span class="cline-any cline-no"> </span>
|
|
1883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
+
<span class="cline-any cline-no"> </span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1887
|
+
<span class="cline-any cline-no"> </span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
+
<span class="cline-any cline-no"> </span>
|
|
1891
|
+
<span class="cline-any cline-no"> </span>
|
|
1892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1899
|
+
<span class="cline-any cline-no"> </span>
|
|
1900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1902
|
+
<span class="cline-any cline-no"> </span>
|
|
1903
|
+
<span class="cline-any cline-no"> </span>
|
|
1904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1907
|
+
<span class="cline-any cline-no"> </span>
|
|
1908
|
+
<span class="cline-any cline-no"> </span>
|
|
1909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1399
1914
|
<span class="cline-any cline-no"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1400
1916
|
<span class="cline-any cline-no"> </span>
|
|
1401
1917
|
<span class="cline-any cline-neutral"> </span>
|
|
1918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
1919
|
<span class="cline-any cline-no"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
1924
|
<span class="cline-any cline-no"> </span>
|
|
1404
1925
|
<span class="cline-any cline-neutral"> </span>
|
|
1405
1926
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1408,10 +1929,17 @@
|
|
|
1408
1929
|
<span class="cline-any cline-neutral"> </span>
|
|
1409
1930
|
<span class="cline-any cline-neutral"> </span>
|
|
1410
1931
|
<span class="cline-any cline-neutral"> </span>
|
|
1932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
1935
|
<span class="cline-any cline-no"> </span>
|
|
1412
1936
|
<span class="cline-any cline-neutral"> </span>
|
|
1937
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
1938
|
<span class="cline-any cline-neutral"> </span>
|
|
1414
1939
|
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
+
<span class="cline-any cline-no"> </span>
|
|
1942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1415
1943
|
<span class="cline-any cline-no"> </span>
|
|
1416
1944
|
<span class="cline-any cline-neutral"> </span>
|
|
1417
1945
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1419,23 +1947,55 @@
|
|
|
1419
1947
|
<span class="cline-any cline-neutral"> </span>
|
|
1420
1948
|
<span class="cline-any cline-neutral"> </span>
|
|
1421
1949
|
<span class="cline-any cline-neutral"> </span>
|
|
1950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1422
1951
|
<span class="cline-any cline-no"> </span>
|
|
1423
1952
|
<span class="cline-any cline-neutral"> </span>
|
|
1424
1953
|
<span class="cline-any cline-no"> </span>
|
|
1954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1425
1957
|
<span class="cline-any cline-no"> </span>
|
|
1426
1958
|
<span class="cline-any cline-neutral"> </span>
|
|
1427
1959
|
<span class="cline-any cline-neutral"> </span>
|
|
1428
1960
|
<span class="cline-any cline-neutral"> </span>
|
|
1429
1961
|
<span class="cline-any cline-neutral"> </span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
1967
|
<span class="cline-any cline-no"> </span>
|
|
1431
1968
|
<span class="cline-any cline-neutral"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
1970
|
<span class="cline-any cline-neutral"> </span>
|
|
1433
1971
|
<span class="cline-any cline-neutral"> </span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-no"> </span>
|
|
1975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
+
<span class="cline-any cline-no"> </span>
|
|
1977
|
+
<span class="cline-any cline-no"> </span>
|
|
1978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1979
|
+
<span class="cline-any cline-no"> </span>
|
|
1980
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
1981
|
<span class="cline-any cline-no"> </span>
|
|
1982
|
+
<span class="cline-any cline-no"> </span>
|
|
1983
|
+
<span class="cline-any cline-no"> </span>
|
|
1984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
1988
|
<span class="cline-any cline-neutral"> </span>
|
|
1436
1989
|
<span class="cline-any cline-no"> </span>
|
|
1437
1990
|
<span class="cline-any cline-no"> </span>
|
|
1438
1991
|
<span class="cline-any cline-neutral"> </span>
|
|
1992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1439
1999
|
<span class="cline-any cline-no"> </span>
|
|
1440
2000
|
<span class="cline-any cline-neutral"> </span>
|
|
1441
2001
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1443,14 +2003,38 @@
|
|
|
1443
2003
|
<span class="cline-any cline-no"> </span>
|
|
1444
2004
|
<span class="cline-any cline-neutral"> </span>
|
|
1445
2005
|
<span class="cline-any cline-neutral"> </span>
|
|
2006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
2013
|
<span class="cline-any cline-no"> </span>
|
|
2014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
2015
|
<span class="cline-any cline-no"> </span>
|
|
1448
2016
|
<span class="cline-any cline-neutral"> </span>
|
|
2017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2019
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
2020
|
<span class="cline-any cline-no"> </span>
|
|
1450
2021
|
<span class="cline-any cline-neutral"> </span>
|
|
1451
2022
|
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
2030
|
<span class="cline-any cline-no"> </span>
|
|
1453
2031
|
<span class="cline-any cline-neutral"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
2038
|
<span class="cline-any cline-neutral"> </span>
|
|
1455
2039
|
<span class="cline-any cline-neutral"> </span>
|
|
1456
2040
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1460,27 +2044,49 @@
|
|
|
1460
2044
|
<span class="cline-any cline-neutral"> </span>
|
|
1461
2045
|
<span class="cline-any cline-neutral"> </span>
|
|
1462
2046
|
<span class="cline-any cline-neutral"> </span>
|
|
2047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1463
2049
|
<span class="cline-any cline-no"> </span>
|
|
2050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1464
2051
|
<span class="cline-any cline-no"> </span>
|
|
1465
2052
|
<span class="cline-any cline-neutral"> </span>
|
|
1466
2053
|
<span class="cline-any cline-no"> </span>
|
|
1467
2054
|
<span class="cline-any cline-neutral"> </span>
|
|
1468
2055
|
<span class="cline-any cline-neutral"> </span>
|
|
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>
|
|
2060
|
+
<span class="cline-any cline-no"> </span>
|
|
2061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2069
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
2070
|
<span class="cline-any cline-no"> </span>
|
|
1470
2071
|
<span class="cline-any cline-neutral"> </span>
|
|
1471
2072
|
<span class="cline-any cline-no"> </span>
|
|
2073
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
2074
|
<span class="cline-any cline-neutral"> </span>
|
|
1473
2075
|
<span class="cline-any cline-neutral"> </span>
|
|
1474
2076
|
<span class="cline-any cline-neutral"> </span>
|
|
1475
2077
|
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
2079
|
<span class="cline-any cline-neutral"> </span>
|
|
1477
2080
|
<span class="cline-any cline-neutral"> </span>
|
|
2081
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
2082
|
<span class="cline-any cline-neutral"> </span>
|
|
1479
2083
|
<span class="cline-any cline-neutral"> </span>
|
|
1480
2084
|
<span class="cline-any cline-no"> </span>
|
|
1481
2085
|
<span class="cline-any cline-neutral"> </span>
|
|
1482
2086
|
<span class="cline-any cline-no"> </span>
|
|
1483
2087
|
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
+
<span class="cline-any cline-no"> </span>
|
|
2089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
2090
|
<span class="cline-any cline-neutral"> </span>
|
|
1485
2091
|
<span class="cline-any cline-neutral"> </span>
|
|
1486
2092
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1571,18 +2177,19 @@
|
|
|
1571
2177
|
VariableValue,
|
|
1572
2178
|
VariationType,
|
|
1573
2179
|
VariationValue,
|
|
2180
|
+
Variation,
|
|
2181
|
+
RuleKey,
|
|
2182
|
+
VariableKey,
|
|
2183
|
+
VariableSchema,
|
|
1574
2184
|
} from "@featurevisor/types";
|
|
1575
2185
|
|
|
1576
2186
|
import { createLogger, Logger } from "./logger";
|
|
1577
2187
|
import { DatafileReader } from "./datafileReader";
|
|
1578
2188
|
import { Emitter } from "./emitter";
|
|
1579
2189
|
import { getBucketedNumber } from "./bucket";
|
|
1580
|
-
import {
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
getForcedVariation,
|
|
1584
|
-
getForcedVariableValue,
|
|
1585
|
-
} from "./feature";
|
|
2190
|
+
import { findForceFromFeature, getMatchedTrafficAndAllocation } from "./feature";
|
|
2191
|
+
import { allConditionsAreMatched } from "./conditions";
|
|
2192
|
+
import { allGroupSegmentsAreMatched } from "./segments";
|
|
1586
2193
|
|
|
1587
2194
|
export type ReadyCallback = () => void;
|
|
1588
2195
|
|
|
@@ -1632,6 +2239,38 @@ const emptyDatafile: DatafileContent = {
|
|
|
1632
2239
|
|
|
1633
2240
|
export type DatafileFetchHandler = (datafileUrl: string) => Promise<DatafileContent>;
|
|
1634
2241
|
|
|
2242
|
+
export enum EvaluationReason {
|
|
2243
|
+
NOT_FOUND = "not_found",
|
|
2244
|
+
FORCED = "forced",
|
|
2245
|
+
INITIAL = "initial",
|
|
2246
|
+
STICKY = "sticky",
|
|
2247
|
+
RULE = "rule",
|
|
2248
|
+
ALLOCATED = "allocated",
|
|
2249
|
+
DEFAULTED = "defaulted",
|
|
2250
|
+
OVERRIDE = "override",
|
|
2251
|
+
ERROR = "error",
|
|
2252
|
+
}
|
|
2253
|
+
|
|
2254
|
+
export interface Evaluation {
|
|
2255
|
+
// required
|
|
2256
|
+
featureKey: FeatureKey;
|
|
2257
|
+
reason: EvaluationReason;
|
|
2258
|
+
|
|
2259
|
+
// common
|
|
2260
|
+
bucketValue?: BucketValue;
|
|
2261
|
+
ruleKey?: RuleKey;
|
|
2262
|
+
error?: Error;
|
|
2263
|
+
|
|
2264
|
+
// variation
|
|
2265
|
+
variation?: Variation;
|
|
2266
|
+
variationValue?: VariationValue;
|
|
2267
|
+
|
|
2268
|
+
// variable
|
|
2269
|
+
variableKey?: VariableKey;
|
|
2270
|
+
variableValue?: VariableValue;
|
|
2271
|
+
variableSchema?: VariableSchema;
|
|
2272
|
+
}
|
|
2273
|
+
|
|
1635
2274
|
function fetchDatafileContent(
|
|
1636
2275
|
datafileUrl,
|
|
1637
2276
|
handleDatafileFetch?: DatafileFetchHandler,
|
|
@@ -1647,26 +2286,30 @@ type FieldType = VariationType | VariableType;
|
|
|
1647
2286
|
type ValueType = VariableValue;
|
|
1648
2287
|
|
|
1649
2288
|
export function <span class="fstat-no" title="function not covered" >getValueByType(</span>value: ValueType, fieldType: FieldType): ValueType {
|
|
1650
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1651
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1652
|
-
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) {</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2292
|
+
}
|
|
1653
2293
|
|
|
1654
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1655
|
-
|
|
1656
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1657
|
-
|
|
1658
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1659
|
-
|
|
1660
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1661
|
-
|
|
1662
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1663
|
-
|
|
1664
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1665
|
-
|
|
1666
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > switch (fieldType) {</span>
|
|
2295
|
+
case "string":
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "string" ? value : undefined;</span>
|
|
2297
|
+
case "integer":
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" > return parseInt(value as string, 10);</span>
|
|
2299
|
+
case "double":
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > return parseFloat(value as string);</span>
|
|
2301
|
+
case "boolean":
|
|
2302
|
+
<span class="cstat-no" title="statement not covered" > return value === true;</span>
|
|
2303
|
+
case "array":
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" > return Array.isArray(value) ? value : undefined;</span>
|
|
2305
|
+
case "object":
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "object" ? value : undefined;</span>
|
|
2307
|
+
// @NOTE: `json` is not handled here intentionally
|
|
2308
|
+
default:
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" > return value;</span>
|
|
2310
|
+
}
|
|
2311
|
+
} catch (e) {
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1670
2313
|
}
|
|
1671
2314
|
}
|
|
1672
2315
|
|
|
@@ -1941,89 +2584,190 @@ export class FeaturevisorInstance {
|
|
|
1941
2584
|
/**
|
|
1942
2585
|
* Variation
|
|
1943
2586
|
*/
|
|
2587
|
+
evaluateVariation(featureKey: FeatureKey | Feature, attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: Evaluation {
|
|
2588
|
+
let evaluation: Evaluation;
|
|
1944
2589
|
|
|
1945
|
-
getVariation(
|
|
1946
|
-
featureKey: FeatureKey | Feature,
|
|
1947
|
-
attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
|
|
1948
|
-
): VariationValue | undefined {
|
|
1949
2590
|
try {
|
|
1950
2591
|
const key = typeof featureKey === "string" ? featureKey : <span class="branch-1 cbranch-no" title="branch not covered" >featureKey.key;</span>
|
|
1951
2592
|
|
|
2593
|
+
// sticky
|
|
1952
2594
|
if (this.stickyFeatures && this.stickyFeatures[key]) {
|
|
1953
|
-
const
|
|
2595
|
+
const variationValue = this.stickyFeatures[key].variation;
|
|
1954
2596
|
|
|
1955
|
-
if (typeof
|
|
1956
|
-
|
|
2597
|
+
if (typeof variationValue !== "undefined") {
|
|
2598
|
+
evaluation = {
|
|
1957
2599
|
featureKey: key,
|
|
1958
|
-
|
|
1959
|
-
|
|
2600
|
+
reason: EvaluationReason.STICKY,
|
|
2601
|
+
variationValue,
|
|
2602
|
+
};
|
|
2603
|
+
|
|
2604
|
+
this.logger.debug("using sticky variation", evaluation);
|
|
1960
2605
|
|
|
1961
|
-
return
|
|
2606
|
+
return evaluation;
|
|
1962
2607
|
}
|
|
1963
2608
|
}
|
|
1964
2609
|
|
|
2610
|
+
// initial
|
|
1965
2611
|
if (
|
|
1966
2612
|
this.statuses &&
|
|
1967
2613
|
!this.statuses.ready &&
|
|
1968
2614
|
this.initialFeatures &&
|
|
1969
|
-
this.initialFeatures[key]
|
|
2615
|
+
this.initialFeatures[key] &&
|
|
2616
|
+
typeof this.initialFeatures[key].variation !== "undefined"
|
|
1970
2617
|
) {
|
|
1971
|
-
const
|
|
2618
|
+
const variationValue = this.initialFeatures[key].variation;
|
|
1972
2619
|
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
2620
|
+
evaluation = {
|
|
2621
|
+
featureKey: key,
|
|
2622
|
+
reason: EvaluationReason.INITIAL,
|
|
2623
|
+
variationValue,
|
|
2624
|
+
};
|
|
1978
2625
|
|
|
1979
|
-
|
|
1980
|
-
|
|
2626
|
+
this.logger.debug("using initial variation", evaluation);
|
|
2627
|
+
|
|
2628
|
+
return evaluation;
|
|
1981
2629
|
}
|
|
1982
2630
|
|
|
1983
2631
|
const feature = this.getFeature(featureKey);
|
|
1984
2632
|
|
|
2633
|
+
// not found
|
|
1985
2634
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (!feature) {
|
|
1986
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2635
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2636
|
+
featureKey: key,
|
|
2637
|
+
reason: EvaluationReason.NOT_FOUND,
|
|
2638
|
+
};
|
|
1987
2639
|
|
|
1988
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2640
|
+
<span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found in datafile", evaluation);</span>
|
|
2641
|
+
|
|
2642
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
1989
2643
|
}
|
|
1990
2644
|
|
|
1991
2645
|
const finalAttributes = this.interceptAttributes
|
|
1992
2646
|
? this.interceptAttributes(attributes)
|
|
1993
2647
|
: attributes;
|
|
1994
2648
|
|
|
1995
|
-
|
|
2649
|
+
// forced
|
|
2650
|
+
const force = findForceFromFeature(feature, attributes, this.datafileReader);
|
|
1996
2651
|
|
|
1997
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (
|
|
1998
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1999
|
-
featureKey,
|
|
2000
|
-
variation: forcedVariation.value,
|
|
2001
|
-
});
|
|
2652
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (force && <span class="branch-1 cbranch-no" title="branch not covered" >force.variation)</span> {
|
|
2653
|
+
const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.value === force.variation)</span>;</span>
|
|
2002
2654
|
|
|
2003
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2655
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation) {</span>
|
|
2656
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2657
|
+
featureKey: feature.key,
|
|
2658
|
+
reason: EvaluationReason.FORCED,
|
|
2659
|
+
variation,
|
|
2660
|
+
};
|
|
2661
|
+
|
|
2662
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("forced variation found", evaluation);</span>
|
|
2663
|
+
|
|
2664
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2665
|
+
}
|
|
2004
2666
|
}
|
|
2005
2667
|
|
|
2668
|
+
// bucketing
|
|
2006
2669
|
const bucketValue = this.getBucketValue(feature, finalAttributes);
|
|
2007
2670
|
|
|
2008
|
-
const
|
|
2009
|
-
feature,
|
|
2671
|
+
const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(
|
|
2672
|
+
feature.traffic,
|
|
2010
2673
|
finalAttributes,
|
|
2011
2674
|
bucketValue,
|
|
2012
2675
|
this.datafileReader,
|
|
2013
2676
|
this.logger,
|
|
2014
2677
|
);
|
|
2015
2678
|
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2679
|
+
if (matchedTraffic) {
|
|
2680
|
+
// override from rule
|
|
2681
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (matchedTraffic.variation) {
|
|
2682
|
+
const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.value === matchedTraffic.variation)</span>;</span>
|
|
2683
|
+
|
|
2684
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation) {</span>
|
|
2685
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2686
|
+
featureKey: feature.key,
|
|
2687
|
+
reason: EvaluationReason.RULE,
|
|
2688
|
+
variation,
|
|
2689
|
+
bucketValue,
|
|
2690
|
+
ruleKey: matchedTraffic.key,
|
|
2691
|
+
};
|
|
2692
|
+
|
|
2693
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("override from rule", evaluation);</span>
|
|
2694
|
+
|
|
2695
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2696
|
+
}
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
// regular allocation
|
|
2700
|
+
if (matchedAllocation && matchedAllocation.variation) {
|
|
2701
|
+
const variation = feature.variations.find((v) => v.value === matchedAllocation.variation);
|
|
2702
|
+
|
|
2703
|
+
if (variation) {
|
|
2704
|
+
evaluation = {
|
|
2705
|
+
featureKey: feature.key,
|
|
2706
|
+
reason: EvaluationReason.ALLOCATED,
|
|
2707
|
+
bucketValue,
|
|
2708
|
+
variation,
|
|
2709
|
+
};
|
|
2710
|
+
|
|
2711
|
+
this.logger.debug("allocated variation", evaluation);
|
|
2712
|
+
|
|
2713
|
+
return evaluation;
|
|
2714
|
+
}
|
|
2715
|
+
}
|
|
2716
|
+
}
|
|
2717
|
+
|
|
2718
|
+
// fall back to default
|
|
2719
|
+
const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.value === feature.defaultVariation)</span>;</span>
|
|
2720
|
+
|
|
2721
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation) {</span>
|
|
2722
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2723
|
+
featureKey: feature.key,
|
|
2724
|
+
reason: EvaluationReason.DEFAULTED,
|
|
2019
2725
|
bucketValue,
|
|
2020
|
-
variation
|
|
2021
|
-
}
|
|
2726
|
+
variation,
|
|
2727
|
+
};
|
|
2728
|
+
|
|
2729
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("using default variation", evaluation);</span>
|
|
2730
|
+
|
|
2731
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2732
|
+
}
|
|
2733
|
+
|
|
2734
|
+
// nothing matched (this should never happen)
|
|
2735
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2736
|
+
featureKey: feature.key,
|
|
2737
|
+
reason: EvaluationReason.ERROR,
|
|
2738
|
+
bucketValue,
|
|
2739
|
+
};
|
|
2740
|
+
|
|
2741
|
+
<span class="cstat-no" title="statement not covered" > this.logger.error("no matched variation", evaluation);</span>
|
|
2742
|
+
|
|
2743
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2744
|
+
} catch (e) {
|
|
2745
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2746
|
+
featureKey: typeof featureKey === "string" ? featureKey : featureKey.key,
|
|
2747
|
+
reason: EvaluationReason.ERROR,
|
|
2748
|
+
error: e,
|
|
2749
|
+
};
|
|
2750
|
+
|
|
2751
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2752
|
+
}
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
getVariation(
|
|
2756
|
+
featureKey: FeatureKey | Feature,
|
|
2757
|
+
attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
|
|
2758
|
+
): VariationValue | undefined {
|
|
2759
|
+
try {
|
|
2760
|
+
const evaluation = this.evaluateVariation(featureKey, attributes);
|
|
2761
|
+
|
|
2762
|
+
if (typeof evaluation.variationValue !== "undefined") {
|
|
2763
|
+
return evaluation.variationValue;
|
|
2764
|
+
}
|
|
2022
2765
|
|
|
2023
|
-
|
|
2766
|
+
if (evaluation.variation) {
|
|
2767
|
+
return evaluation.variation.value;
|
|
2024
2768
|
}
|
|
2025
2769
|
|
|
2026
|
-
return
|
|
2770
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2027
2771
|
} catch (e) {
|
|
2028
2772
|
<span class="cstat-no" title="statement not covered" > this.logger.error("getVariation", { featureKey, error: e });</span>
|
|
2029
2773
|
|
|
@@ -2072,7 +2816,10 @@ export class FeaturevisorInstance {
|
|
|
2072
2816
|
*/
|
|
2073
2817
|
activate(featureKey: FeatureKey, attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: VariationValue | undefined {
|
|
2074
2818
|
try {
|
|
2075
|
-
const
|
|
2819
|
+
const evaluation = this.evaluateVariation(featureKey, attributes);
|
|
2820
|
+
const variationValue = evaluation.variation
|
|
2821
|
+
? evaluation.variation.value
|
|
2822
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >evaluation.variationValue;</span>
|
|
2076
2823
|
|
|
2077
2824
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (typeof variationValue === "undefined") {
|
|
2078
2825
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
@@ -2100,6 +2847,7 @@ export class FeaturevisorInstance {
|
|
|
2100
2847
|
variationValue,
|
|
2101
2848
|
finalAttributes,
|
|
2102
2849
|
captureAttributes,
|
|
2850
|
+
evaluation,
|
|
2103
2851
|
);
|
|
2104
2852
|
|
|
2105
2853
|
return variationValue;
|
|
@@ -2137,92 +2885,253 @@ export class FeaturevisorInstance {
|
|
|
2137
2885
|
/**
|
|
2138
2886
|
* Variable
|
|
2139
2887
|
*/
|
|
2140
|
-
|
|
2141
|
-
<span class="fstat-no" title="function not covered" > getVariable(</span>
|
|
2888
|
+
<span class="fstat-no" title="function not covered" > evaluateVariable(</span>
|
|
2142
2889
|
featureKey: FeatureKey | Feature,
|
|
2143
|
-
variableKey:
|
|
2890
|
+
variableKey: VariableKey,
|
|
2144
2891
|
attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
|
|
2145
|
-
):
|
|
2892
|
+
): Evaluation {
|
|
2893
|
+
let evaluation: Evaluation;
|
|
2894
|
+
|
|
2146
2895
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2147
2896
|
const key = <span class="cstat-no" title="statement not covered" >typeof featureKey === "string" ? featureKey : featureKey.key;</span>
|
|
2148
2897
|
|
|
2898
|
+
// sticky
|
|
2149
2899
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.stickyFeatures && this.stickyFeatures[key] && this.stickyFeatures[key].variables) {</span>
|
|
2150
2900
|
const result = <span class="cstat-no" title="statement not covered" >this.stickyFeatures[key].variables[variableKey];</span>
|
|
2151
2901
|
|
|
2152
2902
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof result !== "undefined") {</span>
|
|
2153
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2903
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2154
2904
|
featureKey: key,
|
|
2905
|
+
reason: EvaluationReason.STICKY,
|
|
2155
2906
|
variableKey,
|
|
2156
|
-
|
|
2907
|
+
variableValue: result,
|
|
2908
|
+
};
|
|
2157
2909
|
|
|
2158
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2910
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("using sticky variable", evaluation);</span>
|
|
2911
|
+
|
|
2912
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2159
2913
|
}
|
|
2160
2914
|
}
|
|
2161
2915
|
|
|
2916
|
+
// initial
|
|
2162
2917
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
|
|
2163
2918
|
this.statuses &&
|
|
2164
2919
|
!this.statuses.ready &&
|
|
2165
2920
|
this.initialFeatures &&
|
|
2166
2921
|
this.initialFeatures[key] &&
|
|
2167
|
-
this.initialFeatures[key].variables
|
|
2922
|
+
this.initialFeatures[key].variables &&
|
|
2923
|
+
typeof this.initialFeatures[key].variables[variableKey] !== "undefined"
|
|
2168
2924
|
) {
|
|
2169
|
-
|
|
2925
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2926
|
+
featureKey: key,
|
|
2927
|
+
reason: EvaluationReason.INITIAL,
|
|
2928
|
+
variableKey,
|
|
2929
|
+
variableValue: this.initialFeatures[key].variables[variableKey],
|
|
2930
|
+
};
|
|
2170
2931
|
|
|
2171
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2172
|
-
<span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", {</span>
|
|
2173
|
-
featureKey: key,
|
|
2174
|
-
variableKey,
|
|
2175
|
-
});
|
|
2932
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", evaluation);</span>
|
|
2176
2933
|
|
|
2177
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2178
|
-
}
|
|
2934
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2179
2935
|
}
|
|
2180
2936
|
|
|
2181
2937
|
const feature = <span class="cstat-no" title="statement not covered" >this.getFeature(featureKey);</span>
|
|
2182
2938
|
|
|
2939
|
+
// not found
|
|
2183
2940
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature) {</span>
|
|
2184
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2941
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2942
|
+
featureKey: key,
|
|
2943
|
+
reason: EvaluationReason.NOT_FOUND,
|
|
2944
|
+
variableKey,
|
|
2945
|
+
};
|
|
2185
2946
|
|
|
2186
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2947
|
+
<span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found in datafile", evaluation);</span>
|
|
2948
|
+
|
|
2949
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2187
2950
|
}
|
|
2188
2951
|
|
|
2189
2952
|
const variableSchema = <span class="cstat-no" title="statement not covered" >Array.isArray(feature.variablesSchema)</span>
|
|
2190
2953
|
? feature.variablesSchema.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.key === variableKey)</span>
|
|
2191
2954
|
: undefined;
|
|
2192
2955
|
|
|
2956
|
+
// variable schema not found
|
|
2193
2957
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!variableSchema) {</span>
|
|
2194
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2958
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2959
|
+
featureKey: key,
|
|
2960
|
+
reason: EvaluationReason.NOT_FOUND,
|
|
2961
|
+
variableKey,
|
|
2962
|
+
};
|
|
2195
2963
|
|
|
2196
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2964
|
+
<span class="cstat-no" title="statement not covered" > this.logger.warn("variable schema not found", evaluation);</span>
|
|
2965
|
+
|
|
2966
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2197
2967
|
}
|
|
2198
2968
|
|
|
2199
2969
|
const finalAttributes = <span class="cstat-no" title="statement not covered" >this.interceptAttributes</span>
|
|
2200
2970
|
? this.interceptAttributes(attributes)
|
|
2201
2971
|
: attributes;
|
|
2202
2972
|
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2973
|
+
// forced
|
|
2974
|
+
const force = <span class="cstat-no" title="statement not covered" >findForceFromFeature(feature, attributes, this.datafileReader);</span>
|
|
2975
|
+
|
|
2976
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (force && force.variables && typeof force.variables[variableKey] !== "undefined") {</span>
|
|
2977
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
2978
|
+
featureKey: feature.key,
|
|
2979
|
+
reason: EvaluationReason.FORCED,
|
|
2980
|
+
variableKey,
|
|
2981
|
+
variableSchema,
|
|
2982
|
+
variableValue: force.variables[variableKey],
|
|
2983
|
+
};
|
|
2209
2984
|
|
|
2210
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2211
|
-
<span class="cstat-no" title="statement not covered" > this.logger.debug("forced variable value found", { featureKey, variableKey });</span>
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("forced variable", evaluation);</span>
|
|
2212
2986
|
|
|
2213
|
-
<span class="cstat-no" title="statement not covered" > return
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
2214
2988
|
}
|
|
2215
2989
|
|
|
2990
|
+
// bucketing
|
|
2216
2991
|
const bucketValue = <span class="cstat-no" title="statement not covered" >this.getBucketValue(feature, finalAttributes);</span>
|
|
2217
2992
|
|
|
2218
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2219
|
-
feature,
|
|
2220
|
-
variableSchema,
|
|
2993
|
+
const { matchedTraffic, matchedAllocation } = <span class="cstat-no" title="statement not covered" >getMatchedTrafficAndAllocation(</span>
|
|
2994
|
+
feature.traffic,
|
|
2221
2995
|
finalAttributes,
|
|
2222
2996
|
bucketValue,
|
|
2223
2997
|
this.datafileReader,
|
|
2224
2998
|
this.logger,
|
|
2225
2999
|
);
|
|
3000
|
+
|
|
3001
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedTraffic) {</span>
|
|
3002
|
+
// override from rule
|
|
3003
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
|
|
3004
|
+
matchedTraffic.variables &&
|
|
3005
|
+
typeof matchedTraffic.variables[variableKey] !== "undefined"
|
|
3006
|
+
) {
|
|
3007
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3008
|
+
featureKey: feature.key,
|
|
3009
|
+
reason: EvaluationReason.RULE,
|
|
3010
|
+
variableKey,
|
|
3011
|
+
variableSchema,
|
|
3012
|
+
variableValue: matchedTraffic.variables[variableKey],
|
|
3013
|
+
bucketValue,
|
|
3014
|
+
ruleKey: matchedTraffic.key,
|
|
3015
|
+
};
|
|
3016
|
+
|
|
3017
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("override from rule", evaluation);</span>
|
|
3018
|
+
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
3020
|
+
}
|
|
3021
|
+
|
|
3022
|
+
// regular allocation
|
|
3023
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedAllocation && matchedAllocation.variation) {</span>
|
|
3024
|
+
const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.value === matchedAllocation.variation)</span>;</span>
|
|
3025
|
+
|
|
3026
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation && variation.variables) {</span>
|
|
3027
|
+
const variableFromVariation = <span class="cstat-no" title="statement not covered" >variation.variables.find(<span class="fstat-no" title="function not covered" >(v</span>) => <span class="cstat-no" title="statement not covered" >v.key === variableKey)</span>;</span>
|
|
3028
|
+
|
|
3029
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variableFromVariation) {</span>
|
|
3030
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variableFromVariation.overrides) {</span>
|
|
3031
|
+
const override = <span class="cstat-no" title="statement not covered" >variableFromVariation.overrides.find(<span class="fstat-no" title="function not covered" >(o</span>) => {</span>
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (o.conditions) {</span>
|
|
3033
|
+
<span class="cstat-no" title="statement not covered" > return allConditionsAreMatched(</span>
|
|
3034
|
+
typeof o.conditions === "string" ? JSON.parse(o.conditions) : o.conditions,
|
|
3035
|
+
finalAttributes,
|
|
3036
|
+
);
|
|
3037
|
+
}
|
|
3038
|
+
|
|
3039
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (o.segments) {</span>
|
|
3040
|
+
<span class="cstat-no" title="statement not covered" > return allGroupSegmentsAreMatched(</span>
|
|
3041
|
+
typeof o.segments === "string" && o.segments !== "*"
|
|
3042
|
+
? JSON.parse(o.segments)
|
|
3043
|
+
: o.segments,
|
|
3044
|
+
finalAttributes,
|
|
3045
|
+
this.datafileReader,
|
|
3046
|
+
);
|
|
3047
|
+
}
|
|
3048
|
+
|
|
3049
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
3050
|
+
});
|
|
3051
|
+
|
|
3052
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (override) {</span>
|
|
3053
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3054
|
+
featureKey: feature.key,
|
|
3055
|
+
reason: EvaluationReason.OVERRIDE,
|
|
3056
|
+
variableKey,
|
|
3057
|
+
variableSchema,
|
|
3058
|
+
variableValue: override.value,
|
|
3059
|
+
bucketValue,
|
|
3060
|
+
ruleKey: matchedTraffic.key,
|
|
3061
|
+
};
|
|
3062
|
+
|
|
3063
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("variable override", evaluation);</span>
|
|
3064
|
+
|
|
3065
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
3066
|
+
}
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof variableFromVariation.value !== "undefined") {</span>
|
|
3070
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3071
|
+
featureKey: feature.key,
|
|
3072
|
+
reason: EvaluationReason.ALLOCATED,
|
|
3073
|
+
variableKey,
|
|
3074
|
+
variableSchema,
|
|
3075
|
+
variableValue: variableFromVariation.value,
|
|
3076
|
+
bucketValue,
|
|
3077
|
+
ruleKey: matchedTraffic.key,
|
|
3078
|
+
};
|
|
3079
|
+
|
|
3080
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("allocated variable", evaluation);</span>
|
|
3081
|
+
|
|
3082
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
3083
|
+
}
|
|
3084
|
+
}
|
|
3085
|
+
}
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
// fall back to default
|
|
3090
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3091
|
+
featureKey: feature.key,
|
|
3092
|
+
reason: EvaluationReason.DEFAULTED,
|
|
3093
|
+
variableKey,
|
|
3094
|
+
variableSchema,
|
|
3095
|
+
variableValue: variableSchema.defaultValue,
|
|
3096
|
+
bucketValue,
|
|
3097
|
+
};
|
|
3098
|
+
|
|
3099
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug("using default value", evaluation);</span>
|
|
3100
|
+
|
|
3101
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
3102
|
+
} catch (e) {
|
|
3103
|
+
<span class="cstat-no" title="statement not covered" > evaluation = {</span>
|
|
3104
|
+
featureKey: typeof featureKey === "string" ? featureKey : featureKey.key,
|
|
3105
|
+
reason: EvaluationReason.ERROR,
|
|
3106
|
+
variableKey,
|
|
3107
|
+
error: e,
|
|
3108
|
+
};
|
|
3109
|
+
|
|
3110
|
+
<span class="cstat-no" title="statement not covered" > return evaluation;</span>
|
|
3111
|
+
}
|
|
3112
|
+
}
|
|
3113
|
+
|
|
3114
|
+
<span class="fstat-no" title="function not covered" > getVariable(</span>
|
|
3115
|
+
featureKey: FeatureKey | Feature,
|
|
3116
|
+
variableKey: string,
|
|
3117
|
+
attributes: Attributes = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
|
|
3118
|
+
): VariableValue | undefined {
|
|
3119
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3120
|
+
const evaluation = <span class="cstat-no" title="statement not covered" >this.evaluateVariable(featureKey, variableKey, attributes);</span>
|
|
3121
|
+
|
|
3122
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof evaluation.variableValue !== "undefined") {</span>
|
|
3123
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
|
|
3124
|
+
evaluation.variableSchema &&
|
|
3125
|
+
evaluation.variableSchema.type === "json" &&
|
|
3126
|
+
typeof evaluation.variableValue === "string"
|
|
3127
|
+
) {
|
|
3128
|
+
<span class="cstat-no" title="statement not covered" > return JSON.parse(evaluation.variableValue);</span>
|
|
3129
|
+
}
|
|
3130
|
+
|
|
3131
|
+
<span class="cstat-no" title="statement not covered" > return evaluation.variableValue;</span>
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2226
3135
|
} catch (e) {
|
|
2227
3136
|
<span class="cstat-no" title="statement not covered" > this.logger.error("getVariable", { featureKey, variableKey, error: e });</span>
|
|
2228
3137
|
|
|
@@ -2311,7 +3220,7 @@ export function createInstance(options: InstanceOptions): FeaturevisorInstance {
|
|
|
2311
3220
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
2312
3221
|
Code coverage generated by
|
|
2313
3222
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2314
|
-
at 2023-07-
|
|
3223
|
+
at 2023-07-13T16:10:16.066Z
|
|
2315
3224
|
</div>
|
|
2316
3225
|
<script src="prettify.js"></script>
|
|
2317
3226
|
<script>
|