topkat-utils 1.2.100 → 1.2.102
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/coverage/clover.xml +1767 -0
- package/coverage/coverage-final.json +16 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/clean-stack-trace.ts.html +205 -0
- package/coverage/lcov-report/config.ts.html +340 -0
- package/coverage/lcov-report/error-utils.ts.html +700 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +326 -0
- package/coverage/lcov-report/is-empty.ts.html +103 -0
- package/coverage/lcov-report/is-nodejs.ts.html +109 -0
- package/coverage/lcov-report/is-object.ts.html +91 -0
- package/coverage/lcov-report/isset.ts.html +91 -0
- package/coverage/lcov-report/logger-utils.ts.html +1156 -0
- package/coverage/lcov-report/loop-utils.ts.html +382 -0
- package/coverage/lcov-report/object-utils.ts.html +1393 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/regexp-utils.ts.html +205 -0
- package/coverage/lcov-report/remove-circular-json-stringify.ts.html +139 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/string-utils.ts.html +922 -0
- package/coverage/lcov-report/timer-utils.ts.html +289 -0
- package/coverage/lcov-report/transaction-utils.ts.html +268 -0
- package/coverage/lcov.info +2151 -0
- package/dist/jest.config.d.ts +7 -0
- package/dist/jest.config.js +21 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/src/timer-utils.d.ts +2 -0
- package/dist/src/timer-utils.js +9 -1
- package/dist/src/timer-utils.js.map +1 -1
- package/dist/src/transaction-utils.js +3 -2
- package/dist/src/transaction-utils.js.map +1 -1
- package/dist/src/transaction-utils.spec.d.ts +1 -0
- package/dist/src/transaction-utils.spec.js +49 -0
- package/dist/src/transaction-utils.spec.js.map +1 -0
- package/jest.config.ts +22 -0
- package/package.json +14 -8
- package/src/timer-utils.ts +11 -0
- package/src/transaction-utils.spec.ts +74 -0
- package/src/transaction-utils.ts +3 -2
- package/tsconfig.json +2 -1
|
@@ -0,0 +1,1393 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for object-utils.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> object-utils.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">28.14% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>123/437</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/0</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/27</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">28.14% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>123/437</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 type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></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>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
|
|
503
|
+
<span class="cline-any cline-yes">2x</span>
|
|
504
|
+
<span class="cline-any cline-yes">2x</span>
|
|
505
|
+
<span class="cline-any cline-yes">2x</span>
|
|
506
|
+
<span class="cline-any cline-yes">2x</span>
|
|
507
|
+
<span class="cline-any cline-yes">2x</span>
|
|
508
|
+
<span class="cline-any cline-yes">2x</span>
|
|
509
|
+
<span class="cline-any cline-yes">2x</span>
|
|
510
|
+
<span class="cline-any cline-yes">2x</span>
|
|
511
|
+
<span class="cline-any cline-yes">2x</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">2x</span>
|
|
515
|
+
<span class="cline-any cline-yes">2x</span>
|
|
516
|
+
<span class="cline-any cline-yes">2x</span>
|
|
517
|
+
<span class="cline-any cline-yes">2x</span>
|
|
518
|
+
<span class="cline-any cline-no"> </span>
|
|
519
|
+
<span class="cline-any cline-no"> </span>
|
|
520
|
+
<span class="cline-any cline-no"> </span>
|
|
521
|
+
<span class="cline-any cline-no"> </span>
|
|
522
|
+
<span class="cline-any cline-no"> </span>
|
|
523
|
+
<span class="cline-any cline-no"> </span>
|
|
524
|
+
<span class="cline-any cline-no"> </span>
|
|
525
|
+
<span class="cline-any cline-no"> </span>
|
|
526
|
+
<span class="cline-any cline-no"> </span>
|
|
527
|
+
<span class="cline-any cline-no"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-no"> </span>
|
|
530
|
+
<span class="cline-any cline-no"> </span>
|
|
531
|
+
<span class="cline-any cline-no"> </span>
|
|
532
|
+
<span class="cline-any cline-no"> </span>
|
|
533
|
+
<span class="cline-any cline-no"> </span>
|
|
534
|
+
<span class="cline-any cline-no"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-no"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </span>
|
|
538
|
+
<span class="cline-any cline-no"> </span>
|
|
539
|
+
<span class="cline-any cline-yes">2x</span>
|
|
540
|
+
<span class="cline-any cline-yes">2x</span>
|
|
541
|
+
<span class="cline-any cline-yes">2x</span>
|
|
542
|
+
<span class="cline-any cline-yes">2x</span>
|
|
543
|
+
<span class="cline-any cline-yes">2x</span>
|
|
544
|
+
<span class="cline-any cline-yes">2x</span>
|
|
545
|
+
<span class="cline-any cline-no"> </span>
|
|
546
|
+
<span class="cline-any cline-no"> </span>
|
|
547
|
+
<span class="cline-any cline-no"> </span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-no"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-yes">2x</span>
|
|
555
|
+
<span class="cline-any cline-yes">2x</span>
|
|
556
|
+
<span class="cline-any cline-yes">2x</span>
|
|
557
|
+
<span class="cline-any cline-yes">2x</span>
|
|
558
|
+
<span class="cline-any cline-yes">2x</span>
|
|
559
|
+
<span class="cline-any cline-yes">2x</span>
|
|
560
|
+
<span class="cline-any cline-no"> </span>
|
|
561
|
+
<span class="cline-any cline-no"> </span>
|
|
562
|
+
<span class="cline-any cline-no"> </span>
|
|
563
|
+
<span class="cline-any cline-no"> </span>
|
|
564
|
+
<span class="cline-any cline-no"> </span>
|
|
565
|
+
<span class="cline-any cline-no"> </span>
|
|
566
|
+
<span class="cline-any cline-no"> </span>
|
|
567
|
+
<span class="cline-any cline-no"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-no"> </span>
|
|
570
|
+
<span class="cline-any cline-no"> </span>
|
|
571
|
+
<span class="cline-any cline-yes">2x</span>
|
|
572
|
+
<span class="cline-any cline-yes">2x</span>
|
|
573
|
+
<span class="cline-any cline-yes">2x</span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </span>
|
|
581
|
+
<span class="cline-any cline-no"> </span>
|
|
582
|
+
<span class="cline-any cline-no"> </span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-no"> </span>
|
|
586
|
+
<span class="cline-any cline-no"> </span>
|
|
587
|
+
<span class="cline-any cline-no"> </span>
|
|
588
|
+
<span class="cline-any cline-no"> </span>
|
|
589
|
+
<span class="cline-any cline-no"> </span>
|
|
590
|
+
<span class="cline-any cline-no"> </span>
|
|
591
|
+
<span class="cline-any cline-no"> </span>
|
|
592
|
+
<span class="cline-any cline-no"> </span>
|
|
593
|
+
<span class="cline-any cline-yes">2x</span>
|
|
594
|
+
<span class="cline-any cline-yes">2x</span>
|
|
595
|
+
<span class="cline-any cline-yes">2x</span>
|
|
596
|
+
<span class="cline-any cline-yes">2x</span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-no"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-no"> </span>
|
|
606
|
+
<span class="cline-any cline-no"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
609
|
+
<span class="cline-any cline-no"> </span>
|
|
610
|
+
<span class="cline-any cline-no"> </span>
|
|
611
|
+
<span class="cline-any cline-no"> </span>
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
613
|
+
<span class="cline-any cline-no"> </span>
|
|
614
|
+
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-no"> </span>
|
|
616
|
+
<span class="cline-any cline-no"> </span>
|
|
617
|
+
<span class="cline-any cline-no"> </span>
|
|
618
|
+
<span class="cline-any cline-yes">2x</span>
|
|
619
|
+
<span class="cline-any cline-yes">2x</span>
|
|
620
|
+
<span class="cline-any cline-yes">2x</span>
|
|
621
|
+
<span class="cline-any cline-yes">2x</span>
|
|
622
|
+
<span class="cline-any cline-no"> </span>
|
|
623
|
+
<span class="cline-any cline-no"> </span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-yes">2x</span>
|
|
626
|
+
<span class="cline-any cline-yes">2x</span>
|
|
627
|
+
<span class="cline-any cline-yes">2x</span>
|
|
628
|
+
<span class="cline-any cline-yes">2x</span>
|
|
629
|
+
<span class="cline-any cline-yes">2x</span>
|
|
630
|
+
<span class="cline-any cline-yes">2x</span>
|
|
631
|
+
<span class="cline-any cline-yes">2x</span>
|
|
632
|
+
<span class="cline-any cline-yes">2x</span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-no"> </span>
|
|
637
|
+
<span class="cline-any cline-yes">2x</span>
|
|
638
|
+
<span class="cline-any cline-yes">2x</span>
|
|
639
|
+
<span class="cline-any cline-no"> </span>
|
|
640
|
+
<span class="cline-any cline-no"> </span>
|
|
641
|
+
<span class="cline-any cline-no"> </span>
|
|
642
|
+
<span class="cline-any cline-no"> </span>
|
|
643
|
+
<span class="cline-any cline-no"> </span>
|
|
644
|
+
<span class="cline-any cline-no"> </span>
|
|
645
|
+
<span class="cline-any cline-no"> </span>
|
|
646
|
+
<span class="cline-any cline-yes">2x</span>
|
|
647
|
+
<span class="cline-any cline-no"> </span>
|
|
648
|
+
<span class="cline-any cline-no"> </span>
|
|
649
|
+
<span class="cline-any cline-no"> </span>
|
|
650
|
+
<span class="cline-any cline-yes">2x</span>
|
|
651
|
+
<span class="cline-any cline-yes">2x</span>
|
|
652
|
+
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-no"> </span>
|
|
654
|
+
<span class="cline-any cline-no"> </span>
|
|
655
|
+
<span class="cline-any cline-no"> </span>
|
|
656
|
+
<span class="cline-any cline-no"> </span>
|
|
657
|
+
<span class="cline-any cline-no"> </span>
|
|
658
|
+
<span class="cline-any cline-no"> </span>
|
|
659
|
+
<span class="cline-any cline-no"> </span>
|
|
660
|
+
<span class="cline-any cline-no"> </span>
|
|
661
|
+
<span class="cline-any cline-no"> </span>
|
|
662
|
+
<span class="cline-any cline-no"> </span>
|
|
663
|
+
<span class="cline-any cline-no"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-no"> </span>
|
|
670
|
+
<span class="cline-any cline-no"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-no"> </span>
|
|
674
|
+
<span class="cline-any cline-no"> </span>
|
|
675
|
+
<span class="cline-any cline-no"> </span>
|
|
676
|
+
<span class="cline-any cline-no"> </span>
|
|
677
|
+
<span class="cline-any cline-no"> </span>
|
|
678
|
+
<span class="cline-any cline-no"> </span>
|
|
679
|
+
<span class="cline-any cline-no"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
681
|
+
<span class="cline-any cline-no"> </span>
|
|
682
|
+
<span class="cline-any cline-no"> </span>
|
|
683
|
+
<span class="cline-any cline-no"> </span>
|
|
684
|
+
<span class="cline-any cline-no"> </span>
|
|
685
|
+
<span class="cline-any cline-yes">2x</span>
|
|
686
|
+
<span class="cline-any cline-yes">2x</span>
|
|
687
|
+
<span class="cline-any cline-yes">2x</span>
|
|
688
|
+
<span class="cline-any cline-yes">2x</span>
|
|
689
|
+
<span class="cline-any cline-yes">2x</span>
|
|
690
|
+
<span class="cline-any cline-yes">2x</span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-no"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-yes">2x</span>
|
|
699
|
+
<span class="cline-any cline-yes">2x</span>
|
|
700
|
+
<span class="cline-any cline-yes">2x</span>
|
|
701
|
+
<span class="cline-any cline-yes">2x</span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
704
|
+
<span class="cline-any cline-no"> </span>
|
|
705
|
+
<span class="cline-any cline-no"> </span>
|
|
706
|
+
<span class="cline-any cline-no"> </span>
|
|
707
|
+
<span class="cline-any cline-no"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-yes">2x</span>
|
|
712
|
+
<span class="cline-any cline-yes">2x</span>
|
|
713
|
+
<span class="cline-any cline-yes">2x</span>
|
|
714
|
+
<span class="cline-any cline-yes">2x</span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-yes">2x</span>
|
|
720
|
+
<span class="cline-any cline-yes">2x</span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-no"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-no"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-yes">2x</span>
|
|
730
|
+
<span class="cline-any cline-yes">2x</span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-yes">2x</span>
|
|
746
|
+
<span class="cline-any cline-yes">2x</span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-yes">2x</span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-yes">2x</span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-no"> </span>
|
|
770
|
+
<span class="cline-any cline-no"> </span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-yes">2x</span>
|
|
775
|
+
<span class="cline-any cline-yes">2x</span>
|
|
776
|
+
<span class="cline-any cline-yes">2x</span>
|
|
777
|
+
<span class="cline-any cline-yes">2x</span>
|
|
778
|
+
<span class="cline-any cline-yes">2x</span>
|
|
779
|
+
<span class="cline-any cline-yes">2x</span>
|
|
780
|
+
<span class="cline-any cline-yes">2x</span>
|
|
781
|
+
<span class="cline-any cline-yes">2x</span>
|
|
782
|
+
<span class="cline-any cline-yes">2x</span>
|
|
783
|
+
<span class="cline-any cline-no"> </span>
|
|
784
|
+
<span class="cline-any cline-no"> </span>
|
|
785
|
+
<span class="cline-any cline-no"> </span>
|
|
786
|
+
<span class="cline-any cline-no"> </span>
|
|
787
|
+
<span class="cline-any cline-no"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-no"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-no"> </span>
|
|
794
|
+
<span class="cline-any cline-yes">2x</span>
|
|
795
|
+
<span class="cline-any cline-yes">2x</span>
|
|
796
|
+
<span class="cline-any cline-yes">2x</span>
|
|
797
|
+
<span class="cline-any cline-yes">2x</span>
|
|
798
|
+
<span class="cline-any cline-yes">2x</span>
|
|
799
|
+
<span class="cline-any cline-yes">2x</span>
|
|
800
|
+
<span class="cline-any cline-no"> </span>
|
|
801
|
+
<span class="cline-any cline-no"> </span>
|
|
802
|
+
<span class="cline-any cline-no"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-no"> </span>
|
|
806
|
+
<span class="cline-any cline-no"> </span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-no"> </span>
|
|
809
|
+
<span class="cline-any cline-no"> </span>
|
|
810
|
+
<span class="cline-any cline-no"> </span>
|
|
811
|
+
<span class="cline-any cline-no"> </span>
|
|
812
|
+
<span class="cline-any cline-no"> </span>
|
|
813
|
+
<span class="cline-any cline-no"> </span>
|
|
814
|
+
<span class="cline-any cline-no"> </span>
|
|
815
|
+
<span class="cline-any cline-yes">2x</span>
|
|
816
|
+
<span class="cline-any cline-yes">2x</span>
|
|
817
|
+
<span class="cline-any cline-yes">2x</span>
|
|
818
|
+
<span class="cline-any cline-yes">2x</span>
|
|
819
|
+
<span class="cline-any cline-yes">2x</span>
|
|
820
|
+
<span class="cline-any cline-no"> </span>
|
|
821
|
+
<span class="cline-any cline-no"> </span>
|
|
822
|
+
<span class="cline-any cline-no"> </span>
|
|
823
|
+
<span class="cline-any cline-no"> </span>
|
|
824
|
+
<span class="cline-any cline-no"> </span>
|
|
825
|
+
<span class="cline-any cline-no"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-no"> </span>
|
|
828
|
+
<span class="cline-any cline-no"> </span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
830
|
+
<span class="cline-any cline-no"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-no"> </span>
|
|
833
|
+
<span class="cline-any cline-no"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
835
|
+
<span class="cline-any cline-yes">2x</span>
|
|
836
|
+
<span class="cline-any cline-yes">2x</span>
|
|
837
|
+
<span class="cline-any cline-yes">2x</span>
|
|
838
|
+
<span class="cline-any cline-yes">2x</span>
|
|
839
|
+
<span class="cline-any cline-yes">2x</span>
|
|
840
|
+
<span class="cline-any cline-yes">2x</span>
|
|
841
|
+
<span class="cline-any cline-yes">2x</span>
|
|
842
|
+
<span class="cline-any cline-yes">2x</span>
|
|
843
|
+
<span class="cline-any cline-yes">2x</span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-no"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-no"> </span>
|
|
849
|
+
<span class="cline-any cline-no"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-no"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-yes">2x</span>
|
|
874
|
+
<span class="cline-any cline-yes">2x</span>
|
|
875
|
+
<span class="cline-any cline-yes">2x</span>
|
|
876
|
+
<span class="cline-any cline-yes">2x</span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-no"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-no"> </span>
|
|
909
|
+
<span class="cline-any cline-yes">2x</span>
|
|
910
|
+
<span class="cline-any cline-yes">2x</span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-yes">2x</span>
|
|
917
|
+
<span class="cline-any cline-yes">2x</span>
|
|
918
|
+
<span class="cline-any cline-yes">2x</span>
|
|
919
|
+
<span class="cline-any cline-yes">2x</span>
|
|
920
|
+
<span class="cline-any cline-no"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-no"> </span>
|
|
923
|
+
<span class="cline-any cline-yes">2x</span>
|
|
924
|
+
<span class="cline-any cline-yes">2x</span>
|
|
925
|
+
<span class="cline-any cline-yes">2x</span>
|
|
926
|
+
<span class="cline-any cline-yes">2x</span>
|
|
927
|
+
<span class="cline-any cline-yes">2x</span>
|
|
928
|
+
<span class="cline-any cline-no"> </span>
|
|
929
|
+
<span class="cline-any cline-no"> </span>
|
|
930
|
+
<span class="cline-any cline-no"> </span>
|
|
931
|
+
<span class="cline-any cline-yes">2x</span>
|
|
932
|
+
<span class="cline-any cline-yes">2x</span>
|
|
933
|
+
<span class="cline-any cline-no"> </span>
|
|
934
|
+
<span class="cline-any cline-no"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-yes">2x</span>
|
|
937
|
+
<span class="cline-any cline-yes">2x</span>
|
|
938
|
+
<span class="cline-any cline-yes">2x</span></td><td class="text"><pre class="prettyprint lang-js">//----------------------------------------
|
|
939
|
+
// OBJECT UTILS
|
|
940
|
+
//----------------------------------------
|
|
941
|
+
import { ObjectGeneric } from './types'
|
|
942
|
+
import { err500IfNotSet } from './error-utils'
|
|
943
|
+
import { recursiveGenericFunctionSync } from './loop-utils'
|
|
944
|
+
import { isset } from './isset'
|
|
945
|
+
import { isObject } from './is-object'
|
|
946
|
+
import { DescriptiveError } from './error-utils'
|
|
947
|
+
import { escapeRegexp } from './regexp-utils'
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
/** Return an object:
|
|
951
|
+
* * with only selected fields
|
|
952
|
+
* * OR without masked fields
|
|
953
|
+
*/
|
|
954
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function simpleObjectMaskOrSelect<Obj extends ObjectGeneric>(</span></span>
|
|
955
|
+
<span class="cstat-no" title="statement not covered" > object: Obj,</span>
|
|
956
|
+
<span class="cstat-no" title="statement not covered" > maskedOrSelectedFields: (keyof Obj)[],</span>
|
|
957
|
+
<span class="cstat-no" title="statement not covered" > mode: 'mask' | 'select' = 'mask',</span>
|
|
958
|
+
<span class="cstat-no" title="statement not covered" > deleteKeysInsteadOfReturningAnewObject = false</span>
|
|
959
|
+
<span class="cstat-no" title="statement not covered" >): Obj {</span>
|
|
960
|
+
<span class="cstat-no" title="statement not covered" > const allKeys = Object.keys(object)</span>
|
|
961
|
+
<span class="cstat-no" title="statement not covered" > const keysToMask = allKeys.filter(keyName => {</span>
|
|
962
|
+
<span class="cstat-no" title="statement not covered" > if (mode === 'mask') return maskedOrSelectedFields.includes(keyName)</span>
|
|
963
|
+
<span class="cstat-no" title="statement not covered" > else return !maskedOrSelectedFields.includes(keyName)</span>
|
|
964
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
965
|
+
<span class="cstat-no" title="statement not covered" > if (deleteKeysInsteadOfReturningAnewObject) {</span>
|
|
966
|
+
<span class="cstat-no" title="statement not covered" > keysToMask.forEach(keyNameToDelete => delete object[keyNameToDelete])</span>
|
|
967
|
+
<span class="cstat-no" title="statement not covered" > return object</span>
|
|
968
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
969
|
+
<span class="cstat-no" title="statement not covered" > return allKeys.reduce((newObject, key) => {</span>
|
|
970
|
+
<span class="cstat-no" title="statement not covered" > if (!keysToMask.includes(key)) newObject[key] = object[key]</span>
|
|
971
|
+
<span class="cstat-no" title="statement not covered" > return newObject</span>
|
|
972
|
+
<span class="cstat-no" title="statement not covered" > }, {}) as Obj</span>
|
|
973
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
974
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* check if **object OR array** has property Safely (avoid cannot read property x of null and such)
|
|
978
|
+
* @param {Object} obj object to test against
|
|
979
|
+
* @param {string} addr `a.b.c.0.1` will test if myObject has props a that has prop b. Work wit arrays as well (like `arr.0`)
|
|
980
|
+
*/
|
|
981
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function has(obj: ObjectGeneric, addr: string) {</span></span>
|
|
982
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(obj) || typeof obj !== 'object') return</span>
|
|
983
|
+
<span class="cstat-no" title="statement not covered" > const propsArr = addr.replace(/\.?\[(\d+)\]/g, '.$1').split('.') // replace a[3] => a.3;</span>
|
|
984
|
+
<span class="cstat-no" title="statement not covered" > let objChain = obj</span>
|
|
985
|
+
<span class="cstat-no" title="statement not covered" > return propsArr.every(prop => {</span>
|
|
986
|
+
<span class="cstat-no" title="statement not covered" > objChain = objChain[prop]</span>
|
|
987
|
+
<span class="cstat-no" title="statement not covered" > return isset(objChain)</span>
|
|
988
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
989
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
990
|
+
|
|
991
|
+
/** Find address in an object "a.b.c" IN { a : { b : {c : 'blah' }}} RETURNS 'blah'
|
|
992
|
+
* @param obj
|
|
993
|
+
* @param addr accept syntax like "obj.subItem.[0].sub2" OR "obj.subItem.0.sub2" OR "obj.subItem[0].sub2"
|
|
994
|
+
* @returns the last item of the chain OR undefined if not found
|
|
995
|
+
*/
|
|
996
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function findByAddress(obj: ObjectGeneric, addr: string | string[]): any | undefined {</span></span>
|
|
997
|
+
<span class="cstat-no" title="statement not covered" > if (addr.length === 0) return obj</span>
|
|
998
|
+
<span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
|
|
999
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(obj) || typeof obj !== 'object') return console.warn('Main object in `findByAddress` function is undefined or has the wrong type')</span>
|
|
1000
|
+
<span class="cstat-no" title="statement not covered" > const propsArr = Array.isArray(addr) ? addr : addr.replace(/\.?\[(\d+)\]/g, '.$1').split('.') // replace .[4] AND [4] TO .4</span>
|
|
1001
|
+
<span class="cstat-no" title="statement not covered" > const objRef = propsArr.reduce((objChain, prop) => {</span>
|
|
1002
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(objChain) || typeof objChain !== 'object' || !isset(objChain[prop])) return</span>
|
|
1003
|
+
<span class="cstat-no" title="statement not covered" > else return objChain[prop]</span>
|
|
1004
|
+
<span class="cstat-no" title="statement not covered" > }, obj)</span>
|
|
1005
|
+
<span class="cstat-no" title="statement not covered" > return objRef</span>
|
|
1006
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1007
|
+
|
|
1008
|
+
type FindByAddressReturnFull = Array<[addr: string, value: any, lastElmKey: string, parent: any[] | Record<string, any>]>
|
|
1009
|
+
/** Will return all objects matching that path. Eg: user.*.myVar */
|
|
1010
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function findByAddressAll<ReturnAddresses extends boolean = false>(</span></span>
|
|
1011
|
+
<span class="cstat-no" title="statement not covered" > obj: Record<string, any>,</span>
|
|
1012
|
+
<span class="cstat-no" title="statement not covered" > addr: string,</span>
|
|
1013
|
+
<span class="cstat-no" title="statement not covered" > returnAddresses: ReturnAddresses = false as ReturnAddresses</span>
|
|
1014
|
+
<span class="cstat-no" title="statement not covered" >): ReturnAddresses extends true ? FindByAddressReturnFull : Array<any> {</span>
|
|
1015
|
+
<span class="cstat-no" title="statement not covered" > err500IfNotSet({ obj, addr })</span>
|
|
1016
|
+
<span class="cstat-no" title="statement not covered" > if (addr === '') return returnAddresses ? [addr, obj, undefined, undefined] as any : obj</span>
|
|
1017
|
+
<span class="cstat-no" title="statement not covered" > const addrRegexp = new RegExp('^' + escapeRegexp(</span>
|
|
1018
|
+
<span class="cstat-no" title="statement not covered" > addr.replace(/\.?\[(\d+)\]/g, '.$1'), // replace .[4] AND [4] TO .4</span>
|
|
1019
|
+
<span class="cstat-no" title="statement not covered" > { parseStarChar: true, wildcardNotMatchingChars: '.[' }) + '$'</span>
|
|
1020
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
1021
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1022
|
+
<span class="cstat-no" title="statement not covered" > const matchingItems: any[] = []</span>
|
|
1023
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1024
|
+
<span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(obj, (item, address, lastElmKey, parent) => {</span>
|
|
1025
|
+
<span class="cstat-no" title="statement not covered" > if (addrRegexp.test(address)) matchingItems.push(returnAddresses ? [address, item, lastElmKey, parent] : item)</span>
|
|
1026
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1027
|
+
<span class="cstat-no" title="statement not covered" > return matchingItems</span>
|
|
1028
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1029
|
+
|
|
1030
|
+
/** Enforce writing subItems. Eg: user.name.blah will ensure all are set until the writing of the last item
|
|
1031
|
+
* NOTE: doesn't work when parent is array
|
|
1032
|
+
*/
|
|
1033
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objForceWrite<MainObj extends Record<string, any>>(obj: MainObj, addr: string, item, options: { doNotWriteFinalValue?: boolean } = {}): MainObj {</span></span>
|
|
1034
|
+
<span class="cstat-no" title="statement not covered" > const { doNotWriteFinalValue = false } = options</span>
|
|
1035
|
+
<span class="cstat-no" title="statement not covered" > const writeFinalValue = !doNotWriteFinalValue</span>
|
|
1036
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1037
|
+
<span class="cstat-no" title="statement not covered" > const chunks = addr.replace(/\.?\[(\d+)\]/g, '.[$1').split('.')</span>
|
|
1038
|
+
<span class="cstat-no" title="statement not covered" > let lastItem: any = obj</span>
|
|
1039
|
+
<span class="cstat-no" title="statement not covered" > chunks.forEach((chunkRaw, i) => {</span>
|
|
1040
|
+
<span class="cstat-no" title="statement not covered" > const chunk = chunkRaw.replace(/^\[/, '')</span>
|
|
1041
|
+
<span class="cstat-no" title="statement not covered" > if (i === chunks.length - 1) {</span>
|
|
1042
|
+
<span class="cstat-no" title="statement not covered" > if (writeFinalValue) lastItem[chunk] = item</span>
|
|
1043
|
+
<span class="cstat-no" title="statement not covered" > } else if (!isset(lastItem[chunk])) {</span>
|
|
1044
|
+
<span class="cstat-no" title="statement not covered" > const nextChunk = chunks[i + 1]</span>
|
|
1045
|
+
<span class="cstat-no" title="statement not covered" > if (isset(nextChunk) && nextChunk.startsWith('[')) lastItem[chunk] = []</span>
|
|
1046
|
+
<span class="cstat-no" title="statement not covered" > else lastItem[chunk] = {}</span>
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > } else if (typeof lastItem[chunk] !== 'object') {</span>
|
|
1048
|
+
<span class="cstat-no" title="statement not covered" > throw new DescriptiveError(`itemNotTypeObjectOrArrayInAddrChainForObjForceWrite`, { code: 500, origin: 'Validator', chunks: chunks.map(c => c.replace(/\[(\d+)/, '[$1]')), actualValueOfItem: lastItem[chunk], actualChunk: chunk, chunkIndex: i })</span>
|
|
1049
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1050
|
+
<span class="cstat-no" title="statement not covered" > lastItem = lastItem[chunk]</span>
|
|
1051
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1052
|
+
<span class="cstat-no" title="statement not covered" > return obj</span>
|
|
1053
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function forcePathInObject<MainObj extends Record<string, any>>(obj: MainObj, addr: string): MainObj {</span></span>
|
|
1059
|
+
<span class="cstat-no" title="statement not covered" > return objForceWrite(obj, addr, undefined, { doNotWriteFinalValue: true })</span>
|
|
1060
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1061
|
+
|
|
1062
|
+
export const objForceWritePath = forcePathInObject
|
|
1063
|
+
|
|
1064
|
+
/** Enforce writing subItems, only if obj.addr is empty.
|
|
1065
|
+
* Eg: user.name.blah will ensure all are set until the writing of the last item
|
|
1066
|
+
* if user.name.blah has a value it will not change it.
|
|
1067
|
+
* NOTE: doesn't work when parent is array
|
|
1068
|
+
*/
|
|
1069
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objForceWriteIfNotSet<MainObj extends Record<string, any>>(obj: MainObj, addr: string, item): MainObj {</span></span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(findByAddress(obj, addr))) return objForceWrite(obj, addr, item)</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > else return obj</span>
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1073
|
+
|
|
1074
|
+
/** Merge mixins into class. Use it in the constructor like: mergeMixins(this, {myMixin: true}) */
|
|
1075
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeMixins(that, ...mixins) {</span></span>
|
|
1076
|
+
<span class="cstat-no" title="statement not covered" > mixins.forEach(mixin => {</span>
|
|
1077
|
+
<span class="cstat-no" title="statement not covered" > for (const method in mixin) {</span>
|
|
1078
|
+
<span class="cstat-no" title="statement not covered" > that[method] = mixin[method]</span>
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1080
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1081
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1082
|
+
|
|
1083
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function cloneObject<MainObj extends Record<string, any>>(o: MainObj): MainObj {</span></span>
|
|
1084
|
+
<span class="cstat-no" title="statement not covered" > return JSON.parse(JSON.stringify(o))</span>
|
|
1085
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1086
|
+
|
|
1087
|
+
/** Deep clone. WILL REMOVE circular references */
|
|
1088
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function deepClone<MainObj extends Record<string, any>>(obj: MainObj, cache = []): MainObj {</span></span>
|
|
1089
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > let copy: any | any[]</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > // usefull to not modify 1st level objet by lower levels</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > // this is required for the same object to be referenced not in a redundant way</span>
|
|
1093
|
+
<span class="cstat-no" title="statement not covered" > const newCache: any[] = [...cache]</span>
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > if (obj instanceof Date) return new Date(obj) as any</span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > // Handle Array</span>
|
|
1097
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(obj)) {</span>
|
|
1098
|
+
<span class="cstat-no" title="statement not covered" > if (newCache.includes(obj)) return [] as any</span>
|
|
1099
|
+
<span class="cstat-no" title="statement not covered" > newCache.push(obj)</span>
|
|
1100
|
+
<span class="cstat-no" title="statement not covered" > copy = []</span>
|
|
1101
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0, len = obj.length; i < len; i++) {</span>
|
|
1102
|
+
<span class="cstat-no" title="statement not covered" > copy[i] = deepClone(obj[i], newCache as any)</span>
|
|
1103
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1104
|
+
<span class="cstat-no" title="statement not covered" > return copy</span>
|
|
1105
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1106
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1107
|
+
<span class="cstat-no" title="statement not covered" > if (typeof obj === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype) {</span>
|
|
1108
|
+
<span class="cstat-no" title="statement not covered" > if (newCache.includes(obj)) return {} as any</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" > newCache.push(obj)</span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > copy = {}</span>
|
|
1111
|
+
<span class="cstat-no" title="statement not covered" > for (const key in obj) {</span>
|
|
1112
|
+
<span class="cstat-no" title="statement not covered" > if (Object.prototype.hasOwnProperty.call(obj, key)) {</span>
|
|
1113
|
+
<span class="cstat-no" title="statement not covered" > copy[key] = deepClone(obj[key], newCache as any)</span>
|
|
1114
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1115
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" > return copy</span>
|
|
1117
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1118
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1119
|
+
<span class="cstat-no" title="statement not covered" > return obj // number, string...</span>
|
|
1120
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
/**
|
|
1124
|
+
* @param {Object} obj the object on which we want to filter the keys
|
|
1125
|
+
* @param {function} filterFunc function that returns true if the key match the wanted criteria
|
|
1126
|
+
*/
|
|
1127
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function filterKeys<MainObj extends Record<string, any>>(obj: MainObj, filter): MainObj {</span></span>
|
|
1128
|
+
<span class="cstat-no" title="statement not covered" > const clone = cloneObject(obj)</span>
|
|
1129
|
+
<span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(obj, (_, addr, lastElementKey) => {</span>
|
|
1130
|
+
<span class="cstat-no" title="statement not covered" > if (!filter(lastElementKey)) deleteByAddress(clone, addr.split('.'))</span>
|
|
1131
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1132
|
+
<span class="cstat-no" title="statement not covered" > return clone</span>
|
|
1133
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1134
|
+
/**
|
|
1135
|
+
* @param {Object} obj the object on which we want to delete a property
|
|
1136
|
+
* @param {Array} addrArr addressArray on which to delete the property
|
|
1137
|
+
*/
|
|
1138
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function deleteByAddress(obj: object, addr: string | string[]) {</span></span>
|
|
1139
|
+
<span class="cstat-no" title="statement not covered" > let current = obj</span>
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > const addrArr = Array.isArray(addr) ? addr : addr.split('.')</span>
|
|
1141
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < addrArr.length; i++) {</span>
|
|
1142
|
+
<span class="cstat-no" title="statement not covered" > const currentAddr = addrArr[i].replace(/(\[|\])/g, '')</span>
|
|
1143
|
+
<span class="cstat-no" title="statement not covered" > if (i === addrArr.length - 1) delete current[currentAddr]</span>
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" > else current = current[currentAddr]</span>
|
|
1145
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1146
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1147
|
+
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
/** Remove all key/values pair if value is undefined */
|
|
1151
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objFilterUndefined<MainObj extends Record<string, any>>(o: MainObj): MainObj {</span></span>
|
|
1152
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(o).forEach(k => !isset(o[k]) && delete o[k])</span>
|
|
1153
|
+
<span class="cstat-no" title="statement not covered" > return o</span>
|
|
1154
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1155
|
+
|
|
1156
|
+
/** Lock all 1st level props of an object to read only */
|
|
1157
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnly<MainObj extends Record<string, any>>(o: MainObj): { readonly [AA in keyof MainObj]: MainObj[AA] } {</span></span>
|
|
1158
|
+
<span class="cstat-no" title="statement not covered" > const throwErr = () => { throw new DescriptiveError('Cannot modify object that is read only', { code: 500 }) }</span>
|
|
1159
|
+
<span class="cstat-no" title="statement not covered" > return new Proxy(o, {</span>
|
|
1160
|
+
<span class="cstat-no" title="statement not covered" > set: throwErr,</span>
|
|
1161
|
+
<span class="cstat-no" title="statement not covered" > defineProperty: throwErr,</span>
|
|
1162
|
+
<span class="cstat-no" title="statement not covered" > deleteProperty: throwErr,</span>
|
|
1163
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1164
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1165
|
+
|
|
1166
|
+
/** Fields of the object can be created BUT NOT reassignated */
|
|
1167
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function reassignForbidden(o) {</span></span>
|
|
1168
|
+
<span class="cstat-no" title="statement not covered" > return new Proxy(o, {</span>
|
|
1169
|
+
<span class="cstat-no" title="statement not covered" > defineProperty: function (that, key, value) {</span>
|
|
1170
|
+
<span class="cstat-no" title="statement not covered" > if (key in that) throw new DescriptiveError(`Cannot reassign the property ${key.toString()} of this object`, { code: 500 })</span>
|
|
1171
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1172
|
+
<span class="cstat-no" title="statement not covered" > that[key] = value</span>
|
|
1173
|
+
<span class="cstat-no" title="statement not covered" > return true</span>
|
|
1174
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1175
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
1176
|
+
<span class="cstat-no" title="statement not covered" > deleteProperty: function (_, key) {</span>
|
|
1177
|
+
<span class="cstat-no" title="statement not covered" > throw new DescriptiveError(`Cannot delete the property ${key.toString()} of this object`, { code: 500 })</span>
|
|
1178
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1179
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1180
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1181
|
+
|
|
1182
|
+
/** All fileds and subFields of the object will become readOnly */
|
|
1183
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnlyForAll(object) {</span></span>
|
|
1184
|
+
<span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(object, (item, _, lastElementKey, parent) => {</span>
|
|
1185
|
+
<span class="cstat-no" title="statement not covered" > if (typeof item === 'object') parent[lastElementKey] = readOnly(item)</span>
|
|
1186
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1187
|
+
<span class="cstat-no" title="statement not covered" > return object</span>
|
|
1188
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1189
|
+
|
|
1190
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objFilterUndefinedRecursive(obj) {</span></span>
|
|
1191
|
+
<span class="cstat-no" title="statement not covered" > if (obj) {</span>
|
|
1192
|
+
<span class="cstat-no" title="statement not covered" > const flattenedObj = flattenObject(obj)</span>
|
|
1193
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(flattenedObj).forEach(key => {</span>
|
|
1194
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(flattenedObj[key])) {</span>
|
|
1195
|
+
<span class="cstat-no" title="statement not covered" > delete flattenedObj[key]</span>
|
|
1196
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1197
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1198
|
+
<span class="cstat-no" title="statement not covered" > return unflattenObject(flattenedObj)</span>
|
|
1199
|
+
<span class="cstat-no" title="statement not covered" > } else return obj</span>
|
|
1200
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1201
|
+
|
|
1202
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function sortObjKeyAccordingToValue(unorderedObj, ascending = true) {</span></span>
|
|
1203
|
+
<span class="cstat-no" title="statement not covered" > const orderedObj = {}</span>
|
|
1204
|
+
<span class="cstat-no" title="statement not covered" > const sortingConst = ascending ? 1 : -1</span>
|
|
1205
|
+
<span class="cstat-no" title="statement not covered" > Object.keys(unorderedObj)</span>
|
|
1206
|
+
<span class="cstat-no" title="statement not covered" > .sort((keyA, keyB) => unorderedObj[keyA] < unorderedObj[keyB] ? sortingConst : -sortingConst)</span>
|
|
1207
|
+
<span class="cstat-no" title="statement not covered" > .forEach(key => { orderedObj[key] = unorderedObj[key] })</span>
|
|
1208
|
+
<span class="cstat-no" title="statement not covered" > return orderedObj</span>
|
|
1209
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1210
|
+
|
|
1211
|
+
/**
|
|
1212
|
+
* Make default value if object key do not exist
|
|
1213
|
+
* @param {object} obj
|
|
1214
|
+
* @param {string} addr
|
|
1215
|
+
* @param {any} defaultValue
|
|
1216
|
+
* @param {function} callback (obj[addr]) => processValue. Eg: myObjAddr => myObjAddr.push('bikou')
|
|
1217
|
+
* @return obj[addr] eventually processed by the callback
|
|
1218
|
+
*/
|
|
1219
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function ensureObjectProp<MainObj extends Record<string, any>, Addr extends string>(</span></span>
|
|
1220
|
+
<span class="cstat-no" title="statement not covered" > obj: MainObj,</span>
|
|
1221
|
+
<span class="cstat-no" title="statement not covered" > addr: Addr,</span>
|
|
1222
|
+
<span class="cstat-no" title="statement not covered" > defaultValue,</span>
|
|
1223
|
+
<span class="cstat-no" title="statement not covered" > callback: (o: any) => any</span>
|
|
1224
|
+
<span class="cstat-no" title="statement not covered" >): MainObj[Addr] {</span>
|
|
1225
|
+
<span class="cstat-no" title="statement not covered" > err500IfNotSet({ obj, addr, defaultValue, callback })</span>
|
|
1226
|
+
<span class="cstat-no" title="statement not covered" > if (!isset(obj[addr])) obj[addr] = defaultValue</span>
|
|
1227
|
+
<span class="cstat-no" title="statement not covered" > if (callback) callback(obj[addr])</span>
|
|
1228
|
+
<span class="cstat-no" title="statement not covered" > return obj[addr]</span>
|
|
1229
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
/** object and array merge
|
|
1233
|
+
* @warn /!\ Array will be merged and duplicate values will be deleted /!\
|
|
1234
|
+
* @return {Object} new object result from merge
|
|
1235
|
+
* NOTE: objects in params will NOT be modified*/
|
|
1236
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeep<</span></span>
|
|
1237
|
+
<span class="cstat-no" title="statement not covered" > O1 extends Record<string, any>,</span>
|
|
1238
|
+
<span class="cstat-no" title="statement not covered" > O2 extends Record<string, any> = Record<string, any>,</span>
|
|
1239
|
+
<span class="cstat-no" title="statement not covered" > O3 extends Record<string, any> = Record<string, any>,</span>
|
|
1240
|
+
<span class="cstat-no" title="statement not covered" > O4 extends Record<string, any> = Record<string, any>,</span>
|
|
1241
|
+
<span class="cstat-no" title="statement not covered" > O5 extends Record<string, any> = Record<string, any>,</span>
|
|
1242
|
+
<span class="cstat-no" title="statement not covered" > O6 extends Record<string, any> = Record<string, any>,</span>
|
|
1243
|
+
<span class="cstat-no" title="statement not covered" >>(...objects: [O1, O2?, O3?, O4?, O5?, O6?]): O1 & O2 & O3 & O4 & O5 & O6 {</span>
|
|
1244
|
+
<span class="cstat-no" title="statement not covered" > return mergeDeepConfigurable(</span>
|
|
1245
|
+
<span class="cstat-no" title="statement not covered" > (previousVal, currentVal) => [...previousVal, ...currentVal].filter((elm, i, arr) => arr.indexOf(elm) === i),</span>
|
|
1246
|
+
<span class="cstat-no" title="statement not covered" > (previousVal, currentVal) => mergeDeep(previousVal, currentVal),</span>
|
|
1247
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
1248
|
+
<span class="cstat-no" title="statement not covered" > ...objects</span>
|
|
1249
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
1250
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1251
|
+
|
|
1252
|
+
/** object and array merge
|
|
1253
|
+
* @warn /!\ Array will be replaced by the latest object /!\
|
|
1254
|
+
* @return {Object} new object result from merge
|
|
1255
|
+
* NOTE: objects in params will NOT be modified */
|
|
1256
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeepOverrideArrays<</span></span>
|
|
1257
|
+
<span class="cstat-no" title="statement not covered" > O1 extends Record<string, any>,</span>
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > O2 extends Record<string, any> = Record<string, any>,</span>
|
|
1259
|
+
<span class="cstat-no" title="statement not covered" > O3 extends Record<string, any> = Record<string, any>,</span>
|
|
1260
|
+
<span class="cstat-no" title="statement not covered" > O4 extends Record<string, any> = Record<string, any>,</span>
|
|
1261
|
+
<span class="cstat-no" title="statement not covered" > O5 extends Record<string, any> = Record<string, any>,</span>
|
|
1262
|
+
<span class="cstat-no" title="statement not covered" > O6 extends Record<string, any> = Record<string, any>,</span>
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" >>(...objects: [O1, O2?, O3?, O4?, O5?, O6?]): O1 & O2 & O3 & O4 & O5 & O6 {</span>
|
|
1264
|
+
<span class="cstat-no" title="statement not covered" > return mergeDeepConfigurable(</span>
|
|
1265
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
1266
|
+
<span class="cstat-no" title="statement not covered" > (previousVal, currentVal) => mergeDeepOverrideArrays(previousVal, currentVal),</span>
|
|
1267
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
1268
|
+
<span class="cstat-no" title="statement not covered" > ...objects</span>
|
|
1269
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
1270
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1271
|
+
|
|
1272
|
+
/** object and array merge
|
|
1273
|
+
* @param {Function} replacerForArrays item[key] = (prevValue, currentVal) => () When 2 values are arrays,
|
|
1274
|
+
* @param {Function} replacerForObjects item[key] = (prevValue, currentVal) => () When 2 values are objects,
|
|
1275
|
+
* @param {Function} replacerDefault item[key] = (prevValue, currentVal) => () For all other values
|
|
1276
|
+
* @param {...Object} objects
|
|
1277
|
+
* @return {Object} new object result from merge
|
|
1278
|
+
* NOTE: objects in params will NOT be modified
|
|
1279
|
+
*/
|
|
1280
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeepConfigurable<</span></span>
|
|
1281
|
+
<span class="cstat-no" title="statement not covered" > O1 extends Record<string, any>,</span>
|
|
1282
|
+
<span class="cstat-no" title="statement not covered" > O2 extends Record<string, any> = Record<string, any>,</span>
|
|
1283
|
+
<span class="cstat-no" title="statement not covered" > O3 extends Record<string, any> = Record<string, any>,</span>
|
|
1284
|
+
<span class="cstat-no" title="statement not covered" > O4 extends Record<string, any> = Record<string, any>,</span>
|
|
1285
|
+
<span class="cstat-no" title="statement not covered" > O5 extends Record<string, any> = Record<string, any>,</span>
|
|
1286
|
+
<span class="cstat-no" title="statement not covered" > O6 extends Record<string, any> = Record<string, any>,</span>
|
|
1287
|
+
<span class="cstat-no" title="statement not covered" >>(</span>
|
|
1288
|
+
<span class="cstat-no" title="statement not covered" > replacerForArrays = (_, curr) => curr, replacerForObjects,</span>
|
|
1289
|
+
<span class="cstat-no" title="statement not covered" > replacerDefault = (_, curr) => curr,</span>
|
|
1290
|
+
<span class="cstat-no" title="statement not covered" > ...objects: [O1, O2?, O3?, O4?, O5?, O6?]</span>
|
|
1291
|
+
<span class="cstat-no" title="statement not covered" >): O1 & O2 & O3 & O4 & O5 & O6 {</span>
|
|
1292
|
+
<span class="cstat-no" title="statement not covered" > return objects.reduce((actuallyMerged, obj) => {</span>
|
|
1293
|
+
<span class="cstat-no" title="statement not covered" > if (obj && typeof obj === 'object') Object.keys(obj).forEach(key => {</span>
|
|
1294
|
+
<span class="cstat-no" title="statement not covered" > const previousVal = actuallyMerged[key]</span>
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > const currentVal = obj[key]</span>
|
|
1296
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1297
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(previousVal) && Array.isArray(currentVal)) {</span>
|
|
1298
|
+
<span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerForArrays(previousVal, currentVal)</span>
|
|
1299
|
+
<span class="cstat-no" title="statement not covered" > } else if (isObject(previousVal) && isObject(currentVal)) {</span>
|
|
1300
|
+
<span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerForObjects(previousVal, currentVal)</span>
|
|
1301
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1302
|
+
<span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerDefault(previousVal, currentVal)</span>
|
|
1303
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1304
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1305
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1306
|
+
<span class="cstat-no" title="statement not covered" > return actuallyMerged</span>
|
|
1307
|
+
<span class="cstat-no" title="statement not covered" > }, {}) as any</span>
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1309
|
+
|
|
1310
|
+
/** { a: {b:2}} => {'a.b':2} useful for translations
|
|
1311
|
+
* NOTE: will remove circular references
|
|
1312
|
+
*/
|
|
1313
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function flattenObject(data, config: { withoutArraySyntax?: boolean, withArraySyntaxMinified?: boolean } = {}): Record<string, any> {</span></span>
|
|
1314
|
+
<span class="cstat-no" title="statement not covered" > const { withoutArraySyntax = false, withArraySyntaxMinified = false } = config</span>
|
|
1315
|
+
<span class="cstat-no" title="statement not covered" > const result = {}</span>
|
|
1316
|
+
<span class="cstat-no" title="statement not covered" > const seenObjects: any[] = [] // avoidCircular reference to infinite loop</span>
|
|
1317
|
+
<span class="cstat-no" title="statement not covered" > const recurse = (cur, prop) => {</span>
|
|
1318
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(cur)) {</span>
|
|
1319
|
+
<span class="cstat-no" title="statement not covered" > const l = cur.length</span>
|
|
1320
|
+
<span class="cstat-no" title="statement not covered" > let i = 0</span>
|
|
1321
|
+
<span class="cstat-no" title="statement not covered" > if (withoutArraySyntax) recurse(cur[0], prop)</span>
|
|
1322
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1323
|
+
<span class="cstat-no" title="statement not covered" > for (; i < l; i++) recurse(cur[i], prop + (withArraySyntaxMinified ? `.${i}` : `[${i}]`))</span>
|
|
1324
|
+
<span class="cstat-no" title="statement not covered" > if (l == 0) result[prop] = []</span>
|
|
1325
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1326
|
+
<span class="cstat-no" title="statement not covered" > } else if (isObject(cur)) { // is object</span>
|
|
1327
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1328
|
+
<span class="cstat-no" title="statement not covered" > if (seenObjects.includes(cur)) cur = deepClone(cur) // avoid circular ref but allow duplicate objects</span>
|
|
1329
|
+
<span class="cstat-no" title="statement not covered" > else seenObjects.push(cur)</span>
|
|
1330
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1331
|
+
<span class="cstat-no" title="statement not covered" > const isEmpty = Object.keys(cur).length === 0</span>
|
|
1332
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1333
|
+
<span class="cstat-no" title="statement not covered" > for (const p in cur) recurse(cur[p], (prop ? prop + '.' : '') + p.replace(/\./g, '%')) // allow prop to contain special chars like points);</span>
|
|
1334
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1335
|
+
<span class="cstat-no" title="statement not covered" > if (isEmpty && prop) result[prop] = {}</span>
|
|
1336
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
1337
|
+
<span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
|
|
1338
|
+
<span class="cstat-no" title="statement not covered" > console.warn('Circular reference in flattenObject, impossible to parse')</span>
|
|
1339
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1340
|
+
<span class="cstat-no" title="statement not covered" > } else result[prop] = cur</span>
|
|
1341
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1342
|
+
<span class="cstat-no" title="statement not covered" > recurse(data, '')</span>
|
|
1343
|
+
<span class="cstat-no" title="statement not covered" > return result</span>
|
|
1344
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1345
|
+
|
|
1346
|
+
/** {'a.b':2} => { a: {b:2}} */
|
|
1347
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function unflattenObject(data: Record<string, any>): Record<string, any> {</span></span>
|
|
1348
|
+
<span class="cstat-no" title="statement not covered" > const newO = {}</span>
|
|
1349
|
+
<span class="cstat-no" title="statement not covered" > for (const [addr, value] of Object.entries(data)) objForceWrite(newO, addr, value)</span>
|
|
1350
|
+
<span class="cstat-no" title="statement not covered" > return newO</span>
|
|
1351
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1352
|
+
|
|
1353
|
+
/** Mean to fix typing because type for Object.entries is not accurate. Ref: https://stackoverflow.com/questions/66565322/get-type-keys-in-typescript
|
|
1354
|
+
* /!\ THIS WILL REMOVE SYMBOL AND NUMBER FROM KEY TYPES as this is 99% of the time unwanted for generic objects
|
|
1355
|
+
*/
|
|
1356
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objEntries<Obj extends Record<string, any>>(obj: Obj): ObjEntries<Obj> {</span></span>
|
|
1357
|
+
<span class="cstat-no" title="statement not covered" > return Object.entries(obj) as any</span>
|
|
1358
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1359
|
+
|
|
1360
|
+
/** Will remove Symbol and Number from keys types */
|
|
1361
|
+
type ObjEntries<T, K extends keyof T = keyof T> = (K extends string ? [K, T[K]] : never)[]
|
|
1362
|
+
|
|
1363
|
+
/** Mean to fix typing because type for Object.keys is not accurate */
|
|
1364
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objKeys<Obj extends Record<string, any>>(obj: Obj): (keyof Obj)[] {</span></span>
|
|
1365
|
+
<span class="cstat-no" title="statement not covered" > return Object.keys(obj) as any</span>
|
|
1366
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1367
|
+
|
|
1368
|
+
/** Will merge all arrays of an object into a single array */
|
|
1369
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeObjectArrays<T extends Record<string, any[]>>(obj: T) {</span></span>
|
|
1370
|
+
<span class="cstat-no" title="statement not covered" > return Object.values(obj).flat() as (T[keyof T][number])[]</span>
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1372
|
+
|
|
1373
|
+
export const keys = objKeys
|
|
1374
|
+
export const entries = objEntries</pre></td></tr></table></pre>
|
|
1375
|
+
|
|
1376
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1377
|
+
</div><!-- /wrapper -->
|
|
1378
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1379
|
+
Code coverage generated by
|
|
1380
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1381
|
+
at 2024-08-30T12:49:01.025Z
|
|
1382
|
+
</div>
|
|
1383
|
+
<script src="prettify.js"></script>
|
|
1384
|
+
<script>
|
|
1385
|
+
window.onload = function () {
|
|
1386
|
+
prettyPrint();
|
|
1387
|
+
};
|
|
1388
|
+
</script>
|
|
1389
|
+
<script src="sorter.js"></script>
|
|
1390
|
+
<script src="block-navigation.js"></script>
|
|
1391
|
+
</body>
|
|
1392
|
+
</html>
|
|
1393
|
+
|