@featurevisor/core 2.26.1 → 3.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 (390) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/coverage/clover.xml +4991 -3130
  3. package/coverage/coverage-final.json +63 -39
  4. package/coverage/lcov-report/block-navigation.js +1 -1
  5. package/coverage/lcov-report/index.html +248 -98
  6. package/coverage/lcov-report/sorter.js +21 -7
  7. package/coverage/lcov-report/src/assess-distribution/index.html +116 -0
  8. package/coverage/lcov-report/src/assess-distribution/index.ts.html +754 -0
  9. package/coverage/lcov-report/{list → src/benchmark}/index.html +30 -30
  10. package/coverage/lcov-report/src/benchmark/index.ts.html +793 -0
  11. package/coverage/lcov-report/{builder → src/builder}/allocator.ts.html +38 -38
  12. package/coverage/lcov-report/{builder/buildScopedConditions.ts.html → src/builder/applyContextToConditions.ts.html} +80 -65
  13. package/coverage/lcov-report/{builder/buildScopedDatafile.ts.html → src/builder/applyContextToDatafile.ts.html} +92 -92
  14. package/coverage/lcov-report/{builder/buildScopedSegments.ts.html → src/builder/applyContextToSegments.ts.html} +103 -67
  15. package/coverage/lcov-report/{builder → src/builder}/buildDatafile.ts.html +336 -306
  16. package/coverage/lcov-report/src/builder/buildProject.ts.html +1117 -0
  17. package/coverage/lcov-report/src/builder/buildRuntimeDatafiles.ts.html +256 -0
  18. package/coverage/lcov-report/{builder → src/builder}/getFeatureRanges.ts.html +22 -22
  19. package/coverage/lcov-report/{builder → src/builder}/hashes.ts.html +50 -50
  20. package/coverage/lcov-report/{builder → src/builder}/index.html +114 -84
  21. package/coverage/lcov-report/{tester/cliFormat.ts.html → src/builder/index.ts.html} +17 -29
  22. package/coverage/lcov-report/{builder → src/builder}/mutateVariables.ts.html +55 -55
  23. package/coverage/lcov-report/{builder → src/builder}/mutator.ts.html +118 -118
  24. package/coverage/lcov-report/{builder → src/builder}/revision.ts.html +15 -15
  25. package/coverage/lcov-report/{builder → src/builder}/traffic.ts.html +86 -86
  26. package/coverage/lcov-report/src/cli/cli.ts.html +400 -0
  27. package/coverage/lcov-report/{tester → src/cli}/index.html +41 -41
  28. package/coverage/lcov-report/src/cli/plugins.ts.html +214 -0
  29. package/coverage/lcov-report/{config → src/config}/index.html +31 -31
  30. package/coverage/lcov-report/{config → src/config}/index.ts.html +12 -12
  31. package/coverage/lcov-report/{config → src/config}/projectConfig.ts.html +312 -96
  32. package/coverage/lcov-report/{datasource → src/datasource}/adapter.ts.html +28 -73
  33. package/coverage/lcov-report/{datasource → src/datasource}/datasource.ts.html +191 -104
  34. package/coverage/lcov-report/{datasource → src/datasource}/filesystemAdapter.ts.html +233 -635
  35. package/coverage/lcov-report/{datasource → src/datasource}/index.html +48 -48
  36. package/coverage/lcov-report/{datasource → src/datasource}/index.ts.html +14 -14
  37. package/coverage/lcov-report/src/evaluate/index.html +116 -0
  38. package/coverage/lcov-report/src/evaluate/index.ts.html +814 -0
  39. package/coverage/lcov-report/src/find-duplicate-segments/findDuplicateSegments.ts.html +313 -0
  40. package/coverage/lcov-report/src/find-duplicate-segments/index.html +131 -0
  41. package/coverage/lcov-report/src/find-duplicate-segments/index.ts.html +307 -0
  42. package/coverage/lcov-report/src/find-usage/index.html +116 -0
  43. package/coverage/lcov-report/src/find-usage/index.ts.html +1780 -0
  44. package/coverage/lcov-report/src/generate-code/index.html +131 -0
  45. package/coverage/lcov-report/src/generate-code/index.ts.html +403 -0
  46. package/coverage/lcov-report/{generate-code → src/generate-code}/typescript.ts.html +266 -1361
  47. package/coverage/lcov-report/{generate-code → src}/index.html +38 -23
  48. package/coverage/lcov-report/src/info/index.html +116 -0
  49. package/coverage/lcov-report/src/info/index.ts.html +472 -0
  50. package/coverage/lcov-report/src/init/index.html +116 -0
  51. package/coverage/lcov-report/src/init/index.ts.html +280 -0
  52. package/coverage/lcov-report/{linter → src/linter}/attributeSchema.ts.html +160 -157
  53. package/coverage/lcov-report/{linter → src/linter}/checkCircularDependency.ts.html +25 -25
  54. package/coverage/lcov-report/{linter → src/linter}/checkPercentageExceedingSlot.ts.html +42 -42
  55. package/coverage/lcov-report/{linter → src/linter}/conditionSchema.ts.html +207 -207
  56. package/coverage/lcov-report/{linter → src/linter}/featureSchema.ts.html +462 -471
  57. package/coverage/lcov-report/{linter → src/linter}/groupSchema.ts.html +25 -22
  58. package/coverage/lcov-report/{linter → src/linter}/index.html +129 -99
  59. package/coverage/lcov-report/src/linter/index.ts.html +88 -0
  60. package/coverage/lcov-report/{linter → src/linter}/lintProject.ts.html +740 -332
  61. package/coverage/lcov-report/{linter → src/linter}/mutationNotation.ts.html +130 -130
  62. package/coverage/lcov-report/{linter → src/linter}/printError.ts.html +27 -27
  63. package/coverage/lcov-report/{linter → src/linter}/schema.ts.html +153 -150
  64. package/coverage/lcov-report/{linter → src/linter}/segmentSchema.ts.html +18 -15
  65. package/coverage/lcov-report/src/linter/targetSchema.ts.html +223 -0
  66. package/coverage/lcov-report/{linter → src/linter}/testSchema.ts.html +54 -48
  67. package/coverage/lcov-report/{linter → src/linter}/zodHelpers.ts.html +17 -17
  68. package/coverage/lcov-report/src/list/index.html +131 -0
  69. package/coverage/lcov-report/src/list/index.ts.html +2065 -0
  70. package/coverage/lcov-report/{list → src/list}/matrix.ts.html +43 -58
  71. package/coverage/lcov-report/src/promoter/index.html +116 -0
  72. package/coverage/lcov-report/src/promoter/index.ts.html +3883 -0
  73. package/coverage/lcov-report/src/sets.ts.html +313 -0
  74. package/coverage/lcov-report/src/targeting.ts.html +403 -0
  75. package/coverage/lcov-report/src/tester/cliFormat.ts.html +133 -0
  76. package/coverage/lcov-report/{tester → src/tester}/helpers.ts.html +15 -15
  77. package/coverage/lcov-report/src/tester/index.html +206 -0
  78. package/coverage/lcov-report/src/tester/prettyDuration.ts.html +187 -0
  79. package/coverage/lcov-report/src/tester/printTestResult.ts.html +337 -0
  80. package/coverage/lcov-report/src/tester/testFeature.ts.html +1186 -0
  81. package/coverage/lcov-report/src/tester/testProject.ts.html +1018 -0
  82. package/coverage/lcov-report/src/tester/testSegment.ts.html +316 -0
  83. package/coverage/lcov-report/{utils → src/utils}/extractKeys.ts.html +68 -68
  84. package/coverage/lcov-report/{utils → src/utils}/git.ts.html +44 -68
  85. package/coverage/lcov-report/{utils → src/utils}/index.html +44 -44
  86. package/coverage/lcov-report/{utils → src/utils}/index.ts.html +14 -14
  87. package/coverage/lcov-report/{utils → src/utils}/pretty.ts.html +20 -20
  88. package/coverage/lcov.info +10121 -5723
  89. package/jest.config.js +13 -4
  90. package/lib/assess-distribution/index.d.ts +1 -1
  91. package/lib/assess-distribution/index.js +59 -40
  92. package/lib/assess-distribution/index.js.map +1 -1
  93. package/lib/benchmark/index.d.ts +8 -5
  94. package/lib/benchmark/index.js +82 -65
  95. package/lib/benchmark/index.js.map +1 -1
  96. package/lib/builder/applyContextToConditions.d.ts +5 -0
  97. package/lib/builder/{buildScopedConditions.js → applyContextToConditions.js} +19 -14
  98. package/lib/builder/applyContextToConditions.js.map +1 -0
  99. package/lib/builder/applyContextToDatafile.d.ts +2 -0
  100. package/lib/builder/{buildScopedDatafile.js → applyContextToDatafile.js} +26 -26
  101. package/lib/builder/applyContextToDatafile.js.map +1 -0
  102. package/lib/builder/applyContextToSegments.d.ts +5 -0
  103. package/lib/builder/{buildScopedSegments.js → applyContextToSegments.js} +19 -14
  104. package/lib/builder/applyContextToSegments.js.map +1 -0
  105. package/lib/builder/buildDatafile.d.ts +9 -6
  106. package/lib/builder/buildDatafile.js +86 -51
  107. package/lib/builder/buildDatafile.js.map +1 -1
  108. package/lib/builder/buildProject.d.ts +17 -3
  109. package/lib/builder/buildProject.js +151 -59
  110. package/lib/builder/buildProject.js.map +1 -1
  111. package/lib/builder/buildRuntimeDatafiles.d.ts +12 -0
  112. package/lib/builder/buildRuntimeDatafiles.js +35 -0
  113. package/lib/builder/buildRuntimeDatafiles.js.map +1 -0
  114. package/lib/builder/getFeatureRanges.js +34 -1
  115. package/lib/builder/getFeatureRanges.js.map +1 -1
  116. package/lib/builder/hashes.js +34 -1
  117. package/lib/builder/hashes.js.map +1 -1
  118. package/lib/builder/index.d.ts +0 -1
  119. package/lib/builder/index.js +0 -1
  120. package/lib/builder/index.js.map +1 -1
  121. package/lib/cli/cli.js +0 -4
  122. package/lib/cli/cli.js.map +1 -1
  123. package/lib/cli/plugins.js +7 -2
  124. package/lib/cli/plugins.js.map +1 -1
  125. package/lib/config/projectConfig.d.ts +17 -17
  126. package/lib/config/projectConfig.js +101 -15
  127. package/lib/config/projectConfig.js.map +1 -1
  128. package/lib/datasource/adapter.d.ts +7 -9
  129. package/lib/datasource/adapter.js +0 -7
  130. package/lib/datasource/adapter.js.map +1 -1
  131. package/lib/datasource/datasource.d.ts +15 -5
  132. package/lib/datasource/datasource.js +37 -9
  133. package/lib/datasource/datasource.js.map +1 -1
  134. package/lib/datasource/filesystemAdapter.d.ts +4 -10
  135. package/lib/datasource/filesystemAdapter.js +111 -149
  136. package/lib/datasource/filesystemAdapter.js.map +1 -1
  137. package/lib/evaluate/index.d.ts +1 -7
  138. package/lib/evaluate/index.js +81 -67
  139. package/lib/evaluate/index.js.map +1 -1
  140. package/lib/find-duplicate-segments/findDuplicateSegments.js +34 -1
  141. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  142. package/lib/find-duplicate-segments/index.js +21 -13
  143. package/lib/find-duplicate-segments/index.js.map +1 -1
  144. package/lib/find-usage/index.js +57 -41
  145. package/lib/find-usage/index.js.map +1 -1
  146. package/lib/generate-code/index.d.ts +1 -1
  147. package/lib/generate-code/index.js +64 -21
  148. package/lib/generate-code/index.js.map +1 -1
  149. package/lib/generate-code/typescript.d.ts +1 -1
  150. package/lib/generate-code/typescript.js +59 -333
  151. package/lib/generate-code/typescript.js.map +1 -1
  152. package/lib/index.d.ts +2 -1
  153. package/lib/index.js +2 -1
  154. package/lib/index.js.map +1 -1
  155. package/lib/info/index.js +57 -16
  156. package/lib/info/index.js.map +1 -1
  157. package/lib/init/index.d.ts +2 -2
  158. package/lib/init/index.js +39 -3
  159. package/lib/init/index.js.map +1 -1
  160. package/lib/linter/attributeSchema.d.ts +1 -0
  161. package/lib/linter/attributeSchema.js +1 -0
  162. package/lib/linter/attributeSchema.js.map +1 -1
  163. package/lib/linter/conditionSchema.js +5 -5
  164. package/lib/linter/conditionSchema.js.map +1 -1
  165. package/lib/linter/featureSchema.d.ts +4 -1
  166. package/lib/linter/featureSchema.js +15 -13
  167. package/lib/linter/featureSchema.js.map +1 -1
  168. package/lib/linter/groupSchema.d.ts +1 -0
  169. package/lib/linter/groupSchema.js +1 -0
  170. package/lib/linter/groupSchema.js.map +1 -1
  171. package/lib/linter/lintProject.d.ts +1 -3
  172. package/lib/linter/lintProject.js +198 -68
  173. package/lib/linter/lintProject.js.map +1 -1
  174. package/lib/linter/schema.js +1 -0
  175. package/lib/linter/schema.js.map +1 -1
  176. package/lib/linter/segmentSchema.d.ts +1 -0
  177. package/lib/linter/segmentSchema.js +1 -0
  178. package/lib/linter/segmentSchema.js.map +1 -1
  179. package/lib/linter/targetSchema.d.ts +16 -0
  180. package/lib/linter/targetSchema.js +40 -0
  181. package/lib/linter/targetSchema.js.map +1 -0
  182. package/lib/linter/testSchema.d.ts +4 -3
  183. package/lib/linter/testSchema.js +9 -4
  184. package/lib/linter/testSchema.js.map +1 -1
  185. package/lib/list/index.d.ts +1 -0
  186. package/lib/list/index.js +131 -12
  187. package/lib/list/index.js.map +1 -1
  188. package/lib/list/matrix.js +3 -7
  189. package/lib/list/matrix.js.map +1 -1
  190. package/lib/promoter/index.d.ts +50 -0
  191. package/lib/promoter/index.js +880 -0
  192. package/lib/promoter/index.js.map +1 -0
  193. package/lib/sets.d.ts +11 -0
  194. package/lib/sets.js +81 -0
  195. package/lib/sets.js.map +1 -0
  196. package/lib/targeting.d.ts +14 -0
  197. package/lib/targeting.js +82 -0
  198. package/lib/targeting.js.map +1 -0
  199. package/lib/tester/cliFormat.d.ts +7 -1
  200. package/lib/tester/cliFormat.js +11 -2
  201. package/lib/tester/cliFormat.js.map +1 -1
  202. package/lib/tester/printTestResult.js +2 -2
  203. package/lib/tester/printTestResult.js.map +1 -1
  204. package/lib/tester/testFeature.d.ts +0 -1
  205. package/lib/tester/testFeature.js +8 -25
  206. package/lib/tester/testFeature.js.map +1 -1
  207. package/lib/tester/testProject.d.ts +2 -3
  208. package/lib/tester/testProject.js +93 -86
  209. package/lib/tester/testProject.js.map +1 -1
  210. package/lib/tester/testSegment.d.ts +1 -1
  211. package/lib/tester/testSegment.js +3 -21
  212. package/lib/tester/testSegment.js.map +1 -1
  213. package/lib/utils/git.js +45 -19
  214. package/lib/utils/git.js.map +1 -1
  215. package/package.json +12 -12
  216. package/src/assess-distribution/index.ts +72 -52
  217. package/src/benchmark/index.ts +124 -91
  218. package/src/builder/{buildScopedConditions.spec.ts → applyContextToConditions.spec.ts} +160 -142
  219. package/src/builder/{buildScopedConditions.ts → applyContextToConditions.ts} +19 -14
  220. package/src/builder/{buildScopedDatafile.spec.ts → applyContextToDatafile.spec.ts} +141 -81
  221. package/src/builder/{buildScopedDatafile.ts → applyContextToDatafile.ts} +33 -33
  222. package/src/builder/{buildScopedSegments.spec.ts → applyContextToSegments.spec.ts} +171 -151
  223. package/src/builder/{buildScopedSegments.ts → applyContextToSegments.ts} +26 -14
  224. package/src/builder/buildDatafile.spec.ts +192 -14
  225. package/src/builder/buildDatafile.ts +74 -64
  226. package/src/builder/buildProject.ts +171 -86
  227. package/src/builder/buildRuntimeDatafiles.ts +57 -0
  228. package/src/builder/index.ts +0 -1
  229. package/src/cli/cli.ts +0 -5
  230. package/src/cli/plugins.ts +7 -2
  231. package/src/config/projectConfig.spec.ts +171 -8
  232. package/src/config/projectConfig.ts +100 -28
  233. package/src/datasource/adapter.ts +8 -23
  234. package/src/datasource/datasource.ts +50 -21
  235. package/src/datasource/filesystemAdapter.spec.ts +133 -74
  236. package/src/datasource/filesystemAdapter.ts +93 -227
  237. package/src/evaluate/index.ts +109 -97
  238. package/src/find-duplicate-segments/index.ts +34 -16
  239. package/src/find-usage/index.ts +89 -44
  240. package/src/generate-code/index.ts +36 -24
  241. package/src/generate-code/typescript.spec.ts +106 -0
  242. package/src/generate-code/typescript.ts +33 -398
  243. package/src/index.ts +2 -1
  244. package/src/info/index.ts +72 -16
  245. package/src/init/index.ts +1 -1
  246. package/src/linter/attributeSchema.ts +1 -0
  247. package/src/linter/conditionSchema.spec.ts +23 -3
  248. package/src/linter/conditionSchema.ts +5 -5
  249. package/src/linter/featureSchema.spec.ts +107 -18
  250. package/src/linter/featureSchema.ts +25 -28
  251. package/src/linter/groupSchema.ts +1 -0
  252. package/src/linter/lintProject.spec.ts +131 -92
  253. package/src/linter/lintProject.ts +233 -97
  254. package/src/linter/schema.ts +1 -0
  255. package/src/linter/segmentSchema.spec.ts +5 -3
  256. package/src/linter/segmentSchema.ts +1 -0
  257. package/src/linter/targetSchema.spec.ts +159 -0
  258. package/src/linter/targetSchema.ts +46 -0
  259. package/src/linter/testSchema.spec.ts +70 -5
  260. package/src/linter/testSchema.ts +12 -10
  261. package/src/list/index.spec.ts +135 -0
  262. package/src/list/index.ts +188 -12
  263. package/src/list/matrix.ts +3 -8
  264. package/src/promoter/index.spec.ts +617 -0
  265. package/src/promoter/index.ts +1266 -0
  266. package/src/sets.ts +76 -0
  267. package/src/targeting.spec.ts +74 -0
  268. package/src/targeting.ts +106 -0
  269. package/src/tester/cliFormat.ts +11 -1
  270. package/src/tester/printTestResult.ts +12 -3
  271. package/src/tester/testFeature.ts +10 -36
  272. package/src/tester/testProject.spec.ts +50 -0
  273. package/src/tester/testProject.ts +89 -140
  274. package/src/tester/testSegment.ts +5 -22
  275. package/src/utils/git.ts +13 -21
  276. package/tsconfig.cjs.json +5 -1
  277. package/tsconfig.typecheck.json +9 -0
  278. package/coverage/lcov-report/builder/convertToV1.ts.html +0 -583
  279. package/lib/builder/allocator.spec.d.ts +0 -1
  280. package/lib/builder/allocator.spec.js +0 -85
  281. package/lib/builder/allocator.spec.js.map +0 -1
  282. package/lib/builder/buildDatafile.spec.d.ts +0 -1
  283. package/lib/builder/buildDatafile.spec.js +0 -233
  284. package/lib/builder/buildDatafile.spec.js.map +0 -1
  285. package/lib/builder/buildScopedConditions.d.ts +0 -5
  286. package/lib/builder/buildScopedConditions.js.map +0 -1
  287. package/lib/builder/buildScopedConditions.spec.d.ts +0 -1
  288. package/lib/builder/buildScopedConditions.spec.js +0 -2167
  289. package/lib/builder/buildScopedConditions.spec.js.map +0 -1
  290. package/lib/builder/buildScopedDatafile.d.ts +0 -2
  291. package/lib/builder/buildScopedDatafile.js.map +0 -1
  292. package/lib/builder/buildScopedDatafile.spec.d.ts +0 -1
  293. package/lib/builder/buildScopedDatafile.spec.js +0 -2277
  294. package/lib/builder/buildScopedDatafile.spec.js.map +0 -1
  295. package/lib/builder/buildScopedSegments.d.ts +0 -5
  296. package/lib/builder/buildScopedSegments.js.map +0 -1
  297. package/lib/builder/buildScopedSegments.spec.d.ts +0 -1
  298. package/lib/builder/buildScopedSegments.spec.js +0 -1062
  299. package/lib/builder/buildScopedSegments.spec.js.map +0 -1
  300. package/lib/builder/convertToV1.d.ts +0 -10
  301. package/lib/builder/convertToV1.js +0 -119
  302. package/lib/builder/convertToV1.js.map +0 -1
  303. package/lib/builder/mutateVariables.spec.d.ts +0 -1
  304. package/lib/builder/mutateVariables.spec.js +0 -1074
  305. package/lib/builder/mutateVariables.spec.js.map +0 -1
  306. package/lib/builder/mutator.spec.d.ts +0 -1
  307. package/lib/builder/mutator.spec.js +0 -368
  308. package/lib/builder/mutator.spec.js.map +0 -1
  309. package/lib/builder/revision.spec.d.ts +0 -1
  310. package/lib/builder/revision.spec.js +0 -21
  311. package/lib/builder/revision.spec.js.map +0 -1
  312. package/lib/builder/traffic.spec.d.ts +0 -1
  313. package/lib/builder/traffic.spec.js +0 -872
  314. package/lib/builder/traffic.spec.js.map +0 -1
  315. package/lib/config/projectConfig.spec.d.ts +0 -1
  316. package/lib/config/projectConfig.spec.js +0 -24
  317. package/lib/config/projectConfig.spec.js.map +0 -1
  318. package/lib/datasource/filesystemAdapter.spec.d.ts +0 -1
  319. package/lib/datasource/filesystemAdapter.spec.js +0 -88
  320. package/lib/datasource/filesystemAdapter.spec.js.map +0 -1
  321. package/lib/generate-code/typescript.spec.d.ts +0 -1
  322. package/lib/generate-code/typescript.spec.js +0 -78
  323. package/lib/generate-code/typescript.spec.js.map +0 -1
  324. package/lib/linter/attributeSchema.spec.d.ts +0 -1
  325. package/lib/linter/attributeSchema.spec.js +0 -266
  326. package/lib/linter/attributeSchema.spec.js.map +0 -1
  327. package/lib/linter/conditionSchema.spec.d.ts +0 -1
  328. package/lib/linter/conditionSchema.spec.js +0 -380
  329. package/lib/linter/conditionSchema.spec.js.map +0 -1
  330. package/lib/linter/featureSchema.spec.d.ts +0 -1
  331. package/lib/linter/featureSchema.spec.js +0 -1552
  332. package/lib/linter/featureSchema.spec.js.map +0 -1
  333. package/lib/linter/lintProject.spec.d.ts +0 -1
  334. package/lib/linter/lintProject.spec.js +0 -211
  335. package/lib/linter/lintProject.spec.js.map +0 -1
  336. package/lib/linter/mutationNotation.spec.d.ts +0 -1
  337. package/lib/linter/mutationNotation.spec.js +0 -598
  338. package/lib/linter/mutationNotation.spec.js.map +0 -1
  339. package/lib/linter/schema.spec.d.ts +0 -1
  340. package/lib/linter/schema.spec.js +0 -535
  341. package/lib/linter/schema.spec.js.map +0 -1
  342. package/lib/linter/segmentSchema.spec.d.ts +0 -1
  343. package/lib/linter/segmentSchema.spec.js +0 -303
  344. package/lib/linter/segmentSchema.spec.js.map +0 -1
  345. package/lib/linter/testSchema.spec.d.ts +0 -1
  346. package/lib/linter/testSchema.spec.js +0 -162
  347. package/lib/linter/testSchema.spec.js.map +0 -1
  348. package/lib/list/matrix.spec.d.ts +0 -1
  349. package/lib/list/matrix.spec.js +0 -42
  350. package/lib/list/matrix.spec.js.map +0 -1
  351. package/lib/site/exportSite.d.ts +0 -2
  352. package/lib/site/exportSite.js +0 -30
  353. package/lib/site/exportSite.js.map +0 -1
  354. package/lib/site/generateHistory.d.ts +0 -3
  355. package/lib/site/generateHistory.js +0 -31
  356. package/lib/site/generateHistory.js.map +0 -1
  357. package/lib/site/generateSiteSearchIndex.d.ts +0 -4
  358. package/lib/site/generateSiteSearchIndex.js +0 -195
  359. package/lib/site/generateSiteSearchIndex.js.map +0 -1
  360. package/lib/site/getLastModifiedFromHistory.d.ts +0 -2
  361. package/lib/site/getLastModifiedFromHistory.js +0 -18
  362. package/lib/site/getLastModifiedFromHistory.js.map +0 -1
  363. package/lib/site/getOwnerAndRepoFromUrl.d.ts +0 -4
  364. package/lib/site/getOwnerAndRepoFromUrl.js +0 -20
  365. package/lib/site/getOwnerAndRepoFromUrl.js.map +0 -1
  366. package/lib/site/getRelativePaths.d.ts +0 -6
  367. package/lib/site/getRelativePaths.js +0 -15
  368. package/lib/site/getRelativePaths.js.map +0 -1
  369. package/lib/site/getRepoDetails.d.ts +0 -8
  370. package/lib/site/getRepoDetails.js +0 -48
  371. package/lib/site/getRepoDetails.js.map +0 -1
  372. package/lib/site/index.d.ts +0 -2
  373. package/lib/site/index.js +0 -43
  374. package/lib/site/index.js.map +0 -1
  375. package/lib/site/serveSite.d.ts +0 -2
  376. package/lib/site/serveSite.js +0 -54
  377. package/lib/site/serveSite.js.map +0 -1
  378. package/lib/tester/helpers.spec.d.ts +0 -1
  379. package/lib/tester/helpers.spec.js +0 -115
  380. package/lib/tester/helpers.spec.js.map +0 -1
  381. package/src/builder/convertToV1.ts +0 -166
  382. package/src/site/exportSite.ts +0 -42
  383. package/src/site/generateHistory.ts +0 -40
  384. package/src/site/generateSiteSearchIndex.ts +0 -258
  385. package/src/site/getLastModifiedFromHistory.ts +0 -21
  386. package/src/site/getOwnerAndRepoFromUrl.ts +0 -17
  387. package/src/site/getRelativePaths.ts +0 -24
  388. package/src/site/getRepoDetails.ts +0 -62
  389. package/src/site/index.ts +0 -46
  390. package/src/site/serveSite.ts +0 -58
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for builder/buildDatafile.ts</title>
6
+ <title>Code coverage report for src/builder/buildDatafile.ts</title>
7
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" />
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
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
14
+ background-image: url(../../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -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">builder</a> buildDatafile.ts</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/builder</a> buildDatafile.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">49.54% </span>
26
+ <span class="strong">67.69% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>108/218</span>
28
+ <span class='fraction'>153/226</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">34.95% </span>
33
+ <span class="strong">57.3% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>43/123</span>
35
+ <span class='fraction'>102/178</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">41.37% </span>
40
+ <span class="strong">59.37% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>12/29</span>
42
+ <span class='fraction'>19/32</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">51.44% </span>
47
+ <span class="strong">70.42% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>107/208</span>
49
+ <span class='fraction'>150/213</span>
50
50
  </div>
51
51
 
52
52
 
@@ -57,11 +57,11 @@
57
57
  <template id="filterTemplate">
58
58
  <div class="quiet">
59
59
  Filter:
60
- <input oninput="onInput()" type="search" id="fileSearch">
60
+ <input type="search" id="fileSearch">
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -709,7 +709,17 @@
709
709
  <a name='L644'></a><a href='#L644'>644</a>
710
710
  <a name='L645'></a><a href='#L645'>645</a>
711
711
  <a name='L646'></a><a href='#L646'>646</a>
712
- <a name='L647'></a><a href='#L647'>647</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
713
723
  <span class="cline-any cline-neutral">&nbsp;</span>
714
724
  <span class="cline-any cline-neutral">&nbsp;</span>
715
725
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -733,18 +743,16 @@
733
743
  <span class="cline-any cline-neutral">&nbsp;</span>
734
744
  <span class="cline-any cline-neutral">&nbsp;</span>
735
745
  <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">1x</span>
737
746
  <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-yes">1x</span>
739
- <span class="cline-any cline-yes">1x</span>
747
+ <span class="cline-any cline-yes">3x</span>
748
+ <span class="cline-any cline-yes">3x</span>
740
749
  <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-yes">1x</span>
742
- <span class="cline-any cline-yes">1x</span>
743
- <span class="cline-any cline-yes">1x</span>
744
- <span class="cline-any cline-yes">1x</span>
750
+ <span class="cline-any cline-yes">3x</span>
751
+ <span class="cline-any cline-yes">3x</span>
745
752
  <span class="cline-any cline-neutral">&nbsp;</span>
746
753
  <span class="cline-any cline-neutral">&nbsp;</span>
747
754
  <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-yes">3x</span>
748
756
  <span class="cline-any cline-neutral">&nbsp;</span>
749
757
  <span class="cline-any cline-neutral">&nbsp;</span>
750
758
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -758,18 +766,18 @@
758
766
  <span class="cline-any cline-neutral">&nbsp;</span>
759
767
  <span class="cline-any cline-neutral">&nbsp;</span>
760
768
  <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-yes">1x</span>
762
769
  <span class="cline-any cline-neutral">&nbsp;</span>
763
770
  <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-yes">1x</span>
764
772
  <span class="cline-any cline-neutral">&nbsp;</span>
765
773
  <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-yes">1x</span>
767
775
  <span class="cline-any cline-no">&nbsp;</span>
768
776
  <span class="cline-any cline-no">&nbsp;</span>
769
777
  <span class="cline-any cline-neutral">&nbsp;</span>
770
778
  <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-yes">1x</span>
780
+ <span class="cline-any cline-yes">1x</span>
773
781
  <span class="cline-any cline-neutral">&nbsp;</span>
774
782
  <span class="cline-any cline-neutral">&nbsp;</span>
775
783
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -784,9 +792,9 @@
784
792
  <span class="cline-any cline-neutral">&nbsp;</span>
785
793
  <span class="cline-any cline-neutral">&nbsp;</span>
786
794
  <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
795
  <span class="cline-any cline-neutral">&nbsp;</span>
789
796
  <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-yes">1x</span>
790
798
  <span class="cline-any cline-neutral">&nbsp;</span>
791
799
  <span class="cline-any cline-neutral">&nbsp;</span>
792
800
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -800,156 +808,179 @@
800
808
  <span class="cline-any cline-neutral">&nbsp;</span>
801
809
  <span class="cline-any cline-neutral">&nbsp;</span>
802
810
  <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-yes">2x</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
803
813
  <span class="cline-any cline-neutral">&nbsp;</span>
804
814
  <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-yes">2x</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
805
817
  <span class="cline-any cline-neutral">&nbsp;</span>
806
818
  <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-yes">2x</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
807
821
  <span class="cline-any cline-neutral">&nbsp;</span>
808
822
  <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-yes">2x</span>
824
+ <span class="cline-any cline-yes">3x</span>
809
825
  <span class="cline-any cline-neutral">&nbsp;</span>
810
826
  <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
811
828
  <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-yes">1x</span>
813
829
  <span class="cline-any cline-neutral">&nbsp;</span>
814
830
  <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-yes">16x</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
815
833
  <span class="cline-any cline-neutral">&nbsp;</span>
816
834
  <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">16x</span>
817
836
  <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-yes">2x</span>
819
- <span class="cline-any cline-yes">2x</span>
820
- <span class="cline-any cline-yes">2x</span>
837
+ <span class="cline-any cline-yes">16x</span>
838
+ <span class="cline-any cline-yes">18x</span>
839
+ <span class="cline-any cline-yes">18x</span>
821
840
  <span class="cline-any cline-neutral">&nbsp;</span>
822
841
  <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-yes">2x</span>
824
- <span class="cline-any cline-yes">2x</span>
825
- <span class="cline-any cline-yes">2x</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
842
  <span class="cline-any cline-neutral">&nbsp;</span>
829
843
  <span class="cline-any cline-neutral">&nbsp;</span>
830
844
  <span class="cline-any cline-neutral">&nbsp;</span>
831
845
  <span class="cline-any cline-neutral">&nbsp;</span>
832
846
  <span class="cline-any cline-neutral">&nbsp;</span>
833
847
  <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-yes">2x</span>
835
- <span class="cline-any cline-yes">2x</span>
836
848
  <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-yes">2x</span>
838
- <span class="cline-any cline-yes">2x</span>
839
849
  <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-yes">2x</span>
841
- <span class="cline-any cline-yes">2x</span>
842
850
  <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-yes">2x</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
851
  <span class="cline-any cline-neutral">&nbsp;</span>
846
852
  <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-yes">2x</span>
848
- <span class="cline-any cline-no">&nbsp;</span>
849
853
  <span class="cline-any cline-neutral">&nbsp;</span>
850
854
  <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-yes">2x</span>
852
855
  <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-yes">8x</span>
856
857
  <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
858
  <span class="cline-any cline-neutral">&nbsp;</span>
859
859
  <span class="cline-any cline-neutral">&nbsp;</span>
860
860
  <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
861
  <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-yes">9x</span>
863
+ <span class="cline-any cline-yes">9x</span>
864
+ <span class="cline-any cline-yes">9x</span>
867
865
  <span class="cline-any cline-neutral">&nbsp;</span>
868
866
  <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-yes">9x</span>
868
+ <span class="cline-any cline-yes">9x</span>
869
+ <span class="cline-any cline-yes">9x</span>
870
+ <span class="cline-any cline-yes">1x</span>
871
+ <span class="cline-any cline-yes">1x</span>
869
872
  <span class="cline-any cline-neutral">&nbsp;</span>
870
873
  <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
874
  <span class="cline-any cline-neutral">&nbsp;</span>
876
875
  <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-no">&nbsp;</span>
878
876
  <span class="cline-any cline-neutral">&nbsp;</span>
879
877
  <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-yes">9x</span>
879
+ <span class="cline-any cline-yes">9x</span>
880
880
  <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-yes">9x</span>
882
+ <span class="cline-any cline-yes">9x</span>
881
883
  <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-yes">9x</span>
885
+ <span class="cline-any cline-yes">16x</span>
882
886
  <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-yes">2x</span>
887
+ <span class="cline-any cline-yes">16x</span>
884
888
  <span class="cline-any cline-no">&nbsp;</span>
885
889
  <span class="cline-any cline-neutral">&nbsp;</span>
886
890
  <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-yes">16x</span>
887
892
  <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-yes">16x</span>
894
+ <span class="cline-any cline-yes">2x</span>
888
895
  <span class="cline-any cline-neutral">&nbsp;</span>
889
896
  <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-yes">14x</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-yes">13x</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
903
  <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-yes">2x</span>
892
- <span class="cline-any cline-yes">2x</span>
893
- <span class="cline-any cline-yes">2x</span>
894
- <span class="cline-any cline-yes">2x</span>
895
904
  <span class="cline-any cline-neutral">&nbsp;</span>
896
905
  <span class="cline-any cline-no">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-yes">13x</span>
909
+ <span class="cline-any cline-yes">3x</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-yes">10x</span>
898
913
  <span class="cline-any cline-no">&nbsp;</span>
899
914
  <span class="cline-any cline-neutral">&nbsp;</span>
900
915
  <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-yes">2x</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">10x</span>
921
+ <span class="cline-any cline-yes">9x</span>
922
+ <span class="cline-any cline-yes">9x</span>
923
+ <span class="cline-any cline-yes">9x</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-yes">1x</span>
926
+ <span class="cline-any cline-yes">1x</span>
927
+ <span class="cline-any cline-yes">1x</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-yes">10x</span>
902
931
  <span class="cline-any cline-no">&nbsp;</span>
903
932
  <span class="cline-any cline-neutral">&nbsp;</span>
904
933
  <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-yes">2x</span>
934
+ <span class="cline-any cline-yes">10x</span>
906
935
  <span class="cline-any cline-no">&nbsp;</span>
907
936
  <span class="cline-any cline-neutral">&nbsp;</span>
908
937
  <span class="cline-any cline-no">&nbsp;</span>
909
938
  <span class="cline-any cline-no">&nbsp;</span>
910
939
  <span class="cline-any cline-neutral">&nbsp;</span>
911
940
  <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
912
943
  <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-yes">2x</span>
914
- <span class="cline-any cline-yes">2x</span>
915
- <span class="cline-any cline-yes">2x</span>
916
944
  <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-yes">2x</span>
918
- <span class="cline-any cline-yes">2x</span>
919
- <span class="cline-any cline-yes">4x</span>
920
- <span class="cline-any cline-yes">8x</span>
921
- <span class="cline-any cline-yes">6x</span>
922
945
  <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-yes">10x</span>
947
+ <span class="cline-any cline-yes">12x</span>
948
+ <span class="cline-any cline-yes">14x</span>
923
949
  <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-yes">6x</span>
925
- <span class="cline-any cline-yes">6x</span>
950
+ <span class="cline-any cline-yes">12x</span>
951
+ <span class="cline-any cline-yes">7x</span>
952
+ <span class="cline-any cline-yes">14x</span>
953
+ <span class="cline-any cline-yes">28x</span>
954
+ <span class="cline-any cline-yes">21x</span>
926
955
  <span class="cline-any cline-neutral">&nbsp;</span>
927
956
  <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-yes">21x</span>
958
+ <span class="cline-any cline-yes">21x</span>
928
959
  <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-yes">8x</span>
930
- <span class="cline-any cline-yes">2x</span>
931
960
  <span class="cline-any cline-neutral">&nbsp;</span>
932
961
  <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-yes">2x</span>
934
- <span class="cline-any cline-yes">4x</span>
962
+ <span class="cline-any cline-yes">28x</span>
963
+ <span class="cline-any cline-yes">7x</span>
935
964
  <span class="cline-any cline-neutral">&nbsp;</span>
936
965
  <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-yes">7x</span>
967
+ <span class="cline-any cline-yes">14x</span>
937
968
  <span class="cline-any cline-neutral">&nbsp;</span>
938
969
  <span class="cline-any cline-neutral">&nbsp;</span>
939
970
  <span class="cline-any cline-neutral">&nbsp;</span>
940
971
  <span class="cline-any cline-neutral">&nbsp;</span>
941
972
  <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-yes">2x</span>
943
973
  <span class="cline-any cline-neutral">&nbsp;</span>
944
974
  <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-yes">10x</span>
945
976
  <span class="cline-any cline-neutral">&nbsp;</span>
946
977
  <span class="cline-any cline-neutral">&nbsp;</span>
947
978
  <span class="cline-any cline-neutral">&nbsp;</span>
948
979
  <span class="cline-any cline-neutral">&nbsp;</span>
949
980
  <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-yes">2x</span>
951
981
  <span class="cline-any cline-neutral">&nbsp;</span>
952
982
  <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-yes">7x</span>
953
984
  <span class="cline-any cline-neutral">&nbsp;</span>
954
985
  <span class="cline-any cline-neutral">&nbsp;</span>
955
986
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -957,7 +988,9 @@
957
988
  <span class="cline-any cline-neutral">&nbsp;</span>
958
989
  <span class="cline-any cline-neutral">&nbsp;</span>
959
990
  <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-yes">2x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-yes">7x</span>
961
994
  <span class="cline-any cline-no">&nbsp;</span>
962
995
  <span class="cline-any cline-no">&nbsp;</span>
963
996
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1018,7 +1051,7 @@
1018
1051
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
1052
  <span class="cline-any cline-neutral">&nbsp;</span>
1020
1053
  <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-yes">2x</span>
1054
+ <span class="cline-any cline-yes">7x</span>
1022
1055
  <span class="cline-any cline-neutral">&nbsp;</span>
1023
1056
  <span class="cline-any cline-neutral">&nbsp;</span>
1024
1057
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1027,25 +1060,25 @@
1027
1060
  <span class="cline-any cline-neutral">&nbsp;</span>
1028
1061
  <span class="cline-any cline-neutral">&nbsp;</span>
1029
1062
  <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-yes">2x</span>
1063
+ <span class="cline-any cline-yes">12x</span>
1031
1064
  <span class="cline-any cline-neutral">&nbsp;</span>
1032
1065
  <span class="cline-any cline-neutral">&nbsp;</span>
1033
1066
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
1067
  <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-yes">2x</span>
1068
+ <span class="cline-any cline-yes">12x</span>
1036
1069
  <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-yes">2x</span>
1038
- <span class="cline-any cline-yes">2x</span>
1039
- <span class="cline-any cline-yes">2x</span>
1070
+ <span class="cline-any cline-yes">12x</span>
1071
+ <span class="cline-any cline-yes">7x</span>
1072
+ <span class="cline-any cline-yes">7x</span>
1040
1073
  <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-yes">2x</span>
1042
- <span class="cline-any cline-yes">4x</span>
1043
- <span class="cline-any cline-yes">4x</span>
1074
+ <span class="cline-any cline-yes">7x</span>
1075
+ <span class="cline-any cline-yes">14x</span>
1076
+ <span class="cline-any cline-yes">14x</span>
1044
1077
  <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">4x</span>
1078
+ <span class="cline-any cline-yes">14x</span>
1046
1079
  <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-yes">8x</span>
1048
- <span class="cline-any cline-yes">6x</span>
1080
+ <span class="cline-any cline-yes">28x</span>
1081
+ <span class="cline-any cline-yes">21x</span>
1049
1082
  <span class="cline-any cline-neutral">&nbsp;</span>
1050
1083
  <span class="cline-any cline-neutral">&nbsp;</span>
1051
1084
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1059,8 +1092,8 @@
1059
1092
  <span class="cline-any cline-neutral">&nbsp;</span>
1060
1093
  <span class="cline-any cline-neutral">&nbsp;</span>
1061
1094
  <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-yes">2x</span>
1063
- <span class="cline-any cline-yes">2x</span>
1095
+ <span class="cline-any cline-yes">7x</span>
1096
+ <span class="cline-any cline-yes">7x</span>
1064
1097
  <span class="cline-any cline-neutral">&nbsp;</span>
1065
1098
  <span class="cline-any cline-neutral">&nbsp;</span>
1066
1099
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1080,7 +1113,7 @@
1080
1113
  <span class="cline-any cline-neutral">&nbsp;</span>
1081
1114
  <span class="cline-any cline-neutral">&nbsp;</span>
1082
1115
  <span class="cline-any cline-neutral">&nbsp;</span>
1083
- <span class="cline-any cline-yes">2x</span>
1116
+ <span class="cline-any cline-yes">12x</span>
1084
1117
  <span class="cline-any cline-neutral">&nbsp;</span>
1085
1118
  <span class="cline-any cline-neutral">&nbsp;</span>
1086
1119
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1094,23 +1127,23 @@
1094
1127
  <span class="cline-any cline-neutral">&nbsp;</span>
1095
1128
  <span class="cline-any cline-neutral">&nbsp;</span>
1096
1129
  <span class="cline-any cline-neutral">&nbsp;</span>
1097
- <span class="cline-any cline-yes">2x</span>
1130
+ <span class="cline-any cline-yes">10x</span>
1098
1131
  <span class="cline-any cline-neutral">&nbsp;</span>
1099
1132
  <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-yes">2x</span>
1133
+ <span class="cline-any cline-yes">7x</span>
1101
1134
  <span class="cline-any cline-neutral">&nbsp;</span>
1102
1135
  <span class="cline-any cline-neutral">&nbsp;</span>
1103
1136
  <span class="cline-any cline-neutral">&nbsp;</span>
1104
1137
  <span class="cline-any cline-neutral">&nbsp;</span>
1105
1138
  <span class="cline-any cline-neutral">&nbsp;</span>
1106
1139
  <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-yes">2x</span>
1140
+ <span class="cline-any cline-yes">12x</span>
1108
1141
  <span class="cline-any cline-neutral">&nbsp;</span>
1109
1142
  <span class="cline-any cline-neutral">&nbsp;</span>
1110
1143
  <span class="cline-any cline-neutral">&nbsp;</span>
1111
1144
  <span class="cline-any cline-neutral">&nbsp;</span>
1112
1145
  <span class="cline-any cline-neutral">&nbsp;</span>
1113
- <span class="cline-any cline-yes">2x</span>
1146
+ <span class="cline-any cline-yes">7x</span>
1114
1147
  <span class="cline-any cline-neutral">&nbsp;</span>
1115
1148
  <span class="cline-any cline-neutral">&nbsp;</span>
1116
1149
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1119,22 +1152,22 @@
1119
1152
  <span class="cline-any cline-neutral">&nbsp;</span>
1120
1153
  <span class="cline-any cline-neutral">&nbsp;</span>
1121
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-yes">2x</span>
1155
+ <span class="cline-any cline-yes">10x</span>
1123
1156
  <span class="cline-any cline-no">&nbsp;</span>
1124
1157
  <span class="cline-any cline-neutral">&nbsp;</span>
1125
1158
  <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-yes">2x</span>
1127
- <span class="cline-any cline-yes">2x</span>
1128
- <span class="cline-any cline-yes">2x</span>
1159
+ <span class="cline-any cline-yes">10x</span>
1160
+ <span class="cline-any cline-yes">7x</span>
1161
+ <span class="cline-any cline-yes">7x</span>
1129
1162
  <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-yes">2x</span>
1131
- <span class="cline-any cline-yes">4x</span>
1163
+ <span class="cline-any cline-yes">7x</span>
1164
+ <span class="cline-any cline-yes">14x</span>
1132
1165
  <span class="cline-any cline-neutral">&nbsp;</span>
1133
- <span class="cline-any cline-yes">4x</span>
1166
+ <span class="cline-any cline-yes">14x</span>
1134
1167
  <span class="cline-any cline-neutral">&nbsp;</span>
1135
1168
  <span class="cline-any cline-neutral">&nbsp;</span>
1136
1169
  <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-yes">4x</span>
1170
+ <span class="cline-any cline-yes">14x</span>
1138
1171
  <span class="cline-any cline-neutral">&nbsp;</span>
1139
1172
  <span class="cline-any cline-neutral">&nbsp;</span>
1140
1173
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1145,7 +1178,7 @@
1145
1178
  <span class="cline-any cline-neutral">&nbsp;</span>
1146
1179
  <span class="cline-any cline-neutral">&nbsp;</span>
1147
1180
  <span class="cline-any cline-neutral">&nbsp;</span>
1148
- <span class="cline-any cline-yes">2x</span>
1181
+ <span class="cline-any cline-yes">10x</span>
1149
1182
  <span class="cline-any cline-no">&nbsp;</span>
1150
1183
  <span class="cline-any cline-no">&nbsp;</span>
1151
1184
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1175,34 +1208,34 @@
1175
1208
  <span class="cline-any cline-neutral">&nbsp;</span>
1176
1209
  <span class="cline-any cline-neutral">&nbsp;</span>
1177
1210
  <span class="cline-any cline-neutral">&nbsp;</span>
1178
- <span class="cline-any cline-yes">2x</span>
1211
+ <span class="cline-any cline-yes">10x</span>
1179
1212
  <span class="cline-any cline-neutral">&nbsp;</span>
1180
1213
  <span class="cline-any cline-neutral">&nbsp;</span>
1181
1214
  <span class="cline-any cline-neutral">&nbsp;</span>
1182
1215
  <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-yes">2x</span>
1184
- <span class="cline-any cline-yes">2x</span>
1216
+ <span class="cline-any cline-yes">9x</span>
1217
+ <span class="cline-any cline-yes">9x</span>
1185
1218
  <span class="cline-any cline-neutral">&nbsp;</span>
1186
- <span class="cline-any cline-yes">2x</span>
1187
- <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-yes">9x</span>
1220
+ <span class="cline-any cline-yes">9x</span>
1188
1221
  <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-no">&nbsp;</span>
1190
- <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-yes">9x</span>
1223
+ <span class="cline-any cline-yes">5x</span>
1191
1224
  <span class="cline-any cline-neutral">&nbsp;</span>
1192
- <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-yes">5x</span>
1193
1226
  <span class="cline-any cline-no">&nbsp;</span>
1194
1227
  <span class="cline-any cline-neutral">&nbsp;</span>
1195
1228
  <span class="cline-any cline-neutral">&nbsp;</span>
1196
- <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-yes">5x</span>
1197
1230
  <span class="cline-any cline-no">&nbsp;</span>
1198
1231
  <span class="cline-any cline-neutral">&nbsp;</span>
1199
1232
  <span class="cline-any cline-neutral">&nbsp;</span>
1200
- <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-yes">5x</span>
1201
1234
  <span class="cline-any cline-neutral">&nbsp;</span>
1202
1235
  <span class="cline-any cline-neutral">&nbsp;</span>
1203
- <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-yes">5x</span>
1204
1237
  <span class="cline-any cline-neutral">&nbsp;</span>
1205
- <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-yes">5x</span>
1206
1239
  <span class="cline-any cline-neutral">&nbsp;</span>
1207
1240
  <span class="cline-any cline-neutral">&nbsp;</span>
1208
1241
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1210,39 +1243,39 @@
1210
1243
  <span class="cline-any cline-neutral">&nbsp;</span>
1211
1244
  <span class="cline-any cline-neutral">&nbsp;</span>
1212
1245
  <span class="cline-any cline-neutral">&nbsp;</span>
1213
- <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-yes">5x</span>
1214
1247
  <span class="cline-any cline-neutral">&nbsp;</span>
1215
1248
  <span class="cline-any cline-neutral">&nbsp;</span>
1216
1249
  <span class="cline-any cline-neutral">&nbsp;</span>
1217
1250
  <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-yes">2x</span>
1219
- <span class="cline-any cline-yes">2x</span>
1251
+ <span class="cline-any cline-yes">9x</span>
1252
+ <span class="cline-any cline-yes">9x</span>
1220
1253
  <span class="cline-any cline-neutral">&nbsp;</span>
1221
- <span class="cline-any cline-yes">2x</span>
1222
- <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-yes">9x</span>
1255
+ <span class="cline-any cline-yes">1x</span>
1223
1256
  <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-no">&nbsp;</span>
1225
- <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">2x</span>
1226
1259
  <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-yes">2x</span>
1228
1261
  <span class="cline-any cline-no">&nbsp;</span>
1229
1262
  <span class="cline-any cline-neutral">&nbsp;</span>
1230
1263
  <span class="cline-any cline-neutral">&nbsp;</span>
1231
- <span class="cline-any cline-no">&nbsp;</span>
1232
- <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-yes">2x</span>
1265
+ <span class="cline-any cline-yes">1x</span>
1233
1266
  <span class="cline-any cline-neutral">&nbsp;</span>
1234
1267
  <span class="cline-any cline-neutral">&nbsp;</span>
1235
- <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-yes">1x</span>
1236
1269
  <span class="cline-any cline-neutral">&nbsp;</span>
1237
1270
  <span class="cline-any cline-neutral">&nbsp;</span>
1238
1271
  <span class="cline-any cline-neutral">&nbsp;</span>
1239
1272
  <span class="cline-any cline-neutral">&nbsp;</span>
1240
- <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-yes">1x</span>
1241
1274
  <span class="cline-any cline-neutral">&nbsp;</span>
1242
1275
  <span class="cline-any cline-neutral">&nbsp;</span>
1243
1276
  <span class="cline-any cline-neutral">&nbsp;</span>
1244
1277
  <span class="cline-any cline-neutral">&nbsp;</span>
1245
- <span class="cline-any cline-yes">2x</span>
1278
+ <span class="cline-any cline-yes">9x</span>
1246
1279
  <span class="cline-any cline-no">&nbsp;</span>
1247
1280
  <span class="cline-any cline-no">&nbsp;</span>
1248
1281
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1280,80 +1313,67 @@
1280
1313
  <span class="cline-any cline-neutral">&nbsp;</span>
1281
1314
  <span class="cline-any cline-neutral">&nbsp;</span>
1282
1315
  <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-neutral">&nbsp;</span>
1284
- <span class="cline-any cline-yes">2x</span>
1285
- <span class="cline-any cline-no">&nbsp;</span>
1286
- <span class="cline-any cline-neutral">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
- <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-yes">9x</span>
1291
1317
  <span class="cline-any cline-neutral">&nbsp;</span>
1292
1318
  <span class="cline-any cline-neutral">&nbsp;</span>
1293
1319
  <span class="cline-any cline-neutral">&nbsp;</span>
1294
1320
  <span class="cline-any cline-neutral">&nbsp;</span>
1295
- <span class="cline-any cline-yes">2x</span>
1296
- <span class="cline-any cline-neutral">&nbsp;</span>
1297
- <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-neutral">&nbsp;</span>
1299
1321
  <span class="cline-any cline-neutral">&nbsp;</span>
1300
1322
  <span class="cline-any cline-neutral">&nbsp;</span>
1301
1323
  <span class="cline-any cline-neutral">&nbsp;</span>
1302
- <span class="cline-any cline-neutral">&nbsp;</span>
1303
- <span class="cline-any cline-yes">2x</span>
1304
- <span class="cline-any cline-neutral">&nbsp;</span>
1305
- <span class="cline-any cline-no">&nbsp;</span>
1306
- <span class="cline-any cline-no">&nbsp;</span>
1307
- <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-yes">9x</span>
1325
+ <span class="cline-any cline-yes">5x</span>
1326
+ <span class="cline-any cline-yes">5x</span>
1327
+ <span class="cline-any cline-yes">5x</span>
1308
1328
  <span class="cline-any cline-neutral">&nbsp;</span>
1309
1329
  <span class="cline-any cline-neutral">&nbsp;</span>
1310
- <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-yes">5x</span>
1311
1331
  <span class="cline-any cline-neutral">&nbsp;</span>
1312
1332
  <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-yes">2x</span>
1314
- <span class="cline-any cline-yes">2x</span>
1333
+ <span class="cline-any cline-yes">9x</span>
1334
+ <span class="cline-any cline-yes">10x</span>
1315
1335
  <span class="cline-any cline-no">&nbsp;</span>
1316
1336
  <span class="cline-any cline-neutral">&nbsp;</span>
1317
1337
  <span class="cline-any cline-neutral">&nbsp;</span>
1318
- <span class="cline-any cline-yes">2x</span>
1319
- <span class="cline-any cline-yes">2x</span>
1338
+ <span class="cline-any cline-yes">10x</span>
1339
+ <span class="cline-any cline-yes">10x</span>
1320
1340
  <span class="cline-any cline-neutral">&nbsp;</span>
1321
1341
  <span class="cline-any cline-neutral">&nbsp;</span>
1322
- <span class="cline-any cline-yes">2x</span>
1342
+ <span class="cline-any cline-yes">10x</span>
1323
1343
  <span class="cline-any cline-neutral">&nbsp;</span>
1324
1344
  <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-yes">2x</span>
1326
- <span class="cline-any cline-yes">2x</span>
1327
- <span class="cline-any cline-yes">4x</span>
1328
- <span class="cline-any cline-yes">4x</span>
1345
+ <span class="cline-any cline-yes">10x</span>
1346
+ <span class="cline-any cline-yes">7x</span>
1347
+ <span class="cline-any cline-yes">14x</span>
1348
+ <span class="cline-any cline-yes">14x</span>
1329
1349
  <span class="cline-any cline-neutral">&nbsp;</span>
1330
1350
  <span class="cline-any cline-neutral">&nbsp;</span>
1331
1351
  <span class="cline-any cline-neutral">&nbsp;</span>
1332
1352
  <span class="cline-any cline-neutral">&nbsp;</span>
1333
- <span class="cline-any cline-yes">2x</span>
1353
+ <span class="cline-any cline-yes">10x</span>
1334
1354
  <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-yes">2x</span>
1355
+ <span class="cline-any cline-yes">10x</span>
1336
1356
  <span class="cline-any cline-neutral">&nbsp;</span>
1337
1357
  <span class="cline-any cline-neutral">&nbsp;</span>
1338
1358
  <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-yes">2x</span>
1340
- <span class="cline-any cline-yes">2x</span>
1341
- <span class="cline-any cline-yes">2x</span>
1359
+ <span class="cline-any cline-yes">9x</span>
1360
+ <span class="cline-any cline-yes">9x</span>
1361
+ <span class="cline-any cline-yes">10x</span>
1342
1362
  <span class="cline-any cline-neutral">&nbsp;</span>
1343
- <span class="cline-any cline-yes">2x</span>
1363
+ <span class="cline-any cline-yes">10x</span>
1344
1364
  <span class="cline-any cline-neutral">&nbsp;</span>
1345
1365
  <span class="cline-any cline-neutral">&nbsp;</span>
1346
- <span class="cline-any cline-yes">2x</span>
1347
- <span class="cline-any cline-yes">2x</span>
1366
+ <span class="cline-any cline-yes">10x</span>
1367
+ <span class="cline-any cline-yes">10x</span>
1348
1368
  <span class="cline-any cline-neutral">&nbsp;</span>
1349
1369
  <span class="cline-any cline-neutral">&nbsp;</span>
1350
1370
  <span class="cline-any cline-neutral">&nbsp;</span>
1351
- <span class="cline-any cline-yes">2x</span>
1371
+ <span class="cline-any cline-yes">9x</span>
1352
1372
  <span class="cline-any cline-no">&nbsp;</span>
1353
1373
  <span class="cline-any cline-no">&nbsp;</span>
1354
1374
  <span class="cline-any cline-neutral">&nbsp;</span>
1355
1375
  <span class="cline-any cline-neutral">&nbsp;</span>
1356
- <span class="cline-any cline-yes">2x</span>
1376
+ <span class="cline-any cline-yes">9x</span>
1357
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
1358
1378
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from "fs";
1359
1379
  &nbsp;
@@ -1362,7 +1382,6 @@ import {
1362
1382
  Segment,
1363
1383
  Feature,
1364
1384
  DatafileContent,
1365
- DatafileContentV1,
1366
1385
  Variation,
1367
1386
  VariableOverride,
1368
1387
  Traffic,
@@ -1379,14 +1398,13 @@ import {
1379
1398
  Force,
1380
1399
  } from "@featurevisor/types";
1381
1400
  &nbsp;
1382
- import { ProjectConfig, SCHEMA_VERSION } from "../config";
1401
+ import { ProjectConfig } from "../config";
1383
1402
  import { Datasource } from "../datasource";
1384
1403
  import { extractAttributeKeysFromConditions, extractSegmentKeysFromGroupSegments } from "../utils";
1385
1404
  import { generateHashForDatafile, generateHashForFeature, getSegmentHashes } from "./hashes";
1386
1405
  &nbsp;
1387
1406
  import { getTraffic } from "./traffic";
1388
1407
  import { getFeatureRanges } from "./getFeatureRanges";
1389
- import { convertToV1 } from "./convertToV1";
1390
1408
  import {
1391
1409
  resolveMutationsForMultipleVariables,
1392
1410
  resolveMutationsForSingleVariable,
@@ -1394,43 +1412,45 @@ import {
1394
1412
  &nbsp;
1395
1413
  export interface CustomDatafileOptions {
1396
1414
  featureKey?: string;
1397
- environment: string;
1415
+ environment: string | false;
1398
1416
  projectConfig: ProjectConfig;
1399
1417
  datasource: Datasource;
1400
1418
  revision?: string;
1401
- schemaVersion?: string;
1402
1419
  inflate?: number;
1403
1420
  tag?: string;
1404
1421
  tags?: BuildTags;
1422
+ includeFeatures?: "*" | FeatureKey[];
1423
+ excludeFeatures?: "*" | FeatureKey[];
1424
+ featurevisorVersion?: string;
1405
1425
  }
1406
1426
  &nbsp;
1407
- export async function <span class="fstat-no" title="function not covered" >getCustomDatafile(</span>
1408
- options: CustomDatafileOptions,
1409
- ): Promise&lt;DatafileContent | DatafileContentV1&gt; {
1427
+ export async function getCustomDatafile(options: CustomDatafileOptions): Promise&lt;DatafileContent&gt; {
1410
1428
  let featuresToInclude;
1411
1429
  &nbsp;
1412
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.featureKey) {</span>
1430
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.featureKey) {
1413
1431
  const requiredChain = <span class="cstat-no" title="statement not covered" >await options.datasource.getRequiredFeaturesChain(options.featureKey);</span>
1414
1432
  <span class="cstat-no" title="statement not covered" > featuresToInclude = Array.from(requiredChain);</span>
1415
1433
  }
1416
1434
  &nbsp;
1417
- const existingState = <span class="cstat-no" title="statement not covered" >await options.datasource.readState(options.environment);</span>
1418
- const datafileContent = <span class="cstat-no" title="statement not covered" >await buildDatafile(</span>
1435
+ const existingState = await options.datasource.readState(options.environment);
1436
+ const datafileContent = await buildDatafile(
1419
1437
  options.projectConfig,
1420
1438
  options.datasource,
1421
1439
  {
1422
- schemaVersion: options.schemaVersion || SCHEMA_VERSION,
1423
- revision: options.revision || "tester",
1440
+ revision: options.revision || <span class="branch-1 cbranch-no" title="branch not covered" >"tester",</span>
1424
1441
  environment: options.environment,
1425
1442
  features: featuresToInclude,
1426
1443
  inflate: options.inflate,
1427
1444
  tag: options.tag,
1428
1445
  tags: options.tags,
1446
+ includeFeatures: options.includeFeatures,
1447
+ excludeFeatures: options.excludeFeatures,
1448
+ featurevisorVersion: options.featurevisorVersion,
1429
1449
  },
1430
1450
  existingState,
1431
1451
  );
1432
1452
  &nbsp;
1433
- <span class="cstat-no" title="statement not covered" > return datafileContent;</span>
1453
+ return datafileContent;
1434
1454
  }
1435
1455
  &nbsp;
1436
1456
  export interface BuildOrTags {
@@ -1443,14 +1463,48 @@ export interface BuildAndTags {
1443
1463
  &nbsp;
1444
1464
  export type BuildTags = BuildOrTags | BuildAndTags | string[];
1445
1465
  &nbsp;
1466
+ function matchesBuildTags(candidateTags: string[], buildTags?: BuildTags): boolean {
1467
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!buildTags) {
1468
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1469
+ }
1470
+ &nbsp;
1471
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(buildTags)) {
1472
+ <span class="cstat-no" title="statement not covered" > return buildTags.some(<span class="fstat-no" title="function not covered" >(s</span>earchTag) =&gt; <span class="cstat-no" title="statement not covered" >candidateTags.indexOf(searchTag) !== -1);</span></span>
1473
+ }
1474
+ &nbsp;
1475
+ <span class="missing-if-branch" title="if path not taken" >I</span>if ("or" in buildTags) {
1476
+ <span class="cstat-no" title="statement not covered" > return buildTags.or.some(<span class="fstat-no" title="function not covered" >(s</span>earchTag) =&gt; <span class="cstat-no" title="statement not covered" >candidateTags.indexOf(searchTag) !== -1);</span></span>
1477
+ }
1478
+ &nbsp;
1479
+ <span class="missing-if-branch" title="else path not taken" >E</span>if ("and" in buildTags) {
1480
+ return buildTags.and.every((searchTag) =&gt; candidateTags.indexOf(searchTag) !== -1);
1481
+ }
1482
+ &nbsp;
1483
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1484
+ }
1485
+ &nbsp;
1486
+ function matchesFeaturePatterns(featureKey: FeatureKey, patterns?: "*" | FeatureKey[]): boolean {
1487
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!patterns) {
1488
+ <span class="cstat-no" title="statement not covered" > return false;</span>
1489
+ }
1490
+ &nbsp;
1491
+ const normalizedPatterns = patterns === "*" ? [patterns] : patterns;
1492
+ &nbsp;
1493
+ return normalizedPatterns.some((pattern) =&gt; {
1494
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&amp;").replace(/\*/g, ".*");
1495
+ return new RegExp(`^${escaped}$`).test(featureKey);
1496
+ });
1497
+ }
1498
+ &nbsp;
1446
1499
  export interface BuildOptions {
1447
- schemaVersion: string;
1448
1500
  revision: string;
1449
1501
  featurevisorVersion?: string;
1450
1502
  revisionFromHash?: boolean;
1451
1503
  environment: string | false;
1452
1504
  tag?: string;
1453
1505
  tags?: BuildTags;
1506
+ includeFeatures?: "*" | FeatureKey[];
1507
+ excludeFeatures?: "*" | FeatureKey[];
1454
1508
  features?: FeatureKey[];
1455
1509
  inflate?: number;
1456
1510
  }
@@ -1460,7 +1514,7 @@ export async function buildDatafile(
1460
1514
  datasource: Datasource,
1461
1515
  options: BuildOptions,
1462
1516
  existingState: ExistingState,
1463
- ): Promise&lt;DatafileContent | DatafileContentV1&gt; {
1517
+ ): Promise&lt;DatafileContent&gt; {
1464
1518
  const segmentKeysUsedByTag = new Set&lt;SegmentKey&gt;();
1465
1519
  const attributeKeysUsedByTag = new Set&lt;AttributeKey&gt;();
1466
1520
  const { featureRanges, featureIsInGroup } = await getFeatureRanges(projectConfig, datasource);
@@ -1469,8 +1523,8 @@ export async function buildDatafile(
1469
1523
  const schemaKeys = await datasource.listSchemas();
1470
1524
  const schemasByKey: Record&lt;string, Schema&gt; = {};
1471
1525
  for (const key of schemaKeys) {
1472
- <span class="cstat-no" title="statement not covered" > try {</span>
1473
- <span class="cstat-no" title="statement not covered" > schemasByKey[key] = await datasource.readSchema(key);</span>
1526
+ try {
1527
+ schemasByKey[key] = await datasource.readSchema(key);
1474
1528
  } catch {
1475
1529
  // Schema file may be invalid; skip for datafile build
1476
1530
  }
@@ -1480,7 +1534,7 @@ export async function buildDatafile(
1480
1534
  const features: Feature[] = [];
1481
1535
  const featuresDirectory = projectConfig.featuresDirectoryPath;
1482
1536
  &nbsp;
1483
- if (fs.existsSync(featuresDirectory)) {
1537
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (fs.existsSync(featuresDirectory)) {
1484
1538
  const featureFiles = await datasource.listFeatures();
1485
1539
  &nbsp;
1486
1540
  for (const featureKey of featureFiles) {
@@ -1490,43 +1544,28 @@ export async function buildDatafile(
1490
1544
  <span class="cstat-no" title="statement not covered" > continue;</span>
1491
1545
  }
1492
1546
  &nbsp;
1493
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.tag &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >parsedFeature.tags.indexOf(options.tag) === -1)</span> {
1494
- <span class="cstat-no" title="statement not covered" > continue;</span>
1547
+ const featureTags = parsedFeature.tags || [];
1548
+ &nbsp;
1549
+ if (options.tag &amp;&amp; featureTags.indexOf(options.tag) === -1) {
1550
+ continue;
1495
1551
  }
1496
1552
  &nbsp;
1497
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.tags) {
1498
- // plain array of tags: treat as OR tags
1499
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(options.tags)) {</span>
1500
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1501
- options.tags.some(<span class="fstat-no" title="function not covered" >(s</span>earchTag) =&gt; <span class="cstat-no" title="statement not covered" >parsedFeature.tags.indexOf(searchTag) !== -1)</span> === false
1502
- ) {
1503
- <span class="cstat-no" title="statement not covered" > continue;</span>
1504
- }
1505
- } else {
1506
- // OR tags
1507
- const orTags = <span class="cstat-no" title="statement not covered" >options.tags as BuildOrTags;</span>
1508
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orTags.or) {</span>
1509
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1510
- orTags.or.some(<span class="fstat-no" title="function not covered" >(s</span>earchTag) =&gt; <span class="cstat-no" title="statement not covered" >parsedFeature.tags.indexOf(searchTag) !== -1)</span> === false
1511
- ) {
1512
- <span class="cstat-no" title="statement not covered" > continue;</span>
1513
- }
1514
- }
1553
+ if (options.tags &amp;&amp; matchesBuildTags(featureTags, options.tags) === false) {
1554
+ continue;
1555
+ }
1515
1556
  &nbsp;
1516
- // AND tags
1517
- const andTags = <span class="cstat-no" title="statement not covered" >options.tags as BuildAndTags;</span>
1518
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (andTags.and) {</span>
1519
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1520
- andTags.and.every(<span class="fstat-no" title="function not covered" >(s</span>earchTag) =&gt; <span class="cstat-no" title="statement not covered" >parsedFeature.tags.indexOf(searchTag) !== -1)</span> ===
1521
- false
1522
- ) {
1523
- <span class="cstat-no" title="statement not covered" > continue;</span>
1524
- }
1525
- }
1526
- }
1557
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
1558
+ options.includeFeatures &amp;&amp;
1559
+ matchesFeaturePatterns(featureKey, options.includeFeatures) === false
1560
+ ) {
1561
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1562
+ }
1563
+ &nbsp;
1564
+ if (options.excludeFeatures &amp;&amp; matchesFeaturePatterns(featureKey, options.excludeFeatures)) {
1565
+ continue;
1527
1566
  }
1528
1567
  &nbsp;
1529
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.features &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >options.features.indexOf(featureKey) === -1)</span> {
1568
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.features &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >options.features.indexOf(featureKey) === -1) {</span>
1530
1569
  <span class="cstat-no" title="statement not covered" > continue;</span>
1531
1570
  }
1532
1571
  &nbsp;
@@ -1538,10 +1577,10 @@ export async function buildDatafile(
1538
1577
  expose = parsedFeature.expose?.[options.environment] as Expose | undefined;
1539
1578
  rules = parsedFeature.rules?.[options.environment] as Rule[];
1540
1579
  force = parsedFeature.force?.[options.environment] as Force[] | undefined;
1541
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1542
- <span class="cstat-no" title="statement not covered" > expose = parsedFeature.expose as Expose | undefined;</span>
1543
- <span class="cstat-no" title="statement not covered" > rules = parsedFeature.rules as Rule[];</span>
1544
- <span class="cstat-no" title="statement not covered" > force = parsedFeature.force as Force[] | undefined;</span>
1580
+ } else {
1581
+ expose = parsedFeature.expose as Expose | undefined;
1582
+ rules = parsedFeature.rules as Rule[];
1583
+ force = parsedFeature.force as Force[] | undefined;
1545
1584
  }
1546
1585
  &nbsp;
1547
1586
  <span class="missing-if-branch" title="if path not taken" >I</span>if (expose === false) {
@@ -1551,7 +1590,11 @@ export async function buildDatafile(
1551
1590
  <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(expose)) {
1552
1591
  const exposeTags = <span class="cstat-no" title="statement not covered" >expose;</span>
1553
1592
  &nbsp;
1554
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.tag &amp;&amp; exposeTags.indexOf(options.tag) === -1) {</span>
1593
+ <span class="cstat-no" title="statement not covered" > if (options.tag &amp;&amp; exposeTags.indexOf(options.tag) === -1) {</span>
1594
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1595
+ }
1596
+ &nbsp;
1597
+ <span class="cstat-no" title="statement not covered" > if (options.tags &amp;&amp; matchesBuildTags(exposeTags, options.tags) === false) {</span>
1555
1598
  <span class="cstat-no" title="statement not covered" > continue;</span>
1556
1599
  }
1557
1600
  }
@@ -1587,7 +1630,7 @@ export async function buildDatafile(
1587
1630
  &nbsp;
1588
1631
  const feature: Feature = {
1589
1632
  key: featureKey,
1590
- deprecated: parsedFeature.deprecated === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true </span>: undefined,
1633
+ deprecated: parsedFeature.deprecated === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true : u</span>ndefined,
1591
1634
  bucketBy: parsedFeature.bucketBy || <span class="branch-1 cbranch-no" title="branch not covered" >projectConfig.defaultBucketBy,</span>
1592
1635
  required: parsedFeature.required,
1593
1636
  disabledVariationValue: parsedFeature.disabledVariationValue,
@@ -1615,7 +1658,7 @@ export async function buildDatafile(
1615
1658
  <span class="cstat-no" title="statement not covered" > mappedVariation.variableOverrides[variableKey] = variableOverrides[</span>
1616
1659
  variableKey
1617
1660
  ].map(<span class="fstat-no" title="function not covered" >(o</span>verride: VariableOverride) =&gt; {
1618
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof override.conditions !== "undefined") {</span>
1661
+ <span class="cstat-no" title="statement not covered" > if (typeof override.conditions !== "undefined") {</span>
1619
1662
  const extractedAttributeKeys = <span class="cstat-no" title="statement not covered" >extractAttributeKeysFromConditions(</span>
1620
1663
  override.conditions,
1621
1664
  );
@@ -1637,7 +1680,7 @@ export async function buildDatafile(
1637
1680
  };
1638
1681
  }
1639
1682
  &nbsp;
1640
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof override.segments !== "undefined") {</span>
1683
+ <span class="cstat-no" title="statement not covered" > if (typeof override.segments !== "undefined") {</span>
1641
1684
  const extractedSegmentKeys = <span class="cstat-no" title="statement not covered" >extractSegmentKeysFromGroupSegments(</span>
1642
1685
  override.segments as GroupSegment | GroupSegment[],
1643
1686
  );
@@ -1666,7 +1709,7 @@ export async function buildDatafile(
1666
1709
  &nbsp;
1667
1710
  return mappedVariation;
1668
1711
  })
1669
- : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
1712
+ : undefined,
1670
1713
  traffic: getTraffic(
1671
1714
  parsedFeature.variations,
1672
1715
  rules,
@@ -1705,7 +1748,7 @@ export async function buildDatafile(
1705
1748
  };
1706
1749
  }
1707
1750
  &nbsp;
1708
- if (typeof override.segments !== "undefined") {
1751
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof override.segments !== "undefined") {
1709
1752
  return {
1710
1753
  segments:
1711
1754
  projectConfig.stringify &amp;&amp; typeof override.segments !== "string"
@@ -1731,7 +1774,7 @@ export async function buildDatafile(
1731
1774
  variables: resolvedVariables,
1732
1775
  variableOverrides: resolvedVariableOverrides,
1733
1776
  segments:
1734
- typeof t.segments !== "string" &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >projectConfig.stringify</span>
1777
+ typeof t.segments !== "string" &amp;&amp; projectConfig.stringify
1735
1778
  ? <span class="branch-0 cbranch-no" title="branch not covered" >JSON.stringify(t.segments)</span>
1736
1779
  : t.segments,
1737
1780
  };
@@ -1748,7 +1791,7 @@ export async function buildDatafile(
1748
1791
  weight: v.weight || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
1749
1792
  };
1750
1793
  })
1751
- : <span class="branch-1 cbranch-no" title="branch not covered" >undefined,</span>
1794
+ : undefined,
1752
1795
  traffic: feature.traffic.map((t: Traffic) =&gt; {
1753
1796
  return {
1754
1797
  key: t.key,
@@ -1782,10 +1825,10 @@ export async function buildDatafile(
1782
1825
  &nbsp;
1783
1826
  feature.variablesSchema[variableKey] = {
1784
1827
  key: variableKey,
1785
- type: (resolved?.type ?? <span class="branch-1 cbranch-no" title="branch not covered" >"string")</span> as VariableType,
1828
+ type: (resolved?.type ?? <span class="branch-1 cbranch-no" title="branch not covered" >"string") as VariableType,</span>
1786
1829
  defaultValue: v.defaultValue,
1787
- deprecated: v.deprecated === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true </span>: undefined,
1788
- useDefaultWhenDisabled: v.useDefaultWhenDisabled === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true </span>: undefined,
1830
+ deprecated: v.deprecated === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true : u</span>ndefined,
1831
+ useDefaultWhenDisabled: v.useDefaultWhenDisabled === true ? <span class="branch-0 cbranch-no" title="branch not covered" >true : u</span>ndefined,
1789
1832
  disabledValue: typeof v.disabledValue !== "undefined" ? <span class="branch-0 cbranch-no" title="branch not covered" >v.disabledValue </span>: undefined,
1790
1833
  };
1791
1834
  }
@@ -1793,9 +1836,9 @@ export async function buildDatafile(
1793
1836
  &nbsp;
1794
1837
  <span class="missing-if-branch" title="if path not taken" >I</span>if (force) {
1795
1838
  <span class="cstat-no" title="statement not covered" > feature.force = force.map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; {</span>
1796
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (f.segments) {</span>
1839
+ <span class="cstat-no" title="statement not covered" > if (f.segments) {</span>
1797
1840
  const extractedSegmentKeys = <span class="cstat-no" title="statement not covered" >extractSegmentKeysFromGroupSegments(f.segments);</span>
1798
- <span class="cstat-no" title="statement not covered" > extractedSegmentKeys.forEach(<span class="fstat-no" title="function not covered" >(s</span>egmentKey) =&gt; <span class="cstat-no" title="statement not covered" >segmentKeysUsedByTag.add(segmentKey))</span>;</span>
1841
+ <span class="cstat-no" title="statement not covered" > extractedSegmentKeys.forEach(<span class="fstat-no" title="function not covered" >(s</span>egmentKey) =&gt; <span class="cstat-no" title="statement not covered" >segmentKeysUsedByTag.add(segmentKey));</span></span>
1799
1842
  &nbsp;
1800
1843
  <span class="cstat-no" title="statement not covered" > f.segments =</span>
1801
1844
  typeof f.segments !== "string" &amp;&amp; projectConfig.stringify
@@ -1803,14 +1846,14 @@ export async function buildDatafile(
1803
1846
  : f.segments;
1804
1847
  }
1805
1848
  &nbsp;
1806
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (f.conditions) {</span>
1849
+ <span class="cstat-no" title="statement not covered" > if (f.conditions) {</span>
1807
1850
  <span class="cstat-no" title="statement not covered" > f.conditions =</span>
1808
1851
  typeof f.conditions !== "string" &amp;&amp; projectConfig.stringify
1809
1852
  ? JSON.stringify(f.conditions)
1810
1853
  : f.conditions;
1811
1854
  }
1812
1855
  &nbsp;
1813
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (f.variables) {</span>
1856
+ <span class="cstat-no" title="statement not covered" > if (f.variables) {</span>
1814
1857
  <span class="cstat-no" title="statement not covered" > f.variables = resolveMutationsForMultipleVariables(</span>
1815
1858
  parsedFeature.variablesSchema,
1816
1859
  f.variables,
@@ -1829,26 +1872,26 @@ export async function buildDatafile(
1829
1872
  const segments: Segment[] = [];
1830
1873
  const segmentsDirectory = projectConfig.segmentsDirectoryPath;
1831
1874
  &nbsp;
1832
- <span class="missing-if-branch" title="if path not taken" >I</span>if (fs.existsSync(segmentsDirectory)) {
1833
- const segmentFiles = <span class="cstat-no" title="statement not covered" >await datasource.listSegments();</span>
1875
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (fs.existsSync(segmentsDirectory)) {
1876
+ const segmentFiles = await datasource.listSegments();
1834
1877
  &nbsp;
1835
- <span class="cstat-no" title="statement not covered" > for (const segmentKey of segmentFiles) {</span>
1836
- const parsedSegment = <span class="cstat-no" title="statement not covered" >await datasource.readSegment(segmentKey);</span>
1878
+ for (const segmentKey of segmentFiles) {
1879
+ const parsedSegment = await datasource.readSegment(segmentKey);
1837
1880
  &nbsp;
1838
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedSegment.archived === true) {</span>
1881
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedSegment.archived === true) {
1839
1882
  <span class="cstat-no" title="statement not covered" > continue;</span>
1840
1883
  }
1841
1884
  &nbsp;
1842
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (segmentKeysUsedByTag.has(segmentKey) === false) {</span>
1885
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (segmentKeysUsedByTag.has(segmentKey) === false) {
1843
1886
  <span class="cstat-no" title="statement not covered" > continue;</span>
1844
1887
  }
1845
1888
  &nbsp;
1846
- const extractedAttributeKeys = <span class="cstat-no" title="statement not covered" >extractAttributeKeysFromConditions(</span>
1889
+ const extractedAttributeKeys = extractAttributeKeysFromConditions(
1847
1890
  parsedSegment.conditions as Condition | Condition[],
1848
1891
  );
1849
- <span class="cstat-no" title="statement not covered" > extractedAttributeKeys.forEach(<span class="fstat-no" title="function not covered" >(a</span>ttributeKey) =&gt; <span class="cstat-no" title="statement not covered" >attributeKeysUsedByTag.add(attributeKey))</span>;</span>
1892
+ extractedAttributeKeys.forEach((attributeKey) =&gt; attributeKeysUsedByTag.add(attributeKey));
1850
1893
  &nbsp;
1851
- const segment: Segment = <span class="cstat-no" title="statement not covered" >{</span>
1894
+ const segment: Segment = {
1852
1895
  key: segmentKey,
1853
1896
  conditions:
1854
1897
  typeof parsedSegment.conditions !== "string" &amp;&amp; projectConfig.stringify === true
@@ -1856,7 +1899,7 @@ export async function buildDatafile(
1856
1899
  : parsedSegment.conditions,
1857
1900
  };
1858
1901
  &nbsp;
1859
- <span class="cstat-no" title="statement not covered" > segments.push(segment);</span>
1902
+ segments.push(segment);
1860
1903
  }
1861
1904
  }
1862
1905
  &nbsp;
@@ -1864,39 +1907,39 @@ export async function buildDatafile(
1864
1907
  const attributes: Attribute[] = [];
1865
1908
  const attributesDirectory = projectConfig.attributesDirectoryPath;
1866
1909
  &nbsp;
1867
- <span class="missing-if-branch" title="if path not taken" >I</span>if (fs.existsSync(attributesDirectory)) {
1868
- const attributeFiles = <span class="cstat-no" title="statement not covered" >await datasource.listAttributes();</span>
1910
+ if (fs.existsSync(attributesDirectory)) {
1911
+ const attributeFiles = await datasource.listAttributes();
1869
1912
  &nbsp;
1870
- <span class="cstat-no" title="statement not covered" > for (const attributeKey of attributeFiles) {</span>
1871
- const parsedAttribute = <span class="cstat-no" title="statement not covered" >await datasource.readAttribute(attributeKey);</span>
1913
+ for (const attributeKey of attributeFiles) {
1914
+ const parsedAttribute = await datasource.readAttribute(attributeKey);
1872
1915
  &nbsp;
1873
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedAttribute.archived === true) {</span>
1916
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (parsedAttribute.archived === true) {
1874
1917
  <span class="cstat-no" title="statement not covered" > continue;</span>
1875
1918
  }
1876
1919
  &nbsp;
1877
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (attributeKeysUsedByTag.has(attributeKey) === false) {</span>
1878
- <span class="cstat-no" title="statement not covered" > continue;</span>
1920
+ if (attributeKeysUsedByTag.has(attributeKey) === false) {
1921
+ continue;
1879
1922
  }
1880
1923
  &nbsp;
1881
- const attribute: Attribute = <span class="cstat-no" title="statement not covered" >{</span>
1924
+ const attribute: Attribute = {
1882
1925
  key: attributeKey,
1883
1926
  type: parsedAttribute.type,
1884
1927
  };
1885
1928
  &nbsp;
1886
- <span class="cstat-no" title="statement not covered" > attributes.push(attribute);</span>
1929
+ attributes.push(attribute);
1887
1930
  }
1888
1931
  }
1889
1932
  &nbsp;
1890
1933
  // inflate
1891
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.inflate &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >options.inflate &gt;= 2)</span> {
1934
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.inflate &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >options.inflate &gt;= 2) {</span>
1892
1935
  const allFeatureKeys = <span class="cstat-no" title="statement not covered" >features.map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.key)</span>;</span>
1893
1936
  const allSegmentKeys = <span class="cstat-no" title="statement not covered" >segments.map(<span class="fstat-no" title="function not covered" >(s</span>) =&gt; <span class="cstat-no" title="statement not covered" >s.key)</span>;</span>
1894
1937
  const allAttributeKeys = <span class="cstat-no" title="statement not covered" >attributes.map(<span class="fstat-no" title="function not covered" >(a</span>) =&gt; <span class="cstat-no" title="statement not covered" >a.key)</span>;</span>
1895
1938
  &nbsp;
1896
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; options.inflate - 1; i++) {</span>
1939
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0; i</span> &lt; options.inflate - 1; i++) {</span>
1897
1940
  // feature
1898
1941
  <span class="cstat-no" title="statement not covered" > for (const featureKey of allFeatureKeys) {</span>
1899
- const originalFeature = <span class="cstat-no" title="statement not covered" >features.find(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.key === featureKey)</span> as Feature;</span>
1942
+ const originalFeature = <span class="cstat-no" title="statement not covered" >features.find(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.key === featureKey) as Feature;</span></span>
1900
1943
  &nbsp;
1901
1944
  <span class="cstat-no" title="statement not covered" > features.unshift({</span>
1902
1945
  ...originalFeature,
@@ -1906,7 +1949,7 @@ export async function buildDatafile(
1906
1949
  &nbsp;
1907
1950
  // segment
1908
1951
  <span class="cstat-no" title="statement not covered" > for (const segmentKey of allSegmentKeys) {</span>
1909
- const originalSegment = <span class="cstat-no" title="statement not covered" >segments.find(<span class="fstat-no" title="function not covered" >(s</span>) =&gt; <span class="cstat-no" title="statement not covered" >s.key === segmentKey)</span> as Segment;</span>
1952
+ const originalSegment = <span class="cstat-no" title="statement not covered" >segments.find(<span class="fstat-no" title="function not covered" >(s</span>) =&gt; <span class="cstat-no" title="statement not covered" >s.key === segmentKey) as Segment;</span></span>
1910
1953
  &nbsp;
1911
1954
  <span class="cstat-no" title="statement not covered" > segments.unshift({</span>
1912
1955
  ...originalSegment,
@@ -1916,7 +1959,7 @@ export async function buildDatafile(
1916
1959
  &nbsp;
1917
1960
  // attribute
1918
1961
  <span class="cstat-no" title="statement not covered" > for (const attributeKey of allAttributeKeys) {</span>
1919
- const originalAttribute = <span class="cstat-no" title="statement not covered" >attributes.find(<span class="fstat-no" title="function not covered" >(a</span>) =&gt; <span class="cstat-no" title="statement not covered" >a.key === attributeKey)</span> as Attribute;</span>
1962
+ const originalAttribute = <span class="cstat-no" title="statement not covered" >attributes.find(<span class="fstat-no" title="function not covered" >(a</span>) =&gt; <span class="cstat-no" title="statement not covered" >a.key === attributeKey) as Attribute;</span></span>
1920
1963
  &nbsp;
1921
1964
  <span class="cstat-no" title="statement not covered" > attributes.unshift({</span>
1922
1965
  ...originalAttribute,
@@ -1926,19 +1969,7 @@ export async function buildDatafile(
1926
1969
  }
1927
1970
  }
1928
1971
  &nbsp;
1929
- // schema v1
1930
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.schemaVersion === "1") {
1931
- <span class="cstat-no" title="statement not covered" > return convertToV1({</span>
1932
- revision: options.revision,
1933
- projectConfig,
1934
- attributes,
1935
- features,
1936
- segments,
1937
- });
1938
- }
1939
- &nbsp;
1940
- // schema v2
1941
- const datafileContentV2: DatafileContent = {
1972
+ const datafileContent: DatafileContent = {
1942
1973
  schemaVersion: "2",
1943
1974
  featurevisorVersion: options.featurevisorVersion,
1944
1975
  revision: options.revision,
@@ -1946,17 +1977,16 @@ export async function buildDatafile(
1946
1977
  features: {},
1947
1978
  };
1948
1979
  &nbsp;
1949
- datafileContentV2.segments = segments.reduce(<span class="fstat-no" title="function not covered" >(a</span>cc, segment) =&gt; {
1950
- // key check needed for supporting v1 datafile generation
1951
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (segment.key) {</span>
1952
- <span class="cstat-no" title="statement not covered" > acc[segment.key] = segment;</span>
1953
- <span class="cstat-no" title="statement not covered" > delete acc[segment.key].key; </span>// remove key from segment, as it is not needed in v2 datafile
1980
+ datafileContent.segments = segments.reduce((acc, segment) =&gt; {
1981
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (segment.key) {
1982
+ acc[segment.key] = segment;
1983
+ delete acc[segment.key].key; // remove key from segment, as it is not needed in v2 datafile
1954
1984
  }
1955
1985
  &nbsp;
1956
- <span class="cstat-no" title="statement not covered" > return acc;</span>
1986
+ return acc;
1957
1987
  }, {});
1958
1988
  &nbsp;
1959
- datafileContentV2.features = features.reduce((acc, feature) =&gt; {
1989
+ datafileContent.features = features.reduce((acc, feature) =&gt; {
1960
1990
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature.key) {
1961
1991
  <span class="cstat-no" title="statement not covered" > return acc;</span>
1962
1992
  }
@@ -1970,7 +2000,7 @@ export async function buildDatafile(
1970
2000
  // remove variablesSchema[key].key
1971
2001
  if (featureV2.variablesSchema) {
1972
2002
  for (const [variableKey, variable] of Object.entries(featureV2.variablesSchema)) {
1973
- if (variable.key) {
2003
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (variable.key) {
1974
2004
  delete featureV2.variablesSchema[variableKey].key;
1975
2005
  }
1976
2006
  }
@@ -1982,24 +2012,24 @@ export async function buildDatafile(
1982
2012
  }, {});
1983
2013
  &nbsp;
1984
2014
  // add feature hashes for change detection
1985
- const segmentHashes = getSegmentHashes(datafileContentV2.segments);
1986
- Object.keys(datafileContentV2.features).forEach((featureKey) =&gt; {
1987
- const hash = generateHashForFeature(featureKey, datafileContentV2.features, segmentHashes);
2015
+ const segmentHashes = getSegmentHashes(datafileContent.segments);
2016
+ Object.keys(datafileContent.features).forEach((featureKey) =&gt; {
2017
+ const hash = generateHashForFeature(featureKey, datafileContent.features, segmentHashes);
1988
2018
  &nbsp;
1989
- datafileContentV2.features[featureKey].hash = hash;
2019
+ datafileContent.features[featureKey].hash = hash;
1990
2020
  &nbsp;
1991
2021
  // check needed to support --inflate option
1992
- if (existingState.features[featureKey]) {
2022
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (existingState.features[featureKey]) {
1993
2023
  existingState.features[featureKey].hash = hash;
1994
2024
  }
1995
2025
  });
1996
2026
  &nbsp;
1997
2027
  <span class="missing-if-branch" title="if path not taken" >I</span>if (options.revisionFromHash) {
1998
- const datafileHash = <span class="cstat-no" title="statement not covered" >generateHashForDatafile(datafileContentV2);</span>
1999
- <span class="cstat-no" title="statement not covered" > datafileContentV2.revision = `${datafileHash}`;</span>
2028
+ const datafileHash = <span class="cstat-no" title="statement not covered" >generateHashForDatafile(datafileContent);</span>
2029
+ <span class="cstat-no" title="statement not covered" > datafileContent.revision = `${datafileHash}`;</span>
2000
2030
  }
2001
2031
  &nbsp;
2002
- return datafileContentV2;
2032
+ return datafileContent;
2003
2033
  }
2004
2034
  &nbsp;</pre></td></tr></table></pre>
2005
2035
 
@@ -2008,16 +2038,16 @@ export async function buildDatafile(
2008
2038
  <div class='footer quiet pad2 space-top1 center small'>
2009
2039
  Code coverage generated by
2010
2040
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2011
- at 2026-04-26T16:47:51.164Z
2041
+ at 2026-07-12T20:35:50.655Z
2012
2042
  </div>
2013
- <script src="../prettify.js"></script>
2043
+ <script src="../../prettify.js"></script>
2014
2044
  <script>
2015
2045
  window.onload = function () {
2016
2046
  prettyPrint();
2017
2047
  };
2018
2048
  </script>
2019
- <script src="../sorter.js"></script>
2020
- <script src="../block-navigation.js"></script>
2049
+ <script src="../../sorter.js"></script>
2050
+ <script src="../../block-navigation.js"></script>
2021
2051
  </body>
2022
2052
  </html>
2023
2053