@featurevisor/core 1.35.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +0 -6
  2. package/coverage/clover.xml +321 -237
  3. package/coverage/coverage-final.json +8 -8
  4. package/coverage/lcov-report/index.html +77 -47
  5. package/coverage/lcov-report/lib/builder/allocator.js.html +14 -14
  6. package/coverage/lcov-report/lib/builder/index.html +16 -16
  7. package/coverage/lcov-report/lib/builder/revision.js.html +3 -3
  8. package/coverage/lcov-report/lib/builder/traffic.js.html +88 -64
  9. package/coverage/lcov-report/lib/list/index.html +116 -0
  10. package/coverage/lcov-report/lib/{tester → list}/matrix.js.html +90 -66
  11. package/coverage/lcov-report/lib/tester/helpers.js.html +295 -0
  12. package/coverage/lcov-report/lib/tester/index.html +20 -35
  13. package/coverage/lcov-report/src/builder/allocator.ts.html +2 -2
  14. package/coverage/lcov-report/src/builder/index.html +15 -15
  15. package/coverage/lcov-report/src/builder/revision.ts.html +1 -1
  16. package/coverage/lcov-report/src/builder/traffic.ts.html +96 -24
  17. package/coverage/lcov-report/src/list/index.html +116 -0
  18. package/coverage/lcov-report/src/{tester → list}/matrix.ts.html +87 -21
  19. package/coverage/lcov-report/src/tester/helpers.ts.html +313 -0
  20. package/coverage/lcov-report/src/tester/index.html +20 -35
  21. package/coverage/lcov.info +592 -436
  22. package/lib/assess-distribution/index.d.ts +1 -1
  23. package/lib/assess-distribution/index.js +102 -162
  24. package/lib/assess-distribution/index.js.map +1 -1
  25. package/lib/benchmark/index.js +87 -143
  26. package/lib/benchmark/index.js.map +1 -1
  27. package/lib/builder/allocator.d.ts +1 -1
  28. package/lib/builder/allocator.js +12 -12
  29. package/lib/builder/allocator.js.map +1 -1
  30. package/lib/builder/allocator.spec.js +22 -22
  31. package/lib/builder/allocator.spec.js.map +1 -1
  32. package/lib/builder/buildDatafile.d.ts +4 -3
  33. package/lib/builder/buildDatafile.js +311 -388
  34. package/lib/builder/buildDatafile.js.map +1 -1
  35. package/lib/builder/buildProject.d.ts +2 -1
  36. package/lib/builder/buildProject.js +96 -183
  37. package/lib/builder/buildProject.js.map +1 -1
  38. package/lib/builder/convertToV1.d.ts +10 -0
  39. package/lib/builder/convertToV1.js +119 -0
  40. package/lib/builder/convertToV1.js.map +1 -0
  41. package/lib/builder/getFeatureRanges.d.ts +1 -1
  42. package/lib/builder/getFeatureRanges.js +32 -105
  43. package/lib/builder/getFeatureRanges.js.map +1 -1
  44. package/lib/builder/hashes.d.ts +4 -0
  45. package/lib/builder/hashes.js +70 -0
  46. package/lib/builder/hashes.js.map +1 -0
  47. package/lib/builder/revision.js +2 -2
  48. package/lib/builder/revision.js.map +1 -1
  49. package/lib/builder/revision.spec.js +1 -1
  50. package/lib/builder/revision.spec.js.map +1 -1
  51. package/lib/builder/traffic.d.ts +1 -1
  52. package/lib/builder/traffic.js +57 -49
  53. package/lib/builder/traffic.js.map +1 -1
  54. package/lib/builder/traffic.spec.js +14 -14
  55. package/lib/builder/traffic.spec.js.map +1 -1
  56. package/lib/cli/cli.js +60 -129
  57. package/lib/cli/cli.js.map +1 -1
  58. package/lib/cli/plugins.js +14 -16
  59. package/lib/cli/plugins.js.map +1 -1
  60. package/lib/config/parsers.js +1 -1
  61. package/lib/config/parsers.js.map +1 -1
  62. package/lib/config/projectConfig.d.ts +8 -6
  63. package/lib/config/projectConfig.js +31 -72
  64. package/lib/config/projectConfig.js.map +1 -1
  65. package/lib/datasource/adapter.d.ts +1 -1
  66. package/lib/datasource/adapter.js +2 -5
  67. package/lib/datasource/adapter.js.map +1 -1
  68. package/lib/datasource/datasource.d.ts +2 -1
  69. package/lib/datasource/datasource.js +107 -148
  70. package/lib/datasource/datasource.js.map +1 -1
  71. package/lib/datasource/filesystemAdapter.d.ts +1 -1
  72. package/lib/datasource/filesystemAdapter.js +224 -360
  73. package/lib/datasource/filesystemAdapter.js.map +1 -1
  74. package/lib/evaluate/index.d.ts +1 -1
  75. package/lib/evaluate/index.js +120 -188
  76. package/lib/evaluate/index.js.map +1 -1
  77. package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
  78. package/lib/find-duplicate-segments/findDuplicateSegments.js +40 -128
  79. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  80. package/lib/find-duplicate-segments/index.js +27 -82
  81. package/lib/find-duplicate-segments/index.js.map +1 -1
  82. package/lib/find-usage/index.d.ts +7 -5
  83. package/lib/find-usage/index.js +333 -507
  84. package/lib/find-usage/index.js.map +1 -1
  85. package/lib/generate-code/index.js +36 -91
  86. package/lib/generate-code/index.js.map +1 -1
  87. package/lib/generate-code/typescript.js +117 -157
  88. package/lib/generate-code/typescript.js.map +1 -1
  89. package/lib/index.d.ts +0 -1
  90. package/lib/index.js +0 -1
  91. package/lib/index.js.map +1 -1
  92. package/lib/info/index.js +45 -133
  93. package/lib/info/index.js.map +1 -1
  94. package/lib/init/index.d.ts +1 -1
  95. package/lib/init/index.js +16 -64
  96. package/lib/init/index.js.map +1 -1
  97. package/lib/linter/attributeSchema.d.ts +21 -6
  98. package/lib/linter/attributeSchema.js +18 -4
  99. package/lib/linter/attributeSchema.js.map +1 -1
  100. package/lib/linter/checkCircularDependency.d.ts +1 -1
  101. package/lib/linter/checkCircularDependency.js +22 -80
  102. package/lib/linter/checkCircularDependency.js.map +1 -1
  103. package/lib/linter/checkPercentageExceedingSlot.d.ts +1 -1
  104. package/lib/linter/checkPercentageExceedingSlot.js +36 -76
  105. package/lib/linter/checkPercentageExceedingSlot.js.map +1 -1
  106. package/lib/linter/conditionSchema.d.ts +1 -1
  107. package/lib/linter/conditionSchema.js +89 -41
  108. package/lib/linter/conditionSchema.js.map +1 -1
  109. package/lib/linter/featureSchema.d.ts +345 -197
  110. package/lib/linter/featureSchema.js +313 -172
  111. package/lib/linter/featureSchema.js.map +1 -1
  112. package/lib/linter/groupSchema.js +6 -6
  113. package/lib/linter/groupSchema.js.map +1 -1
  114. package/lib/linter/lintProject.js +306 -480
  115. package/lib/linter/lintProject.js.map +1 -1
  116. package/lib/linter/printError.js +7 -7
  117. package/lib/linter/printError.js.map +1 -1
  118. package/lib/linter/segmentSchema.js +2 -2
  119. package/lib/linter/segmentSchema.js.map +1 -1
  120. package/lib/linter/testSchema.d.ts +155 -3
  121. package/lib/linter/testSchema.js +47 -17
  122. package/lib/linter/testSchema.js.map +1 -1
  123. package/lib/list/index.d.ts +1 -0
  124. package/lib/list/index.js +349 -517
  125. package/lib/list/index.js.map +1 -1
  126. package/lib/{tester → list}/matrix.d.ts +1 -1
  127. package/lib/{tester → list}/matrix.js +50 -42
  128. package/lib/list/matrix.js.map +1 -0
  129. package/lib/{tester → list}/matrix.spec.js +7 -7
  130. package/lib/list/matrix.spec.js.map +1 -0
  131. package/lib/site/exportSite.js +25 -71
  132. package/lib/site/exportSite.js.map +1 -1
  133. package/lib/site/generateHistory.d.ts +1 -1
  134. package/lib/site/generateHistory.js +26 -82
  135. package/lib/site/generateHistory.js.map +1 -1
  136. package/lib/site/generateSiteSearchIndex.d.ts +1 -1
  137. package/lib/site/generateSiteSearchIndex.js +182 -259
  138. package/lib/site/generateSiteSearchIndex.js.map +1 -1
  139. package/lib/site/getLastModifiedFromHistory.d.ts +1 -1
  140. package/lib/site/getLastModifiedFromHistory.js +2 -2
  141. package/lib/site/getLastModifiedFromHistory.js.map +1 -1
  142. package/lib/site/getOwnerAndRepoFromUrl.js +6 -6
  143. package/lib/site/getOwnerAndRepoFromUrl.js.map +1 -1
  144. package/lib/site/getRelativePaths.js +7 -7
  145. package/lib/site/getRelativePaths.js.map +1 -1
  146. package/lib/site/getRepoDetails.js +20 -20
  147. package/lib/site/getRepoDetails.js.map +1 -1
  148. package/lib/site/index.js +25 -73
  149. package/lib/site/index.js.map +1 -1
  150. package/lib/site/serveSite.js +10 -10
  151. package/lib/site/serveSite.js.map +1 -1
  152. package/lib/tester/helpers.d.ts +2 -0
  153. package/lib/tester/helpers.js +71 -0
  154. package/lib/tester/helpers.js.map +1 -0
  155. package/lib/tester/helpers.spec.js +115 -0
  156. package/lib/tester/helpers.spec.js.map +1 -0
  157. package/lib/tester/index.d.ts +0 -1
  158. package/lib/tester/index.js +0 -1
  159. package/lib/tester/index.js.map +1 -1
  160. package/lib/tester/prettyDuration.js +11 -11
  161. package/lib/tester/prettyDuration.js.map +1 -1
  162. package/lib/tester/printTestResult.d.ts +1 -1
  163. package/lib/tester/printTestResult.js +35 -15
  164. package/lib/tester/printTestResult.js.map +1 -1
  165. package/lib/tester/testFeature.d.ts +4 -2
  166. package/lib/tester/testFeature.js +264 -226
  167. package/lib/tester/testFeature.js.map +1 -1
  168. package/lib/tester/testProject.d.ts +3 -7
  169. package/lib/tester/testProject.js +145 -246
  170. package/lib/tester/testProject.js.map +1 -1
  171. package/lib/tester/testSegment.d.ts +5 -2
  172. package/lib/tester/testSegment.js +65 -102
  173. package/lib/tester/testSegment.js.map +1 -1
  174. package/lib/utils/extractKeys.d.ts +2 -1
  175. package/lib/utils/extractKeys.js +57 -12
  176. package/lib/utils/extractKeys.js.map +1 -1
  177. package/lib/utils/git.d.ts +1 -1
  178. package/lib/utils/git.js +23 -23
  179. package/lib/utils/git.js.map +1 -1
  180. package/lib/utils/pretty.js +2 -4
  181. package/lib/utils/pretty.js.map +1 -1
  182. package/package.json +5 -6
  183. package/src/assess-distribution/index.ts +3 -2
  184. package/src/benchmark/index.ts +3 -3
  185. package/src/builder/allocator.spec.ts +1 -1
  186. package/src/builder/allocator.ts +1 -1
  187. package/src/builder/buildDatafile.ts +161 -124
  188. package/src/builder/buildProject.ts +6 -3
  189. package/src/builder/convertToV1.ts +166 -0
  190. package/src/builder/getFeatureRanges.ts +1 -1
  191. package/src/builder/hashes.ts +109 -0
  192. package/src/builder/traffic.ts +40 -16
  193. package/src/cli/cli.ts +1 -1
  194. package/src/cli/plugins.ts +0 -2
  195. package/src/config/projectConfig.ts +13 -10
  196. package/src/datasource/adapter.ts +1 -1
  197. package/src/datasource/datasource.ts +23 -2
  198. package/src/datasource/filesystemAdapter.ts +11 -12
  199. package/src/evaluate/index.ts +7 -6
  200. package/src/find-duplicate-segments/findDuplicateSegments.ts +1 -1
  201. package/src/find-usage/index.ts +111 -44
  202. package/src/generate-code/index.ts +1 -3
  203. package/src/generate-code/typescript.ts +7 -29
  204. package/src/index.ts +0 -1
  205. package/src/info/index.ts +2 -2
  206. package/src/init/index.ts +2 -2
  207. package/src/linter/attributeSchema.ts +18 -2
  208. package/src/linter/checkCircularDependency.ts +1 -1
  209. package/src/linter/checkPercentageExceedingSlot.ts +28 -8
  210. package/src/linter/conditionSchema.ts +66 -10
  211. package/src/linter/featureSchema.ts +312 -116
  212. package/src/linter/lintProject.ts +9 -4
  213. package/src/linter/testSchema.ts +42 -3
  214. package/src/list/index.ts +18 -30
  215. package/src/{tester → list}/matrix.ts +33 -11
  216. package/src/site/exportSite.ts +2 -4
  217. package/src/site/generateHistory.ts +1 -1
  218. package/src/site/generateSiteSearchIndex.ts +58 -50
  219. package/src/site/getLastModifiedFromHistory.ts +1 -1
  220. package/src/tester/helpers.spec.ts +149 -0
  221. package/src/tester/helpers.ts +76 -0
  222. package/src/tester/index.ts +0 -1
  223. package/src/tester/printTestResult.ts +25 -3
  224. package/src/tester/testFeature.ts +270 -124
  225. package/src/tester/testProject.ts +28 -49
  226. package/src/tester/testSegment.ts +48 -40
  227. package/src/utils/extractKeys.ts +58 -1
  228. package/src/utils/git.ts +1 -1
  229. package/tsconfig.cjs.json +1 -0
  230. package/coverage/lcov-report/lib/tester/checkIfObjectsAreEqual.js.html +0 -151
  231. package/coverage/lcov-report/src/tester/checkIfObjectsAreEqual.ts.html +0 -157
  232. package/lib/restore/index.d.ts +0 -4
  233. package/lib/restore/index.js +0 -91
  234. package/lib/restore/index.js.map +0 -1
  235. package/lib/tester/checkIfArraysAreEqual.d.ts +0 -1
  236. package/lib/tester/checkIfArraysAreEqual.js +0 -18
  237. package/lib/tester/checkIfArraysAreEqual.js.map +0 -1
  238. package/lib/tester/checkIfObjectsAreEqual.d.ts +0 -1
  239. package/lib/tester/checkIfObjectsAreEqual.js +0 -23
  240. package/lib/tester/checkIfObjectsAreEqual.js.map +0 -1
  241. package/lib/tester/checkIfObjectsAreEqual.spec.js +0 -26
  242. package/lib/tester/checkIfObjectsAreEqual.spec.js.map +0 -1
  243. package/lib/tester/matrix.js.map +0 -1
  244. package/lib/tester/matrix.spec.js.map +0 -1
  245. package/src/restore/index.ts +0 -42
  246. package/src/tester/checkIfArraysAreEqual.ts +0 -16
  247. package/src/tester/checkIfObjectsAreEqual.spec.ts +0 -31
  248. package/src/tester/checkIfObjectsAreEqual.ts +0 -24
  249. /package/lib/{tester → list}/matrix.spec.d.ts +0 -0
  250. /package/lib/tester/{checkIfObjectsAreEqual.spec.d.ts → helpers.spec.d.ts} +0 -0
  251. /package/src/{tester → list}/matrix.spec.ts +0 -0
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for lib/tester/matrix.js</title>
6
+ <title>Code coverage report for lib/list/matrix.js</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../../prettify.css" />
9
9
  <link rel="stylesheet" href="../../base.css" />
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">lib/tester</a> matrix.js</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">lib/list</a> matrix.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">27.9% </span>
26
+ <span class="strong">24.7% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>24/86</span>
28
+ <span class='fraction'>21/85</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">18.18% </span>
33
+ <span class="strong">10.25% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>8/44</span>
35
+ <span class='fraction'>4/39</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">25% </span>
40
+ <span class="strong">20% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>3/12</span>
42
+ <span class='fraction'>2/10</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">29.11% </span>
47
+ <span class="strong">24.69% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>23/79</span>
49
+ <span class='fraction'>20/81</span>
50
50
  </div>
51
51
 
52
52
 
@@ -196,18 +196,15 @@
196
196
  <a name='L131'></a><a href='#L131'>131</a>
197
197
  <a name='L132'></a><a href='#L132'>132</a>
198
198
  <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
200
- <span class="cline-any cline-yes">1x</span>
201
- <span class="cline-any cline-yes">2x</span>
202
- <span class="cline-any cline-no">&nbsp;</span>
203
- <span class="cline-any cline-no">&nbsp;</span>
204
- <span class="cline-any cline-no">&nbsp;</span>
205
- <span class="cline-any cline-no">&nbsp;</span>
206
- <span class="cline-any cline-neutral">&nbsp;</span>
207
- <span class="cline-any cline-no">&nbsp;</span>
208
- <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-yes">2x</span>
210
- <span class="cline-any cline-neutral">&nbsp;</span>
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>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
211
208
  <span class="cline-any cline-yes">1x</span>
212
209
  <span class="cline-any cline-yes">1x</span>
213
210
  <span class="cline-any cline-yes">1x</span>
@@ -216,7 +213,6 @@
216
213
  <span class="cline-any cline-yes">1x</span>
217
214
  <span class="cline-any cline-yes">1x</span>
218
215
  <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-neutral">&nbsp;</span>
220
216
  <span class="cline-any cline-yes">10x</span>
221
217
  <span class="cline-any cline-yes">10x</span>
222
218
  <span class="cline-any cline-yes">10x</span>
@@ -284,14 +280,34 @@
284
280
  <span class="cline-any cline-neutral">&nbsp;</span>
285
281
  <span class="cline-any cline-no">&nbsp;</span>
286
282
  <span class="cline-any cline-no">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-no">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-no">&nbsp;</span>
294
+ <span class="cline-any cline-no">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-no">&nbsp;</span>
287
299
  <span class="cline-any cline-no">&nbsp;</span>
288
300
  <span class="cline-any cline-no">&nbsp;</span>
289
301
  <span class="cline-any cline-neutral">&nbsp;</span>
290
302
  <span class="cline-any cline-no">&nbsp;</span>
291
303
  <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
305
  <span class="cline-any cline-no">&nbsp;</span>
293
306
  <span class="cline-any cline-no">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
309
  <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
311
  <span class="cline-any cline-no">&nbsp;</span>
296
312
  <span class="cline-any cline-no">&nbsp;</span>
297
313
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -330,17 +346,6 @@
330
346
  <span class="cline-any cline-no">&nbsp;</span>
331
347
  <span class="cline-any cline-neutral">&nbsp;</span>
332
348
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
333
- var __assign = (this &amp;&amp; this.__assign) || function () {
334
- __assign = Object.assign || <span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >fu</span>nction(t) {</span>
335
- <span class="cstat-no" title="statement not covered" > for (var s, i = <span class="cstat-no" title="statement not covered" >1,</span> n = <span class="cstat-no" title="statement not covered" >arguments.length;</span> i &lt; n; i++) {</span>
336
- <span class="cstat-no" title="statement not covered" > s = arguments[i];</span>
337
- <span class="cstat-no" title="statement not covered" > for (var p in s) <span class="cstat-no" title="statement not covered" >if (Object.prototype.hasOwnProperty.call(s, p))</span></span>
338
- <span class="cstat-no" title="statement not covered" > t[p] = s[p];</span>
339
- }
340
- <span class="cstat-no" title="statement not covered" > return t;</span>
341
- };
342
- return __assign.apply(this, arguments);
343
- };
344
349
  Object.defineProperty(exports, "__esModule", { value: true });
345
350
  exports.getMatrixCombinations = getMatrixCombinations;
346
351
  exports.applyCombinationToValue = applyCombinationToValue;
@@ -349,11 +354,10 @@ exports.getFeatureAssertionsFromMatrix = getFeatureAssertionsFromMatrix;
349
354
  exports.applyCombinationToSegmentAssertion = applyCombinationToSegmentAssertion;
350
355
  exports.getSegmentAssertionsFromMatrix = getSegmentAssertionsFromMatrix;
351
356
  function generateCombinations(keys, matrix, idx, prev, combinations) {
352
- var _a;
353
- var key = keys[idx];
354
- var values = matrix[key];
355
- for (var i = 0; i &lt; values.length; i++) {
356
- var combination = __assign(__assign({}, prev), (_a = {}, _a[key] = values[i], _a));
357
+ const key = keys[idx];
358
+ const values = matrix[key];
359
+ for (let i = 0; i &lt; values.length; i++) {
360
+ const combination = { ...prev, [key]: values[i] };
357
361
  if (idx === keys.length - 1) {
358
362
  combinations.push(combination);
359
363
  }
@@ -363,28 +367,28 @@ function generateCombinations(keys, matrix, idx, prev, combinations) {
363
367
  }
364
368
  }
365
369
  function getMatrixCombinations(matrix) {
366
- var keys = Object.keys(matrix);
370
+ const keys = Object.keys(matrix);
367
371
  if (!keys.length) {
368
372
  return [];
369
373
  }
370
- var combinations = [];
374
+ const combinations = [];
371
375
  generateCombinations(keys, matrix, 0, {}, combinations);
372
376
  return combinations;
373
377
  }
374
378
  function <span class="fstat-no" title="function not covered" >applyCombinationToValue(</span>value, combination) {
375
379
  <span class="cstat-no" title="statement not covered" > if (typeof value === "string") {</span>
376
- var variableKeysInValue = <span class="cstat-no" title="statement not covered" >value.match(/\${{(.+?)}}/g);</span>
380
+ const variableKeysInValue = <span class="cstat-no" title="statement not covered" >value.match(/\${{(.+?)}}/g);</span>
377
381
  // no variables found
378
382
  <span class="cstat-no" title="statement not covered" > if (!variableKeysInValue) {</span>
379
383
  <span class="cstat-no" title="statement not covered" > return value;</span>
380
384
  }
381
385
  // only 1 variable found, so we can insert the value directly
382
386
  <span class="cstat-no" title="statement not covered" > if (variableKeysInValue.length === 1 &amp;&amp; value.startsWith("${{") &amp;&amp; value.endsWith("}}")) {</span>
383
- var key = <span class="cstat-no" title="statement not covered" >value.replace("${{", "").replace("}}", "").trim();</span>
387
+ const key = <span class="cstat-no" title="statement not covered" >value.replace("${{", "").replace("}}", "").trim();</span>
384
388
  <span class="cstat-no" title="statement not covered" > return combination[key];</span>
385
389
  }
386
390
  // multiple variables found, so we can replace each as a whole string
387
- <span class="cstat-no" title="statement not covered" > return value.replace(/\${{(.+?)}}/g, <span class="fstat-no" title="function not covered" >fu</span>nction (_, key) { <span class="cstat-no" title="statement not covered" >return combination[key.trim()]; </span>});</span>
391
+ <span class="cstat-no" title="statement not covered" > return value.replace(/\${{(.+?)}}/g, <span class="fstat-no" title="function not covered" >(_</span>, key) =&gt; <span class="cstat-no" title="statement not covered" >combination[key.trim()])</span>;</span>
388
392
  }
389
393
  <span class="cstat-no" title="statement not covered" > return value;</span>
390
394
  }
@@ -392,12 +396,12 @@ function <span class="fstat-no" title="function not covered" >applyCombinationTo
392
396
  * Features
393
397
  */
394
398
  function <span class="fstat-no" title="function not covered" >applyCombinationToFeatureAssertion(</span>combination, assertion) {
395
- var flattenedAssertion = <span class="cstat-no" title="statement not covered" >__assign({}, assertion);</span>
399
+ const flattenedAssertion = <span class="cstat-no" title="statement not covered" >{ ...assertion };</span>
396
400
  // environment
397
401
  <span class="cstat-no" title="statement not covered" > flattenedAssertion.environment = applyCombinationToValue(flattenedAssertion.environment, combination);</span>
398
402
  // context
399
- <span class="cstat-no" title="statement not covered" > flattenedAssertion.context = Object.keys(flattenedAssertion.context).reduce(<span class="fstat-no" title="function not covered" >fu</span>nction (acc, key) {</span>
400
- <span class="cstat-no" title="statement not covered" > acc[key] = applyCombinationToValue(flattenedAssertion.context[key], combination);</span>
403
+ <span class="cstat-no" title="statement not covered" > flattenedAssertion.context = Object.keys(flattenedAssertion.context || {}).reduce(<span class="fstat-no" title="function not covered" >(a</span>cc, key) =&gt; {</span>
404
+ <span class="cstat-no" title="statement not covered" > acc[key] = applyCombinationToValue(flattenedAssertion.context?.[key], combination);</span>
401
405
  <span class="cstat-no" title="statement not covered" > return acc;</span>
402
406
  }, {});
403
407
  // at
@@ -416,16 +420,36 @@ function <span class="fstat-no" title="function not covered" >applyCombinationTo
416
420
  }
417
421
  function <span class="fstat-no" title="function not covered" >getFeatureAssertionsFromMatrix(</span>aIndex, assertionWithMatrix) {
418
422
  <span class="cstat-no" title="statement not covered" > if (!assertionWithMatrix.matrix) {</span>
419
- var assertion = <span class="cstat-no" title="statement not covered" >__assign({}, assertionWithMatrix);</span>
420
- <span class="cstat-no" title="statement not covered" > assertion.description = "Assertion #".concat(aIndex + 1, ":").concat(assertion.environment ? " (".concat(assertion.environment, ")") : "", " ").concat(assertion.description || "at ".concat(assertion.at, "%"));</span>
423
+ const assertion = <span class="cstat-no" title="statement not covered" >{ ...assertionWithMatrix };</span>
424
+ let suffix;
425
+ <span class="cstat-no" title="statement not covered" > if (assertion.environment) {</span>
426
+ <span class="cstat-no" title="statement not covered" > suffix = ` (${assertion.environment})`;</span>
427
+ }
428
+ <span class="cstat-no" title="statement not covered" > if (assertion.description) {</span>
429
+ <span class="cstat-no" title="statement not covered" > suffix = `: ${assertion.description}`;</span>
430
+ }
431
+ else {
432
+ <span class="cstat-no" title="statement not covered" > suffix = `: at ${assertion.at}%`;</span>
433
+ }
434
+ <span class="cstat-no" title="statement not covered" > assertion.description = `Assertion #${aIndex + 1}${suffix}`;</span>
421
435
  <span class="cstat-no" title="statement not covered" > return [assertion];</span>
422
436
  }
423
- var assertions = <span class="cstat-no" title="statement not covered" >[];</span>
424
- var combinations = <span class="cstat-no" title="statement not covered" >getMatrixCombinations(assertionWithMatrix.matrix);</span>
425
- <span class="cstat-no" title="statement not covered" > for (var cIndex = <span class="cstat-no" title="statement not covered" >0;</span> cIndex &lt; combinations.length; cIndex++) {</span>
426
- var combination = <span class="cstat-no" title="statement not covered" >combinations[cIndex];</span>
427
- var assertion = <span class="cstat-no" title="statement not covered" >applyCombinationToFeatureAssertion(combination, assertionWithMatrix);</span>
428
- <span class="cstat-no" title="statement not covered" > assertion.description = "Assertion #".concat(aIndex + 1, ":").concat(assertion.environment ? " (".concat(assertion.environment, ")") : "", " ").concat(assertion.description || "at ".concat(assertion.at, "%"));</span>
437
+ const assertions = <span class="cstat-no" title="statement not covered" >[];</span>
438
+ const combinations = <span class="cstat-no" title="statement not covered" >getMatrixCombinations(assertionWithMatrix.matrix);</span>
439
+ <span class="cstat-no" title="statement not covered" > for (let cIndex = <span class="cstat-no" title="statement not covered" >0;</span> cIndex &lt; combinations.length; cIndex++) {</span>
440
+ const combination = <span class="cstat-no" title="statement not covered" >combinations[cIndex];</span>
441
+ const assertion = <span class="cstat-no" title="statement not covered" >applyCombinationToFeatureAssertion(combination, assertionWithMatrix);</span>
442
+ let suffix;
443
+ <span class="cstat-no" title="statement not covered" > if (assertion.environment) {</span>
444
+ <span class="cstat-no" title="statement not covered" > suffix = ` (${assertion.environment})`;</span>
445
+ }
446
+ <span class="cstat-no" title="statement not covered" > if (assertion.description) {</span>
447
+ <span class="cstat-no" title="statement not covered" > suffix = `: ${assertion.description}`;</span>
448
+ }
449
+ else {
450
+ <span class="cstat-no" title="statement not covered" > suffix = `: at ${assertion.at}%`;</span>
451
+ }
452
+ <span class="cstat-no" title="statement not covered" > assertion.description = `Assertion #${aIndex + 1}${suffix}`;</span>
429
453
  <span class="cstat-no" title="statement not covered" > assertions.push(assertion);</span>
430
454
  }
431
455
  <span class="cstat-no" title="statement not covered" > return assertions;</span>
@@ -434,9 +458,9 @@ function <span class="fstat-no" title="function not covered" >getFeatureAssertio
434
458
  * Segments
435
459
  */
436
460
  function <span class="fstat-no" title="function not covered" >applyCombinationToSegmentAssertion(</span>combination, assertion) {
437
- var flattenedAssertion = <span class="cstat-no" title="statement not covered" >__assign({}, assertion);</span>
461
+ const flattenedAssertion = <span class="cstat-no" title="statement not covered" >{ ...assertion };</span>
438
462
  // context
439
- <span class="cstat-no" title="statement not covered" > flattenedAssertion.context = Object.keys(flattenedAssertion.context).reduce(<span class="fstat-no" title="function not covered" >fu</span>nction (acc, key) {</span>
463
+ <span class="cstat-no" title="statement not covered" > flattenedAssertion.context = Object.keys(flattenedAssertion.context).reduce(<span class="fstat-no" title="function not covered" >(a</span>cc, key) =&gt; {</span>
440
464
  <span class="cstat-no" title="statement not covered" > acc[key] = applyCombinationToValue(flattenedAssertion.context[key], combination);</span>
441
465
  <span class="cstat-no" title="statement not covered" > return acc;</span>
442
466
  }, {});
@@ -448,16 +472,16 @@ function <span class="fstat-no" title="function not covered" >applyCombinationTo
448
472
  }
449
473
  function <span class="fstat-no" title="function not covered" >getSegmentAssertionsFromMatrix(</span>aIndex, assertionWithMatrix) {
450
474
  <span class="cstat-no" title="statement not covered" > if (!assertionWithMatrix.matrix) {</span>
451
- var assertion = <span class="cstat-no" title="statement not covered" >__assign({}, assertionWithMatrix);</span>
452
- <span class="cstat-no" title="statement not covered" > assertion.description = "Assertion #".concat(aIndex + 1, ": ").concat(assertion.description || "#".concat(aIndex + 1));</span>
475
+ const assertion = <span class="cstat-no" title="statement not covered" >{ ...assertionWithMatrix };</span>
476
+ <span class="cstat-no" title="statement not covered" > assertion.description = `Assertion #${aIndex + 1}${assertion.description ? `: ${assertion.description}` : ""}`;</span>
453
477
  <span class="cstat-no" title="statement not covered" > return [assertion];</span>
454
478
  }
455
- var assertions = <span class="cstat-no" title="statement not covered" >[];</span>
456
- var combinations = <span class="cstat-no" title="statement not covered" >getMatrixCombinations(assertionWithMatrix.matrix);</span>
457
- <span class="cstat-no" title="statement not covered" > for (var cIndex = <span class="cstat-no" title="statement not covered" >0;</span> cIndex &lt; combinations.length; cIndex++) {</span>
458
- var combination = <span class="cstat-no" title="statement not covered" >combinations[cIndex];</span>
459
- var assertion = <span class="cstat-no" title="statement not covered" >applyCombinationToSegmentAssertion(combination, assertionWithMatrix);</span>
460
- <span class="cstat-no" title="statement not covered" > assertion.description = "Assertion #".concat(aIndex + 1, ": ").concat(assertion.description || "#".concat(aIndex + 1));</span>
479
+ const assertions = <span class="cstat-no" title="statement not covered" >[];</span>
480
+ const combinations = <span class="cstat-no" title="statement not covered" >getMatrixCombinations(assertionWithMatrix.matrix);</span>
481
+ <span class="cstat-no" title="statement not covered" > for (let cIndex = <span class="cstat-no" title="statement not covered" >0;</span> cIndex &lt; combinations.length; cIndex++) {</span>
482
+ const combination = <span class="cstat-no" title="statement not covered" >combinations[cIndex];</span>
483
+ const assertion = <span class="cstat-no" title="statement not covered" >applyCombinationToSegmentAssertion(combination, assertionWithMatrix);</span>
484
+ <span class="cstat-no" title="statement not covered" > assertion.description = `Assertion #${aIndex + 1}: ${assertion.description || `#${aIndex + 1}`}`;</span>
461
485
  <span class="cstat-no" title="statement not covered" > assertions.push(assertion);</span>
462
486
  }
463
487
  <span class="cstat-no" title="statement not covered" > return assertions;</span>
@@ -469,7 +493,7 @@ function <span class="fstat-no" title="function not covered" >getSegmentAssertio
469
493
  <div class='footer quiet pad2 space-top1 center small'>
470
494
  Code coverage generated by
471
495
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
472
- at 2025-04-12T20:35:04.397Z
496
+ at 2025-07-13T22:32:10.637Z
473
497
  </div>
474
498
  <script src="../../prettify.js"></script>
475
499
  <script>
@@ -0,0 +1,295 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/tester/helpers.js</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> / <a href="index.html">lib/tester</a> helpers.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.18% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>41/44</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">94% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>47/50</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">93.02% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>40/43</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 high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-yes">1x</span>
138
+ <span class="cline-any cline-yes">1x</span>
139
+ <span class="cline-any cline-yes">1x</span>
140
+ <span class="cline-any cline-neutral">&nbsp;</span>
141
+ <span class="cline-any cline-yes">23x</span>
142
+ <span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
+ <span class="cline-any cline-yes">23x</span>
145
+ <span class="cline-any cline-no">&nbsp;</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-yes">23x</span>
148
+ <span class="cline-any cline-yes">23x</span>
149
+ <span class="cline-any cline-yes">23x</span>
150
+ <span class="cline-any cline-yes">3x</span>
151
+ <span class="cline-any cline-neutral">&nbsp;</span>
152
+ <span class="cline-any cline-yes">20x</span>
153
+ <span class="cline-any cline-yes">24x</span>
154
+ <span class="cline-any cline-yes">1x</span>
155
+ <span class="cline-any cline-neutral">&nbsp;</span>
156
+ <span class="cline-any cline-yes">23x</span>
157
+ <span class="cline-any cline-yes">23x</span>
158
+ <span class="cline-any cline-yes">23x</span>
159
+ <span class="cline-any cline-yes">4x</span>
160
+ <span class="cline-any cline-yes">1x</span>
161
+ <span class="cline-any cline-neutral">&nbsp;</span>
162
+ <span class="cline-any cline-neutral">&nbsp;</span>
163
+ <span class="cline-any cline-yes">19x</span>
164
+ <span class="cline-any cline-yes">4x</span>
165
+ <span class="cline-any cline-yes">2x</span>
166
+ <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-neutral">&nbsp;</span>
168
+ <span class="cline-any cline-yes">15x</span>
169
+ <span class="cline-any cline-yes">4x</span>
170
+ <span class="cline-any cline-neutral">&nbsp;</span>
171
+ <span class="cline-any cline-neutral">&nbsp;</span>
172
+ <span class="cline-any cline-yes">12x</span>
173
+ <span class="cline-any cline-neutral">&nbsp;</span>
174
+ <span class="cline-any cline-neutral">&nbsp;</span>
175
+ <span class="cline-any cline-yes">29x</span>
176
+ <span class="cline-any cline-no">&nbsp;</span>
177
+ <span class="cline-any cline-neutral">&nbsp;</span>
178
+ <span class="cline-any cline-yes">29x</span>
179
+ <span class="cline-any cline-yes">3x</span>
180
+ <span class="cline-any cline-neutral">&nbsp;</span>
181
+ <span class="cline-any cline-yes">26x</span>
182
+ <span class="cline-any cline-yes">3x</span>
183
+ <span class="cline-any cline-neutral">&nbsp;</span>
184
+ <span class="cline-any cline-yes">23x</span>
185
+ <span class="cline-any cline-yes">44x</span>
186
+ <span class="cline-any cline-yes">44x</span>
187
+ <span class="cline-any cline-yes">44x</span>
188
+ <span class="cline-any cline-yes">4x</span>
189
+ <span class="cline-any cline-yes">1x</span>
190
+ <span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-yes">40x</span>
193
+ <span class="cline-any cline-neutral">&nbsp;</span>
194
+ <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-neutral">&nbsp;</span>
196
+ <span class="cline-any cline-yes">6x</span>
197
+ <span class="cline-any cline-yes">2x</span>
198
+ <span class="cline-any cline-neutral">&nbsp;</span>
199
+ <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-yes">34x</span>
201
+ <span class="cline-any cline-yes">6x</span>
202
+ <span class="cline-any cline-neutral">&nbsp;</span>
203
+ <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-yes">14x</span>
205
+ <span class="cline-any cline-neutral">&nbsp;</span>
206
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
207
+ Object.defineProperty(exports, "__esModule", { value: true });
208
+ exports.checkIfObjectsAreEqual = checkIfObjectsAreEqual;
209
+ exports.checkIfArraysAreEqual = checkIfArraysAreEqual;
210
+ function checkIfObjectsAreEqual(obj1, obj2) {
211
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (obj1 === obj2) {
212
+ <span class="cstat-no" title="statement not covered" > return true;</span>
213
+ }
214
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof obj1 !== "object" || obj1 === null || typeof obj2 !== "object" || obj2 === null) {
215
+ <span class="cstat-no" title="statement not covered" > return false;</span>
216
+ }
217
+ const keys1 = Object.keys(obj1);
218
+ const keys2 = Object.keys(obj2);
219
+ if (keys1.length !== keys2.length) {
220
+ return false;
221
+ }
222
+ for (const key of keys1) {
223
+ if (!keys2.includes(key)) {
224
+ return false;
225
+ }
226
+ const val1 = obj1[key];
227
+ const val2 = obj2[key];
228
+ if (Array.isArray(val1) &amp;&amp; Array.isArray(val2)) {
229
+ if (!checkIfArraysAreEqual(val1, val2)) {
230
+ return false;
231
+ }
232
+ }
233
+ else if (typeof val1 === "object" &amp;&amp; typeof val2 === "object") {
234
+ if (!checkIfObjectsAreEqual(val1, val2)) {
235
+ return false;
236
+ }
237
+ }
238
+ else if (val1 !== val2) {
239
+ return false;
240
+ }
241
+ }
242
+ return true;
243
+ }
244
+ function checkIfArraysAreEqual(arr1, arr2) {
245
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (arr1 === arr2) {
246
+ <span class="cstat-no" title="statement not covered" > return true;</span>
247
+ }
248
+ if (!Array.isArray(arr1) || !Array.isArray(arr2)) {
249
+ return false;
250
+ }
251
+ if (arr1.length !== arr2.length) {
252
+ return false;
253
+ }
254
+ for (let i = 0; i &lt; arr1.length; i++) {
255
+ const val1 = arr1[i];
256
+ const val2 = arr2[i];
257
+ if (Array.isArray(val1) &amp;&amp; Array.isArray(val2)) {
258
+ if (!checkIfArraysAreEqual(val1, val2)) {
259
+ return false;
260
+ }
261
+ }
262
+ else if (typeof val1 === "object" &amp;&amp;
263
+ typeof val2 === "object" &amp;&amp;
264
+ val1 !== null &amp;&amp;
265
+ val2 !== null) {
266
+ if (!checkIfObjectsAreEqual(val1, val2)) {
267
+ return false;
268
+ }
269
+ }
270
+ else if (val1 !== val2) {
271
+ return false;
272
+ }
273
+ }
274
+ return true;
275
+ }
276
+ //# sourceMappingURL=helpers.js.map</pre></td></tr></table></pre>
277
+
278
+ <div class='push'></div><!-- for sticky footer -->
279
+ </div><!-- /wrapper -->
280
+ <div class='footer quiet pad2 space-top1 center small'>
281
+ Code coverage generated by
282
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
283
+ at 2025-07-13T22:32:10.637Z
284
+ </div>
285
+ <script src="../../prettify.js"></script>
286
+ <script>
287
+ window.onload = function () {
288
+ prettyPrint();
289
+ };
290
+ </script>
291
+ <script src="../../sorter.js"></script>
292
+ <script src="../../block-navigation.js"></script>
293
+ </body>
294
+ </html>
295
+