@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.
- package/CHANGELOG.md +8 -0
- package/README.md +0 -6
- package/coverage/clover.xml +321 -237
- package/coverage/coverage-final.json +8 -8
- package/coverage/lcov-report/index.html +77 -47
- package/coverage/lcov-report/lib/builder/allocator.js.html +14 -14
- package/coverage/lcov-report/lib/builder/index.html +16 -16
- package/coverage/lcov-report/lib/builder/revision.js.html +3 -3
- package/coverage/lcov-report/lib/builder/traffic.js.html +90 -63
- package/coverage/lcov-report/lib/list/index.html +116 -0
- package/coverage/lcov-report/lib/{tester → list}/matrix.js.html +90 -66
- package/coverage/lcov-report/lib/tester/helpers.js.html +295 -0
- package/coverage/lcov-report/lib/tester/index.html +20 -35
- package/coverage/lcov-report/src/builder/allocator.ts.html +2 -2
- package/coverage/lcov-report/src/builder/index.html +15 -15
- package/coverage/lcov-report/src/builder/revision.ts.html +1 -1
- package/coverage/lcov-report/src/builder/traffic.ts.html +101 -23
- package/coverage/lcov-report/src/list/index.html +116 -0
- package/coverage/lcov-report/src/{tester → list}/matrix.ts.html +87 -21
- package/coverage/lcov-report/src/tester/helpers.ts.html +313 -0
- package/coverage/lcov-report/src/tester/index.html +20 -35
- package/coverage/lcov.info +592 -436
- package/lib/assess-distribution/index.d.ts +1 -1
- package/lib/assess-distribution/index.js +102 -162
- package/lib/assess-distribution/index.js.map +1 -1
- package/lib/benchmark/index.js +87 -143
- package/lib/benchmark/index.js.map +1 -1
- package/lib/builder/allocator.d.ts +1 -1
- package/lib/builder/allocator.js +12 -12
- package/lib/builder/allocator.js.map +1 -1
- package/lib/builder/allocator.spec.js +22 -22
- package/lib/builder/allocator.spec.js.map +1 -1
- package/lib/builder/buildDatafile.d.ts +4 -3
- package/lib/builder/buildDatafile.js +311 -388
- package/lib/builder/buildDatafile.js.map +1 -1
- package/lib/builder/buildProject.d.ts +2 -1
- package/lib/builder/buildProject.js +96 -183
- package/lib/builder/buildProject.js.map +1 -1
- package/lib/builder/convertToV1.d.ts +10 -0
- package/lib/builder/convertToV1.js +119 -0
- package/lib/builder/convertToV1.js.map +1 -0
- package/lib/builder/getFeatureRanges.d.ts +1 -1
- package/lib/builder/getFeatureRanges.js +32 -105
- package/lib/builder/getFeatureRanges.js.map +1 -1
- package/lib/builder/hashes.d.ts +4 -0
- package/lib/builder/hashes.js +70 -0
- package/lib/builder/hashes.js.map +1 -0
- package/lib/builder/revision.js +2 -2
- package/lib/builder/revision.js.map +1 -1
- package/lib/builder/revision.spec.js +1 -1
- package/lib/builder/revision.spec.js.map +1 -1
- package/lib/builder/traffic.d.ts +1 -1
- package/lib/builder/traffic.js +57 -48
- package/lib/builder/traffic.js.map +1 -1
- package/lib/builder/traffic.spec.js +14 -14
- package/lib/builder/traffic.spec.js.map +1 -1
- package/lib/cli/cli.js +60 -129
- package/lib/cli/cli.js.map +1 -1
- package/lib/cli/plugins.js +14 -16
- package/lib/cli/plugins.js.map +1 -1
- package/lib/config/parsers.js +1 -1
- package/lib/config/parsers.js.map +1 -1
- package/lib/config/projectConfig.d.ts +8 -6
- package/lib/config/projectConfig.js +31 -72
- package/lib/config/projectConfig.js.map +1 -1
- package/lib/datasource/adapter.d.ts +1 -1
- package/lib/datasource/adapter.js +2 -5
- package/lib/datasource/adapter.js.map +1 -1
- package/lib/datasource/datasource.d.ts +2 -1
- package/lib/datasource/datasource.js +107 -148
- package/lib/datasource/datasource.js.map +1 -1
- package/lib/datasource/filesystemAdapter.d.ts +1 -1
- package/lib/datasource/filesystemAdapter.js +224 -360
- package/lib/datasource/filesystemAdapter.js.map +1 -1
- package/lib/evaluate/index.d.ts +1 -1
- package/lib/evaluate/index.js +120 -188
- package/lib/evaluate/index.js.map +1 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.js +40 -128
- package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
- package/lib/find-duplicate-segments/index.js +27 -82
- package/lib/find-duplicate-segments/index.js.map +1 -1
- package/lib/find-usage/index.d.ts +7 -5
- package/lib/find-usage/index.js +333 -507
- package/lib/find-usage/index.js.map +1 -1
- package/lib/generate-code/index.js +36 -91
- package/lib/generate-code/index.js.map +1 -1
- package/lib/generate-code/typescript.js +117 -157
- package/lib/generate-code/typescript.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/info/index.js +45 -133
- package/lib/info/index.js.map +1 -1
- package/lib/init/index.d.ts +1 -1
- package/lib/init/index.js +16 -64
- package/lib/init/index.js.map +1 -1
- package/lib/linter/attributeSchema.d.ts +21 -6
- package/lib/linter/attributeSchema.js +18 -4
- package/lib/linter/attributeSchema.js.map +1 -1
- package/lib/linter/checkCircularDependency.d.ts +1 -1
- package/lib/linter/checkCircularDependency.js +22 -80
- package/lib/linter/checkCircularDependency.js.map +1 -1
- package/lib/linter/checkPercentageExceedingSlot.d.ts +1 -1
- package/lib/linter/checkPercentageExceedingSlot.js +36 -76
- package/lib/linter/checkPercentageExceedingSlot.js.map +1 -1
- package/lib/linter/conditionSchema.d.ts +1 -1
- package/lib/linter/conditionSchema.js +89 -41
- package/lib/linter/conditionSchema.js.map +1 -1
- package/lib/linter/featureSchema.d.ts +345 -197
- package/lib/linter/featureSchema.js +313 -172
- package/lib/linter/featureSchema.js.map +1 -1
- package/lib/linter/groupSchema.js +6 -6
- package/lib/linter/groupSchema.js.map +1 -1
- package/lib/linter/lintProject.js +306 -480
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/printError.js +7 -7
- package/lib/linter/printError.js.map +1 -1
- package/lib/linter/segmentSchema.js +2 -2
- package/lib/linter/segmentSchema.js.map +1 -1
- package/lib/linter/testSchema.d.ts +155 -3
- package/lib/linter/testSchema.js +47 -17
- package/lib/linter/testSchema.js.map +1 -1
- package/lib/list/index.d.ts +1 -0
- package/lib/list/index.js +349 -517
- package/lib/list/index.js.map +1 -1
- package/lib/{tester → list}/matrix.d.ts +1 -1
- package/lib/{tester → list}/matrix.js +50 -42
- package/lib/list/matrix.js.map +1 -0
- package/lib/{tester → list}/matrix.spec.js +7 -7
- package/lib/list/matrix.spec.js.map +1 -0
- package/lib/site/exportSite.js +25 -71
- package/lib/site/exportSite.js.map +1 -1
- package/lib/site/generateHistory.d.ts +1 -1
- package/lib/site/generateHistory.js +26 -82
- package/lib/site/generateHistory.js.map +1 -1
- package/lib/site/generateSiteSearchIndex.d.ts +1 -1
- package/lib/site/generateSiteSearchIndex.js +182 -259
- package/lib/site/generateSiteSearchIndex.js.map +1 -1
- package/lib/site/getLastModifiedFromHistory.d.ts +1 -1
- package/lib/site/getLastModifiedFromHistory.js +2 -2
- package/lib/site/getLastModifiedFromHistory.js.map +1 -1
- package/lib/site/getOwnerAndRepoFromUrl.js +6 -6
- package/lib/site/getOwnerAndRepoFromUrl.js.map +1 -1
- package/lib/site/getRelativePaths.js +7 -7
- package/lib/site/getRelativePaths.js.map +1 -1
- package/lib/site/getRepoDetails.js +20 -20
- package/lib/site/getRepoDetails.js.map +1 -1
- package/lib/site/index.js +25 -73
- package/lib/site/index.js.map +1 -1
- package/lib/site/serveSite.js +10 -10
- package/lib/site/serveSite.js.map +1 -1
- package/lib/tester/helpers.d.ts +2 -0
- package/lib/tester/helpers.js +71 -0
- package/lib/tester/helpers.js.map +1 -0
- package/lib/tester/helpers.spec.js +115 -0
- package/lib/tester/helpers.spec.js.map +1 -0
- package/lib/tester/index.d.ts +0 -1
- package/lib/tester/index.js +0 -1
- package/lib/tester/index.js.map +1 -1
- package/lib/tester/prettyDuration.js +11 -11
- package/lib/tester/prettyDuration.js.map +1 -1
- package/lib/tester/printTestResult.d.ts +1 -1
- package/lib/tester/printTestResult.js +35 -15
- package/lib/tester/printTestResult.js.map +1 -1
- package/lib/tester/testFeature.d.ts +4 -2
- package/lib/tester/testFeature.js +264 -226
- package/lib/tester/testFeature.js.map +1 -1
- package/lib/tester/testProject.d.ts +3 -7
- package/lib/tester/testProject.js +145 -246
- package/lib/tester/testProject.js.map +1 -1
- package/lib/tester/testSegment.d.ts +5 -2
- package/lib/tester/testSegment.js +65 -102
- package/lib/tester/testSegment.js.map +1 -1
- package/lib/utils/extractKeys.d.ts +2 -1
- package/lib/utils/extractKeys.js +57 -12
- package/lib/utils/extractKeys.js.map +1 -1
- package/lib/utils/git.d.ts +1 -1
- package/lib/utils/git.js +23 -23
- package/lib/utils/git.js.map +1 -1
- package/lib/utils/pretty.js +2 -4
- package/lib/utils/pretty.js.map +1 -1
- package/package.json +5 -6
- package/src/assess-distribution/index.ts +3 -2
- package/src/benchmark/index.ts +3 -3
- package/src/builder/allocator.spec.ts +1 -1
- package/src/builder/allocator.ts +1 -1
- package/src/builder/buildDatafile.ts +161 -124
- package/src/builder/buildProject.ts +6 -3
- package/src/builder/convertToV1.ts +166 -0
- package/src/builder/getFeatureRanges.ts +1 -1
- package/src/builder/hashes.ts +109 -0
- package/src/builder/traffic.ts +41 -15
- package/src/cli/cli.ts +1 -1
- package/src/cli/plugins.ts +0 -2
- package/src/config/projectConfig.ts +13 -10
- package/src/datasource/adapter.ts +1 -1
- package/src/datasource/datasource.ts +23 -2
- package/src/datasource/filesystemAdapter.ts +11 -12
- package/src/evaluate/index.ts +7 -6
- package/src/find-duplicate-segments/findDuplicateSegments.ts +1 -1
- package/src/find-usage/index.ts +111 -44
- package/src/generate-code/index.ts +1 -3
- package/src/generate-code/typescript.ts +7 -29
- package/src/index.ts +0 -1
- package/src/info/index.ts +2 -2
- package/src/init/index.ts +2 -2
- package/src/linter/attributeSchema.ts +18 -2
- package/src/linter/checkCircularDependency.ts +1 -1
- package/src/linter/checkPercentageExceedingSlot.ts +28 -8
- package/src/linter/conditionSchema.ts +66 -10
- package/src/linter/featureSchema.ts +312 -116
- package/src/linter/lintProject.ts +9 -4
- package/src/linter/testSchema.ts +42 -3
- package/src/list/index.ts +18 -30
- package/src/{tester → list}/matrix.ts +33 -11
- package/src/site/exportSite.ts +2 -4
- package/src/site/generateHistory.ts +1 -1
- package/src/site/generateSiteSearchIndex.ts +58 -50
- package/src/site/getLastModifiedFromHistory.ts +1 -1
- package/src/tester/helpers.spec.ts +149 -0
- package/src/tester/helpers.ts +76 -0
- package/src/tester/index.ts +0 -1
- package/src/tester/printTestResult.ts +25 -3
- package/src/tester/testFeature.ts +270 -124
- package/src/tester/testProject.ts +28 -49
- package/src/tester/testSegment.ts +48 -40
- package/src/utils/extractKeys.ts +58 -1
- package/src/utils/git.ts +1 -1
- package/tsconfig.cjs.json +1 -0
- package/coverage/lcov-report/lib/tester/checkIfObjectsAreEqual.js.html +0 -151
- package/coverage/lcov-report/src/tester/checkIfObjectsAreEqual.ts.html +0 -157
- package/lib/restore/index.d.ts +0 -4
- package/lib/restore/index.js +0 -91
- package/lib/restore/index.js.map +0 -1
- package/lib/tester/checkIfArraysAreEqual.d.ts +0 -1
- package/lib/tester/checkIfArraysAreEqual.js +0 -18
- package/lib/tester/checkIfArraysAreEqual.js.map +0 -1
- package/lib/tester/checkIfObjectsAreEqual.d.ts +0 -1
- package/lib/tester/checkIfObjectsAreEqual.js +0 -23
- package/lib/tester/checkIfObjectsAreEqual.js.map +0 -1
- package/lib/tester/checkIfObjectsAreEqual.spec.js +0 -26
- package/lib/tester/checkIfObjectsAreEqual.spec.js.map +0 -1
- package/lib/tester/matrix.js.map +0 -1
- package/lib/tester/matrix.spec.js.map +0 -1
- package/src/restore/index.ts +0 -42
- package/src/tester/checkIfArraysAreEqual.ts +0 -16
- package/src/tester/checkIfObjectsAreEqual.spec.ts +0 -31
- package/src/tester/checkIfObjectsAreEqual.ts +0 -24
- /package/lib/{tester → list}/matrix.spec.d.ts +0 -0
- /package/lib/tester/{checkIfObjectsAreEqual.spec.d.ts → helpers.spec.d.ts} +0 -0
- /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">
|
|
26
|
+
<span class="strong">89.7% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
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">
|
|
33
|
+
<span class="strong">73.07% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
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">
|
|
47
|
+
<span class="strong">89.39% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>59/
|
|
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
|
|
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"> </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"> </span>
|
|
211
220
|
<span class="cline-any cline-neutral"> </span>
|
|
212
221
|
<span class="cline-any cline-yes">9x</span>
|
|
213
|
-
<span class="cline-any cline-neutral"> </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"> </span>
|
|
217
|
-
<span class="cline-any cline-neutral"> </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"> </span>
|
|
222
225
|
<span class="cline-any cline-neutral"> </span>
|
|
223
226
|
<span class="cline-any cline-neutral"> </span>
|
|
224
227
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -260,6 +263,7 @@
|
|
|
260
263
|
<span class="cline-any cline-neutral"> </span>
|
|
261
264
|
<span class="cline-any cline-neutral"> </span>
|
|
262
265
|
<span class="cline-any cline-neutral"> </span>
|
|
266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
263
267
|
<span class="cline-any cline-yes">13x</span>
|
|
264
268
|
<span class="cline-any cline-no"> </span>
|
|
265
269
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -275,13 +279,16 @@
|
|
|
275
279
|
<span class="cline-any cline-neutral"> </span>
|
|
276
280
|
<span class="cline-any cline-neutral"> </span>
|
|
277
281
|
<span class="cline-any cline-neutral"> </span>
|
|
282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
285
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
286
293
|
<span class="cline-any cline-neutral"> </span>
|
|
287
294
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
305
|
+
<span class="cline-any cline-no"> </span>
|
|
306
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
299
310
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
303
316
|
<span class="cline-any cline-neutral"> </span>
|
|
304
317
|
<span class="cline-any cline-neutral"> </span>
|
|
305
318
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -308,12 +321,17 @@
|
|
|
308
321
|
<span class="cline-any cline-neutral"> </span>
|
|
309
322
|
<span class="cline-any cline-neutral"> </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"> </span>
|
|
313
327
|
<span class="cline-any cline-neutral"> </span>
|
|
314
328
|
<span class="cline-any cline-yes">28x</span>
|
|
315
329
|
<span class="cline-any cline-neutral"> </span>
|
|
316
330
|
<span class="cline-any cline-yes">13x</span>
|
|
331
|
+
<span class="cline-any cline-no"> </span>
|
|
332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
334
|
+
<span class="cline-any cline-yes">13x</span>
|
|
317
335
|
<span class="cline-any cline-neutral"> </span>
|
|
318
336
|
<span class="cline-any cline-yes">13x</span>
|
|
319
337
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -323,8 +341,8 @@ exports.detectIfVariationsChanged = detectIfVariationsChanged;
|
|
|
323
341
|
exports.getRulePercentageDiff = getRulePercentageDiff;
|
|
324
342
|
exports.detectIfRangesChanged = detectIfRangesChanged;
|
|
325
343
|
exports.getTraffic = getTraffic;
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
|
|
340
|
-
? JSON.stringify(yamlVariations.map(
|
|
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 }) => ({ value, weight })))
|
|
344
359
|
: <span class="branch-1 cbranch-no" title="branch not covered" >undefined;</span>
|
|
345
|
-
return (JSON.stringify(existingFeature.variations.map(
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
weight: weight,
|
|
350
|
-
});
|
|
351
|
-
})) !== checkVariations);
|
|
360
|
+
return (JSON.stringify(existingFeature.variations.map(({ value, weight }) => ({
|
|
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
|
-
|
|
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
|
-
|
|
379
|
-
// @
|
|
380
|
-
|
|
390
|
+
const result = [];
|
|
391
|
+
// @NOTE: may be pass from builder directly?
|
|
392
|
+
const availableRanges = ranges && <span class="branch-1 cbranch-no" title="branch not covered" >ranges.length > 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
|
-
|
|
383
|
-
|
|
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
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
410
|
+
const variationsChanged = detectIfVariationsChanged(variations, existingFeature);
|
|
411
|
+
const existingTrafficRule = existingFeature?.traffic.find((t) => 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 < 0 || // percentage decreased
|
|
404
|
-
rangesChanged
|
|
405
|
-
|
|
406
|
-
|
|
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 && existingTrafficRule.allocation && !needsRebucketing) {
|
|
407
424
|
// increase: build on top of existing allocations
|
|
408
|
-
|
|
409
|
-
traffic.allocation = existingTrafficRule.allocation.map(function (
|
|
410
|
-
|
|
411
|
-
|
|
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
|
-
|
|
431
|
+
existingSum += range[1] - range[0];
|
|
416
432
|
return result;
|
|
417
433
|
});
|
|
418
|
-
updatedAvailableRanges = (0, allocator_1.getUpdatedAvailableRangesAfterFilling)(availableRanges,
|
|
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
|
-
|
|
423
|
-
|
|
424
|
-
|
|
438
|
+
let weight = variation.weight;
|
|
439
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (traffic.variationWeights && <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
|
-
|
|
447
|
+
const rangesToFill = (0, allocator_1.getAllocation)(updatedAvailableRanges, toFillValue);
|
|
428
448
|
rangesToFill.forEach(function (range) {
|
|
429
|
-
traffic.allocation
|
|
430
|
-
|
|
431
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
<span class="
|
|
459
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (traffic.allocation) {
|
|
460
|
+
traffic.allocation = traffic.allocation.filter((a) => {
|
|
461
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (a.range && 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
|
-
|
|
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-
|
|
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
|
+
|