@featurevisor/core 1.35.2 → 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 (252) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +0 -6
  3. package/coverage/clover.xml +321 -237
  4. package/coverage/coverage-final.json +8 -8
  5. package/coverage/lcov-report/index.html +77 -47
  6. package/coverage/lcov-report/lib/builder/allocator.js.html +14 -14
  7. package/coverage/lcov-report/lib/builder/index.html +16 -16
  8. package/coverage/lcov-report/lib/builder/revision.js.html +3 -3
  9. package/coverage/lcov-report/lib/builder/traffic.js.html +90 -63
  10. package/coverage/lcov-report/lib/list/index.html +116 -0
  11. package/coverage/lcov-report/lib/{tester → list}/matrix.js.html +90 -66
  12. package/coverage/lcov-report/lib/tester/helpers.js.html +295 -0
  13. package/coverage/lcov-report/lib/tester/index.html +20 -35
  14. package/coverage/lcov-report/src/builder/allocator.ts.html +2 -2
  15. package/coverage/lcov-report/src/builder/index.html +15 -15
  16. package/coverage/lcov-report/src/builder/revision.ts.html +1 -1
  17. package/coverage/lcov-report/src/builder/traffic.ts.html +101 -23
  18. package/coverage/lcov-report/src/list/index.html +116 -0
  19. package/coverage/lcov-report/src/{tester → list}/matrix.ts.html +87 -21
  20. package/coverage/lcov-report/src/tester/helpers.ts.html +313 -0
  21. package/coverage/lcov-report/src/tester/index.html +20 -35
  22. package/coverage/lcov.info +592 -436
  23. package/lib/assess-distribution/index.d.ts +1 -1
  24. package/lib/assess-distribution/index.js +102 -162
  25. package/lib/assess-distribution/index.js.map +1 -1
  26. package/lib/benchmark/index.js +87 -143
  27. package/lib/benchmark/index.js.map +1 -1
  28. package/lib/builder/allocator.d.ts +1 -1
  29. package/lib/builder/allocator.js +12 -12
  30. package/lib/builder/allocator.js.map +1 -1
  31. package/lib/builder/allocator.spec.js +22 -22
  32. package/lib/builder/allocator.spec.js.map +1 -1
  33. package/lib/builder/buildDatafile.d.ts +4 -3
  34. package/lib/builder/buildDatafile.js +311 -388
  35. package/lib/builder/buildDatafile.js.map +1 -1
  36. package/lib/builder/buildProject.d.ts +2 -1
  37. package/lib/builder/buildProject.js +96 -183
  38. package/lib/builder/buildProject.js.map +1 -1
  39. package/lib/builder/convertToV1.d.ts +10 -0
  40. package/lib/builder/convertToV1.js +119 -0
  41. package/lib/builder/convertToV1.js.map +1 -0
  42. package/lib/builder/getFeatureRanges.d.ts +1 -1
  43. package/lib/builder/getFeatureRanges.js +32 -105
  44. package/lib/builder/getFeatureRanges.js.map +1 -1
  45. package/lib/builder/hashes.d.ts +4 -0
  46. package/lib/builder/hashes.js +70 -0
  47. package/lib/builder/hashes.js.map +1 -0
  48. package/lib/builder/revision.js +2 -2
  49. package/lib/builder/revision.js.map +1 -1
  50. package/lib/builder/revision.spec.js +1 -1
  51. package/lib/builder/revision.spec.js.map +1 -1
  52. package/lib/builder/traffic.d.ts +1 -1
  53. package/lib/builder/traffic.js +57 -48
  54. package/lib/builder/traffic.js.map +1 -1
  55. package/lib/builder/traffic.spec.js +14 -14
  56. package/lib/builder/traffic.spec.js.map +1 -1
  57. package/lib/cli/cli.js +60 -129
  58. package/lib/cli/cli.js.map +1 -1
  59. package/lib/cli/plugins.js +14 -16
  60. package/lib/cli/plugins.js.map +1 -1
  61. package/lib/config/parsers.js +1 -1
  62. package/lib/config/parsers.js.map +1 -1
  63. package/lib/config/projectConfig.d.ts +8 -6
  64. package/lib/config/projectConfig.js +31 -72
  65. package/lib/config/projectConfig.js.map +1 -1
  66. package/lib/datasource/adapter.d.ts +1 -1
  67. package/lib/datasource/adapter.js +2 -5
  68. package/lib/datasource/adapter.js.map +1 -1
  69. package/lib/datasource/datasource.d.ts +2 -1
  70. package/lib/datasource/datasource.js +107 -148
  71. package/lib/datasource/datasource.js.map +1 -1
  72. package/lib/datasource/filesystemAdapter.d.ts +1 -1
  73. package/lib/datasource/filesystemAdapter.js +224 -360
  74. package/lib/datasource/filesystemAdapter.js.map +1 -1
  75. package/lib/evaluate/index.d.ts +1 -1
  76. package/lib/evaluate/index.js +120 -188
  77. package/lib/evaluate/index.js.map +1 -1
  78. package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
  79. package/lib/find-duplicate-segments/findDuplicateSegments.js +40 -128
  80. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  81. package/lib/find-duplicate-segments/index.js +27 -82
  82. package/lib/find-duplicate-segments/index.js.map +1 -1
  83. package/lib/find-usage/index.d.ts +7 -5
  84. package/lib/find-usage/index.js +333 -507
  85. package/lib/find-usage/index.js.map +1 -1
  86. package/lib/generate-code/index.js +36 -91
  87. package/lib/generate-code/index.js.map +1 -1
  88. package/lib/generate-code/typescript.js +117 -157
  89. package/lib/generate-code/typescript.js.map +1 -1
  90. package/lib/index.d.ts +0 -1
  91. package/lib/index.js +0 -1
  92. package/lib/index.js.map +1 -1
  93. package/lib/info/index.js +45 -133
  94. package/lib/info/index.js.map +1 -1
  95. package/lib/init/index.d.ts +1 -1
  96. package/lib/init/index.js +16 -64
  97. package/lib/init/index.js.map +1 -1
  98. package/lib/linter/attributeSchema.d.ts +21 -6
  99. package/lib/linter/attributeSchema.js +18 -4
  100. package/lib/linter/attributeSchema.js.map +1 -1
  101. package/lib/linter/checkCircularDependency.d.ts +1 -1
  102. package/lib/linter/checkCircularDependency.js +22 -80
  103. package/lib/linter/checkCircularDependency.js.map +1 -1
  104. package/lib/linter/checkPercentageExceedingSlot.d.ts +1 -1
  105. package/lib/linter/checkPercentageExceedingSlot.js +36 -76
  106. package/lib/linter/checkPercentageExceedingSlot.js.map +1 -1
  107. package/lib/linter/conditionSchema.d.ts +1 -1
  108. package/lib/linter/conditionSchema.js +89 -41
  109. package/lib/linter/conditionSchema.js.map +1 -1
  110. package/lib/linter/featureSchema.d.ts +345 -197
  111. package/lib/linter/featureSchema.js +313 -172
  112. package/lib/linter/featureSchema.js.map +1 -1
  113. package/lib/linter/groupSchema.js +6 -6
  114. package/lib/linter/groupSchema.js.map +1 -1
  115. package/lib/linter/lintProject.js +306 -480
  116. package/lib/linter/lintProject.js.map +1 -1
  117. package/lib/linter/printError.js +7 -7
  118. package/lib/linter/printError.js.map +1 -1
  119. package/lib/linter/segmentSchema.js +2 -2
  120. package/lib/linter/segmentSchema.js.map +1 -1
  121. package/lib/linter/testSchema.d.ts +155 -3
  122. package/lib/linter/testSchema.js +47 -17
  123. package/lib/linter/testSchema.js.map +1 -1
  124. package/lib/list/index.d.ts +1 -0
  125. package/lib/list/index.js +349 -517
  126. package/lib/list/index.js.map +1 -1
  127. package/lib/{tester → list}/matrix.d.ts +1 -1
  128. package/lib/{tester → list}/matrix.js +50 -42
  129. package/lib/list/matrix.js.map +1 -0
  130. package/lib/{tester → list}/matrix.spec.js +7 -7
  131. package/lib/list/matrix.spec.js.map +1 -0
  132. package/lib/site/exportSite.js +25 -71
  133. package/lib/site/exportSite.js.map +1 -1
  134. package/lib/site/generateHistory.d.ts +1 -1
  135. package/lib/site/generateHistory.js +26 -82
  136. package/lib/site/generateHistory.js.map +1 -1
  137. package/lib/site/generateSiteSearchIndex.d.ts +1 -1
  138. package/lib/site/generateSiteSearchIndex.js +182 -259
  139. package/lib/site/generateSiteSearchIndex.js.map +1 -1
  140. package/lib/site/getLastModifiedFromHistory.d.ts +1 -1
  141. package/lib/site/getLastModifiedFromHistory.js +2 -2
  142. package/lib/site/getLastModifiedFromHistory.js.map +1 -1
  143. package/lib/site/getOwnerAndRepoFromUrl.js +6 -6
  144. package/lib/site/getOwnerAndRepoFromUrl.js.map +1 -1
  145. package/lib/site/getRelativePaths.js +7 -7
  146. package/lib/site/getRelativePaths.js.map +1 -1
  147. package/lib/site/getRepoDetails.js +20 -20
  148. package/lib/site/getRepoDetails.js.map +1 -1
  149. package/lib/site/index.js +25 -73
  150. package/lib/site/index.js.map +1 -1
  151. package/lib/site/serveSite.js +10 -10
  152. package/lib/site/serveSite.js.map +1 -1
  153. package/lib/tester/helpers.d.ts +2 -0
  154. package/lib/tester/helpers.js +71 -0
  155. package/lib/tester/helpers.js.map +1 -0
  156. package/lib/tester/helpers.spec.js +115 -0
  157. package/lib/tester/helpers.spec.js.map +1 -0
  158. package/lib/tester/index.d.ts +0 -1
  159. package/lib/tester/index.js +0 -1
  160. package/lib/tester/index.js.map +1 -1
  161. package/lib/tester/prettyDuration.js +11 -11
  162. package/lib/tester/prettyDuration.js.map +1 -1
  163. package/lib/tester/printTestResult.d.ts +1 -1
  164. package/lib/tester/printTestResult.js +35 -15
  165. package/lib/tester/printTestResult.js.map +1 -1
  166. package/lib/tester/testFeature.d.ts +4 -2
  167. package/lib/tester/testFeature.js +264 -226
  168. package/lib/tester/testFeature.js.map +1 -1
  169. package/lib/tester/testProject.d.ts +3 -7
  170. package/lib/tester/testProject.js +145 -246
  171. package/lib/tester/testProject.js.map +1 -1
  172. package/lib/tester/testSegment.d.ts +5 -2
  173. package/lib/tester/testSegment.js +65 -102
  174. package/lib/tester/testSegment.js.map +1 -1
  175. package/lib/utils/extractKeys.d.ts +2 -1
  176. package/lib/utils/extractKeys.js +57 -12
  177. package/lib/utils/extractKeys.js.map +1 -1
  178. package/lib/utils/git.d.ts +1 -1
  179. package/lib/utils/git.js +23 -23
  180. package/lib/utils/git.js.map +1 -1
  181. package/lib/utils/pretty.js +2 -4
  182. package/lib/utils/pretty.js.map +1 -1
  183. package/package.json +5 -6
  184. package/src/assess-distribution/index.ts +3 -2
  185. package/src/benchmark/index.ts +3 -3
  186. package/src/builder/allocator.spec.ts +1 -1
  187. package/src/builder/allocator.ts +1 -1
  188. package/src/builder/buildDatafile.ts +161 -124
  189. package/src/builder/buildProject.ts +6 -3
  190. package/src/builder/convertToV1.ts +166 -0
  191. package/src/builder/getFeatureRanges.ts +1 -1
  192. package/src/builder/hashes.ts +109 -0
  193. package/src/builder/traffic.ts +41 -15
  194. package/src/cli/cli.ts +1 -1
  195. package/src/cli/plugins.ts +0 -2
  196. package/src/config/projectConfig.ts +13 -10
  197. package/src/datasource/adapter.ts +1 -1
  198. package/src/datasource/datasource.ts +23 -2
  199. package/src/datasource/filesystemAdapter.ts +11 -12
  200. package/src/evaluate/index.ts +7 -6
  201. package/src/find-duplicate-segments/findDuplicateSegments.ts +1 -1
  202. package/src/find-usage/index.ts +111 -44
  203. package/src/generate-code/index.ts +1 -3
  204. package/src/generate-code/typescript.ts +7 -29
  205. package/src/index.ts +0 -1
  206. package/src/info/index.ts +2 -2
  207. package/src/init/index.ts +2 -2
  208. package/src/linter/attributeSchema.ts +18 -2
  209. package/src/linter/checkCircularDependency.ts +1 -1
  210. package/src/linter/checkPercentageExceedingSlot.ts +28 -8
  211. package/src/linter/conditionSchema.ts +66 -10
  212. package/src/linter/featureSchema.ts +312 -116
  213. package/src/linter/lintProject.ts +9 -4
  214. package/src/linter/testSchema.ts +42 -3
  215. package/src/list/index.ts +18 -30
  216. package/src/{tester → list}/matrix.ts +33 -11
  217. package/src/site/exportSite.ts +2 -4
  218. package/src/site/generateHistory.ts +1 -1
  219. package/src/site/generateSiteSearchIndex.ts +58 -50
  220. package/src/site/getLastModifiedFromHistory.ts +1 -1
  221. package/src/tester/helpers.spec.ts +149 -0
  222. package/src/tester/helpers.ts +76 -0
  223. package/src/tester/index.ts +0 -1
  224. package/src/tester/printTestResult.ts +25 -3
  225. package/src/tester/testFeature.ts +270 -124
  226. package/src/tester/testProject.ts +28 -49
  227. package/src/tester/testSegment.ts +48 -40
  228. package/src/utils/extractKeys.ts +58 -1
  229. package/src/utils/git.ts +1 -1
  230. package/tsconfig.cjs.json +1 -0
  231. package/coverage/lcov-report/lib/tester/checkIfObjectsAreEqual.js.html +0 -151
  232. package/coverage/lcov-report/src/tester/checkIfObjectsAreEqual.ts.html +0 -157
  233. package/lib/restore/index.d.ts +0 -4
  234. package/lib/restore/index.js +0 -91
  235. package/lib/restore/index.js.map +0 -1
  236. package/lib/tester/checkIfArraysAreEqual.d.ts +0 -1
  237. package/lib/tester/checkIfArraysAreEqual.js +0 -18
  238. package/lib/tester/checkIfArraysAreEqual.js.map +0 -1
  239. package/lib/tester/checkIfObjectsAreEqual.d.ts +0 -1
  240. package/lib/tester/checkIfObjectsAreEqual.js +0 -23
  241. package/lib/tester/checkIfObjectsAreEqual.js.map +0 -1
  242. package/lib/tester/checkIfObjectsAreEqual.spec.js +0 -26
  243. package/lib/tester/checkIfObjectsAreEqual.spec.js.map +0 -1
  244. package/lib/tester/matrix.js.map +0 -1
  245. package/lib/tester/matrix.spec.js.map +0 -1
  246. package/src/restore/index.ts +0 -42
  247. package/src/tester/checkIfArraysAreEqual.ts +0 -16
  248. package/src/tester/checkIfObjectsAreEqual.spec.ts +0 -31
  249. package/src/tester/checkIfObjectsAreEqual.ts +0 -24
  250. /package/lib/{tester → list}/matrix.spec.d.ts +0 -0
  251. /package/lib/tester/{checkIfObjectsAreEqual.spec.d.ts → helpers.spec.d.ts} +0 -0
  252. /package/src/{tester → list}/matrix.spec.ts +0 -0
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">92.64% </span>
26
+ <span class="strong">89.7% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>63/68</span>
28
+ <span class='fraction'>61/68</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">79.54% </span>
33
+ <span class="strong">73.07% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>35/44</span>
35
+ <span class='fraction'>38/52</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">92.18% </span>
47
+ <span class="strong">89.39% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>59/64</span>
49
+ <span class='fraction'>59/66</span>
50
50
  </div>
51
51
 
52
52
 
@@ -190,7 +190,16 @@
190
190
  <a name='L125'></a><a href='#L125'>125</a>
191
191
  <a name='L126'></a><a href='#L126'>126</a>
192
192
  <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
194
203
  <span class="cline-any cline-yes">1x</span>
195
204
  <span class="cline-any cline-yes">1x</span>
196
205
  <span class="cline-any cline-yes">1x</span>
@@ -210,15 +219,9 @@
210
219
  <span class="cline-any cline-no">&nbsp;</span>
211
220
  <span class="cline-any cline-neutral">&nbsp;</span>
212
221
  <span class="cline-any cline-yes">9x</span>
213
- <span class="cline-any cline-neutral">&nbsp;</span>
214
- <span class="cline-any cline-yes">21x</span>
215
222
  <span class="cline-any cline-yes">21x</span>
216
223
  <span class="cline-any cline-neutral">&nbsp;</span>
217
- <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-yes">9x</span>
219
224
  <span class="cline-any cline-yes">22x</span>
220
- <span class="cline-any cline-yes">22x</span>
221
- <span class="cline-any cline-neutral">&nbsp;</span>
222
225
  <span class="cline-any cline-neutral">&nbsp;</span>
223
226
  <span class="cline-any cline-neutral">&nbsp;</span>
224
227
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -260,6 +263,7 @@
260
263
  <span class="cline-any cline-neutral">&nbsp;</span>
261
264
  <span class="cline-any cline-neutral">&nbsp;</span>
262
265
  <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
267
  <span class="cline-any cline-yes">13x</span>
264
268
  <span class="cline-any cline-no">&nbsp;</span>
265
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -275,13 +279,16 @@
275
279
  <span class="cline-any cline-neutral">&nbsp;</span>
276
280
  <span class="cline-any cline-neutral">&nbsp;</span>
277
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
286
  <span class="cline-any cline-yes">13x</span>
279
287
  <span class="cline-any cline-yes">13x</span>
280
288
  <span class="cline-any cline-neutral">&nbsp;</span>
281
289
  <span class="cline-any cline-yes">1x</span>
282
290
  <span class="cline-any cline-yes">1x</span>
283
291
  <span class="cline-any cline-yes">2x</span>
284
- <span class="cline-any cline-yes">2x</span>
285
292
  <span class="cline-any cline-neutral">&nbsp;</span>
286
293
  <span class="cline-any cline-neutral">&nbsp;</span>
287
294
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -294,12 +301,18 @@
294
301
  <span class="cline-any cline-yes">13x</span>
295
302
  <span class="cline-any cline-yes">30x</span>
296
303
  <span class="cline-any cline-yes">30x</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-yes">30x</span>
297
308
  <span class="cline-any cline-yes">30x</span>
298
309
  <span class="cline-any cline-neutral">&nbsp;</span>
299
310
  <span class="cline-any cline-neutral">&nbsp;</span>
300
311
  <span class="cline-any cline-yes">30x</span>
301
312
  <span class="cline-any cline-yes">30x</span>
302
313
  <span class="cline-any cline-yes">26x</span>
314
+ <span class="cline-any cline-yes">26x</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
316
  <span class="cline-any cline-neutral">&nbsp;</span>
304
317
  <span class="cline-any cline-neutral">&nbsp;</span>
305
318
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -308,12 +321,17 @@
308
321
  <span class="cline-any cline-neutral">&nbsp;</span>
309
322
  <span class="cline-any cline-neutral">&nbsp;</span>
310
323
  <span class="cline-any cline-yes">13x</span>
324
+ <span class="cline-any cline-yes">13x</span>
311
325
  <span class="cline-any cline-yes">28x</span>
312
326
  <span class="cline-any cline-no">&nbsp;</span>
313
327
  <span class="cline-any cline-neutral">&nbsp;</span>
314
328
  <span class="cline-any cline-yes">28x</span>
315
329
  <span class="cline-any cline-neutral">&nbsp;</span>
316
330
  <span class="cline-any cline-yes">13x</span>
331
+ <span class="cline-any cline-no">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-yes">13x</span>
317
335
  <span class="cline-any cline-neutral">&nbsp;</span>
318
336
  <span class="cline-any cline-yes">13x</span>
319
337
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -323,8 +341,8 @@ exports.detectIfVariationsChanged = detectIfVariationsChanged;
323
341
  exports.getRulePercentageDiff = getRulePercentageDiff;
324
342
  exports.detectIfRangesChanged = detectIfRangesChanged;
325
343
  exports.getTraffic = getTraffic;
326
- var sdk_1 = require("@featurevisor/sdk");
327
- var allocator_1 = require("./allocator");
344
+ const sdk_1 = require("@featurevisor/sdk");
345
+ const allocator_1 = require("./allocator");
328
346
  function detectIfVariationsChanged(yamlVariations, // as exists in latest YAML
329
347
  existingFeature) {
330
348
  if (!existingFeature || typeof existingFeature.variations === "undefined") {
@@ -336,26 +354,20 @@ existingFeature) {
336
354
  // variations didn't exist before, and not even now
337
355
  <span class="cstat-no" title="statement not covered" > return false;</span>
338
356
  }
339
- var checkVariations = Array.isArray(yamlVariations)
340
- ? JSON.stringify(yamlVariations.map(function (_a) {
341
- var value = _a.value, weight = _a.weight;
342
- return ({ value: value, weight: weight });
343
- }))
357
+ const checkVariations = Array.isArray(yamlVariations)
358
+ ? JSON.stringify(yamlVariations.map(({ value, weight }) =&gt; ({ value, weight })))
344
359
  : <span class="branch-1 cbranch-no" title="branch not covered" >undefined;</span>
345
- return (JSON.stringify(existingFeature.variations.map(function (_a) {
346
- var value = _a.value, weight = _a.weight;
347
- return ({
348
- value: value,
349
- weight: weight,
350
- });
351
- })) !== checkVariations);
360
+ return (JSON.stringify(existingFeature.variations.map(({ value, weight }) =&gt; ({
361
+ value,
362
+ weight,
363
+ }))) !== checkVariations);
352
364
  }
353
365
  function getRulePercentageDiff(trafficPercentage, // 0 to 100k
354
366
  existingTrafficRule) {
355
367
  if (!existingTrafficRule) {
356
368
  return 0;
357
369
  }
358
- var existingPercentage = existingTrafficRule.percentage;
370
+ const existingPercentage = existingTrafficRule.percentage;
359
371
  return trafficPercentage - existingPercentage;
360
372
  }
361
373
  function detectIfRangesChanged(availableRanges, // as exists in latest YAML
@@ -375,16 +387,17 @@ variations, parsedRules,
375
387
  existingFeature,
376
388
  // ranges from group slots
377
389
  ranges) {
378
- var result = [];
379
- // @TODO: may be pass from builder directly?
380
- var availableRanges = 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, sdk_1.MAX_BUCKETED_NUMBER]];
390
+ const result = [];
391
+ // @NOTE: may be pass from builder directly?
392
+ const availableRanges = 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, sdk_1.MAX_BUCKETED_NUMBER]];
381
393
  parsedRules.forEach(function (parsedRule) {
382
- var rulePercentage = parsedRule.percentage; // 0 - 100
383
- var traffic = {
394
+ const rulePercentage = parsedRule.percentage; // 0 - 100
395
+ const traffic = {
384
396
  key: parsedRule.key,
385
397
  segments: parsedRule.segments,
386
398
  percentage: rulePercentage * (sdk_1.MAX_BUCKETED_NUMBER / 100),
387
399
  allocation: [],
400
+ variationWeights: parsedRule.variationWeights,
388
401
  };
389
402
  // overrides
390
403
  <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedRule.variables) {
@@ -394,52 +407,66 @@ ranges) {
394
407
  <span class="cstat-no" title="statement not covered" > traffic.variation = parsedRule.variation;</span>
395
408
  }
396
409
  // detect changes
397
- var variationsChanged = detectIfVariationsChanged(variations, existingFeature);
398
- var existingTrafficRule = existingFeature === null || existingFeature === void 0 ? void 0 : existingFeature.traffic.find(function (t) { return t.key === parsedRule.key; });
399
- var rulePercentageDiff = getRulePercentageDiff(traffic.percentage, existingTrafficRule);
400
- var rangesChanged = detectIfRangesChanged(availableRanges, existingFeature);
401
- var needsRebucketing = !existingTrafficRule || // new rule
410
+ const variationsChanged = detectIfVariationsChanged(variations, existingFeature);
411
+ const existingTrafficRule = existingFeature?.traffic.find((t) =&gt; t.key === parsedRule.key);
412
+ const rulePercentageDiff = getRulePercentageDiff(traffic.percentage, existingTrafficRule);
413
+ const rangesChanged = detectIfRangesChanged(availableRanges, existingFeature);
414
+ const needsRebucketing = !existingTrafficRule || // new rule
402
415
  variationsChanged || // variations changed
403
416
  rulePercentageDiff &lt; 0 || // percentage decreased
404
- rangesChanged; // belongs to a group, and group ranges changed
405
- var updatedAvailableRanges = JSON.parse(JSON.stringify(availableRanges));
406
- if (existingTrafficRule &amp;&amp; !needsRebucketing) {
417
+ rangesChanged || // belongs to a group, and group ranges changed
418
+ // @NOTE: this means, if variationWeights is present, it will always rebucket.
419
+ // worth checking if we can maintain consistent bucketing for this use case as well.
420
+ // but this use case is unlikely to hit in practice because it doesn't matter if the feature itself is 100% rolled out.
421
+ traffic.variationWeights; // variation weights overridden
422
+ let updatedAvailableRanges = JSON.parse(JSON.stringify(availableRanges));
423
+ if (existingTrafficRule &amp;&amp; existingTrafficRule.allocation &amp;&amp; !needsRebucketing) {
407
424
  // increase: build on top of existing allocations
408
- var existingSum_1 = 0;
409
- traffic.allocation = existingTrafficRule.allocation.map(function (_a) {
410
- var variation = _a.variation, range = _a.range;
411
- var result = {
412
- variation: variation,
425
+ let existingSum = 0;
426
+ traffic.allocation = existingTrafficRule.allocation.map(function ({ variation, range }) {
427
+ const result = {
428
+ variation,
413
429
  range: range,
414
430
  };
415
- existingSum_1 += range[1] - range[0];
431
+ existingSum += range[1] - range[0];
416
432
  return result;
417
433
  });
418
- updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(availableRanges, existingSum_1);
434
+ updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(availableRanges, existingSum);
419
435
  }
420
436
  <span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(variations)) {
421
437
  variations.forEach(function (variation) {
422
- var weight = variation.weight;
423
- var percentage = weight * (sdk_1.MAX_BUCKETED_NUMBER / 100);
424
- var toFillValue = needsRebucketing
438
+ let weight = variation.weight;
439
+ <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> {
440
+ // override weight from rule
441
+ <span class="cstat-no" title="statement not covered" > weight = traffic.variationWeights[variation.value];</span>
442
+ }
443
+ const percentage = weight * (sdk_1.MAX_BUCKETED_NUMBER / 100);
444
+ const toFillValue = needsRebucketing
425
445
  ? percentage * (rulePercentage / 100) // whole value
426
446
  : (weight / 100) * rulePercentageDiff; // incrementing
427
- var rangesToFill = (0, allocator_1.getAllocation)(updatedAvailableRanges, toFillValue);
447
+ const rangesToFill = (0, allocator_1.getAllocation)(updatedAvailableRanges, toFillValue);
428
448
  rangesToFill.forEach(function (range) {
429
- traffic.allocation.push({
430
- variation: variation.value,
431
- range: range,
432
- });
449
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (traffic.allocation) {
450
+ traffic.allocation.push({
451
+ variation: variation.value,
452
+ range,
453
+ });
454
+ }
433
455
  });
434
456
  updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(updatedAvailableRanges, toFillValue);
435
457
  });
436
458
  }
437
- traffic.allocation = traffic.allocation.filter(function (a) {
438
- <span class="missing-if-branch" title="if path not taken" >I</span>if (a.range &amp;&amp; a.range[0] === a.range[1]) {
439
- <span class="cstat-no" title="statement not covered" > return false;</span>
459
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (traffic.allocation) {
460
+ traffic.allocation = traffic.allocation.filter((a) =&gt; {
461
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (a.range &amp;&amp; a.range[0] === a.range[1]) {
462
+ <span class="cstat-no" title="statement not covered" > return false;</span>
463
+ }
464
+ return true;
465
+ });
466
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (traffic.allocation.length === 0) {
467
+ <span class="cstat-no" title="statement not covered" > delete traffic.allocation;</span>
440
468
  }
441
- return true;
442
- });
469
+ }
443
470
  result.push(traffic);
444
471
  });
445
472
  return result;
@@ -451,7 +478,7 @@ ranges) {
451
478
  <div class='footer quiet pad2 space-top1 center small'>
452
479
  Code coverage generated by
453
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
454
- at 2025-03-31T21:26:38.403Z
481
+ at 2025-07-13T22:32:10.637Z
455
482
  </div>
456
483
  <script src="../../prettify.js"></script>
457
484
  <script>
@@ -0,0 +1,116 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/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> lib/list</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">24.7% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>21/85</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">10.25% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>4/39</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">24.69% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>20/81</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.js"><a href="matrix.js.html">matrix.js</a></td>
83
+ <td data-value="24.7" class="pic low">
84
+ <div class="chart"><div class="cover-fill" style="width: 24%"></div><div class="cover-empty" style="width: 76%"></div></div>
85
+ </td>
86
+ <td data-value="24.7" class="pct low">24.7%</td>
87
+ <td data-value="85" class="abs low">21/85</td>
88
+ <td data-value="10.25" class="pct low">10.25%</td>
89
+ <td data-value="39" class="abs low">4/39</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="24.69" class="pct low">24.69%</td>
93
+ <td data-value="81" class="abs low">20/81</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
+