@featurevisor/core 2.17.0 → 2.18.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 (73) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/coverage/clover.xml +798 -764
  3. package/coverage/coverage-final.json +5 -5
  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 +18 -18
  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 +1 -1
  14. package/coverage/lcov-report/config/index.ts.html +1 -1
  15. package/coverage/lcov-report/config/projectConfig.ts.html +1 -1
  16. package/coverage/lcov-report/datasource/adapter.ts.html +1 -1
  17. package/coverage/lcov-report/datasource/datasource.ts.html +1 -1
  18. package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +1 -1
  19. package/coverage/lcov-report/datasource/index.html +1 -1
  20. package/coverage/lcov-report/datasource/index.ts.html +1 -1
  21. package/coverage/lcov-report/index.html +18 -18
  22. package/coverage/lcov-report/linter/attributeSchema.ts.html +1 -1
  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 +365 -188
  27. package/coverage/lcov-report/linter/groupSchema.ts.html +1 -1
  28. package/coverage/lcov-report/linter/index.html +34 -34
  29. package/coverage/lcov-report/linter/lintProject.ts.html +1 -1
  30. package/coverage/lcov-report/linter/mutationNotation.ts.html +99 -66
  31. package/coverage/lcov-report/linter/printError.ts.html +1 -1
  32. package/coverage/lcov-report/linter/schema.ts.html +170 -80
  33. package/coverage/lcov-report/linter/segmentSchema.ts.html +1 -1
  34. package/coverage/lcov-report/linter/testSchema.ts.html +1 -1
  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 +1 -1
  39. package/coverage/lcov-report/parsers/json.ts.html +1 -1
  40. package/coverage/lcov-report/parsers/yml.ts.html +1 -1
  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 +1 -1
  45. package/coverage/lcov-report/utils/index.html +1 -1
  46. package/coverage/lcov.info +1653 -1567
  47. package/json-schema/attribute.json +25 -9
  48. package/json-schema/feature.json +319 -238
  49. package/json-schema/segment.json +76 -45
  50. package/lib/generate-code/typescript.js +63 -20
  51. package/lib/generate-code/typescript.js.map +1 -1
  52. package/lib/linter/featureSchema.d.ts +9 -0
  53. package/lib/linter/featureSchema.js +38 -8
  54. package/lib/linter/featureSchema.js.map +1 -1
  55. package/lib/linter/featureSchema.spec.js +93 -0
  56. package/lib/linter/featureSchema.spec.js.map +1 -1
  57. package/lib/linter/mutationNotation.js +21 -11
  58. package/lib/linter/mutationNotation.js.map +1 -1
  59. package/lib/linter/mutationNotation.spec.js +18 -0
  60. package/lib/linter/mutationNotation.spec.js.map +1 -1
  61. package/lib/linter/schema.d.ts +1 -0
  62. package/lib/linter/schema.js +13 -0
  63. package/lib/linter/schema.js.map +1 -1
  64. package/lib/linter/schema.spec.js +51 -0
  65. package/lib/linter/schema.spec.js.map +1 -1
  66. package/package.json +5 -5
  67. package/src/generate-code/typescript.ts +87 -20
  68. package/src/linter/featureSchema.spec.ts +118 -0
  69. package/src/linter/featureSchema.ts +65 -6
  70. package/src/linter/mutationNotation.spec.ts +23 -0
  71. package/src/linter/mutationNotation.ts +18 -7
  72. package/src/linter/schema.spec.ts +72 -0
  73. package/src/linter/schema.ts +30 -0
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">86.01% </span>
26
+ <span class="strong">86.56% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>166/193</span>
28
+ <span class='fraction'>174/201</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">85.39% </span>
33
+ <span class="strong">86.31% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>152/178</span>
35
+ <span class='fraction'>164/190</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.22% </span>
47
+ <span class="strong">90.65% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>157/174</span>
49
+ <span class='fraction'>165/182</span>
50
50
  </div>
51
51
 
52
52
 
@@ -525,14 +525,44 @@
525
525
  <a name='L460'></a><a href='#L460'>460</a>
526
526
  <a name='L461'></a><a href='#L461'>461</a>
527
527
  <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
529
559
  <span class="cline-any cline-yes">3x</span>
530
560
  <span class="cline-any cline-neutral">&nbsp;</span>
531
561
  <span class="cline-any cline-neutral">&nbsp;</span>
532
562
  <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">57x</span>
563
+ <span class="cline-any cline-yes">59x</span>
534
564
  <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-yes">43x</span>
565
+ <span class="cline-any cline-yes">45x</span>
536
566
  <span class="cline-any cline-neutral">&nbsp;</span>
537
567
  <span class="cline-any cline-yes">3x</span>
538
568
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -569,19 +599,20 @@
569
599
  <span class="cline-any cline-neutral">&nbsp;</span>
570
600
  <span class="cline-any cline-neutral">&nbsp;</span>
571
601
  <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
603
  <span class="cline-any cline-yes">3x</span>
573
604
  <span class="cline-any cline-neutral">&nbsp;</span>
574
605
  <span class="cline-any cline-neutral">&nbsp;</span>
575
606
  <span class="cline-any cline-neutral">&nbsp;</span>
576
607
  <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-yes">496x</span>
578
- <span class="cline-any cline-yes">495x</span>
579
- <span class="cline-any cline-yes">495x</span>
580
- <span class="cline-any cline-yes">495x</span>
581
- <span class="cline-any cline-yes">21x</span>
582
- <span class="cline-any cline-yes">57x</span>
583
- <span class="cline-any cline-yes">57x</span>
584
- <span class="cline-any cline-yes">7x</span>
608
+ <span class="cline-any cline-yes">513x</span>
609
+ <span class="cline-any cline-yes">512x</span>
610
+ <span class="cline-any cline-yes">512x</span>
611
+ <span class="cline-any cline-yes">512x</span>
612
+ <span class="cline-any cline-yes">22x</span>
613
+ <span class="cline-any cline-yes">59x</span>
614
+ <span class="cline-any cline-yes">59x</span>
615
+ <span class="cline-any cline-yes">8x</span>
585
616
  <span class="cline-any cline-neutral">&nbsp;</span>
586
617
  <span class="cline-any cline-neutral">&nbsp;</span>
587
618
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -589,10 +620,10 @@
589
620
  <span class="cline-any cline-neutral">&nbsp;</span>
590
621
  <span class="cline-any cline-neutral">&nbsp;</span>
591
622
  <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-yes">495x</span>
623
+ <span class="cline-any cline-yes">512x</span>
593
624
  <span class="cline-any cline-yes">24x</span>
594
625
  <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-yes">495x</span>
626
+ <span class="cline-any cline-yes">512x</span>
596
627
  <span class="cline-any cline-yes">63x</span>
597
628
  <span class="cline-any cline-yes">125x</span>
598
629
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -601,7 +632,14 @@
601
632
  <span class="cline-any cline-neutral">&nbsp;</span>
602
633
  <span class="cline-any cline-neutral">&nbsp;</span>
603
634
  <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">495x</span>
635
+ <span class="cline-any cline-yes">512x</span>
636
+ <span class="cline-any cline-yes">2x</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-yes">512x</span>
605
643
  <span class="cline-any cline-yes">7x</span>
606
644
  <span class="cline-any cline-yes">13x</span>
607
645
  <span class="cline-any cline-yes">13x</span>
@@ -619,19 +657,19 @@
619
657
  <span class="cline-any cline-neutral">&nbsp;</span>
620
658
  <span class="cline-any cline-neutral">&nbsp;</span>
621
659
  <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">883x</span>
623
- <span class="cline-any cline-yes">883x</span>
624
- <span class="cline-any cline-yes">883x</span>
625
- <span class="cline-any cline-yes">883x</span>
626
- <span class="cline-any cline-yes">883x</span>
627
- <span class="cline-any cline-yes">883x</span>
628
- <span class="cline-any cline-yes">5x</span>
660
+ <span class="cline-any cline-yes">921x</span>
661
+ <span class="cline-any cline-yes">921x</span>
662
+ <span class="cline-any cline-yes">921x</span>
663
+ <span class="cline-any cline-yes">921x</span>
664
+ <span class="cline-any cline-yes">921x</span>
665
+ <span class="cline-any cline-yes">921x</span>
666
+ <span class="cline-any cline-yes">6x</span>
629
667
  <span class="cline-any cline-neutral">&nbsp;</span>
630
668
  <span class="cline-any cline-neutral">&nbsp;</span>
631
669
  <span class="cline-any cline-neutral">&nbsp;</span>
632
670
  <span class="cline-any cline-neutral">&nbsp;</span>
633
671
  <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">883x</span>
672
+ <span class="cline-any cline-yes">921x</span>
635
673
  <span class="cline-any cline-yes">3x</span>
636
674
  <span class="cline-any cline-yes">3x</span>
637
675
  <span class="cline-any cline-yes">1x</span>
@@ -641,7 +679,7 @@
641
679
  <span class="cline-any cline-neutral">&nbsp;</span>
642
680
  <span class="cline-any cline-neutral">&nbsp;</span>
643
681
  <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-yes">883x</span>
682
+ <span class="cline-any cline-yes">921x</span>
645
683
  <span class="cline-any cline-yes">3x</span>
646
684
  <span class="cline-any cline-yes">3x</span>
647
685
  <span class="cline-any cline-yes">1x</span>
@@ -651,7 +689,7 @@
651
689
  <span class="cline-any cline-neutral">&nbsp;</span>
652
690
  <span class="cline-any cline-neutral">&nbsp;</span>
653
691
  <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-yes">883x</span>
692
+ <span class="cline-any cline-yes">921x</span>
655
693
  <span class="cline-any cline-yes">1x</span>
656
694
  <span class="cline-any cline-yes">3x</span>
657
695
  <span class="cline-any cline-yes">3x</span>
@@ -672,19 +710,26 @@
672
710
  <span class="cline-any cline-neutral">&nbsp;</span>
673
711
  <span class="cline-any cline-neutral">&nbsp;</span>
674
712
  <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-yes">883x</span>
713
+ <span class="cline-any cline-yes">921x</span>
676
714
  <span class="cline-any cline-yes">60x</span>
677
715
  <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-yes">883x</span>
679
- <span class="cline-any cline-yes">138x</span>
680
- <span class="cline-any cline-yes">266x</span>
716
+ <span class="cline-any cline-yes">921x</span>
717
+ <span class="cline-any cline-yes">140x</span>
718
+ <span class="cline-any cline-yes">268x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
722
  <span class="cline-any cline-neutral">&nbsp;</span>
682
723
  <span class="cline-any cline-neutral">&nbsp;</span>
683
724
  <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-yes">921x</span>
726
+ <span class="cline-any cline-yes">11x</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
729
  <span class="cline-any cline-neutral">&nbsp;</span>
685
730
  <span class="cline-any cline-neutral">&nbsp;</span>
686
731
  <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-yes">883x</span>
732
+ <span class="cline-any cline-yes">921x</span>
688
733
  <span class="cline-any cline-yes">12x</span>
689
734
  <span class="cline-any cline-yes">23x</span>
690
735
  <span class="cline-any cline-yes">23x</span>
@@ -702,20 +747,20 @@
702
747
  <span class="cline-any cline-neutral">&nbsp;</span>
703
748
  <span class="cline-any cline-neutral">&nbsp;</span>
704
749
  <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-yes">884x</span>
706
- <span class="cline-any cline-yes">884x</span>
707
- <span class="cline-any cline-yes">884x</span>
708
- <span class="cline-any cline-yes">884x</span>
709
- <span class="cline-any cline-yes">884x</span>
710
- <span class="cline-any cline-yes">884x</span>
711
- <span class="cline-any cline-yes">884x</span>
712
- <span class="cline-any cline-yes">2x</span>
750
+ <span class="cline-any cline-yes">922x</span>
751
+ <span class="cline-any cline-yes">922x</span>
752
+ <span class="cline-any cline-yes">922x</span>
753
+ <span class="cline-any cline-yes">922x</span>
754
+ <span class="cline-any cline-yes">922x</span>
755
+ <span class="cline-any cline-yes">922x</span>
756
+ <span class="cline-any cline-yes">922x</span>
757
+ <span class="cline-any cline-yes">3x</span>
713
758
  <span class="cline-any cline-neutral">&nbsp;</span>
714
759
  <span class="cline-any cline-neutral">&nbsp;</span>
715
760
  <span class="cline-any cline-neutral">&nbsp;</span>
716
761
  <span class="cline-any cline-neutral">&nbsp;</span>
717
762
  <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-yes">884x</span>
763
+ <span class="cline-any cline-yes">922x</span>
719
764
  <span class="cline-any cline-yes">15x</span>
720
765
  <span class="cline-any cline-yes">15x</span>
721
766
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -726,7 +771,7 @@
726
771
  <span class="cline-any cline-neutral">&nbsp;</span>
727
772
  <span class="cline-any cline-neutral">&nbsp;</span>
728
773
  <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-yes">884x</span>
774
+ <span class="cline-any cline-yes">922x</span>
730
775
  <span class="cline-any cline-yes">62x</span>
731
776
  <span class="cline-any cline-yes">62x</span>
732
777
  <span class="cline-any cline-yes">62x</span>
@@ -739,7 +784,7 @@
739
784
  <span class="cline-any cline-neutral">&nbsp;</span>
740
785
  <span class="cline-any cline-yes">62x</span>
741
786
  <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-yes">884x</span>
787
+ <span class="cline-any cline-yes">922x</span>
743
788
  <span class="cline-any cline-yes">19x</span>
744
789
  <span class="cline-any cline-yes">19x</span>
745
790
  <span class="cline-any cline-yes">1x</span>
@@ -763,7 +808,7 @@
763
808
  <span class="cline-any cline-neutral">&nbsp;</span>
764
809
  <span class="cline-any cline-neutral">&nbsp;</span>
765
810
  <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-yes">884x</span>
811
+ <span class="cline-any cline-yes">922x</span>
767
812
  <span class="cline-any cline-yes">16x</span>
768
813
  <span class="cline-any cline-yes">45x</span>
769
814
  <span class="cline-any cline-yes">45x</span>
@@ -792,19 +837,26 @@
792
837
  <span class="cline-any cline-neutral">&nbsp;</span>
793
838
  <span class="cline-any cline-neutral">&nbsp;</span>
794
839
  <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-yes">884x</span>
840
+ <span class="cline-any cline-yes">922x</span>
796
841
  <span class="cline-any cline-yes">59x</span>
797
842
  <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-yes">884x</span>
799
- <span class="cline-any cline-yes">139x</span>
800
- <span class="cline-any cline-yes">267x</span>
843
+ <span class="cline-any cline-yes">922x</span>
844
+ <span class="cline-any cline-yes">141x</span>
845
+ <span class="cline-any cline-yes">269x</span>
801
846
  <span class="cline-any cline-neutral">&nbsp;</span>
802
847
  <span class="cline-any cline-neutral">&nbsp;</span>
803
848
  <span class="cline-any cline-neutral">&nbsp;</span>
804
849
  <span class="cline-any cline-neutral">&nbsp;</span>
805
850
  <span class="cline-any cline-neutral">&nbsp;</span>
806
851
  <span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-yes">884x</span>
852
+ <span class="cline-any cline-yes">922x</span>
853
+ <span class="cline-any cline-yes">11x</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-yes">922x</span>
808
860
  <span class="cline-any cline-yes">12x</span>
809
861
  <span class="cline-any cline-yes">23x</span>
810
862
  <span class="cline-any cline-yes">23x</span>
@@ -843,20 +895,20 @@
843
895
  <span class="cline-any cline-neutral">&nbsp;</span>
844
896
  <span class="cline-any cline-neutral">&nbsp;</span>
845
897
  <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-yes">882x</span>
847
- <span class="cline-any cline-yes">882x</span>
848
- <span class="cline-any cline-yes">882x</span>
849
- <span class="cline-any cline-yes">882x</span>
850
- <span class="cline-any cline-yes">882x</span>
851
- <span class="cline-any cline-yes">882x</span>
852
- <span class="cline-any cline-yes">882x</span>
853
- <span class="cline-any cline-yes">3x</span>
898
+ <span class="cline-any cline-yes">921x</span>
899
+ <span class="cline-any cline-yes">921x</span>
900
+ <span class="cline-any cline-yes">921x</span>
901
+ <span class="cline-any cline-yes">921x</span>
902
+ <span class="cline-any cline-yes">921x</span>
903
+ <span class="cline-any cline-yes">921x</span>
904
+ <span class="cline-any cline-yes">921x</span>
905
+ <span class="cline-any cline-yes">4x</span>
854
906
  <span class="cline-any cline-neutral">&nbsp;</span>
855
907
  <span class="cline-any cline-neutral">&nbsp;</span>
856
908
  <span class="cline-any cline-neutral">&nbsp;</span>
857
909
  <span class="cline-any cline-neutral">&nbsp;</span>
858
910
  <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-yes">882x</span>
911
+ <span class="cline-any cline-yes">921x</span>
860
912
  <span class="cline-any cline-yes">6x</span>
861
913
  <span class="cline-any cline-yes">1x</span>
862
914
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -886,24 +938,31 @@
886
938
  <span class="cline-any cline-neutral">&nbsp;</span>
887
939
  <span class="cline-any cline-neutral">&nbsp;</span>
888
940
  <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-yes">882x</span>
941
+ <span class="cline-any cline-yes">921x</span>
890
942
  <span class="cline-any cline-yes">3x</span>
891
943
  <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-yes">882x</span>
944
+ <span class="cline-any cline-yes">921x</span>
893
945
  <span class="cline-any cline-yes">1x</span>
894
946
  <span class="cline-any cline-yes">3x</span>
895
947
  <span class="cline-any cline-yes">3x</span>
896
948
  <span class="cline-any cline-neutral">&nbsp;</span>
897
949
  <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-yes">882x</span>
899
- <span class="cline-any cline-yes">60x</span>
950
+ <span class="cline-any cline-yes">921x</span>
951
+ <span class="cline-any cline-yes">61x</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-yes">921x</span>
954
+ <span class="cline-any cline-yes">140x</span>
955
+ <span class="cline-any cline-yes">268x</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-yes">921x</span>
959
+ <span class="cline-any cline-yes">11x</span>
900
960
  <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-yes">882x</span>
902
- <span class="cline-any cline-yes">138x</span>
903
- <span class="cline-any cline-yes">266x</span>
904
961
  <span class="cline-any cline-neutral">&nbsp;</span>
905
962
  <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-yes">882x</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-yes">921x</span>
907
966
  <span class="cline-any cline-yes">12x</span>
908
967
  <span class="cline-any cline-yes">23x</span>
909
968
  <span class="cline-any cline-yes">23x</span>
@@ -914,7 +973,7 @@
914
973
  <span class="cline-any cline-neutral">&nbsp;</span>
915
974
  <span class="cline-any cline-neutral">&nbsp;</span>
916
975
  <span class="cline-any cline-yes">3x</span>
917
- <span class="cline-any cline-yes">2456x</span>
976
+ <span class="cline-any cline-yes">2560x</span>
918
977
  <span class="cline-any cline-neutral">&nbsp;</span>
919
978
  <span class="cline-any cline-neutral">&nbsp;</span>
920
979
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -937,8 +996,9 @@
937
996
  <span class="cline-any cline-neutral">&nbsp;</span>
938
997
  <span class="cline-any cline-neutral">&nbsp;</span>
939
998
  <span class="cline-any cline-yes">3x</span>
940
- <span class="cline-any cline-yes">103x</span>
941
- <span class="cline-any cline-yes">320x</span>
999
+ <span class="cline-any cline-yes">111x</span>
1000
+ <span class="cline-any cline-yes">334x</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
1002
  <span class="cline-any cline-neutral">&nbsp;</span>
943
1003
  <span class="cline-any cline-neutral">&nbsp;</span>
944
1004
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -960,7 +1020,7 @@
960
1020
  <span class="cline-any cline-neutral">&nbsp;</span>
961
1021
  <span class="cline-any cline-neutral">&nbsp;</span>
962
1022
  <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-yes">29x</span>
1023
+ <span class="cline-any cline-yes">33x</span>
964
1024
  <span class="cline-any cline-yes">2x</span>
965
1025
  <span class="cline-any cline-neutral">&nbsp;</span>
966
1026
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -970,7 +1030,7 @@
970
1030
  <span class="cline-any cline-neutral">&nbsp;</span>
971
1031
  <span class="cline-any cline-neutral">&nbsp;</span>
972
1032
  <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-yes">320x</span>
1033
+ <span class="cline-any cline-yes">334x</span>
974
1034
  <span class="cline-any cline-yes">2x</span>
975
1035
  <span class="cline-any cline-neutral">&nbsp;</span>
976
1036
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -979,13 +1039,13 @@
979
1039
  <span class="cline-any cline-neutral">&nbsp;</span>
980
1040
  <span class="cline-any cline-neutral">&nbsp;</span>
981
1041
  <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-yes">320x</span>
983
- <span class="cline-any cline-yes">320x</span>
984
- <span class="cline-any cline-yes">320x</span>
985
- <span class="cline-any cline-yes">320x</span>
1042
+ <span class="cline-any cline-yes">334x</span>
1043
+ <span class="cline-any cline-yes">334x</span>
1044
+ <span class="cline-any cline-yes">334x</span>
1045
+ <span class="cline-any cline-yes">334x</span>
986
1046
  <span class="cline-any cline-neutral">&nbsp;</span>
987
1047
  <span class="cline-any cline-neutral">&nbsp;</span>
988
- <span class="cline-any cline-yes">103x</span>
1048
+ <span class="cline-any cline-yes">111x</span>
989
1049
  <span class="cline-any cline-neutral">&nbsp;</span>
990
1050
  <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
1051
  import { z } from "zod";
@@ -1024,6 +1084,7 @@ type SchemaLike = {
1024
1084
  uniqueItems?: boolean;
1025
1085
  items?: unknown;
1026
1086
  properties?: Record&lt;string, unknown&gt;;
1087
+ additionalProperties?: unknown;
1027
1088
  oneOf?: unknown[];
1028
1089
  };
1029
1090
  &nbsp;
@@ -1063,6 +1124,13 @@ export function refineEnumMatchesType(
1063
1124
  );
1064
1125
  }
1065
1126
  }
1127
+ if (schema.additionalProperties &amp;&amp; typeof schema.additionalProperties === "object") {
1128
+ refineEnumMatchesType(
1129
+ schema.additionalProperties as SchemaLike,
1130
+ [...pathPrefix, "additionalProperties"],
1131
+ ctx,
1132
+ );
1133
+ }
1066
1134
  if (schema.oneOf &amp;&amp; Array.isArray(schema.oneOf)) {
1067
1135
  schema.oneOf.forEach((branch, i) =&gt; {
1068
1136
  if (branch &amp;&amp; typeof branch === "object") {
@@ -1146,6 +1214,13 @@ export function refineMinimumMaximum(
1146
1214
  );
1147
1215
  }
1148
1216
  }
1217
+ if (schema.additionalProperties &amp;&amp; typeof schema.additionalProperties === "object") {
1218
+ refineMinimumMaximum(
1219
+ schema.additionalProperties as SchemaLike,
1220
+ [...pathPrefix, "additionalProperties"],
1221
+ ctx,
1222
+ );
1223
+ }
1149
1224
  if (schema.oneOf &amp;&amp; Array.isArray(schema.oneOf)) {
1150
1225
  schema.oneOf.forEach((branch, i) =&gt; {
1151
1226
  if (branch &amp;&amp; typeof branch === "object") {
@@ -1266,6 +1341,13 @@ export function refineStringLengthPattern(
1266
1341
  );
1267
1342
  }
1268
1343
  }
1344
+ if (schema.additionalProperties &amp;&amp; typeof schema.additionalProperties === "object") {
1345
+ refineStringLengthPattern(
1346
+ schema.additionalProperties as SchemaLike,
1347
+ [...pathPrefix, "additionalProperties"],
1348
+ ctx,
1349
+ );
1350
+ }
1269
1351
  if (schema.oneOf &amp;&amp; Array.isArray(schema.oneOf)) {
1270
1352
  schema.oneOf.forEach((branch, i) =&gt; {
1271
1353
  if (branch &amp;&amp; typeof branch === "object") {
@@ -1365,6 +1447,13 @@ export function refineArrayItems(
1365
1447
  refineArrayItems(schema.properties[k] as SchemaLike, [...pathPrefix, "properties", k], ctx);
1366
1448
  }
1367
1449
  }
1450
+ if (schema.additionalProperties &amp;&amp; typeof schema.additionalProperties === "object") {
1451
+ refineArrayItems(
1452
+ schema.additionalProperties as SchemaLike,
1453
+ [...pathPrefix, "additionalProperties"],
1454
+ ctx,
1455
+ );
1456
+ }
1368
1457
  if (schema.oneOf &amp;&amp; Array.isArray(schema.oneOf)) {
1369
1458
  schema.oneOf.forEach((branch, i) =&gt; {
1370
1459
  if (branch &amp;&amp; typeof branch === "object") {
@@ -1417,6 +1506,7 @@ export function getSchemaZodSchema(schemaKeys: SchemaKey[] = <span class="branch
1417
1506
  uniqueItems: z.boolean().optional(),
1418
1507
  required: z.array(z.string()).optional(),
1419
1508
  properties: z.record(z.string(), schemaZodSchema).optional(),
1509
+ additionalProperties: schemaZodSchema.optional(),
1420
1510
  // Annotations: default?: Value; examples?: Value[];
1421
1511
  &nbsp;
1422
1512
  schema: z
@@ -1456,7 +1546,7 @@ export function getSchemaZodSchema(schemaKeys: SchemaKey[] = <span class="branch
1456
1546
  <div class='footer quiet pad2 space-top1 center small'>
1457
1547
  Code coverage generated by
1458
1548
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1459
- at 2026-02-27T17:47:18.936Z
1549
+ at 2026-02-27T20:35:38.828Z
1460
1550
  </div>
1461
1551
  <script src="../prettify.js"></script>
1462
1552
  <script>
@@ -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-27T17:47:18.936Z
118
+ at 2026-02-27T20:35:38.828Z
119
119
  </div>
120
120
  <script src="../prettify.js"></script>
121
121
  <script>
@@ -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-27T17:47:18.936Z
538
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
104
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
724
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
134
+ at 2026-02-27T20:35:38.828Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -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-27T17:47:18.936Z
139
+ at 2026-02-27T20:35:38.828Z
140
140
  </div>
141
141
  <script src="../prettify.js"></script>
142
142
  <script>
@@ -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-27T17:47:18.936Z
106
+ at 2026-02-27T20:35:38.828Z
107
107
  </div>
108
108
  <script src="../prettify.js"></script>
109
109
  <script>
@@ -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-27T17:47:18.936Z
577
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
91
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
301
+ at 2026-02-27T20:35:38.828Z
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-27T17:47:18.936Z
119
+ at 2026-02-27T20:35:38.828Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>