@featurevisor/core 1.35.3 → 2.0.1

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 +88 -64
  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 +96 -24
  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 -49
  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 +40 -16
  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
 
@@ -191,7 +191,15 @@
191
191
  <a name='L126'></a><a href='#L126'>126</a>
192
192
  <a name='L127'></a><a href='#L127'>127</a>
193
193
  <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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>
195
203
  <span class="cline-any cline-yes">1x</span>
196
204
  <span class="cline-any cline-yes">1x</span>
197
205
  <span class="cline-any cline-yes">1x</span>
@@ -211,15 +219,9 @@
211
219
  <span class="cline-any cline-no">&nbsp;</span>
212
220
  <span class="cline-any cline-neutral">&nbsp;</span>
213
221
  <span class="cline-any cline-yes">9x</span>
214
- <span class="cline-any cline-neutral">&nbsp;</span>
215
- <span class="cline-any cline-yes">21x</span>
216
222
  <span class="cline-any cline-yes">21x</span>
217
223
  <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-yes">9x</span>
220
224
  <span class="cline-any cline-yes">22x</span>
221
- <span class="cline-any cline-yes">22x</span>
222
- <span class="cline-any cline-neutral">&nbsp;</span>
223
225
  <span class="cline-any cline-neutral">&nbsp;</span>
224
226
  <span class="cline-any cline-neutral">&nbsp;</span>
225
227
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -261,6 +263,7 @@
261
263
  <span class="cline-any cline-neutral">&nbsp;</span>
262
264
  <span class="cline-any cline-neutral">&nbsp;</span>
263
265
  <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
267
  <span class="cline-any cline-yes">13x</span>
265
268
  <span class="cline-any cline-no">&nbsp;</span>
266
269
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -276,13 +279,16 @@
276
279
  <span class="cline-any cline-neutral">&nbsp;</span>
277
280
  <span class="cline-any cline-neutral">&nbsp;</span>
278
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>
279
286
  <span class="cline-any cline-yes">13x</span>
280
287
  <span class="cline-any cline-yes">13x</span>
281
288
  <span class="cline-any cline-neutral">&nbsp;</span>
282
289
  <span class="cline-any cline-yes">1x</span>
283
290
  <span class="cline-any cline-yes">1x</span>
284
291
  <span class="cline-any cline-yes">2x</span>
285
- <span class="cline-any cline-yes">2x</span>
286
292
  <span class="cline-any cline-neutral">&nbsp;</span>
287
293
  <span class="cline-any cline-neutral">&nbsp;</span>
288
294
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -295,12 +301,18 @@
295
301
  <span class="cline-any cline-yes">13x</span>
296
302
  <span class="cline-any cline-yes">30x</span>
297
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>
298
308
  <span class="cline-any cline-yes">30x</span>
299
309
  <span class="cline-any cline-neutral">&nbsp;</span>
300
310
  <span class="cline-any cline-neutral">&nbsp;</span>
301
311
  <span class="cline-any cline-yes">30x</span>
302
312
  <span class="cline-any cline-yes">30x</span>
303
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>
304
316
  <span class="cline-any cline-neutral">&nbsp;</span>
305
317
  <span class="cline-any cline-neutral">&nbsp;</span>
306
318
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -309,11 +321,15 @@
309
321
  <span class="cline-any cline-neutral">&nbsp;</span>
310
322
  <span class="cline-any cline-neutral">&nbsp;</span>
311
323
  <span class="cline-any cline-yes">13x</span>
324
+ <span class="cline-any cline-yes">13x</span>
312
325
  <span class="cline-any cline-yes">28x</span>
313
326
  <span class="cline-any cline-no">&nbsp;</span>
314
327
  <span class="cline-any cline-neutral">&nbsp;</span>
315
328
  <span class="cline-any cline-yes">28x</span>
316
329
  <span class="cline-any cline-neutral">&nbsp;</span>
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>
317
333
  <span class="cline-any cline-neutral">&nbsp;</span>
318
334
  <span class="cline-any cline-yes">13x</span>
319
335
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -325,8 +341,8 @@ exports.detectIfVariationsChanged = detectIfVariationsChanged;
325
341
  exports.getRulePercentageDiff = getRulePercentageDiff;
326
342
  exports.detectIfRangesChanged = detectIfRangesChanged;
327
343
  exports.getTraffic = getTraffic;
328
- var sdk_1 = require("@featurevisor/sdk");
329
- var allocator_1 = require("./allocator");
344
+ const sdk_1 = require("@featurevisor/sdk");
345
+ const allocator_1 = require("./allocator");
330
346
  function detectIfVariationsChanged(yamlVariations, // as exists in latest YAML
331
347
  existingFeature) {
332
348
  if (!existingFeature || typeof existingFeature.variations === "undefined") {
@@ -338,26 +354,20 @@ existingFeature) {
338
354
  // variations didn't exist before, and not even now
339
355
  <span class="cstat-no" title="statement not covered" > return false;</span>
340
356
  }
341
- var checkVariations = Array.isArray(yamlVariations)
342
- ? JSON.stringify(yamlVariations.map(function (_a) {
343
- var value = _a.value, weight = _a.weight;
344
- return ({ value: value, weight: weight });
345
- }))
357
+ const checkVariations = Array.isArray(yamlVariations)
358
+ ? JSON.stringify(yamlVariations.map(({ value, weight }) =&gt; ({ value, weight })))
346
359
  : <span class="branch-1 cbranch-no" title="branch not covered" >undefined;</span>
347
- return (JSON.stringify(existingFeature.variations.map(function (_a) {
348
- var value = _a.value, weight = _a.weight;
349
- return ({
350
- value: value,
351
- weight: weight,
352
- });
353
- })) !== checkVariations);
360
+ return (JSON.stringify(existingFeature.variations.map(({ value, weight }) =&gt; ({
361
+ value,
362
+ weight,
363
+ }))) !== checkVariations);
354
364
  }
355
365
  function getRulePercentageDiff(trafficPercentage, // 0 to 100k
356
366
  existingTrafficRule) {
357
367
  if (!existingTrafficRule) {
358
368
  return 0;
359
369
  }
360
- var existingPercentage = existingTrafficRule.percentage;
370
+ const existingPercentage = existingTrafficRule.percentage;
361
371
  return trafficPercentage - existingPercentage;
362
372
  }
363
373
  function detectIfRangesChanged(availableRanges, // as exists in latest YAML
@@ -377,16 +387,17 @@ variations, parsedRules,
377
387
  existingFeature,
378
388
  // ranges from group slots
379
389
  ranges) {
380
- var result = [];
381
- // @TODO: may be pass from builder directly?
382
- 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]];
383
393
  parsedRules.forEach(function (parsedRule) {
384
- var rulePercentage = parsedRule.percentage; // 0 - 100
385
- var traffic = {
394
+ const rulePercentage = parsedRule.percentage; // 0 - 100
395
+ const traffic = {
386
396
  key: parsedRule.key,
387
397
  segments: parsedRule.segments,
388
398
  percentage: rulePercentage * (sdk_1.MAX_BUCKETED_NUMBER / 100),
389
399
  allocation: [],
400
+ variationWeights: parsedRule.variationWeights,
390
401
  };
391
402
  // overrides
392
403
  <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedRule.variables) {
@@ -396,53 +407,66 @@ ranges) {
396
407
  <span class="cstat-no" title="statement not covered" > traffic.variation = parsedRule.variation;</span>
397
408
  }
398
409
  // detect changes
399
- var variationsChanged = detectIfVariationsChanged(variations, existingFeature);
400
- var existingTrafficRule = existingFeature === null || existingFeature === void 0 ? void 0 : existingFeature.traffic.find(function (t) { return t.key === parsedRule.key; });
401
- var rulePercentageDiff = getRulePercentageDiff(traffic.percentage, existingTrafficRule);
402
- var rangesChanged = detectIfRangesChanged(availableRanges, existingFeature);
403
- 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
404
415
  variationsChanged || // variations changed
405
416
  rulePercentageDiff &lt; 0 || // percentage decreased
406
- rangesChanged; // belongs to a group, and group ranges changed
407
- var updatedAvailableRanges = JSON.parse(JSON.stringify(availableRanges));
408
- 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) {
409
424
  // increase: build on top of existing allocations
410
- var existingSum_1 = 0;
411
- traffic.allocation = existingTrafficRule.allocation.map(function (_a) {
412
- var variation = _a.variation, range = _a.range;
413
- var result = {
414
- variation: variation,
425
+ let existingSum = 0;
426
+ traffic.allocation = existingTrafficRule.allocation.map(function ({ variation, range }) {
427
+ const result = {
428
+ variation,
415
429
  range: range,
416
430
  };
417
- existingSum_1 += range[1] - range[0];
431
+ existingSum += range[1] - range[0];
418
432
  return result;
419
433
  });
420
- updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(availableRanges, existingSum_1);
434
+ updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(availableRanges, existingSum);
421
435
  }
422
436
  <span class="missing-if-branch" title="else path not taken" >E</span>if (Array.isArray(variations)) {
423
437
  variations.forEach(function (variation) {
424
- var weight = variation.weight;
425
- var percentage = weight * (sdk_1.MAX_BUCKETED_NUMBER / 100);
426
- 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
427
445
  ? percentage * (rulePercentage / 100) // whole value
428
446
  : (weight / 100) * rulePercentageDiff; // incrementing
429
- var rangesToFill = (0, allocator_1.getAllocation)(updatedAvailableRanges, toFillValue);
447
+ const rangesToFill = (0, allocator_1.getAllocation)(updatedAvailableRanges, toFillValue);
430
448
  rangesToFill.forEach(function (range) {
431
- traffic.allocation.push({
432
- variation: variation.value,
433
- range: range,
434
- });
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
+ }
435
455
  });
436
456
  updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(updatedAvailableRanges, toFillValue);
437
457
  });
438
458
  }
439
- traffic.allocation = traffic.allocation.filter(function (a) {
440
- <span class="missing-if-branch" title="if path not taken" >I</span>if (a.range &amp;&amp; a.range[0] === a.range[1]) {
441
- <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>
442
468
  }
443
- return true;
444
- });
445
- // @TODO: in v2, remove "allocation" property if an empty array
469
+ }
446
470
  result.push(traffic);
447
471
  });
448
472
  return result;
@@ -454,7 +478,7 @@ ranges) {
454
478
  <div class='footer quiet pad2 space-top1 center small'>
455
479
  Code coverage generated by
456
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
457
- at 2025-04-12T20:35:04.397Z
481
+ at 2025-07-19T20:24:47.780Z
458
482
  </div>
459
483
  <script src="../../prettify.js"></script>
460
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-19T20:24:47.780Z
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
+