@featurevisor/core 1.35.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +0 -6
  2. package/coverage/clover.xml +321 -237
  3. package/coverage/coverage-final.json +8 -8
  4. package/coverage/lcov-report/index.html +77 -47
  5. package/coverage/lcov-report/lib/builder/allocator.js.html +14 -14
  6. package/coverage/lcov-report/lib/builder/index.html +16 -16
  7. package/coverage/lcov-report/lib/builder/revision.js.html +3 -3
  8. package/coverage/lcov-report/lib/builder/traffic.js.html +88 -64
  9. package/coverage/lcov-report/lib/list/index.html +116 -0
  10. package/coverage/lcov-report/lib/{tester → list}/matrix.js.html +90 -66
  11. package/coverage/lcov-report/lib/tester/helpers.js.html +295 -0
  12. package/coverage/lcov-report/lib/tester/index.html +20 -35
  13. package/coverage/lcov-report/src/builder/allocator.ts.html +2 -2
  14. package/coverage/lcov-report/src/builder/index.html +15 -15
  15. package/coverage/lcov-report/src/builder/revision.ts.html +1 -1
  16. package/coverage/lcov-report/src/builder/traffic.ts.html +96 -24
  17. package/coverage/lcov-report/src/list/index.html +116 -0
  18. package/coverage/lcov-report/src/{tester → list}/matrix.ts.html +87 -21
  19. package/coverage/lcov-report/src/tester/helpers.ts.html +313 -0
  20. package/coverage/lcov-report/src/tester/index.html +20 -35
  21. package/coverage/lcov.info +592 -436
  22. package/lib/assess-distribution/index.d.ts +1 -1
  23. package/lib/assess-distribution/index.js +102 -162
  24. package/lib/assess-distribution/index.js.map +1 -1
  25. package/lib/benchmark/index.js +87 -143
  26. package/lib/benchmark/index.js.map +1 -1
  27. package/lib/builder/allocator.d.ts +1 -1
  28. package/lib/builder/allocator.js +12 -12
  29. package/lib/builder/allocator.js.map +1 -1
  30. package/lib/builder/allocator.spec.js +22 -22
  31. package/lib/builder/allocator.spec.js.map +1 -1
  32. package/lib/builder/buildDatafile.d.ts +4 -3
  33. package/lib/builder/buildDatafile.js +311 -388
  34. package/lib/builder/buildDatafile.js.map +1 -1
  35. package/lib/builder/buildProject.d.ts +2 -1
  36. package/lib/builder/buildProject.js +96 -183
  37. package/lib/builder/buildProject.js.map +1 -1
  38. package/lib/builder/convertToV1.d.ts +10 -0
  39. package/lib/builder/convertToV1.js +119 -0
  40. package/lib/builder/convertToV1.js.map +1 -0
  41. package/lib/builder/getFeatureRanges.d.ts +1 -1
  42. package/lib/builder/getFeatureRanges.js +32 -105
  43. package/lib/builder/getFeatureRanges.js.map +1 -1
  44. package/lib/builder/hashes.d.ts +4 -0
  45. package/lib/builder/hashes.js +70 -0
  46. package/lib/builder/hashes.js.map +1 -0
  47. package/lib/builder/revision.js +2 -2
  48. package/lib/builder/revision.js.map +1 -1
  49. package/lib/builder/revision.spec.js +1 -1
  50. package/lib/builder/revision.spec.js.map +1 -1
  51. package/lib/builder/traffic.d.ts +1 -1
  52. package/lib/builder/traffic.js +57 -49
  53. package/lib/builder/traffic.js.map +1 -1
  54. package/lib/builder/traffic.spec.js +14 -14
  55. package/lib/builder/traffic.spec.js.map +1 -1
  56. package/lib/cli/cli.js +60 -129
  57. package/lib/cli/cli.js.map +1 -1
  58. package/lib/cli/plugins.js +14 -16
  59. package/lib/cli/plugins.js.map +1 -1
  60. package/lib/config/parsers.js +1 -1
  61. package/lib/config/parsers.js.map +1 -1
  62. package/lib/config/projectConfig.d.ts +8 -6
  63. package/lib/config/projectConfig.js +31 -72
  64. package/lib/config/projectConfig.js.map +1 -1
  65. package/lib/datasource/adapter.d.ts +1 -1
  66. package/lib/datasource/adapter.js +2 -5
  67. package/lib/datasource/adapter.js.map +1 -1
  68. package/lib/datasource/datasource.d.ts +2 -1
  69. package/lib/datasource/datasource.js +107 -148
  70. package/lib/datasource/datasource.js.map +1 -1
  71. package/lib/datasource/filesystemAdapter.d.ts +1 -1
  72. package/lib/datasource/filesystemAdapter.js +224 -360
  73. package/lib/datasource/filesystemAdapter.js.map +1 -1
  74. package/lib/evaluate/index.d.ts +1 -1
  75. package/lib/evaluate/index.js +120 -188
  76. package/lib/evaluate/index.js.map +1 -1
  77. package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
  78. package/lib/find-duplicate-segments/findDuplicateSegments.js +40 -128
  79. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  80. package/lib/find-duplicate-segments/index.js +27 -82
  81. package/lib/find-duplicate-segments/index.js.map +1 -1
  82. package/lib/find-usage/index.d.ts +7 -5
  83. package/lib/find-usage/index.js +333 -507
  84. package/lib/find-usage/index.js.map +1 -1
  85. package/lib/generate-code/index.js +36 -91
  86. package/lib/generate-code/index.js.map +1 -1
  87. package/lib/generate-code/typescript.js +117 -157
  88. package/lib/generate-code/typescript.js.map +1 -1
  89. package/lib/index.d.ts +0 -1
  90. package/lib/index.js +0 -1
  91. package/lib/index.js.map +1 -1
  92. package/lib/info/index.js +45 -133
  93. package/lib/info/index.js.map +1 -1
  94. package/lib/init/index.d.ts +1 -1
  95. package/lib/init/index.js +16 -64
  96. package/lib/init/index.js.map +1 -1
  97. package/lib/linter/attributeSchema.d.ts +21 -6
  98. package/lib/linter/attributeSchema.js +18 -4
  99. package/lib/linter/attributeSchema.js.map +1 -1
  100. package/lib/linter/checkCircularDependency.d.ts +1 -1
  101. package/lib/linter/checkCircularDependency.js +22 -80
  102. package/lib/linter/checkCircularDependency.js.map +1 -1
  103. package/lib/linter/checkPercentageExceedingSlot.d.ts +1 -1
  104. package/lib/linter/checkPercentageExceedingSlot.js +36 -76
  105. package/lib/linter/checkPercentageExceedingSlot.js.map +1 -1
  106. package/lib/linter/conditionSchema.d.ts +1 -1
  107. package/lib/linter/conditionSchema.js +89 -41
  108. package/lib/linter/conditionSchema.js.map +1 -1
  109. package/lib/linter/featureSchema.d.ts +345 -197
  110. package/lib/linter/featureSchema.js +313 -172
  111. package/lib/linter/featureSchema.js.map +1 -1
  112. package/lib/linter/groupSchema.js +6 -6
  113. package/lib/linter/groupSchema.js.map +1 -1
  114. package/lib/linter/lintProject.js +306 -480
  115. package/lib/linter/lintProject.js.map +1 -1
  116. package/lib/linter/printError.js +7 -7
  117. package/lib/linter/printError.js.map +1 -1
  118. package/lib/linter/segmentSchema.js +2 -2
  119. package/lib/linter/segmentSchema.js.map +1 -1
  120. package/lib/linter/testSchema.d.ts +155 -3
  121. package/lib/linter/testSchema.js +47 -17
  122. package/lib/linter/testSchema.js.map +1 -1
  123. package/lib/list/index.d.ts +1 -0
  124. package/lib/list/index.js +349 -517
  125. package/lib/list/index.js.map +1 -1
  126. package/lib/{tester → list}/matrix.d.ts +1 -1
  127. package/lib/{tester → list}/matrix.js +50 -42
  128. package/lib/list/matrix.js.map +1 -0
  129. package/lib/{tester → list}/matrix.spec.js +7 -7
  130. package/lib/list/matrix.spec.js.map +1 -0
  131. package/lib/site/exportSite.js +25 -71
  132. package/lib/site/exportSite.js.map +1 -1
  133. package/lib/site/generateHistory.d.ts +1 -1
  134. package/lib/site/generateHistory.js +26 -82
  135. package/lib/site/generateHistory.js.map +1 -1
  136. package/lib/site/generateSiteSearchIndex.d.ts +1 -1
  137. package/lib/site/generateSiteSearchIndex.js +182 -259
  138. package/lib/site/generateSiteSearchIndex.js.map +1 -1
  139. package/lib/site/getLastModifiedFromHistory.d.ts +1 -1
  140. package/lib/site/getLastModifiedFromHistory.js +2 -2
  141. package/lib/site/getLastModifiedFromHistory.js.map +1 -1
  142. package/lib/site/getOwnerAndRepoFromUrl.js +6 -6
  143. package/lib/site/getOwnerAndRepoFromUrl.js.map +1 -1
  144. package/lib/site/getRelativePaths.js +7 -7
  145. package/lib/site/getRelativePaths.js.map +1 -1
  146. package/lib/site/getRepoDetails.js +20 -20
  147. package/lib/site/getRepoDetails.js.map +1 -1
  148. package/lib/site/index.js +25 -73
  149. package/lib/site/index.js.map +1 -1
  150. package/lib/site/serveSite.js +10 -10
  151. package/lib/site/serveSite.js.map +1 -1
  152. package/lib/tester/helpers.d.ts +2 -0
  153. package/lib/tester/helpers.js +71 -0
  154. package/lib/tester/helpers.js.map +1 -0
  155. package/lib/tester/helpers.spec.js +115 -0
  156. package/lib/tester/helpers.spec.js.map +1 -0
  157. package/lib/tester/index.d.ts +0 -1
  158. package/lib/tester/index.js +0 -1
  159. package/lib/tester/index.js.map +1 -1
  160. package/lib/tester/prettyDuration.js +11 -11
  161. package/lib/tester/prettyDuration.js.map +1 -1
  162. package/lib/tester/printTestResult.d.ts +1 -1
  163. package/lib/tester/printTestResult.js +35 -15
  164. package/lib/tester/printTestResult.js.map +1 -1
  165. package/lib/tester/testFeature.d.ts +4 -2
  166. package/lib/tester/testFeature.js +264 -226
  167. package/lib/tester/testFeature.js.map +1 -1
  168. package/lib/tester/testProject.d.ts +3 -7
  169. package/lib/tester/testProject.js +145 -246
  170. package/lib/tester/testProject.js.map +1 -1
  171. package/lib/tester/testSegment.d.ts +5 -2
  172. package/lib/tester/testSegment.js +65 -102
  173. package/lib/tester/testSegment.js.map +1 -1
  174. package/lib/utils/extractKeys.d.ts +2 -1
  175. package/lib/utils/extractKeys.js +57 -12
  176. package/lib/utils/extractKeys.js.map +1 -1
  177. package/lib/utils/git.d.ts +1 -1
  178. package/lib/utils/git.js +23 -23
  179. package/lib/utils/git.js.map +1 -1
  180. package/lib/utils/pretty.js +2 -4
  181. package/lib/utils/pretty.js.map +1 -1
  182. package/package.json +5 -6
  183. package/src/assess-distribution/index.ts +3 -2
  184. package/src/benchmark/index.ts +3 -3
  185. package/src/builder/allocator.spec.ts +1 -1
  186. package/src/builder/allocator.ts +1 -1
  187. package/src/builder/buildDatafile.ts +161 -124
  188. package/src/builder/buildProject.ts +6 -3
  189. package/src/builder/convertToV1.ts +166 -0
  190. package/src/builder/getFeatureRanges.ts +1 -1
  191. package/src/builder/hashes.ts +109 -0
  192. package/src/builder/traffic.ts +40 -16
  193. package/src/cli/cli.ts +1 -1
  194. package/src/cli/plugins.ts +0 -2
  195. package/src/config/projectConfig.ts +13 -10
  196. package/src/datasource/adapter.ts +1 -1
  197. package/src/datasource/datasource.ts +23 -2
  198. package/src/datasource/filesystemAdapter.ts +11 -12
  199. package/src/evaluate/index.ts +7 -6
  200. package/src/find-duplicate-segments/findDuplicateSegments.ts +1 -1
  201. package/src/find-usage/index.ts +111 -44
  202. package/src/generate-code/index.ts +1 -3
  203. package/src/generate-code/typescript.ts +7 -29
  204. package/src/index.ts +0 -1
  205. package/src/info/index.ts +2 -2
  206. package/src/init/index.ts +2 -2
  207. package/src/linter/attributeSchema.ts +18 -2
  208. package/src/linter/checkCircularDependency.ts +1 -1
  209. package/src/linter/checkPercentageExceedingSlot.ts +28 -8
  210. package/src/linter/conditionSchema.ts +66 -10
  211. package/src/linter/featureSchema.ts +312 -116
  212. package/src/linter/lintProject.ts +9 -4
  213. package/src/linter/testSchema.ts +42 -3
  214. package/src/list/index.ts +18 -30
  215. package/src/{tester → list}/matrix.ts +33 -11
  216. package/src/site/exportSite.ts +2 -4
  217. package/src/site/generateHistory.ts +1 -1
  218. package/src/site/generateSiteSearchIndex.ts +58 -50
  219. package/src/site/getLastModifiedFromHistory.ts +1 -1
  220. package/src/tester/helpers.spec.ts +149 -0
  221. package/src/tester/helpers.ts +76 -0
  222. package/src/tester/index.ts +0 -1
  223. package/src/tester/printTestResult.ts +25 -3
  224. package/src/tester/testFeature.ts +270 -124
  225. package/src/tester/testProject.ts +28 -49
  226. package/src/tester/testSegment.ts +48 -40
  227. package/src/utils/extractKeys.ts +58 -1
  228. package/src/utils/git.ts +1 -1
  229. package/tsconfig.cjs.json +1 -0
  230. package/coverage/lcov-report/lib/tester/checkIfObjectsAreEqual.js.html +0 -151
  231. package/coverage/lcov-report/src/tester/checkIfObjectsAreEqual.ts.html +0 -157
  232. package/lib/restore/index.d.ts +0 -4
  233. package/lib/restore/index.js +0 -91
  234. package/lib/restore/index.js.map +0 -1
  235. package/lib/tester/checkIfArraysAreEqual.d.ts +0 -1
  236. package/lib/tester/checkIfArraysAreEqual.js +0 -18
  237. package/lib/tester/checkIfArraysAreEqual.js.map +0 -1
  238. package/lib/tester/checkIfObjectsAreEqual.d.ts +0 -1
  239. package/lib/tester/checkIfObjectsAreEqual.js +0 -23
  240. package/lib/tester/checkIfObjectsAreEqual.js.map +0 -1
  241. package/lib/tester/checkIfObjectsAreEqual.spec.js +0 -26
  242. package/lib/tester/checkIfObjectsAreEqual.spec.js.map +0 -1
  243. package/lib/tester/matrix.js.map +0 -1
  244. package/lib/tester/matrix.spec.js.map +0 -1
  245. package/src/restore/index.ts +0 -42
  246. package/src/tester/checkIfArraysAreEqual.ts +0 -16
  247. package/src/tester/checkIfObjectsAreEqual.spec.ts +0 -31
  248. package/src/tester/checkIfObjectsAreEqual.ts +0 -24
  249. /package/lib/{tester → list}/matrix.spec.d.ts +0 -0
  250. /package/lib/tester/{checkIfObjectsAreEqual.spec.d.ts → helpers.spec.d.ts} +0 -0
  251. /package/src/{tester → list}/matrix.spec.ts +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">38.83% </span>
26
+ <span class="strong">93.18% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>40/103</span>
28
+ <span class='fraction'>41/44</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">36.2% </span>
33
+ <span class="strong">94% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>21/58</span>
35
+ <span class='fraction'>47/50</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">30.76% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/13</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">38.7% </span>
47
+ <span class="strong">93.02% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>36/93</span>
49
+ <span class='fraction'>40/43</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -79,33 +79,18 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file high" data-value="checkIfObjectsAreEqual.js"><a href="checkIfObjectsAreEqual.js.html">checkIfObjectsAreEqual.js</a></td>
83
- <td data-value="94.11" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div>
82
+ <td class="file high" data-value="helpers.js"><a href="helpers.js.html">helpers.js</a></td>
83
+ <td data-value="93.18" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 93%"></div><div class="cover-empty" style="width: 7%"></div></div>
85
85
  </td>
86
- <td data-value="94.11" class="pct high">94.11%</td>
87
- <td data-value="17" class="abs high">16/17</td>
88
- <td data-value="92.85" class="pct high">92.85%</td>
89
- <td data-value="14" class="abs high">13/14</td>
86
+ <td data-value="93.18" class="pct high">93.18%</td>
87
+ <td data-value="44" class="abs high">41/44</td>
88
+ <td data-value="94" class="pct high">94%</td>
89
+ <td data-value="50" class="abs high">47/50</td>
90
90
  <td data-value="100" class="pct high">100%</td>
91
- <td data-value="1" class="abs high">1/1</td>
92
- <td data-value="92.85" class="pct high">92.85%</td>
93
- <td data-value="14" class="abs high">13/14</td>
94
- </tr>
95
-
96
- <tr>
97
- <td class="file low" data-value="matrix.js"><a href="matrix.js.html">matrix.js</a></td>
98
- <td data-value="27.9" class="pic low">
99
- <div class="chart"><div class="cover-fill" style="width: 27%"></div><div class="cover-empty" style="width: 73%"></div></div>
100
- </td>
101
- <td data-value="27.9" class="pct low">27.9%</td>
102
- <td data-value="86" class="abs low">24/86</td>
103
- <td data-value="18.18" class="pct low">18.18%</td>
104
- <td data-value="44" class="abs low">8/44</td>
105
- <td data-value="25" class="pct low">25%</td>
106
- <td data-value="12" class="abs low">3/12</td>
107
- <td data-value="29.11" class="pct low">29.11%</td>
108
- <td data-value="79" class="abs low">23/79</td>
91
+ <td data-value="2" class="abs high">2/2</td>
92
+ <td data-value="93.02" class="pct high">93.02%</td>
93
+ <td data-value="43" class="abs high">40/43</td>
109
94
  </tr>
110
95
 
111
96
  </tbody>
@@ -116,7 +101,7 @@
116
101
  <div class='footer quiet pad2 space-top1 center small'>
117
102
  Code coverage generated by
118
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2025-04-12T20:35:04.397Z
104
+ at 2025-07-13T22:32:10.637Z
120
105
  </div>
121
106
  <script src="../../prettify.js"></script>
122
107
  <script>
@@ -153,7 +153,7 @@
153
153
  <span class="cline-any cline-neutral">&nbsp;</span>
154
154
  <span class="cline-any cline-yes">34x</span>
155
155
  <span class="cline-any cline-neutral">&nbsp;</span>
156
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Range, Percentage } from "@featurevisor/types";
156
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Range, Percentage } from "@featurevisor/types";
157
157
  &nbsp;
158
158
  export function getAllocation(availableRanges: Range[], fill: Percentage): Range[] {
159
159
  const result: Range[] = [];
@@ -205,7 +205,7 @@ export function getUpdatedAvailableRangesAfterFilling(
205
205
  <div class='footer quiet pad2 space-top1 center small'>
206
206
  Code coverage generated by
207
207
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
208
- at 2025-04-12T20:35:04.397Z
208
+ at 2025-07-13T22:32:10.637Z
209
209
  </div>
210
210
  <script src="../../prettify.js"></script>
211
211
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.87% </span>
26
+ <span class="strong">92.3% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>92/98</span>
28
+ <span class='fraction'>96/104</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">86.66% </span>
33
+ <span class="strong">83.01% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>39/45</span>
35
+ <span class='fraction'>44/53</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">93.81% </span>
47
+ <span class="strong">92.23% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>91/97</span>
49
+ <span class='fraction'>95/103</span>
50
50
  </div>
51
51
 
52
52
 
@@ -110,17 +110,17 @@
110
110
 
111
111
  <tr>
112
112
  <td class="file high" data-value="traffic.ts"><a href="traffic.ts.html">traffic.ts</a></td>
113
- <td data-value="91.8" class="pic high">
114
- <div class="chart"><div class="cover-fill" style="width: 91%"></div><div class="cover-empty" style="width: 9%"></div></div>
113
+ <td data-value="89.55" class="pic high">
114
+ <div class="chart"><div class="cover-fill" style="width: 89%"></div><div class="cover-empty" style="width: 11%"></div></div>
115
115
  </td>
116
- <td data-value="91.8" class="pct high">91.8%</td>
117
- <td data-value="61" class="abs high">56/61</td>
118
- <td data-value="82.35" class="pct high">82.35%</td>
119
- <td data-value="34" class="abs high">28/34</td>
116
+ <td data-value="89.55" class="pct high">89.55%</td>
117
+ <td data-value="67" class="abs high">60/67</td>
118
+ <td data-value="78.57" class="pct medium">78.57%</td>
119
+ <td data-value="42" class="abs medium">33/42</td>
120
120
  <td data-value="100" class="pct high">100%</td>
121
121
  <td data-value="12" class="abs high">12/12</td>
122
- <td data-value="91.66" class="pct high">91.66%</td>
123
- <td data-value="60" class="abs high">55/60</td>
122
+ <td data-value="89.39" class="pct high">89.39%</td>
123
+ <td data-value="66" class="abs high">59/66</td>
124
124
  </tr>
125
125
 
126
126
  </tbody>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2025-04-12T20:35:04.397Z
134
+ at 2025-07-13T22:32:10.637Z
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>
137
137
  <script>
@@ -136,7 +136,7 @@
136
136
  <div class='footer quiet pad2 space-top1 center small'>
137
137
  Code coverage generated by
138
138
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
139
- at 2025-04-12T20:35:04.397Z
139
+ at 2025-07-13T22:32:10.637Z
140
140
  </div>
141
141
  <script src="../../prettify.js"></script>
142
142
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">91.8% </span>
26
+ <span class="strong">89.55% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>56/61</span>
28
+ <span class='fraction'>60/67</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">82.35% </span>
33
+ <span class="strong">78.57% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>28/34</span>
35
+ <span class='fraction'>33/42</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">91.66% </span>
47
+ <span class="strong">89.39% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>55/60</span>
49
+ <span class='fraction'>59/66</span>
50
50
  </div>
51
51
 
52
52
 
@@ -230,7 +230,38 @@
230
230
  <a name='L165'></a><a href='#L165'>165</a>
231
231
  <a name='L166'></a><a href='#L166'>166</a>
232
232
  <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
265
  <span class="cline-any cline-yes">1x</span>
235
266
  <span class="cline-any cline-neutral">&nbsp;</span>
236
267
  <span class="cline-any cline-yes">1x</span>
@@ -318,6 +349,7 @@
318
349
  <span class="cline-any cline-neutral">&nbsp;</span>
319
350
  <span class="cline-any cline-neutral">&nbsp;</span>
320
351
  <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
353
  <span class="cline-any cline-yes">13x</span>
322
354
  <span class="cline-any cline-no">&nbsp;</span>
323
355
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -338,6 +370,10 @@
338
370
  <span class="cline-any cline-neutral">&nbsp;</span>
339
371
  <span class="cline-any cline-neutral">&nbsp;</span>
340
372
  <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
377
  <span class="cline-any cline-yes">13x</span>
342
378
  <span class="cline-any cline-neutral">&nbsp;</span>
343
379
  <span class="cline-any cline-yes">13x</span>
@@ -361,6 +397,12 @@
361
397
  <span class="cline-any cline-yes">13x</span>
362
398
  <span class="cline-any cline-yes">13x</span>
363
399
  <span class="cline-any cline-yes">30x</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-yes">30x</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-no">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
406
  <span class="cline-any cline-yes">30x</span>
365
407
  <span class="cline-any cline-neutral">&nbsp;</span>
366
408
  <span class="cline-any cline-yes">30x</span>
@@ -370,6 +412,8 @@
370
412
  <span class="cline-any cline-neutral">&nbsp;</span>
371
413
  <span class="cline-any cline-yes">30x</span>
372
414
  <span class="cline-any cline-yes">26x</span>
415
+ <span class="cline-any cline-yes">26x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
417
  <span class="cline-any cline-neutral">&nbsp;</span>
374
418
  <span class="cline-any cline-neutral">&nbsp;</span>
375
419
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -383,6 +427,7 @@
383
427
  <span class="cline-any cline-neutral">&nbsp;</span>
384
428
  <span class="cline-any cline-neutral">&nbsp;</span>
385
429
  <span class="cline-any cline-yes">13x</span>
430
+ <span class="cline-any cline-yes">13x</span>
386
431
  <span class="cline-any cline-yes">28x</span>
387
432
  <span class="cline-any cline-no">&nbsp;</span>
388
433
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -390,6 +435,9 @@
390
435
  <span class="cline-any cline-yes">28x</span>
391
436
  <span class="cline-any cline-neutral">&nbsp;</span>
392
437
  <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-yes">13x</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
441
  <span class="cline-any cline-neutral">&nbsp;</span>
394
442
  <span class="cline-any cline-neutral">&nbsp;</span>
395
443
  <span class="cline-any cline-yes">13x</span>
@@ -397,7 +445,14 @@
397
445
  <span class="cline-any cline-neutral">&nbsp;</span>
398
446
  <span class="cline-any cline-yes">13x</span>
399
447
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Rule, ExistingFeature, Traffic, Variation, Range, Percentage } from "@featurevisor/types";
448
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type {
449
+ Rule,
450
+ ExistingFeature,
451
+ Traffic,
452
+ Variation,
453
+ Range,
454
+ Percentage,
455
+ } from "@featurevisor/types";
401
456
  import { MAX_BUCKETED_NUMBER } from "@featurevisor/sdk";
402
457
  &nbsp;
403
458
  import { getAllocation, getUpdatedAvailableRangesAfterFilling } from "./allocator";
@@ -470,7 +525,7 @@ export function getTraffic(
470
525
  ): Traffic[] {
471
526
  const result: Traffic[] = [];
472
527
  &nbsp;
473
- // @TODO: may be pass from builder directly?
528
+ // @NOTE: may be pass from builder directly?
474
529
  const availableRanges =
475
530
  ranges &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >ranges.length &gt; 0 </span>? <span class="branch-0 cbranch-no" title="branch not covered" >ranges </span>: ([[0, MAX_BUCKETED_NUMBER]] as Range[]);
476
531
  &nbsp;
@@ -482,6 +537,7 @@ export function getTraffic(
482
537
  segments: parsedRule.segments,
483
538
  percentage: rulePercentage * (MAX_BUCKETED_NUMBER / 100),
484
539
  allocation: [],
540
+ variationWeights: parsedRule.variationWeights,
485
541
  };
486
542
  &nbsp;
487
543
  // overrides
@@ -503,11 +559,15 @@ export function getTraffic(
503
559
  !existingTrafficRule || // new rule
504
560
  variationsChanged || // variations changed
505
561
  rulePercentageDiff &lt; 0 || // percentage decreased
506
- rangesChanged; // belongs to a group, and group ranges changed
562
+ rangesChanged || // belongs to a group, and group ranges changed
563
+ // @NOTE: this means, if variationWeights is present, it will always rebucket.
564
+ // worth checking if we can maintain consistent bucketing for this use case as well.
565
+ // but this use case is unlikely to hit in practice because it doesn't matter if the feature itself is 100% rolled out.
566
+ traffic.variationWeights; // variation weights overridden
507
567
  &nbsp;
508
568
  let updatedAvailableRanges = JSON.parse(JSON.stringify(availableRanges));
509
569
  &nbsp;
510
- if (existingTrafficRule &amp;&amp; !needsRebucketing) {
570
+ if (existingTrafficRule &amp;&amp; existingTrafficRule.allocation &amp;&amp; !needsRebucketing) {
511
571
  // increase: build on top of existing allocations
512
572
  let existingSum = 0;
513
573
  &nbsp;
@@ -527,7 +587,13 @@ export function getTraffic(
527
587
  &nbsp;
528
588
  if (Array.isArray(variations)) {
529
589
  variations.forEach(function (variation) {
530
- const weight = variation.weight as number;
590
+ let weight = variation.weight as number;
591
+ &nbsp;
592
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (traffic.variationWeights &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >traffic.variationWeights[variation.value])</span> {
593
+ // override weight from rule
594
+ <span class="cstat-no" title="statement not covered" > weight = traffic.variationWeights[variation.value];</span>
595
+ }
596
+ &nbsp;
531
597
  const percentage = weight * (MAX_BUCKETED_NUMBER / 100);
532
598
  &nbsp;
533
599
  const toFillValue = needsRebucketing
@@ -536,10 +602,12 @@ export function getTraffic(
536
602
  const rangesToFill = getAllocation(updatedAvailableRanges, toFillValue);
537
603
  &nbsp;
538
604
  rangesToFill.forEach(function (range) {
539
- traffic.allocation.push({
540
- variation: variation.value,
541
- range,
542
- });
605
+ if (traffic.allocation) {
606
+ traffic.allocation.push({
607
+ variation: variation.value,
608
+ range,
609
+ });
610
+ }
543
611
  });
544
612
  &nbsp;
545
613
  updatedAvailableRanges = getUpdatedAvailableRangesAfterFilling(
@@ -549,15 +617,19 @@ export function getTraffic(
549
617
  });
550
618
  }
551
619
  &nbsp;
552
- traffic.allocation = traffic.allocation.filter((a) =&gt; {
553
- <span class="missing-if-branch" title="if path not taken" >I</span>if (a.range &amp;&amp; a.range[0] === a.range[1]) {
554
- <span class="cstat-no" title="statement not covered" > return false;</span>
555
- }
620
+ if (traffic.allocation) {
621
+ traffic.allocation = traffic.allocation.filter((a) =&gt; {
622
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (a.range &amp;&amp; a.range[0] === a.range[1]) {
623
+ <span class="cstat-no" title="statement not covered" > return false;</span>
624
+ }
556
625
  &nbsp;
557
- return true;
558
- });
626
+ return true;
627
+ });
559
628
  &nbsp;
560
- // @TODO: in v2, remove "allocation" property if an empty array
629
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (traffic.allocation.length === 0) {
630
+ <span class="cstat-no" title="statement not covered" > delete traffic.allocation;</span>
631
+ }
632
+ }
561
633
  &nbsp;
562
634
  result.push(traffic);
563
635
  });
@@ -571,7 +643,7 @@ export function getTraffic(
571
643
  <div class='footer quiet pad2 space-top1 center small'>
572
644
  Code coverage generated by
573
645
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
574
- at 2025-04-12T20:35:04.397Z
646
+ at 2025-07-13T22:32:10.637Z
575
647
  </div>
576
648
  <script src="../../prettify.js"></script>
577
649
  <script>
@@ -0,0 +1,116 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/list</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> src/list</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">23.8% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>20/84</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">9.37% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>3/32</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">20% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>2/10</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">23.75% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>19/80</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <div class="pad1">
66
+ <table class="coverage-summary">
67
+ <thead>
68
+ <tr>
69
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
+ </tr>
80
+ </thead>
81
+ <tbody><tr>
82
+ <td class="file low" data-value="matrix.ts"><a href="matrix.ts.html">matrix.ts</a></td>
83
+ <td data-value="23.8" class="pic low">
84
+ <div class="chart"><div class="cover-fill" style="width: 23%"></div><div class="cover-empty" style="width: 77%"></div></div>
85
+ </td>
86
+ <td data-value="23.8" class="pct low">23.8%</td>
87
+ <td data-value="84" class="abs low">20/84</td>
88
+ <td data-value="9.37" class="pct low">9.37%</td>
89
+ <td data-value="32" class="abs low">3/32</td>
90
+ <td data-value="20" class="pct low">20%</td>
91
+ <td data-value="10" class="abs low">2/10</td>
92
+ <td data-value="23.75" class="pct low">23.75%</td>
93
+ <td data-value="80" class="abs low">19/80</td>
94
+ </tr>
95
+
96
+ </tbody>
97
+ </table>
98
+ </div>
99
+ <div class='push'></div><!-- for sticky footer -->
100
+ </div><!-- /wrapper -->
101
+ <div class='footer quiet pad2 space-top1 center small'>
102
+ Code coverage generated by
103
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
+ at 2025-07-13T22:32:10.637Z
105
+ </div>
106
+ <script src="../../prettify.js"></script>
107
+ <script>
108
+ window.onload = function () {
109
+ prettyPrint();
110
+ };
111
+ </script>
112
+ <script src="../../sorter.js"></script>
113
+ <script src="../../block-navigation.js"></script>
114
+ </body>
115
+ </html>
116
+