@featurevisor/core 2.14.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/coverage/clover.xml +774 -652
  3. package/coverage/coverage-final.json +19 -18
  4. package/coverage/lcov-report/builder/allocator.ts.html +1 -1
  5. package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
  6. package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
  7. package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
  8. package/coverage/lcov-report/builder/index.html +1 -1
  9. package/coverage/lcov-report/builder/mutateVariables.ts.html +1 -1
  10. package/coverage/lcov-report/builder/mutator.ts.html +1 -1
  11. package/coverage/lcov-report/builder/revision.ts.html +1 -1
  12. package/coverage/lcov-report/builder/traffic.ts.html +1 -1
  13. package/coverage/lcov-report/config/index.html +30 -15
  14. package/coverage/lcov-report/config/index.ts.html +88 -0
  15. package/coverage/lcov-report/config/projectConfig.ts.html +79 -46
  16. package/coverage/lcov-report/datasource/adapter.ts.html +74 -11
  17. package/coverage/lcov-report/datasource/datasource.ts.html +76 -25
  18. package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +690 -66
  19. package/coverage/lcov-report/datasource/index.html +35 -35
  20. package/coverage/lcov-report/datasource/index.ts.html +1 -1
  21. package/coverage/lcov-report/index.html +43 -43
  22. package/coverage/lcov-report/linter/attributeSchema.ts.html +4 -4
  23. package/coverage/lcov-report/linter/checkCircularDependency.ts.html +1 -1
  24. package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +1 -1
  25. package/coverage/lcov-report/linter/conditionSchema.ts.html +7 -7
  26. package/coverage/lcov-report/linter/featureSchema.ts.html +152 -164
  27. package/coverage/lcov-report/linter/groupSchema.ts.html +3 -3
  28. package/coverage/lcov-report/linter/index.html +34 -34
  29. package/coverage/lcov-report/linter/lintProject.ts.html +428 -83
  30. package/coverage/lcov-report/linter/mutationNotation.ts.html +3 -3
  31. package/coverage/lcov-report/linter/printError.ts.html +9 -9
  32. package/coverage/lcov-report/linter/schema.ts.html +4 -4
  33. package/coverage/lcov-report/linter/segmentSchema.ts.html +3 -3
  34. package/coverage/lcov-report/linter/testSchema.ts.html +6 -6
  35. package/coverage/lcov-report/list/index.html +1 -1
  36. package/coverage/lcov-report/list/matrix.ts.html +1 -1
  37. package/coverage/lcov-report/parsers/index.html +1 -1
  38. package/coverage/lcov-report/parsers/index.ts.html +4 -4
  39. package/coverage/lcov-report/parsers/json.ts.html +2 -2
  40. package/coverage/lcov-report/parsers/yml.ts.html +6 -6
  41. package/coverage/lcov-report/tester/cliFormat.ts.html +1 -1
  42. package/coverage/lcov-report/tester/helpers.ts.html +1 -1
  43. package/coverage/lcov-report/tester/index.html +1 -1
  44. package/coverage/lcov-report/utils/git.ts.html +118 -16
  45. package/coverage/lcov-report/utils/index.html +14 -14
  46. package/coverage/lcov.info +1374 -1107
  47. package/lib/config/projectConfig.d.ts +3 -0
  48. package/lib/config/projectConfig.js +7 -1
  49. package/lib/config/projectConfig.js.map +1 -1
  50. package/lib/config/projectConfig.spec.d.ts +1 -0
  51. package/lib/config/projectConfig.spec.js +24 -0
  52. package/lib/config/projectConfig.spec.js.map +1 -0
  53. package/lib/datasource/adapter.d.ts +7 -0
  54. package/lib/datasource/adapter.js +7 -0
  55. package/lib/datasource/adapter.js.map +1 -1
  56. package/lib/datasource/datasource.d.ts +3 -1
  57. package/lib/datasource/datasource.js +6 -0
  58. package/lib/datasource/datasource.js.map +1 -1
  59. package/lib/datasource/filesystemAdapter.d.ts +8 -0
  60. package/lib/datasource/filesystemAdapter.js +134 -7
  61. package/lib/datasource/filesystemAdapter.js.map +1 -1
  62. package/lib/datasource/filesystemAdapter.spec.d.ts +1 -0
  63. package/lib/datasource/filesystemAdapter.spec.js +88 -0
  64. package/lib/datasource/filesystemAdapter.spec.js.map +1 -0
  65. package/lib/linter/conditionSchema.spec.js +2 -0
  66. package/lib/linter/conditionSchema.spec.js.map +1 -1
  67. package/lib/linter/featureSchema.js +46 -49
  68. package/lib/linter/featureSchema.js.map +1 -1
  69. package/lib/linter/featureSchema.spec.js +17 -0
  70. package/lib/linter/featureSchema.spec.js.map +1 -1
  71. package/lib/linter/lintProject.d.ts +2 -0
  72. package/lib/linter/lintProject.js +85 -8
  73. package/lib/linter/lintProject.js.map +1 -1
  74. package/lib/linter/lintProject.spec.js +37 -0
  75. package/lib/linter/lintProject.spec.js.map +1 -1
  76. package/lib/linter/segmentSchema.spec.js +2 -0
  77. package/lib/linter/segmentSchema.spec.js.map +1 -1
  78. package/lib/utils/git.js +32 -7
  79. package/lib/utils/git.js.map +1 -1
  80. package/package.json +2 -2
  81. package/src/config/projectConfig.spec.ts +31 -0
  82. package/src/config/projectConfig.ts +11 -0
  83. package/src/datasource/adapter.ts +21 -0
  84. package/src/datasource/datasource.ts +18 -1
  85. package/src/datasource/filesystemAdapter.spec.ts +153 -0
  86. package/src/datasource/filesystemAdapter.ts +216 -8
  87. package/src/linter/conditionSchema.spec.ts +2 -0
  88. package/src/linter/featureSchema.spec.ts +21 -0
  89. package/src/linter/featureSchema.ts +84 -88
  90. package/src/linter/lintProject.spec.ts +74 -0
  91. package/src/linter/lintProject.ts +123 -8
  92. package/src/linter/segmentSchema.spec.ts +2 -0
  93. package/src/utils/git.ts +41 -7
@@ -491,8 +491,8 @@
491
491
  <span class="cline-any cline-neutral">&nbsp;</span>
492
492
  <span class="cline-any cline-neutral">&nbsp;</span>
493
493
  <span class="cline-any cline-yes">3x</span>
494
- <span class="cline-any cline-yes">688x</span>
495
- <span class="cline-any cline-yes">688x</span>
494
+ <span class="cline-any cline-yes">689x</span>
495
+ <span class="cline-any cline-yes">689x</span>
496
496
  <span class="cline-any cline-neutral">&nbsp;</span>
497
497
  <span class="cline-any cline-neutral">&nbsp;</span>
498
498
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1294,7 +1294,7 @@ export function parsePathMapKey(relativePath: string): PathSegment[] | null {
1294
1294
  <div class='footer quiet pad2 space-top1 center small'>
1295
1295
  Code coverage generated by
1296
1296
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1297
- at 2026-02-24T19:50:30.107Z
1297
+ at 2026-02-25T22:03:15.189Z
1298
1298
  </div>
1299
1299
  <script src="../prettify.js"></script>
1300
1300
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">50% </span>
26
+ <span class="strong">56.25% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>8/16</span>
28
+ <span class='fraction'>9/16</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">50% </span>
47
+ <span class="strong">56.25% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>8/16</span>
49
+ <span class='fraction'>9/16</span>
50
50
  </div>
51
51
 
52
52
 
@@ -126,9 +126,9 @@
126
126
  <span class="cline-any cline-neutral">&nbsp;</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
128
  <span class="cline-any cline-yes">1x</span>
129
- <span class="cline-any cline-yes">1x</span>
129
+ <span class="cline-any cline-yes">2x</span>
130
130
  <span class="cline-any cline-neutral">&nbsp;</span>
131
- <span class="cline-any cline-yes">1x</span>
131
+ <span class="cline-any cline-yes">4x</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
133
133
  <span class="cline-any cline-neutral">&nbsp;</span>
134
134
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -144,7 +144,7 @@
144
144
  <span class="cline-any cline-neutral">&nbsp;</span>
145
145
  <span class="cline-any cline-neutral">&nbsp;</span>
146
146
  <span class="cline-any cline-neutral">&nbsp;</span>
147
- <span class="cline-any cline-no">&nbsp;</span>
147
+ <span class="cline-any cline-yes">3x</span>
148
148
  <span class="cline-any cline-neutral">&nbsp;</span>
149
149
  <span class="cline-any cline-neutral">&nbsp;</span>
150
150
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -195,7 +195,7 @@ export function getLintIssuesFromZodError(e: ZodError): LintIssueFromZod[] {
195
195
  };
196
196
  }
197
197
  &nbsp;
198
- <span class="cstat-no" title="statement not covered" > return {</span>
198
+ return {
199
199
  message: issue.message,
200
200
  path: issue.path,
201
201
  code: issue.code,
@@ -223,7 +223,7 @@ export function <span class="fstat-no" title="function not covered" >printZodErr
223
223
  <div class='footer quiet pad2 space-top1 center small'>
224
224
  Code coverage generated by
225
225
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
226
- at 2026-02-24T19:50:30.107Z
226
+ at 2026-02-25T22:03:15.189Z
227
227
  </div>
228
228
  <script src="../prettify.js"></script>
229
229
  <script>
@@ -914,7 +914,7 @@
914
914
  <span class="cline-any cline-neutral">&nbsp;</span>
915
915
  <span class="cline-any cline-neutral">&nbsp;</span>
916
916
  <span class="cline-any cline-yes">3x</span>
917
- <span class="cline-any cline-yes">2455x</span>
917
+ <span class="cline-any cline-yes">2456x</span>
918
918
  <span class="cline-any cline-neutral">&nbsp;</span>
919
919
  <span class="cline-any cline-neutral">&nbsp;</span>
920
920
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -937,7 +937,7 @@
937
937
  <span class="cline-any cline-neutral">&nbsp;</span>
938
938
  <span class="cline-any cline-neutral">&nbsp;</span>
939
939
  <span class="cline-any cline-yes">3x</span>
940
- <span class="cline-any cline-yes">98x</span>
940
+ <span class="cline-any cline-yes">103x</span>
941
941
  <span class="cline-any cline-yes">320x</span>
942
942
  <span class="cline-any cline-neutral">&nbsp;</span>
943
943
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -985,7 +985,7 @@
985
985
  <span class="cline-any cline-yes">320x</span>
986
986
  <span class="cline-any cline-neutral">&nbsp;</span>
987
987
  <span class="cline-any cline-neutral">&nbsp;</span>
988
- <span class="cline-any cline-yes">98x</span>
988
+ <span class="cline-any cline-yes">103x</span>
989
989
  <span class="cline-any cline-neutral">&nbsp;</span>
990
990
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Schema, SchemaKey, Value } from "@featurevisor/types";
991
991
  import { z } from "zod";
@@ -1456,7 +1456,7 @@ export function getSchemaZodSchema(schemaKeys: SchemaKey[] = <span class="branch
1456
1456
  <div class='footer quiet pad2 space-top1 center small'>
1457
1457
  Code coverage generated by
1458
1458
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1459
- at 2026-02-24T19:50:30.107Z
1459
+ at 2026-02-25T22:03:15.189Z
1460
1460
  </div>
1461
1461
  <script src="../prettify.js"></script>
1462
1462
  <script>
@@ -83,7 +83,7 @@
83
83
  <span class="cline-any cline-neutral">&nbsp;</span>
84
84
  <span class="cline-any cline-neutral">&nbsp;</span>
85
85
  <span class="cline-any cline-yes">2x</span>
86
- <span class="cline-any cline-yes">21x</span>
86
+ <span class="cline-any cline-yes">23x</span>
87
87
  <span class="cline-any cline-neutral">&nbsp;</span>
88
88
  <span class="cline-any cline-neutral">&nbsp;</span>
89
89
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -91,7 +91,7 @@
91
91
  <span class="cline-any cline-neutral">&nbsp;</span>
92
92
  <span class="cline-any cline-neutral">&nbsp;</span>
93
93
  <span class="cline-any cline-neutral">&nbsp;</span>
94
- <span class="cline-any cline-yes">21x</span>
94
+ <span class="cline-any cline-yes">23x</span>
95
95
  <span class="cline-any cline-neutral">&nbsp;</span>
96
96
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from "zod";
97
97
  &nbsp;
@@ -115,7 +115,7 @@ export function getSegmentZodSchema(projectConfig: ProjectConfig, conditionsZodS
115
115
  <div class='footer quiet pad2 space-top1 center small'>
116
116
  Code coverage generated by
117
117
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
118
- at 2026-02-24T19:50:30.107Z
118
+ at 2026-02-25T22:03:15.189Z
119
119
  </div>
120
120
  <script src="../prettify.js"></script>
121
121
  <script>
@@ -227,9 +227,9 @@
227
227
  <span class="cline-any cline-neutral">&nbsp;</span>
228
228
  <span class="cline-any cline-neutral">&nbsp;</span>
229
229
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-yes">4x</span>
230
+ <span class="cline-any cline-yes">6x</span>
231
231
  <span class="cline-any cline-neutral">&nbsp;</span>
232
- <span class="cline-any cline-yes">4x</span>
232
+ <span class="cline-any cline-yes">6x</span>
233
233
  <span class="cline-any cline-neutral">&nbsp;</span>
234
234
  <span class="cline-any cline-neutral">&nbsp;</span>
235
235
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -241,7 +241,7 @@
241
241
  <span class="cline-any cline-neutral">&nbsp;</span>
242
242
  <span class="cline-any cline-neutral">&nbsp;</span>
243
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">4x</span>
244
+ <span class="cline-any cline-yes">6x</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
246
  <span class="cline-any cline-neutral">&nbsp;</span>
247
247
  <span class="cline-any cline-yes">18x</span>
@@ -262,7 +262,7 @@
262
262
  <span class="cline-any cline-neutral">&nbsp;</span>
263
263
  <span class="cline-any cline-neutral">&nbsp;</span>
264
264
  <span class="cline-any cline-neutral">&nbsp;</span>
265
- <span class="cline-any cline-yes">4x</span>
265
+ <span class="cline-any cline-yes">6x</span>
266
266
  <span class="cline-any cline-neutral">&nbsp;</span>
267
267
  <span class="cline-any cline-neutral">&nbsp;</span>
268
268
  <span class="cline-any cline-yes">67x</span>
@@ -371,7 +371,7 @@
371
371
  <span class="cline-any cline-neutral">&nbsp;</span>
372
372
  <span class="cline-any cline-neutral">&nbsp;</span>
373
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">4x</span>
374
+ <span class="cline-any cline-yes">6x</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
376
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from "zod";
377
377
  &nbsp;
@@ -535,7 +535,7 @@ export function getTestsZodSchema(
535
535
  <div class='footer quiet pad2 space-top1 center small'>
536
536
  Code coverage generated by
537
537
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
538
- at 2026-02-24T19:50:30.107Z
538
+ at 2026-02-25T22:03:15.189Z
539
539
  </div>
540
540
  <script src="../prettify.js"></script>
541
541
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-02-24T19:50:30.107Z
104
+ at 2026-02-25T22:03:15.189Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -721,7 +721,7 @@ export function <span class="fstat-no" title="function not covered" >getSegmentA
721
721
  <div class='footer quiet pad2 space-top1 center small'>
722
722
  Code coverage generated by
723
723
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
724
- at 2026-02-24T19:50:30.107Z
724
+ at 2026-02-25T22:03:15.189Z
725
725
  </div>
726
726
  <script src="../prettify.js"></script>
727
727
  <script>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2026-02-24T19:50:30.107Z
134
+ at 2026-02-25T22:03:15.189Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -85,8 +85,8 @@
85
85
  <a name='L20'></a><a href='#L20'>20</a>
86
86
  <a name='L21'></a><a href='#L21'>21</a>
87
87
  <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
89
- <span class="cline-any cline-yes">1x</span>
88
+ <a name='L23'></a><a href='#L23'>23</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
89
+ <span class="cline-any cline-yes">3x</span>
90
90
  <span class="cline-any cline-neutral">&nbsp;</span>
91
91
  <span class="cline-any cline-neutral">&nbsp;</span>
92
92
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -99,7 +99,7 @@
99
99
  <span class="cline-any cline-neutral">&nbsp;</span>
100
100
  <span class="cline-any cline-neutral">&nbsp;</span>
101
101
  <span class="cline-any cline-neutral">&nbsp;</span>
102
- <span class="cline-any cline-yes">1x</span>
102
+ <span class="cline-any cline-yes">3x</span>
103
103
  <span class="cline-any cline-neutral">&nbsp;</span>
104
104
  <span class="cline-any cline-neutral">&nbsp;</span>
105
105
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -136,7 +136,7 @@ export type Parser = BuiltInParser | CustomParser;
136
136
  <div class='footer quiet pad2 space-top1 center small'>
137
137
  Code coverage generated by
138
138
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
139
- at 2026-02-24T19:50:30.107Z
139
+ at 2026-02-25T22:03:15.189Z
140
140
  </div>
141
141
  <script src="../prettify.js"></script>
142
142
  <script>
@@ -76,7 +76,7 @@
76
76
  <a name='L11'></a><a href='#L11'>11</a>
77
77
  <a name='L12'></a><a href='#L12'>12</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
78
78
  <span class="cline-any cline-neutral">&nbsp;</span>
79
- <span class="cline-any cline-yes">2x</span>
79
+ <span class="cline-any cline-yes">4x</span>
80
80
  <span class="cline-any cline-neutral">&nbsp;</span>
81
81
  <span class="cline-any cline-neutral">&nbsp;</span>
82
82
  <span class="cline-any cline-yes">3x</span>
@@ -103,7 +103,7 @@ export const jsonParser: CustomParser = {
103
103
  <div class='footer quiet pad2 space-top1 center small'>
104
104
  Code coverage generated by
105
105
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
106
- at 2026-02-24T19:50:30.107Z
106
+ at 2026-02-25T22:03:15.189Z
107
107
  </div>
108
108
  <script src="../prettify.js"></script>
109
109
  <script>
@@ -231,11 +231,11 @@
231
231
  <a name='L166'></a><a href='#L166'>166</a>
232
232
  <a name='L167'></a><a href='#L167'>167</a>
233
233
  <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
234
+ <a name='L169'></a><a href='#L169'>169</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
235
235
  <span class="cline-any cline-neutral">&nbsp;</span>
236
- <span class="cline-any cline-yes">2x</span>
236
+ <span class="cline-any cline-yes">4x</span>
237
237
  <span class="cline-any cline-neutral">&nbsp;</span>
238
- <span class="cline-any cline-yes">2x</span>
238
+ <span class="cline-any cline-yes">4x</span>
239
239
  <span class="cline-any cline-neutral">&nbsp;</span>
240
240
  <span class="cline-any cline-neutral">&nbsp;</span>
241
241
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -371,10 +371,10 @@
371
371
  <span class="cline-any cline-yes">2x</span>
372
372
  <span class="cline-any cline-neutral">&nbsp;</span>
373
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">2x</span>
374
+ <span class="cline-any cline-yes">4x</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
376
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-yes">375x</span>
377
+ <span class="cline-any cline-yes">388x</span>
378
378
  <span class="cline-any cline-neutral">&nbsp;</span>
379
379
  <span class="cline-any cline-neutral">&nbsp;</span>
380
380
  <span class="cline-any cline-yes">7x</span>
@@ -574,7 +574,7 @@ export const ymlParser: CustomParser = {
574
574
  <div class='footer quiet pad2 space-top1 center small'>
575
575
  Code coverage generated by
576
576
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
577
- at 2026-02-24T19:50:30.107Z
577
+ at 2026-02-25T22:03:15.189Z
578
578
  </div>
579
579
  <script src="../prettify.js"></script>
580
580
  <script>
@@ -88,7 +88,7 @@ export const CLI_FORMAT_BOLD_UNDERLINE = "\x1b[1m\x1b[4m%s\x1b[0m";
88
88
  <div class='footer quiet pad2 space-top1 center small'>
89
89
  Code coverage generated by
90
90
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
91
- at 2026-02-24T19:50:30.107Z
91
+ at 2026-02-25T22:03:15.189Z
92
92
  </div>
93
93
  <script src="../prettify.js"></script>
94
94
  <script>
@@ -298,7 +298,7 @@ export function checkIfArraysAreEqual(arr1: any[], arr2: any[]): boolean {
298
298
  <div class='footer quiet pad2 space-top1 center small'>
299
299
  Code coverage generated by
300
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
301
- at 2026-02-24T19:50:30.107Z
301
+ at 2026-02-25T22:03:15.189Z
302
302
  </div>
303
303
  <script src="../prettify.js"></script>
304
304
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-02-24T19:50:30.107Z
119
+ at 2026-02-25T22:03:15.189Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">2.89% </span>
26
+ <span class="strong">2.59% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>2/69</span>
28
+ <span class='fraction'>2/77</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/34</span>
35
+ <span class='fraction'>0/48</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/5</span>
42
+ <span class='fraction'>0/6</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">2.89% </span>
47
+ <span class="strong">2.59% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>2/69</span>
49
+ <span class='fraction'>2/77</span>
50
50
  </div>
51
51
 
52
52
 
@@ -195,7 +195,41 @@
195
195
  <a name='L130'></a><a href='#L130'>130</a>
196
196
  <a name='L131'></a><a href='#L131'>131</a>
197
197
  <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
199
233
  <span class="cline-any cline-neutral">&nbsp;</span>
200
234
  <span class="cline-any cline-neutral">&nbsp;</span>
201
235
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -209,6 +243,12 @@
209
243
  <span class="cline-any cline-neutral">&nbsp;</span>
210
244
  <span class="cline-any cline-neutral">&nbsp;</span>
211
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-no">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
252
  <span class="cline-any cline-neutral">&nbsp;</span>
213
253
  <span class="cline-any cline-neutral">&nbsp;</span>
214
254
  <span class="cline-any cline-no">&nbsp;</span>
@@ -257,7 +297,7 @@
257
297
  <span class="cline-any cline-no">&nbsp;</span>
258
298
  <span class="cline-any cline-neutral">&nbsp;</span>
259
299
  <span class="cline-any cline-neutral">&nbsp;</span>
260
- <span class="cline-any cline-yes">1x</span>
300
+ <span class="cline-any cline-yes">3x</span>
261
301
  <span class="cline-any cline-neutral">&nbsp;</span>
262
302
  <span class="cline-any cline-neutral">&nbsp;</span>
263
303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -287,27 +327,55 @@
287
327
  <span class="cline-any cline-no">&nbsp;</span>
288
328
  <span class="cline-any cline-no">&nbsp;</span>
289
329
  <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-no">&nbsp;</span>
290
336
  <span class="cline-any cline-no">&nbsp;</span>
291
337
  <span class="cline-any cline-no">&nbsp;</span>
292
338
  <span class="cline-any cline-no">&nbsp;</span>
293
339
  <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
342
  <span class="cline-any cline-no">&nbsp;</span>
295
343
  <span class="cline-any cline-neutral">&nbsp;</span>
296
344
  <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-no">&nbsp;</span>
297
347
  <span class="cline-any cline-no">&nbsp;</span>
298
348
  <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
299
352
  <span class="cline-any cline-neutral">&nbsp;</span>
300
353
  <span class="cline-any cline-neutral">&nbsp;</span>
301
354
  <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
356
  <span class="cline-any cline-no">&nbsp;</span>
303
357
  <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
361
  <span class="cline-any cline-no">&nbsp;</span>
305
362
  <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
368
  <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
371
  <span class="cline-any cline-neutral">&nbsp;</span>
308
372
  <span class="cline-any cline-neutral">&nbsp;</span>
309
373
  <span class="cline-any cline-no">&nbsp;</span>
310
374
  <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
379
  <span class="cline-any cline-no">&nbsp;</span>
312
380
  <span class="cline-any cline-neutral">&nbsp;</span>
313
381
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -334,6 +402,12 @@ import type { Commit, EntityDiff, EntityType } from "@featurevisor/types";
334
402
  import { ProjectConfig } from "../config";
335
403
  import { CustomParser } from "../parsers";
336
404
  &nbsp;
405
+ function <span class="fstat-no" title="function not covered" >isWithinDirectory(</span>directoryPath: string, fileDirectoryPath: string): boolean {
406
+ <span class="cstat-no" title="statement not covered" > return (</span>
407
+ fileDirectoryPath === directoryPath || fileDirectoryPath.startsWith(directoryPath + path.sep)
408
+ );
409
+ }
410
+ &nbsp;
337
411
  function <span class="fstat-no" title="function not covered" >parseGitCommitShowOutput(</span>gitShowOutput: string) {
338
412
  const result = <span class="cstat-no" title="statement not covered" >{</span>
339
413
  hash: "",
@@ -412,17 +486,22 @@ export function <span class="fstat-no" title="function not covered" >getCommit(<
412
486
  &nbsp;
413
487
  // get entity type
414
488
  let type: EntityType = <span class="cstat-no" title="statement not covered" >"attribute";</span>
415
- <span class="cstat-no" title="statement not covered" > if (relativeDir === projectConfig.attributesDirectoryPath) {</span>
489
+ <span class="cstat-no" title="statement not covered" > if (isWithinDirectory(projectConfig.attributesDirectoryPath, relativeDir)) {</span>
416
490
  <span class="cstat-no" title="statement not covered" > type = "attribute";</span>
417
- } else <span class="cstat-no" title="statement not covered" >if (relativeDir === projectConfig.segmentsDirectoryPath) {</span>
491
+ } else <span class="cstat-no" title="statement not covered" >if (isWithinDirectory(projectConfig.segmentsDirectoryPath, relativeDir)) {</span>
418
492
  <span class="cstat-no" title="statement not covered" > type = "segment";</span>
419
- } else <span class="cstat-no" title="statement not covered" >if (relativeDir === projectConfig.featuresDirectoryPath) {</span>
493
+ } else <span class="cstat-no" title="statement not covered" >if (isWithinDirectory(projectConfig.featuresDirectoryPath, relativeDir)) {</span>
494
+ <span class="cstat-no" title="statement not covered" > type = "feature";</span>
495
+ } else <span class="cstat-no" title="statement not covered" >if (</span>
496
+ projectConfig.splitByEnvironment &amp;&amp;
497
+ isWithinDirectory(projectConfig.environmentsDirectoryPath, relativeDir)
498
+ ) {
420
499
  <span class="cstat-no" title="statement not covered" > type = "feature";</span>
421
- } else <span class="cstat-no" title="statement not covered" >if (relativeDir === projectConfig.groupsDirectoryPath) {</span>
500
+ } else <span class="cstat-no" title="statement not covered" >if (isWithinDirectory(projectConfig.groupsDirectoryPath, relativeDir)) {</span>
422
501
  <span class="cstat-no" title="statement not covered" > type = "group";</span>
423
- } else <span class="cstat-no" title="statement not covered" >if (relativeDir === projectConfig.schemasDirectoryPath) {</span>
502
+ } else <span class="cstat-no" title="statement not covered" >if (isWithinDirectory(projectConfig.schemasDirectoryPath, relativeDir)) {</span>
424
503
  <span class="cstat-no" title="statement not covered" > type = "schema";</span>
425
- } else <span class="cstat-no" title="statement not covered" >if (relativeDir === projectConfig.testsDirectoryPath) {</span>
504
+ } else <span class="cstat-no" title="statement not covered" >if (isWithinDirectory(projectConfig.testsDirectoryPath, relativeDir)) {</span>
426
505
  <span class="cstat-no" title="statement not covered" > type = "test";</span>
427
506
  } else {
428
507
  // unknown type
@@ -438,7 +517,30 @@ export function <span class="fstat-no" title="function not covered" >getCommit(<
438
517
  <span class="cstat-no" title="statement not covered" > return;</span>
439
518
  }
440
519
  &nbsp;
441
- const key = <span class="cstat-no" title="statement not covered" >fileName.replace(extensionWithDot, "");</span>
520
+ let key = <span class="cstat-no" title="statement not covered" >fileName.replace(extensionWithDot, "");</span>
521
+ &nbsp;
522
+ <span class="cstat-no" title="statement not covered" > if (</span>
523
+ type === "feature" &amp;&amp;
524
+ projectConfig.splitByEnvironment &amp;&amp;
525
+ absolutePath.startsWith(projectConfig.environmentsDirectoryPath + path.sep)
526
+ ) {
527
+ const featureRelativePath = <span class="cstat-no" title="statement not covered" >absolutePath</span>
528
+ .replace(projectConfig.environmentsDirectoryPath + path.sep, "")
529
+ .split(path.sep)
530
+ .slice(1)
531
+ .join(path.sep)
532
+ .replace(extensionWithDot, "");
533
+ &nbsp;
534
+ <span class="cstat-no" title="statement not covered" > key = featureRelativePath.replace(/\\/g, "/");</span>
535
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
536
+ type === "feature" &amp;&amp;
537
+ absolutePath.startsWith(projectConfig.featuresDirectoryPath + path.sep)
538
+ ) {
539
+ <span class="cstat-no" title="statement not covered" > key = absolutePath</span>
540
+ .replace(projectConfig.featuresDirectoryPath + path.sep, "")
541
+ .replace(extensionWithDot, "")
542
+ .replace(/\\/g, "/");
543
+ }
442
544
  &nbsp;
443
545
  const entityDiff: EntityDiff = <span class="cstat-no" title="statement not covered" >{</span>
444
546
  type,
@@ -466,7 +568,7 @@ export function <span class="fstat-no" title="function not covered" >getCommit(<
466
568
  <div class='footer quiet pad2 space-top1 center small'>
467
569
  Code coverage generated by
468
570
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
469
- at 2026-02-24T19:50:30.107Z
571
+ at 2026-02-25T22:03:15.189Z
470
572
  </div>
471
573
  <script src="../prettify.js"></script>
472
574
  <script>