@featurevisor/core 2.13.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/coverage/clover.xml +1499 -1028
- package/coverage/coverage-final.json +21 -17
- 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 +30 -15
- package/coverage/lcov-report/config/index.ts.html +88 -0
- package/coverage/lcov-report/config/projectConfig.ts.html +79 -46
- package/coverage/lcov-report/datasource/adapter.ts.html +74 -11
- package/coverage/lcov-report/datasource/datasource.ts.html +77 -26
- package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +693 -69
- package/coverage/lcov-report/datasource/index.html +35 -35
- package/coverage/lcov-report/datasource/index.ts.html +1 -1
- package/coverage/lcov-report/index.html +53 -53
- package/coverage/lcov-report/linter/attributeSchema.ts.html +4 -4
- package/coverage/lcov-report/linter/checkCircularDependency.ts.html +1 -1
- package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +1 -1
- package/coverage/lcov-report/linter/conditionSchema.ts.html +7 -7
- package/coverage/lcov-report/linter/featureSchema.ts.html +848 -389
- package/coverage/lcov-report/linter/groupSchema.ts.html +3 -3
- package/coverage/lcov-report/linter/index.html +50 -35
- package/coverage/lcov-report/linter/lintProject.ts.html +437 -92
- package/coverage/lcov-report/linter/mutationNotation.ts.html +1309 -0
- package/coverage/lcov-report/linter/printError.ts.html +9 -9
- package/coverage/lcov-report/linter/schema.ts.html +69 -69
- package/coverage/lcov-report/linter/segmentSchema.ts.html +3 -3
- package/coverage/lcov-report/linter/testSchema.ts.html +10 -10
- 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 +1 -1
- package/coverage/lcov-report/parsers/index.ts.html +4 -4
- 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 +1 -1
- package/coverage/lcov-report/tester/helpers.ts.html +1 -1
- package/coverage/lcov-report/tester/index.html +1 -1
- package/coverage/lcov-report/utils/git.ts.html +118 -16
- package/coverage/lcov-report/utils/index.html +14 -14
- package/coverage/lcov.info +2918 -1932
- 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/config/projectConfig.d.ts +3 -0
- package/lib/config/projectConfig.js +7 -1
- package/lib/config/projectConfig.js.map +1 -1
- package/lib/config/projectConfig.spec.d.ts +1 -0
- package/lib/config/projectConfig.spec.js +24 -0
- package/lib/config/projectConfig.spec.js.map +1 -0
- package/lib/datasource/adapter.d.ts +7 -0
- package/lib/datasource/adapter.js +7 -0
- package/lib/datasource/adapter.js.map +1 -1
- package/lib/datasource/datasource.d.ts +3 -1
- package/lib/datasource/datasource.js +6 -0
- package/lib/datasource/datasource.js.map +1 -1
- package/lib/datasource/filesystemAdapter.d.ts +8 -0
- package/lib/datasource/filesystemAdapter.js +134 -7
- package/lib/datasource/filesystemAdapter.js.map +1 -1
- package/lib/datasource/filesystemAdapter.spec.d.ts +1 -0
- package/lib/datasource/filesystemAdapter.spec.js +88 -0
- package/lib/datasource/filesystemAdapter.spec.js.map +1 -0
- package/lib/linter/conditionSchema.spec.js +2 -0
- package/lib/linter/conditionSchema.spec.js.map +1 -1
- package/lib/linter/featureSchema.d.ts +7 -7
- package/lib/linter/featureSchema.js +176 -103
- package/lib/linter/featureSchema.js.map +1 -1
- package/lib/linter/featureSchema.spec.js +167 -0
- package/lib/linter/featureSchema.spec.js.map +1 -1
- package/lib/linter/lintProject.d.ts +2 -0
- package/lib/linter/lintProject.js +85 -8
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/lintProject.spec.js +37 -0
- package/lib/linter/lintProject.spec.js.map +1 -1
- 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/segmentSchema.spec.js +2 -0
- package/lib/linter/segmentSchema.spec.js.map +1 -1
- package/lib/utils/git.js +32 -7
- package/lib/utils/git.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/config/projectConfig.spec.ts +31 -0
- package/src/config/projectConfig.ts +11 -0
- package/src/datasource/adapter.ts +21 -0
- package/src/datasource/datasource.ts +18 -1
- package/src/datasource/filesystemAdapter.spec.ts +153 -0
- package/src/datasource/filesystemAdapter.ts +216 -8
- package/src/linter/conditionSchema.spec.ts +2 -0
- package/src/linter/featureSchema.spec.ts +203 -0
- package/src/linter/featureSchema.ts +320 -167
- package/src/linter/lintProject.spec.ts +74 -0
- package/src/linter/lintProject.ts +123 -8
- package/src/linter/mutationNotation.spec.ts +642 -0
- package/src/linter/mutationNotation.ts +408 -0
- package/src/linter/segmentSchema.spec.ts +2 -0
- package/src/utils/git.ts +41 -7
|
@@ -0,0 +1,796 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for builder/mutator.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">builder</a> mutator.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">88.15% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>134/152</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">72.32% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>81/112</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'>6/6</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">94.81% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>128/135</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
317
|
+
<span class="cline-any cline-yes">5x</span>
|
|
318
|
+
<span class="cline-any cline-yes">278x</span>
|
|
319
|
+
<span class="cline-any cline-yes">278x</span>
|
|
320
|
+
<span class="cline-any cline-yes">278x</span>
|
|
321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
323
|
+
<span class="cline-any cline-yes">278x</span>
|
|
324
|
+
<span class="cline-any cline-yes">64x</span>
|
|
325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
327
|
+
<span class="cline-any cline-yes">278x</span>
|
|
328
|
+
<span class="cline-any cline-yes">278x</span>
|
|
329
|
+
<span class="cline-any cline-yes">278x</span>
|
|
330
|
+
<span class="cline-any cline-yes">470x</span>
|
|
331
|
+
<span class="cline-any cline-yes">470x</span>
|
|
332
|
+
<span class="cline-any cline-yes">2169x</span>
|
|
333
|
+
<span class="cline-any cline-yes">2169x</span>
|
|
334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
335
|
+
<span class="cline-any cline-yes">470x</span>
|
|
336
|
+
<span class="cline-any cline-yes">470x</span>
|
|
337
|
+
<span class="cline-any cline-yes">441x</span>
|
|
338
|
+
<span class="cline-any cline-yes">65x</span>
|
|
339
|
+
<span class="cline-any cline-yes">65x</span>
|
|
340
|
+
<span class="cline-any cline-yes">143x</span>
|
|
341
|
+
<span class="cline-any cline-yes">65x</span>
|
|
342
|
+
<span class="cline-any cline-yes">65x</span>
|
|
343
|
+
<span class="cline-any cline-yes">65x</span>
|
|
344
|
+
<span class="cline-any cline-yes">65x</span>
|
|
345
|
+
<span class="cline-any cline-yes">19x</span>
|
|
346
|
+
<span class="cline-any cline-yes">19x</span>
|
|
347
|
+
<span class="cline-any cline-yes">19x</span>
|
|
348
|
+
<span class="cline-any cline-yes">19x</span>
|
|
349
|
+
<span class="cline-any cline-yes">19x</span>
|
|
350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
351
|
+
<span class="cline-any cline-yes">46x</span>
|
|
352
|
+
<span class="cline-any cline-yes">46x</span>
|
|
353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
355
|
+
<span class="cline-any cline-yes">376x</span>
|
|
356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
357
|
+
<span class="cline-any cline-yes">29x</span>
|
|
358
|
+
<span class="cline-any cline-yes">29x</span>
|
|
359
|
+
<span class="cline-any cline-yes">29x</span>
|
|
360
|
+
<span class="cline-any cline-yes">29x</span>
|
|
361
|
+
<span class="cline-any cline-yes">29x</span>
|
|
362
|
+
<span class="cline-any cline-yes">29x</span>
|
|
363
|
+
<span class="cline-any cline-yes">29x</span>
|
|
364
|
+
<span class="cline-any cline-yes">29x</span>
|
|
365
|
+
<span class="cline-any cline-no"> </span>
|
|
366
|
+
<span class="cline-any cline-no"> </span>
|
|
367
|
+
<span class="cline-any cline-no"> </span>
|
|
368
|
+
<span class="cline-any cline-no"> </span>
|
|
369
|
+
<span class="cline-any cline-no"> </span>
|
|
370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
371
|
+
<span class="cline-any cline-yes">29x</span>
|
|
372
|
+
<span class="cline-any cline-yes">29x</span>
|
|
373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
375
|
+
<span class="cline-any cline-yes">470x</span>
|
|
376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-yes">278x</span>
|
|
379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
382
|
+
<span class="cline-any cline-yes">66x</span>
|
|
383
|
+
<span class="cline-any cline-yes">66x</span>
|
|
384
|
+
<span class="cline-any cline-yes">66x</span>
|
|
385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
386
|
+
<span class="cline-any cline-yes">28x</span>
|
|
387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
393
|
+
<span class="cline-any cline-yes">28x</span>
|
|
394
|
+
<span class="cline-any cline-yes">28x</span>
|
|
395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
396
|
+
<span class="cline-any cline-yes">38x</span>
|
|
397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
398
|
+
<span class="cline-any cline-yes">1x</span>
|
|
399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
405
|
+
<span class="cline-any cline-yes">1x</span>
|
|
406
|
+
<span class="cline-any cline-yes">1x</span>
|
|
407
|
+
<span class="cline-any cline-yes">1x</span>
|
|
408
|
+
<span class="cline-any cline-yes">1x</span>
|
|
409
|
+
<span class="cline-any cline-yes">1x</span>
|
|
410
|
+
<span class="cline-any cline-yes">1x</span>
|
|
411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
412
|
+
<span class="cline-any cline-yes">1x</span>
|
|
413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
414
|
+
<span class="cline-any cline-yes">37x</span>
|
|
415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
424
|
+
<span class="cline-any cline-yes">118x</span>
|
|
425
|
+
<span class="cline-any cline-yes">19x</span>
|
|
426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
427
|
+
<span class="cline-any cline-yes">19x</span>
|
|
428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
434
|
+
<span class="cline-any cline-yes">19x</span>
|
|
435
|
+
<span class="cline-any cline-yes">19x</span>
|
|
436
|
+
<span class="cline-any cline-yes">5x</span>
|
|
437
|
+
<span class="cline-any cline-yes">5x</span>
|
|
438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
439
|
+
<span class="cline-any cline-yes">14x</span>
|
|
440
|
+
<span class="cline-any cline-yes">14x</span>
|
|
441
|
+
<span class="cline-any cline-yes">14x</span>
|
|
442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
443
|
+
<span class="cline-any cline-no"> </span>
|
|
444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
445
|
+
<span class="cline-any cline-yes">99x</span>
|
|
446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
447
|
+
<span class="cline-any cline-yes">9x</span>
|
|
448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
454
|
+
<span class="cline-any cline-yes">9x</span>
|
|
455
|
+
<span class="cline-any cline-yes">9x</span>
|
|
456
|
+
<span class="cline-any cline-yes">9x</span>
|
|
457
|
+
<span class="cline-any cline-yes">9x</span>
|
|
458
|
+
<span class="cline-any cline-yes">13x</span>
|
|
459
|
+
<span class="cline-any cline-yes">13x</span>
|
|
460
|
+
<span class="cline-any cline-yes">13x</span>
|
|
461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
462
|
+
<span class="cline-any cline-yes">9x</span>
|
|
463
|
+
<span class="cline-any cline-yes">7x</span>
|
|
464
|
+
<span class="cline-any cline-yes">3x</span>
|
|
465
|
+
<span class="cline-any cline-yes">3x</span>
|
|
466
|
+
<span class="cline-any cline-neutral"> </span>
|
|
467
|
+
<span class="cline-any cline-yes">4x</span>
|
|
468
|
+
<span class="cline-any cline-yes">2x</span>
|
|
469
|
+
<span class="cline-any cline-yes">2x</span>
|
|
470
|
+
<span class="cline-any cline-neutral"> </span>
|
|
471
|
+
<span class="cline-any cline-yes">2x</span>
|
|
472
|
+
<span class="cline-any cline-yes">2x</span>
|
|
473
|
+
<span class="cline-any cline-yes">2x</span>
|
|
474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
475
|
+
<span class="cline-any cline-no"> </span>
|
|
476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
477
|
+
<span class="cline-any cline-yes">90x</span>
|
|
478
|
+
<span class="cline-any cline-yes">90x</span>
|
|
479
|
+
<span class="cline-any cline-yes">90x</span>
|
|
480
|
+
<span class="cline-any cline-yes">3x</span>
|
|
481
|
+
<span class="cline-any cline-yes">3x</span>
|
|
482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
483
|
+
<span class="cline-any cline-yes">87x</span>
|
|
484
|
+
<span class="cline-any cline-yes">5x</span>
|
|
485
|
+
<span class="cline-any cline-yes">5x</span>
|
|
486
|
+
<span class="cline-any cline-yes">5x</span>
|
|
487
|
+
<span class="cline-any cline-yes">5x</span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-yes">82x</span>
|
|
490
|
+
<span class="cline-any cline-yes">4x</span>
|
|
491
|
+
<span class="cline-any cline-yes">4x</span>
|
|
492
|
+
<span class="cline-any cline-yes">4x</span>
|
|
493
|
+
<span class="cline-any cline-yes">4x</span>
|
|
494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
495
|
+
<span class="cline-any cline-yes">78x</span>
|
|
496
|
+
<span class="cline-any cline-yes">78x</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-yes">5x</span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-yes">128x</span>
|
|
507
|
+
<span class="cline-any cline-yes">123x</span>
|
|
508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
509
|
+
<span class="cline-any cline-yes">123x</span>
|
|
510
|
+
<span class="cline-any cline-yes">123x</span>
|
|
511
|
+
<span class="cline-any cline-yes">4x</span>
|
|
512
|
+
<span class="cline-any cline-yes">2x</span>
|
|
513
|
+
<span class="cline-any cline-yes">2x</span>
|
|
514
|
+
<span class="cline-any cline-yes">1x</span>
|
|
515
|
+
<span class="cline-any cline-yes">1x</span>
|
|
516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
517
|
+
<span class="cline-any cline-yes">1x</span>
|
|
518
|
+
<span class="cline-any cline-yes">1x</span>
|
|
519
|
+
<span class="cline-any cline-yes">1x</span>
|
|
520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
522
|
+
<span class="cline-any cline-yes">2x</span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-yes">119x</span>
|
|
526
|
+
<span class="cline-any cline-yes">119x</span>
|
|
527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-yes">119x</span>
|
|
529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
531
|
+
<span class="cline-any cline-yes">119x</span>
|
|
532
|
+
<span class="cline-any cline-yes">66x</span>
|
|
533
|
+
<span class="cline-any cline-yes">66x</span>
|
|
534
|
+
<span class="cline-any cline-yes">65x</span>
|
|
535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
537
|
+
<span class="cline-any cline-yes">118x</span>
|
|
538
|
+
<span class="cline-any cline-yes">118x</span>
|
|
539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { VariableSchema, VariableValue } from "@featurevisor/types";
|
|
541
|
+
|
|
542
|
+
export type PathPart =
|
|
543
|
+
| { key: string }
|
|
544
|
+
| { key: string; index: number }
|
|
545
|
+
| { key: string; selector: { prop: string; value: string } };
|
|
546
|
+
|
|
547
|
+
export type MutationOperation = "set" | "append" | "prepend" | "after" | "before" | "remove";
|
|
548
|
+
|
|
549
|
+
export interface ParsedNotation {
|
|
550
|
+
segments: PathPart[];
|
|
551
|
+
operation: MutationOperation;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export function parseNotation(notation: string): ParsedNotation {
|
|
555
|
+
let rest = notation.trim();
|
|
556
|
+
const operationMatch = rest.match(/:((?:append|prepend|after|before|remove))$/);
|
|
557
|
+
const operation: MutationOperation = operationMatch
|
|
558
|
+
? (operationMatch[1] as MutationOperation)
|
|
559
|
+
: "set";
|
|
560
|
+
if (operationMatch) {
|
|
561
|
+
rest = rest.slice(0, -operationMatch[0].length);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
const segments: PathPart[] = [];
|
|
565
|
+
let i = 0;
|
|
566
|
+
while (i < rest.length) {
|
|
567
|
+
let key = "";
|
|
568
|
+
while (i < rest.length && rest[i] !== "." && rest[i] !== "[") {
|
|
569
|
+
key += rest[i];
|
|
570
|
+
i++;
|
|
571
|
+
}
|
|
572
|
+
key = key.trim();
|
|
573
|
+
if (key) {
|
|
574
|
+
if (rest[i] === "[") {
|
|
575
|
+
i++;
|
|
576
|
+
const bracketStart = i;
|
|
577
|
+
while (i < rest.length && rest[i] !== "]") i++;
|
|
578
|
+
const bracketContent = rest.slice(bracketStart, i);
|
|
579
|
+
i++;
|
|
580
|
+
const eq = bracketContent.indexOf("=");
|
|
581
|
+
if (eq >= 0) {
|
|
582
|
+
const prop = bracketContent.slice(0, eq).trim();
|
|
583
|
+
let val = bracketContent.slice(eq + 1).trim();
|
|
584
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (val.startsWith('"') && <span class="branch-1 cbranch-no" title="branch not covered" >val.endsWith('"'))</span> <span class="cstat-no" title="statement not covered" >val = val.slice(1, -1);</span>
|
|
585
|
+
else <span class="missing-if-branch" title="if path not taken" >I</span>if (val.startsWith("'") && <span class="branch-1 cbranch-no" title="branch not covered" >val.endsWith("'"))</span> <span class="cstat-no" title="statement not covered" >val = val.slice(1, -1);</span>
|
|
586
|
+
segments.push({ key, selector: { prop, value: val } });
|
|
587
|
+
} else {
|
|
588
|
+
const index = parseInt(bracketContent.trim(), 10);
|
|
589
|
+
segments.push({ key, index });
|
|
590
|
+
}
|
|
591
|
+
} else {
|
|
592
|
+
segments.push({ key });
|
|
593
|
+
}
|
|
594
|
+
} else if (rest[i] === "[") {
|
|
595
|
+
i++;
|
|
596
|
+
const bracketStart = i;
|
|
597
|
+
while (i < rest.length && rest[i] !== "]") i++;
|
|
598
|
+
const bracketContent = rest.slice(bracketStart, i);
|
|
599
|
+
i++;
|
|
600
|
+
const eq = bracketContent.indexOf("=");
|
|
601
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (eq >= 0) {
|
|
602
|
+
const prop = <span class="cstat-no" title="statement not covered" >bracketContent.slice(0, eq).trim();</span>
|
|
603
|
+
let val = <span class="cstat-no" title="statement not covered" >bracketContent.slice(eq + 1).trim();</span>
|
|
604
|
+
<span class="cstat-no" title="statement not covered" > if (val.startsWith('"') && val.endsWith('"')) <span class="cstat-no" title="statement not covered" >val = val.slice(1, -1);</span></span>
|
|
605
|
+
else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (val.startsWith("'") && val.endsWith("'")) <span class="cstat-no" title="statement not covered" >val = val.slice(1, -1);</span></span>
|
|
606
|
+
<span class="cstat-no" title="statement not covered" > segments.push({ key: "", selector: { prop, value: val } });</span>
|
|
607
|
+
} else {
|
|
608
|
+
const index = parseInt(bracketContent.trim(), 10);
|
|
609
|
+
segments.push({ key: "", index });
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
if (rest[i] === ".") i++;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
return { segments, operation };
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
function getAtSegment(obj: VariableValue, seg: PathPart): VariableValue {
|
|
619
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (obj === null || obj === undefined) <span class="cstat-no" title="statement not covered" >return undefined;</span>
|
|
620
|
+
const o = obj as Record<string, unknown>;
|
|
621
|
+
if ("index" in seg) {
|
|
622
|
+
const arr =
|
|
623
|
+
seg.key === ""
|
|
624
|
+
? Array.isArray(obj)
|
|
625
|
+
? obj
|
|
626
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >undefined</span>
|
|
627
|
+
: Array.isArray(obj)
|
|
628
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >obj</span>
|
|
629
|
+
: (o[seg.key] as unknown[]);
|
|
630
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(arr)) <span class="cstat-no" title="statement not covered" >return undefined;</span>
|
|
631
|
+
return arr[seg.index] as VariableValue;
|
|
632
|
+
}
|
|
633
|
+
if ("selector" in seg) {
|
|
634
|
+
const arr =
|
|
635
|
+
seg.key === ""
|
|
636
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >Array.isArray(obj)</span>
|
|
637
|
+
? obj
|
|
638
|
+
: undefined
|
|
639
|
+
: Array.isArray(obj)
|
|
640
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >obj</span>
|
|
641
|
+
: (o[seg.key] as unknown[]);
|
|
642
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(arr)) <span class="cstat-no" title="statement not covered" >return undefined;</span>
|
|
643
|
+
const { prop, value } = seg.selector;
|
|
644
|
+
const found = arr.find((item) => {
|
|
645
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (item === null || typeof item !== "object") <span class="cstat-no" title="statement not covered" >return false;</span>
|
|
646
|
+
const v = (item as Record<string, unknown>)[prop];
|
|
647
|
+
return String(v) === value;
|
|
648
|
+
});
|
|
649
|
+
return found as VariableValue;
|
|
650
|
+
}
|
|
651
|
+
return o[seg.key] as VariableValue;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
function setAtSegment(
|
|
655
|
+
obj: Record<string, unknown> | unknown[],
|
|
656
|
+
seg: PathPart,
|
|
657
|
+
_value: VariableValue,
|
|
658
|
+
op: MutationOperation,
|
|
659
|
+
setValue: VariableValue | undefined,
|
|
660
|
+
): void {
|
|
661
|
+
if ("index" in seg) {
|
|
662
|
+
const i = seg.index;
|
|
663
|
+
const arr =
|
|
664
|
+
seg.key === ""
|
|
665
|
+
? Array.isArray(obj)
|
|
666
|
+
? obj
|
|
667
|
+
: <span class="branch-1 cbranch-no" title="branch not covered" >undefined</span>
|
|
668
|
+
: Array.isArray(obj)
|
|
669
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >obj</span>
|
|
670
|
+
: ((obj as Record<string, unknown>)[seg.key] as unknown[]);
|
|
671
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(arr)) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
672
|
+
if (op === "remove") {
|
|
673
|
+
arr.splice(i, 1);
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
if (op === "set") {
|
|
677
|
+
arr[i] = setValue;
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
681
|
+
}
|
|
682
|
+
if ("selector" in seg) {
|
|
683
|
+
const arr =
|
|
684
|
+
seg.key === ""
|
|
685
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >Array.isArray(obj)</span>
|
|
686
|
+
? obj
|
|
687
|
+
: undefined
|
|
688
|
+
: Array.isArray(obj)
|
|
689
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >obj</span>
|
|
690
|
+
: ((obj as Record<string, unknown>)[seg.key] as unknown[]);
|
|
691
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(arr)) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
692
|
+
const { prop, value: selVal } = seg.selector;
|
|
693
|
+
const numVal = /^\d+$/.test(selVal) ? parseInt(selVal, 10) : null;
|
|
694
|
+
const idx = arr.findIndex((item) => {
|
|
695
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (item === null || typeof item !== "object") <span class="cstat-no" title="statement not covered" >return false;</span>
|
|
696
|
+
const v = (item as Record<string, unknown>)[prop];
|
|
697
|
+
return String(v) === selVal || (numVal !== null && v === numVal);
|
|
698
|
+
});
|
|
699
|
+
if (idx < 0) return;
|
|
700
|
+
if (op === "remove") {
|
|
701
|
+
arr.splice(idx, 1);
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
if (op === "after" && setValue !== undefined) {
|
|
705
|
+
arr.splice(idx + 1, 0, setValue);
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
if (op === "before" && setValue !== undefined) {
|
|
709
|
+
arr.splice(idx, 0, setValue);
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
713
|
+
}
|
|
714
|
+
const key = seg.key;
|
|
715
|
+
const o = obj as Record<string, unknown>;
|
|
716
|
+
if (op === "remove") {
|
|
717
|
+
delete o[key];
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
if (op === "append" && setValue !== undefined) {
|
|
721
|
+
const arr = (o[key] ?? []) as unknown[];
|
|
722
|
+
arr.push(setValue);
|
|
723
|
+
o[key] = arr;
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
if (op === "prepend" && setValue !== undefined) {
|
|
727
|
+
const arr = (o[key] ?? []) as unknown[];
|
|
728
|
+
arr.unshift(setValue);
|
|
729
|
+
o[key] = arr;
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
if (op === "set") {
|
|
733
|
+
o[key] = setValue as unknown;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
export function mutate(
|
|
738
|
+
_schema: VariableSchema,
|
|
739
|
+
value: VariableValue,
|
|
740
|
+
notation: string,
|
|
741
|
+
setValue: VariableValue | undefined,
|
|
742
|
+
): VariableValue {
|
|
743
|
+
if (value === null || value === undefined) return value;
|
|
744
|
+
const result = JSON.parse(JSON.stringify(value)) as VariableValue;
|
|
745
|
+
|
|
746
|
+
const { segments, operation } = parseNotation(notation);
|
|
747
|
+
if (segments.length === 0) {
|
|
748
|
+
if (Array.isArray(result) && setValue !== undefined) {
|
|
749
|
+
const arr = result as VariableValue[];
|
|
750
|
+
if (operation === "append") {
|
|
751
|
+
arr.push(setValue);
|
|
752
|
+
return result;
|
|
753
|
+
}
|
|
754
|
+
if (operation === "prepend") {
|
|
755
|
+
arr.unshift(setValue);
|
|
756
|
+
return result;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
return result;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
const last = segments[segments.length - 1];
|
|
763
|
+
const parentSegments = segments.slice(0, -1);
|
|
764
|
+
|
|
765
|
+
let container: Record<string, unknown> | unknown[] = result as
|
|
766
|
+
| Record<string, unknown>
|
|
767
|
+
| unknown[];
|
|
768
|
+
for (const seg of parentSegments) {
|
|
769
|
+
const next = getAtSegment(container as VariableValue, seg);
|
|
770
|
+
if (next === undefined) return result;
|
|
771
|
+
container = next as Record<string, unknown> | unknown[];
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
setAtSegment(container, last, undefined, operation, setValue);
|
|
775
|
+
return result;
|
|
776
|
+
}
|
|
777
|
+
</pre></td></tr></table></pre>
|
|
778
|
+
|
|
779
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
780
|
+
</div><!-- /wrapper -->
|
|
781
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
782
|
+
Code coverage generated by
|
|
783
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
784
|
+
at 2026-02-25T22:03:15.189Z
|
|
785
|
+
</div>
|
|
786
|
+
<script src="../prettify.js"></script>
|
|
787
|
+
<script>
|
|
788
|
+
window.onload = function () {
|
|
789
|
+
prettyPrint();
|
|
790
|
+
};
|
|
791
|
+
</script>
|
|
792
|
+
<script src="../sorter.js"></script>
|
|
793
|
+
<script src="../block-navigation.js"></script>
|
|
794
|
+
</body>
|
|
795
|
+
</html>
|
|
796
|
+
|