@featurevisor/core 2.12.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/coverage/clover.xml +1663 -596
- package/coverage/coverage-final.json +24 -6
- package/coverage/lcov-report/builder/allocator.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
- package/coverage/lcov-report/builder/index.html +38 -8
- package/coverage/lcov-report/builder/mutateVariables.ts.html +400 -0
- package/coverage/lcov-report/builder/mutator.ts.html +796 -0
- package/coverage/lcov-report/builder/revision.ts.html +1 -1
- package/coverage/lcov-report/builder/traffic.ts.html +1 -1
- package/coverage/lcov-report/config/index.html +116 -0
- package/coverage/lcov-report/config/projectConfig.ts.html +676 -0
- package/coverage/lcov-report/datasource/adapter.ts.html +235 -0
- package/coverage/lcov-report/datasource/datasource.ts.html +862 -0
- package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +1354 -0
- package/coverage/lcov-report/datasource/index.html +161 -0
- package/coverage/lcov-report/datasource/index.ts.html +94 -0
- package/coverage/lcov-report/index.html +83 -38
- package/coverage/lcov-report/linter/attributeSchema.ts.html +175 -0
- package/coverage/lcov-report/linter/checkCircularDependency.ts.html +220 -0
- package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +268 -0
- package/coverage/lcov-report/linter/conditionSchema.ts.html +38 -38
- package/coverage/lcov-report/linter/featureSchema.ts.html +956 -485
- package/coverage/lcov-report/linter/groupSchema.ts.html +226 -0
- package/coverage/lcov-report/linter/index.html +139 -19
- package/coverage/lcov-report/linter/lintProject.ts.html +1840 -0
- package/coverage/lcov-report/linter/mutationNotation.ts.html +1309 -0
- package/coverage/lcov-report/linter/printError.ts.html +238 -0
- package/coverage/lcov-report/linter/schema.ts.html +116 -116
- package/coverage/lcov-report/linter/segmentSchema.ts.html +5 -5
- package/coverage/lcov-report/linter/testSchema.ts.html +550 -0
- package/coverage/lcov-report/list/index.html +1 -1
- package/coverage/lcov-report/list/matrix.ts.html +1 -1
- package/coverage/lcov-report/parsers/index.html +20 -5
- package/coverage/lcov-report/parsers/index.ts.html +151 -0
- package/coverage/lcov-report/parsers/json.ts.html +2 -2
- package/coverage/lcov-report/parsers/yml.ts.html +6 -6
- package/coverage/lcov-report/tester/cliFormat.ts.html +103 -0
- package/coverage/lcov-report/tester/helpers.ts.html +1 -1
- package/coverage/lcov-report/tester/index.html +20 -5
- package/coverage/lcov-report/utils/git.ts.html +481 -0
- package/coverage/lcov-report/utils/index.html +116 -0
- package/coverage/lcov.info +3253 -1214
- package/lib/builder/buildDatafile.js +8 -3
- package/lib/builder/buildDatafile.js.map +1 -1
- package/lib/builder/mutateVariables.d.ts +14 -0
- package/lib/builder/mutateVariables.js +90 -0
- package/lib/builder/mutateVariables.js.map +1 -0
- package/lib/builder/mutateVariables.spec.d.ts +1 -0
- package/lib/builder/mutateVariables.spec.js +1045 -0
- package/lib/builder/mutateVariables.spec.js.map +1 -0
- package/lib/builder/mutator.d.ts +20 -0
- package/lib/builder/mutator.js +223 -0
- package/lib/builder/mutator.js.map +1 -0
- package/lib/builder/mutator.spec.d.ts +1 -0
- package/lib/builder/mutator.spec.js +368 -0
- package/lib/builder/mutator.spec.js.map +1 -0
- package/lib/linter/featureSchema.d.ts +7 -7
- package/lib/linter/featureSchema.js +138 -62
- package/lib/linter/featureSchema.js.map +1 -1
- package/lib/linter/featureSchema.spec.js +150 -0
- package/lib/linter/featureSchema.spec.js.map +1 -1
- package/lib/linter/lintProject.d.ts +17 -1
- package/lib/linter/lintProject.js +191 -198
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/lintProject.spec.d.ts +1 -0
- package/lib/linter/lintProject.spec.js +86 -0
- package/lib/linter/lintProject.spec.js.map +1 -0
- package/lib/linter/mutationNotation.d.ts +47 -0
- package/lib/linter/mutationNotation.js +381 -0
- package/lib/linter/mutationNotation.js.map +1 -0
- package/lib/linter/mutationNotation.spec.d.ts +1 -0
- package/lib/linter/mutationNotation.spec.js +549 -0
- package/lib/linter/mutationNotation.spec.js.map +1 -0
- package/lib/linter/printError.d.ts +7 -0
- package/lib/linter/printError.js +30 -15
- package/lib/linter/printError.js.map +1 -1
- package/package.json +2 -2
- package/src/builder/buildDatafile.ts +29 -3
- package/src/builder/mutateVariables.spec.ts +1134 -0
- package/src/builder/mutateVariables.ts +105 -0
- package/src/builder/mutator.spec.ts +413 -0
- package/src/builder/mutator.ts +237 -0
- package/src/linter/featureSchema.spec.ts +182 -0
- package/src/linter/featureSchema.ts +254 -97
- package/src/linter/lintProject.spec.ts +115 -0
- package/src/linter/lintProject.ts +256 -254
- package/src/linter/mutationNotation.spec.ts +642 -0
- package/src/linter/mutationNotation.ts +408 -0
- package/src/linter/printError.ts +40 -16
|
@@ -0,0 +1,1309 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for linter/mutationNotation.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">linter</a> mutationNotation.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">88.96% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>129/145</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">78.62% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>103/131</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>8/8</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">95.96% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>119/124</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
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>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
476
|
+
<span class="cline-any cline-yes">3x</span>
|
|
477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
481
|
+
<span class="cline-any cline-yes">3x</span>
|
|
482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
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>
|
|
496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
503
|
+
<span class="cline-any cline-yes">3x</span>
|
|
504
|
+
<span class="cline-any cline-yes">160x</span>
|
|
505
|
+
<span class="cline-any cline-yes">160x</span>
|
|
506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
507
|
+
<span class="cline-any cline-yes">155x</span>
|
|
508
|
+
<span class="cline-any cline-yes">155x</span>
|
|
509
|
+
<span class="cline-any cline-yes">155x</span>
|
|
510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
511
|
+
<span class="cline-any cline-yes">155x</span>
|
|
512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
518
|
+
<span class="cline-any cline-yes">155x</span>
|
|
519
|
+
<span class="cline-any cline-yes">155x</span>
|
|
520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
530
|
+
<span class="cline-any cline-yes">701x</span>
|
|
531
|
+
<span class="cline-any cline-yes">699x</span>
|
|
532
|
+
<span class="cline-any cline-yes">84x</span>
|
|
533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
534
|
+
<span class="cline-any cline-yes">615x</span>
|
|
535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-yes">382x</span>
|
|
542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
551
|
+
<span class="cline-any cline-yes">3x</span>
|
|
552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
556
|
+
<span class="cline-any cline-yes">146x</span>
|
|
557
|
+
<span class="cline-any cline-yes">146x</span>
|
|
558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-yes">144x</span>
|
|
560
|
+
<span class="cline-any cline-yes">182x</span>
|
|
561
|
+
<span class="cline-any cline-yes">181x</span>
|
|
562
|
+
<span class="cline-any cline-yes">154x</span>
|
|
563
|
+
<span class="cline-any cline-yes">151x</span>
|
|
564
|
+
<span class="cline-any cline-yes">151x</span>
|
|
565
|
+
<span class="cline-any cline-yes">145x</span>
|
|
566
|
+
<span class="cline-any cline-yes">145x</span>
|
|
567
|
+
<span class="cline-any cline-yes">139x</span>
|
|
568
|
+
<span class="cline-any cline-yes">139x</span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-yes">166x</span>
|
|
571
|
+
<span class="cline-any cline-yes">29x</span>
|
|
572
|
+
<span class="cline-any cline-yes">28x</span>
|
|
573
|
+
<span class="cline-any cline-yes">28x</span>
|
|
574
|
+
<span class="cline-any cline-yes">28x</span>
|
|
575
|
+
<span class="cline-any cline-yes">28x</span>
|
|
576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
578
|
+
<span class="cline-any cline-yes">127x</span>
|
|
579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
591
|
+
<span class="cline-any cline-yes">96x</span>
|
|
592
|
+
<span class="cline-any cline-yes">10x</span>
|
|
593
|
+
<span class="cline-any cline-yes">10x</span>
|
|
594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
597
|
+
<span class="cline-any cline-yes">86x</span>
|
|
598
|
+
<span class="cline-any cline-yes">86x</span>
|
|
599
|
+
<span class="cline-any cline-yes">86x</span>
|
|
600
|
+
<span class="cline-any cline-yes">86x</span>
|
|
601
|
+
<span class="cline-any cline-yes">86x</span>
|
|
602
|
+
<span class="cline-any cline-yes">34x</span>
|
|
603
|
+
<span class="cline-any cline-yes">34x</span>
|
|
604
|
+
<span class="cline-any cline-yes">8x</span>
|
|
605
|
+
<span class="cline-any cline-yes">6x</span>
|
|
606
|
+
<span class="cline-any cline-yes">6x</span>
|
|
607
|
+
<span class="cline-any cline-yes">6x</span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-yes">26x</span>
|
|
610
|
+
<span class="cline-any cline-yes">26x</span>
|
|
611
|
+
<span class="cline-any cline-yes">26x</span>
|
|
612
|
+
<span class="cline-any cline-yes">26x</span>
|
|
613
|
+
<span class="cline-any cline-yes">26x</span>
|
|
614
|
+
<span class="cline-any cline-yes">26x</span>
|
|
615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-yes">32x</span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-yes">84x</span>
|
|
619
|
+
<span class="cline-any cline-yes">84x</span>
|
|
620
|
+
<span class="cline-any cline-yes">84x</span>
|
|
621
|
+
<span class="cline-any cline-yes">15x</span>
|
|
622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
623
|
+
<span class="cline-any cline-yes">69x</span>
|
|
624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
625
|
+
<span class="cline-any cline-yes">69x</span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
628
|
+
<span class="cline-any cline-yes">69x</span>
|
|
629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-yes">3x</span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-yes">101x</span>
|
|
651
|
+
<span class="cline-any cline-yes">101x</span>
|
|
652
|
+
<span class="cline-any cline-yes">1x</span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
661
|
+
<span class="cline-any cline-yes">100x</span>
|
|
662
|
+
<span class="cline-any cline-yes">100x</span>
|
|
663
|
+
<span class="cline-any cline-yes">1x</span>
|
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
672
|
+
<span class="cline-any cline-yes">99x</span>
|
|
673
|
+
<span class="cline-any cline-yes">99x</span>
|
|
674
|
+
<span class="cline-any cline-yes">2x</span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-yes">97x</span>
|
|
684
|
+
<span class="cline-any cline-yes">97x</span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-no"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-no"> </span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-yes">97x</span>
|
|
702
|
+
<span class="cline-any cline-yes">1x</span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-yes">96x</span>
|
|
713
|
+
<span class="cline-any cline-yes">96x</span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-yes">96x</span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-yes">13x</span>
|
|
719
|
+
<span class="cline-any cline-yes">1x</span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-yes">12x</span>
|
|
729
|
+
<span class="cline-any cline-yes">12x</span>
|
|
730
|
+
<span class="cline-any cline-yes">2x</span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
739
|
+
<span class="cline-any cline-yes">10x</span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-yes">10x</span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-yes">10x</span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-yes">17x</span>
|
|
765
|
+
<span class="cline-any cline-yes">1x</span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-yes">16x</span>
|
|
775
|
+
<span class="cline-any cline-yes">16x</span>
|
|
776
|
+
<span class="cline-any cline-yes">12x</span>
|
|
777
|
+
<span class="cline-any cline-yes">1x</span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-yes">11x</span>
|
|
787
|
+
<span class="cline-any cline-yes">7x</span>
|
|
788
|
+
<span class="cline-any cline-yes">7x</span>
|
|
789
|
+
<span class="cline-any cline-yes">1x</span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-yes">6x</span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-yes">6x</span>
|
|
803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
804
|
+
<span class="cline-any cline-yes">4x</span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-yes">4x</span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
816
|
+
<span class="cline-any cline-yes">4x</span>
|
|
817
|
+
<span class="cline-any cline-yes">4x</span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-yes">3x</span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-yes">1x</span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-yes">66x</span>
|
|
835
|
+
<span class="cline-any cline-yes">4x</span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
844
|
+
<span class="cline-any cline-yes">62x</span>
|
|
845
|
+
<span class="cline-any cline-yes">1x</span>
|
|
846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-yes">61x</span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
877
|
+
<span class="cline-any cline-yes">3x</span>
|
|
878
|
+
<span class="cline-any cline-yes">43x</span>
|
|
879
|
+
<span class="cline-any cline-yes">43x</span>
|
|
880
|
+
<span class="cline-any cline-yes">41x</span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { Schema } from "@featurevisor/types";
|
|
883
|
+
|
|
884
|
+
import { parseNotation, type MutationOperation, type PathPart } from "../builder/mutator";
|
|
885
|
+
|
|
886
|
+
export type { MutationOperation, PathPart };
|
|
887
|
+
export type PathSegment = PathPart;
|
|
888
|
+
|
|
889
|
+
const OPERATION_SUFFIX = /:((?:append|prepend|after|before|remove))$/;
|
|
890
|
+
|
|
891
|
+
export interface ParsedMutationKey {
|
|
892
|
+
rootKey: string;
|
|
893
|
+
pathSegments: PathSegment[];
|
|
894
|
+
allSegments: PathSegment[];
|
|
895
|
+
operation: MutationOperation;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Returns true if the key looks like mutation notation (contains path or operation).
|
|
900
|
+
*/
|
|
901
|
+
export function isMutationKey(key: string): boolean {
|
|
902
|
+
const k = key.trim();
|
|
903
|
+
return k.includes(".") || k.includes("[") || OPERATION_SUFFIX.test(k);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/**
|
|
907
|
+
* Parse a full variable key (e.g. "config.width", "items[1].name", "tags:append")
|
|
908
|
+
* into root variable name, path segments within the variable, and operation.
|
|
909
|
+
* Uses the shared parseNotation from the mutator.
|
|
910
|
+
*/
|
|
911
|
+
export function parseMutationKey(key: string): ParsedMutationKey | null {
|
|
912
|
+
const rest = key.trim();
|
|
913
|
+
if (!rest) return null;
|
|
914
|
+
|
|
915
|
+
const { segments, operation } = parseNotation(rest);
|
|
916
|
+
const rootKey = segments.length > 0 && "key" in segments[0] ? segments[0].key : <span class="branch-1 cbranch-no" title="branch not covered" >"";</span>
|
|
917
|
+
const first = segments[0];
|
|
918
|
+
const firstPathPart: PathSegment[] =
|
|
919
|
+
first && ("index" in first || "selector" in first)
|
|
920
|
+
? [
|
|
921
|
+
"index" in first
|
|
922
|
+
? { key: "", index: first.index }
|
|
923
|
+
: { key: "", selector: first.selector! },
|
|
924
|
+
]
|
|
925
|
+
: [];
|
|
926
|
+
const pathWithinVariable = firstPathPart.concat(segments.slice(1));
|
|
927
|
+
return { rootKey, pathSegments: pathWithinVariable, allSegments: segments, operation };
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
/**
|
|
931
|
+
* Resolve a schema reference (schema.schema -> schemasByKey[name]).
|
|
932
|
+
* Follows one level of reference; the resolved schema may itself have oneOf or another ref.
|
|
933
|
+
*/
|
|
934
|
+
function resolveSchemaRef(
|
|
935
|
+
schema: Schema | null,
|
|
936
|
+
schemasByKey: Record<string, Schema> | undefined,
|
|
937
|
+
): Schema | null {
|
|
938
|
+
if (!schema || typeof schema !== "object") return null;
|
|
939
|
+
if (schema.schema && schemasByKey?.[schema.schema]) {
|
|
940
|
+
return resolveSchemaRef(schemasByKey[schema.schema], schemasByKey);
|
|
941
|
+
}
|
|
942
|
+
return schema;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
/**
|
|
946
|
+
* Return true if the schema is a oneOf (multiple possible shapes); path resolution cannot descend through oneOf.
|
|
947
|
+
*/
|
|
948
|
+
function isOneOfSchema(schema: Schema): boolean {
|
|
949
|
+
return Array.isArray(schema.oneOf) && schema.oneOf.length > 0;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* Resolve the schema at a path within a variable schema.
|
|
954
|
+
* pathSegments are the path *within* the variable (e.g. for variable "config", path [ {key:"width"} ];
|
|
955
|
+
* for variable "items", path [ {index:0}, {key:"name"} ]).
|
|
956
|
+
* Returns the schema at that path, or null if the path is invalid.
|
|
957
|
+
* Does not descend through oneOf (path through oneOf is considered invalid for mutation targets).
|
|
958
|
+
*/
|
|
959
|
+
export function resolveSchemaAtPath(
|
|
960
|
+
variableSchema: Schema | null,
|
|
961
|
+
pathSegments: PathSegment[],
|
|
962
|
+
schemasByKey?: Record<string, Schema>,
|
|
963
|
+
): Schema | null {
|
|
964
|
+
let current: Schema | null = resolveSchemaRef(variableSchema, schemasByKey);
|
|
965
|
+
if (!current) return null;
|
|
966
|
+
|
|
967
|
+
for (const seg of pathSegments) {
|
|
968
|
+
if (isOneOfSchema(current)) return null;
|
|
969
|
+
if (seg.key) {
|
|
970
|
+
if (current.type !== "object") return null;
|
|
971
|
+
const props = current.properties;
|
|
972
|
+
if (!props || typeof props !== "object") return null;
|
|
973
|
+
const next = props[seg.key];
|
|
974
|
+
if (next === undefined) return null;
|
|
975
|
+
current = resolveSchemaRef(next, schemasByKey);
|
|
976
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!current) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
977
|
+
}
|
|
978
|
+
if ("index" in seg || "selector" in seg) {
|
|
979
|
+
if (current.type !== "array") return null;
|
|
980
|
+
const itemSchema = current.items;
|
|
981
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!itemSchema || typeof itemSchema !== "object") <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
982
|
+
current = resolveSchemaRef(itemSchema, schemasByKey);
|
|
983
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!current) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return current;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
/**
|
|
990
|
+
* Return the schema of the container at the end of path (object or array) and the last segment.
|
|
991
|
+
* Used to check if we can do append/prepend (must be array) or remove (object key or array element).
|
|
992
|
+
* Does not descend through oneOf.
|
|
993
|
+
*/
|
|
994
|
+
function getContainerSchemaAtPath(
|
|
995
|
+
variableSchema: Schema | null,
|
|
996
|
+
pathSegments: PathSegment[],
|
|
997
|
+
schemasByKey?: Record<string, Schema>,
|
|
998
|
+
): { containerSchema: Schema; lastSegment: PathSegment; parentSchema: Schema } | null {
|
|
999
|
+
if (pathSegments.length === 0) {
|
|
1000
|
+
const resolved = variableSchema ? resolveSchemaRef(variableSchema, schemasByKey) : <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1001
|
+
return resolved
|
|
1002
|
+
? { containerSchema: resolved, lastSegment: { key: "" }, parentSchema: resolved }
|
|
1003
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1004
|
+
}
|
|
1005
|
+
let current: Schema | null = resolveSchemaRef(variableSchema, schemasByKey);
|
|
1006
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!current) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1007
|
+
const pathWithoutLast = pathSegments.slice(0, -1);
|
|
1008
|
+
const lastSegment = pathSegments[pathSegments.length - 1];
|
|
1009
|
+
for (const seg of pathWithoutLast) {
|
|
1010
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (isOneOfSchema(current)) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1011
|
+
if ("index" in seg || "selector" in seg) {
|
|
1012
|
+
if (current.type !== "array") return null;
|
|
1013
|
+
const itemSchema = current.items;
|
|
1014
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!itemSchema || typeof itemSchema !== "object") <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1015
|
+
current = resolveSchemaRef(itemSchema, schemasByKey);
|
|
1016
|
+
} else {
|
|
1017
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (current.type !== "object") <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1018
|
+
const props = current.properties;
|
|
1019
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!props || typeof props !== "object") <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1020
|
+
const next = props[seg.key];
|
|
1021
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (next === undefined) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1022
|
+
current = resolveSchemaRef(next, schemasByKey);
|
|
1023
|
+
}
|
|
1024
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!current) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1025
|
+
}
|
|
1026
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!current) <span class="cstat-no" title="statement not covered" >return null;</span>
|
|
1027
|
+
const parentSchema = current;
|
|
1028
|
+
if ("index" in lastSegment || "selector" in lastSegment) {
|
|
1029
|
+
return { containerSchema: parentSchema, lastSegment, parentSchema };
|
|
1030
|
+
}
|
|
1031
|
+
const propSchema = parentSchema.properties?.[lastSegment.key];
|
|
1032
|
+
const resolvedProp =
|
|
1033
|
+
propSchema && typeof propSchema === "object"
|
|
1034
|
+
? resolveSchemaRef(propSchema, schemasByKey)
|
|
1035
|
+
: null;
|
|
1036
|
+
return resolvedProp ? { containerSchema: resolvedProp, lastSegment, parentSchema } : null;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
export interface MutationValidationResult {
|
|
1040
|
+
valid: boolean;
|
|
1041
|
+
rootKey: string;
|
|
1042
|
+
pathSegments: PathSegment[];
|
|
1043
|
+
operation: MutationOperation;
|
|
1044
|
+
valueSchema: Schema | null;
|
|
1045
|
+
error?: string;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
/**
|
|
1049
|
+
* Validate mutation key against variable schema: root exists, path valid, operation allowed.
|
|
1050
|
+
* Returns valueSchema to validate the value against (for set: schema at path; for append/prepend/after/before: item schema).
|
|
1051
|
+
* Uses Schema from @featurevisor/types; validates required (no :remove on required props) and does not allow path through oneOf.
|
|
1052
|
+
*/
|
|
1053
|
+
export function validateMutationKey(
|
|
1054
|
+
key: string,
|
|
1055
|
+
variableSchemaByKey: Record<string, Schema>,
|
|
1056
|
+
schemasByKey?: Record<string, Schema>,
|
|
1057
|
+
): MutationValidationResult {
|
|
1058
|
+
const parsed = parseMutationKey(key);
|
|
1059
|
+
if (!parsed) {
|
|
1060
|
+
return {
|
|
1061
|
+
valid: false,
|
|
1062
|
+
rootKey: "",
|
|
1063
|
+
pathSegments: [],
|
|
1064
|
+
operation: "set",
|
|
1065
|
+
valueSchema: null,
|
|
1066
|
+
error: `Invalid mutation notation: "${key}"`,
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
const { rootKey, pathSegments, operation } = parsed;
|
|
1070
|
+
if (!rootKey) {
|
|
1071
|
+
return {
|
|
1072
|
+
valid: false,
|
|
1073
|
+
rootKey: "",
|
|
1074
|
+
pathSegments: [],
|
|
1075
|
+
operation,
|
|
1076
|
+
valueSchema: null,
|
|
1077
|
+
error: `Mutation key must start with a variable name: "${key}"`,
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
const variableSchema = variableSchemaByKey[rootKey];
|
|
1081
|
+
if (!variableSchema) {
|
|
1082
|
+
return {
|
|
1083
|
+
valid: false,
|
|
1084
|
+
rootKey,
|
|
1085
|
+
pathSegments,
|
|
1086
|
+
operation,
|
|
1087
|
+
valueSchema: null,
|
|
1088
|
+
error: `Variable "${rootKey}" is not defined in \`variablesSchema\`.`,
|
|
1089
|
+
};
|
|
1090
|
+
}
|
|
1091
|
+
const resolvedRoot = resolveSchemaRef(variableSchema, schemasByKey);
|
|
1092
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!resolvedRoot) {
|
|
1093
|
+
const refName =
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > variableSchema && typeof variableSchema === "object" && "schema" in variableSchema</span>
|
|
1095
|
+
? (variableSchema as { schema?: string }).schema
|
|
1096
|
+
: undefined;
|
|
1097
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1098
|
+
valid: false,
|
|
1099
|
+
rootKey,
|
|
1100
|
+
pathSegments,
|
|
1101
|
+
operation,
|
|
1102
|
+
valueSchema: null,
|
|
1103
|
+
error:
|
|
1104
|
+
refName != null
|
|
1105
|
+
? `Schema "${refName}" could not be loaded for variable "${rootKey}".`
|
|
1106
|
+
: `Could not resolve schema for variable "${rootKey}".`,
|
|
1107
|
+
};
|
|
1108
|
+
}
|
|
1109
|
+
if (pathSegments.length > 0 && isOneOfSchema(resolvedRoot)) {
|
|
1110
|
+
return {
|
|
1111
|
+
valid: false,
|
|
1112
|
+
rootKey,
|
|
1113
|
+
pathSegments,
|
|
1114
|
+
operation,
|
|
1115
|
+
valueSchema: null,
|
|
1116
|
+
error: `Cannot mutate path into variable "${rootKey}" (root schema is \`oneOf\`; path resolution not defined).`,
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
const container = getContainerSchemaAtPath(variableSchema, pathSegments, schemasByKey);
|
|
1121
|
+
const valueSchemaAtPath = resolveSchemaAtPath(variableSchema, pathSegments, schemasByKey);
|
|
1122
|
+
|
|
1123
|
+
switch (operation) {
|
|
1124
|
+
case "append":
|
|
1125
|
+
case "prepend": {
|
|
1126
|
+
if (!container) {
|
|
1127
|
+
return {
|
|
1128
|
+
valid: false,
|
|
1129
|
+
rootKey,
|
|
1130
|
+
pathSegments,
|
|
1131
|
+
operation,
|
|
1132
|
+
valueSchema: null,
|
|
1133
|
+
error: `Path "${key}" is invalid for variable "${rootKey}" (path does not exist in schema).`,
|
|
1134
|
+
};
|
|
1135
|
+
}
|
|
1136
|
+
const arrResolved = container.containerSchema;
|
|
1137
|
+
if (!arrResolved || arrResolved.type !== "array") {
|
|
1138
|
+
return {
|
|
1139
|
+
valid: false,
|
|
1140
|
+
rootKey,
|
|
1141
|
+
pathSegments,
|
|
1142
|
+
operation,
|
|
1143
|
+
valueSchema: null,
|
|
1144
|
+
error: `Operation ":${operation}" is only allowed on array variables or object properties of type array; path "${key}" does not point to an array.`,
|
|
1145
|
+
};
|
|
1146
|
+
}
|
|
1147
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (isOneOfSchema(arrResolved)) {
|
|
1148
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1149
|
+
valid: false,
|
|
1150
|
+
rootKey,
|
|
1151
|
+
pathSegments,
|
|
1152
|
+
operation,
|
|
1153
|
+
valueSchema: null,
|
|
1154
|
+
error: `Operation ":${operation}" is not allowed when array \`items\` is \`oneOf\` (path "${key}").`,
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
1157
|
+
const itemSchema =
|
|
1158
|
+
arrResolved.items && typeof arrResolved.items === "object"
|
|
1159
|
+
? resolveSchemaRef(arrResolved.items, schemasByKey)
|
|
1160
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1161
|
+
return {
|
|
1162
|
+
valid: true,
|
|
1163
|
+
rootKey,
|
|
1164
|
+
pathSegments,
|
|
1165
|
+
operation,
|
|
1166
|
+
valueSchema: itemSchema,
|
|
1167
|
+
};
|
|
1168
|
+
}
|
|
1169
|
+
case "after":
|
|
1170
|
+
case "before":
|
|
1171
|
+
case "remove": {
|
|
1172
|
+
if (!container) {
|
|
1173
|
+
return {
|
|
1174
|
+
valid: false,
|
|
1175
|
+
rootKey,
|
|
1176
|
+
pathSegments,
|
|
1177
|
+
operation,
|
|
1178
|
+
valueSchema: null,
|
|
1179
|
+
error: `Path "${key}" is invalid for variable "${rootKey}" (path does not exist in schema).`,
|
|
1180
|
+
};
|
|
1181
|
+
}
|
|
1182
|
+
const last = container.lastSegment;
|
|
1183
|
+
if ("index" in last || "selector" in last) {
|
|
1184
|
+
if (container.parentSchema.type !== "array") {
|
|
1185
|
+
return {
|
|
1186
|
+
valid: false,
|
|
1187
|
+
rootKey,
|
|
1188
|
+
pathSegments,
|
|
1189
|
+
operation,
|
|
1190
|
+
valueSchema: null,
|
|
1191
|
+
error: `Operation ":${operation}" with array index/selector is only allowed on arrays; path "${key}" does not point to an array element.`,
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
if (operation === "after" || operation === "before") {
|
|
1195
|
+
const parentItems = container.parentSchema.items;
|
|
1196
|
+
if (parentItems && typeof parentItems === "object" && isOneOfSchema(parentItems)) {
|
|
1197
|
+
return {
|
|
1198
|
+
valid: false,
|
|
1199
|
+
rootKey,
|
|
1200
|
+
pathSegments,
|
|
1201
|
+
operation,
|
|
1202
|
+
valueSchema: null,
|
|
1203
|
+
error: `Operation ":${operation}" is not allowed when array \`items\` is \`oneOf\` (path "${key}").`,
|
|
1204
|
+
};
|
|
1205
|
+
}
|
|
1206
|
+
const itemSchema =
|
|
1207
|
+
parentItems && typeof parentItems === "object"
|
|
1208
|
+
? resolveSchemaRef(parentItems, schemasByKey)
|
|
1209
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1210
|
+
return { valid: true, rootKey, pathSegments, operation, valueSchema: itemSchema };
|
|
1211
|
+
}
|
|
1212
|
+
return { valid: true, rootKey, pathSegments, operation, valueSchema: null };
|
|
1213
|
+
}
|
|
1214
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (container.parentSchema.type !== "object") {
|
|
1215
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1216
|
+
valid: false,
|
|
1217
|
+
rootKey,
|
|
1218
|
+
pathSegments,
|
|
1219
|
+
operation,
|
|
1220
|
+
valueSchema: null,
|
|
1221
|
+
error: `Operation ":${operation}" on a property is only allowed on objects; path "${key}" does not point to an object property.`,
|
|
1222
|
+
};
|
|
1223
|
+
}
|
|
1224
|
+
const requiredKeys = container.parentSchema.required;
|
|
1225
|
+
if (
|
|
1226
|
+
operation === "remove" &&
|
|
1227
|
+
Array.isArray(requiredKeys) &&
|
|
1228
|
+
requiredKeys.includes(last.key)
|
|
1229
|
+
) {
|
|
1230
|
+
return {
|
|
1231
|
+
valid: false,
|
|
1232
|
+
rootKey,
|
|
1233
|
+
pathSegments,
|
|
1234
|
+
operation,
|
|
1235
|
+
valueSchema: null,
|
|
1236
|
+
error: `Cannot remove required property "${last.key}" from variable "${rootKey}" (listed in schema \`required\`).`,
|
|
1237
|
+
};
|
|
1238
|
+
}
|
|
1239
|
+
return { valid: true, rootKey, pathSegments, operation, valueSchema: null };
|
|
1240
|
+
}
|
|
1241
|
+
case "set": {
|
|
1242
|
+
if (valueSchemaAtPath === null && pathSegments.length > 0) {
|
|
1243
|
+
return {
|
|
1244
|
+
valid: false,
|
|
1245
|
+
rootKey,
|
|
1246
|
+
pathSegments,
|
|
1247
|
+
operation,
|
|
1248
|
+
valueSchema: null,
|
|
1249
|
+
error: `Path "${key}" is invalid for variable "${rootKey}" (path does not exist in schema).`,
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
if (valueSchemaAtPath && isOneOfSchema(valueSchemaAtPath)) {
|
|
1253
|
+
return {
|
|
1254
|
+
valid: false,
|
|
1255
|
+
rootKey,
|
|
1256
|
+
pathSegments,
|
|
1257
|
+
operation,
|
|
1258
|
+
valueSchema: null,
|
|
1259
|
+
error: `Cannot set value at path "${key}" (target schema is \`oneOf\`; mutation target must be a single schema).`,
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
return {
|
|
1263
|
+
valid: true,
|
|
1264
|
+
rootKey,
|
|
1265
|
+
pathSegments,
|
|
1266
|
+
operation,
|
|
1267
|
+
valueSchema: valueSchemaAtPath,
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1270
|
+
<span class="branch-6 cbranch-no" title="branch not covered" > default:</span>
|
|
1271
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1272
|
+
valid: true,
|
|
1273
|
+
rootKey,
|
|
1274
|
+
pathSegments,
|
|
1275
|
+
operation,
|
|
1276
|
+
valueSchema: valueSchemaAtPath,
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
/**
|
|
1282
|
+
* Parse a path-map key (relative to a variable) into path segments for resolveSchemaAtPath.
|
|
1283
|
+
* e.g. "display.fontSize" -> [{key:"display"},{key:"fontSize"}], "[0].name" -> [{key:"",index:0},{key:"name"}].
|
|
1284
|
+
*/
|
|
1285
|
+
export function parsePathMapKey(relativePath: string): PathSegment[] | null {
|
|
1286
|
+
const parsed = parseMutationKey(relativePath);
|
|
1287
|
+
if (!parsed) return null;
|
|
1288
|
+
return parsed.allSegments.length > 0 ? parsed.allSegments : <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1289
|
+
}
|
|
1290
|
+
</pre></td></tr></table></pre>
|
|
1291
|
+
|
|
1292
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1293
|
+
</div><!-- /wrapper -->
|
|
1294
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1295
|
+
Code coverage generated by
|
|
1296
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1297
|
+
at 2026-02-24T19:50:30.107Z
|
|
1298
|
+
</div>
|
|
1299
|
+
<script src="../prettify.js"></script>
|
|
1300
|
+
<script>
|
|
1301
|
+
window.onload = function () {
|
|
1302
|
+
prettyPrint();
|
|
1303
|
+
};
|
|
1304
|
+
</script>
|
|
1305
|
+
<script src="../sorter.js"></script>
|
|
1306
|
+
<script src="../block-navigation.js"></script>
|
|
1307
|
+
</body>
|
|
1308
|
+
</html>
|
|
1309
|
+
|