topkat-utils 1.3.12 → 1.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/src/error-utils.d.ts +1 -4
  2. package/dist/src/error-utils.js +12 -15
  3. package/dist/src/error-utils.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/error-utils.ts +11 -15
  6. package/.yarn/install-state.gz +0 -0
  7. package/coverage/clover.xml +0 -1991
  8. package/coverage/coverage-final.json +0 -17
  9. package/coverage/lcov-report/base.css +0 -224
  10. package/coverage/lcov-report/block-navigation.js +0 -87
  11. package/coverage/lcov-report/clean-stack-trace.ts.html +0 -199
  12. package/coverage/lcov-report/config.ts.html +0 -352
  13. package/coverage/lcov-report/error-utils.ts.html +0 -766
  14. package/coverage/lcov-report/favicon.png +0 -0
  15. package/coverage/lcov-report/index.html +0 -341
  16. package/coverage/lcov-report/is-empty.ts.html +0 -103
  17. package/coverage/lcov-report/is-nodejs.ts.html +0 -109
  18. package/coverage/lcov-report/is-object.ts.html +0 -91
  19. package/coverage/lcov-report/isset.ts.html +0 -91
  20. package/coverage/lcov-report/logger-utils.ts.html +0 -1159
  21. package/coverage/lcov-report/loop-utils.ts.html +0 -574
  22. package/coverage/lcov-report/math-utils.ts.html +0 -259
  23. package/coverage/lcov-report/object-utils.ts.html +0 -1471
  24. package/coverage/lcov-report/prettify.css +0 -1
  25. package/coverage/lcov-report/prettify.js +0 -2
  26. package/coverage/lcov-report/regexp-utils.ts.html +0 -238
  27. package/coverage/lcov-report/remove-circular-json-stringify.ts.html +0 -139
  28. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  29. package/coverage/lcov-report/sorter.js +0 -196
  30. package/coverage/lcov-report/string-utils.ts.html +0 -964
  31. package/coverage/lcov-report/timer-utils.ts.html +0 -349
  32. package/coverage/lcov-report/transaction-utils.ts.html +0 -274
  33. package/coverage/lcov.info +0 -2405
@@ -1,1471 +0,0 @@
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.72% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>133/463</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/28</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">28.72% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>133/463</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>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
529
- <span class="cline-any cline-yes">2x</span>
530
- <span class="cline-any cline-yes">2x</span>
531
- <span class="cline-any cline-yes">2x</span>
532
- <span class="cline-any cline-yes">2x</span>
533
- <span class="cline-any cline-yes">2x</span>
534
- <span class="cline-any cline-yes">2x</span>
535
- <span class="cline-any cline-yes">2x</span>
536
- <span class="cline-any cline-yes">2x</span>
537
- <span class="cline-any cline-yes">2x</span>
538
- <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-yes">2x</span>
566
- <span class="cline-any cline-yes">2x</span>
567
- <span class="cline-any cline-yes">2x</span>
568
- <span class="cline-any cline-yes">2x</span>
569
- <span class="cline-any cline-yes">2x</span>
570
- <span class="cline-any cline-yes">2x</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-no">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-yes">2x</span>
582
- <span class="cline-any cline-yes">2x</span>
583
- <span class="cline-any cline-yes">2x</span>
584
- <span class="cline-any cline-yes">2x</span>
585
- <span class="cline-any cline-yes">2x</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-yes">2x</span>
598
- <span class="cline-any cline-yes">2x</span>
599
- <span class="cline-any cline-yes">2x</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-no">&nbsp;</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-yes">2x</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-yes">2x</span>
645
- <span class="cline-any cline-yes">2x</span>
646
- <span class="cline-any cline-yes">2x</span>
647
- <span class="cline-any cline-yes">2x</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-yes">2x</span>
652
- <span class="cline-any cline-yes">2x</span>
653
- <span class="cline-any cline-yes">2x</span>
654
- <span class="cline-any cline-yes">2x</span>
655
- <span class="cline-any cline-yes">2x</span>
656
- <span class="cline-any cline-yes">2x</span>
657
- <span class="cline-any cline-yes">2x</span>
658
- <span class="cline-any cline-yes">2x</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-yes">2x</span>
664
- <span class="cline-any cline-yes">2x</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-yes">2x</span>
673
- <span class="cline-any cline-no">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-yes">2x</span>
677
- <span class="cline-any cline-yes">2x</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</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-yes">2x</span>
716
- <span class="cline-any cline-yes">2x</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-yes">2x</span>
725
- <span class="cline-any cline-yes">2x</span>
726
- <span class="cline-any cline-yes">2x</span>
727
- <span class="cline-any cline-yes">2x</span>
728
- <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-no">&nbsp;</span>
737
- <span class="cline-any cline-yes">2x</span>
738
- <span class="cline-any cline-yes">2x</span>
739
- <span class="cline-any cline-yes">2x</span>
740
- <span class="cline-any cline-yes">2x</span>
741
- <span class="cline-any cline-no">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</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">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-no">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-yes">2x</span>
756
- <span class="cline-any cline-yes">2x</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-yes">2x</span>
772
- <span class="cline-any cline-yes">2x</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</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">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-no">&nbsp;</span>
793
- <span class="cline-any cline-no">&nbsp;</span>
794
- <span class="cline-any cline-yes">2x</span>
795
- <span class="cline-any cline-no">&nbsp;</span>
796
- <span class="cline-any cline-no">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-no">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-yes">2x</span>
804
- <span class="cline-any cline-yes">2x</span>
805
- <span class="cline-any cline-yes">2x</span>
806
- <span class="cline-any cline-yes">2x</span>
807
- <span class="cline-any cline-yes">2x</span>
808
- <span class="cline-any cline-yes">2x</span>
809
- <span class="cline-any cline-yes">2x</span>
810
- <span class="cline-any cline-yes">2x</span>
811
- <span class="cline-any cline-yes">2x</span>
812
- <span class="cline-any cline-no">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-no">&nbsp;</span>
818
- <span class="cline-any cline-no">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-yes">2x</span>
824
- <span class="cline-any cline-yes">2x</span>
825
- <span class="cline-any cline-yes">2x</span>
826
- <span class="cline-any cline-yes">2x</span>
827
- <span class="cline-any cline-yes">2x</span>
828
- <span class="cline-any cline-yes">2x</span>
829
- <span class="cline-any cline-no">&nbsp;</span>
830
- <span class="cline-any cline-no">&nbsp;</span>
831
- <span class="cline-any cline-no">&nbsp;</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-no">&nbsp;</span>
834
- <span class="cline-any cline-no">&nbsp;</span>
835
- <span class="cline-any cline-no">&nbsp;</span>
836
- <span class="cline-any cline-no">&nbsp;</span>
837
- <span class="cline-any cline-no">&nbsp;</span>
838
- <span class="cline-any cline-no">&nbsp;</span>
839
- <span class="cline-any cline-no">&nbsp;</span>
840
- <span class="cline-any cline-no">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</span>
844
- <span class="cline-any cline-yes">2x</span>
845
- <span class="cline-any cline-yes">2x</span>
846
- <span class="cline-any cline-yes">2x</span>
847
- <span class="cline-any cline-yes">2x</span>
848
- <span class="cline-any cline-yes">2x</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-no">&nbsp;</span>
852
- <span class="cline-any cline-no">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-no">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-yes">2x</span>
865
- <span class="cline-any cline-yes">2x</span>
866
- <span class="cline-any cline-yes">2x</span>
867
- <span class="cline-any cline-yes">2x</span>
868
- <span class="cline-any cline-yes">2x</span>
869
- <span class="cline-any cline-yes">2x</span>
870
- <span class="cline-any cline-yes">2x</span>
871
- <span class="cline-any cline-yes">2x</span>
872
- <span class="cline-any cline-yes">2x</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-no">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-no">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-no">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-no">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-no">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-yes">2x</span>
903
- <span class="cline-any cline-yes">2x</span>
904
- <span class="cline-any cline-yes">2x</span>
905
- <span class="cline-any cline-yes">2x</span>
906
- <span class="cline-any cline-no">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-no">&nbsp;</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-no">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-no">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-no">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-no">&nbsp;</span>
924
- <span class="cline-any cline-no">&nbsp;</span>
925
- <span class="cline-any cline-no">&nbsp;</span>
926
- <span class="cline-any cline-no">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
935
- <span class="cline-any cline-no">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-no">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
939
- <span class="cline-any cline-yes">2x</span>
940
- <span class="cline-any cline-yes">2x</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
944
- <span class="cline-any cline-no">&nbsp;</span>
945
- <span class="cline-any cline-no">&nbsp;</span>
946
- <span class="cline-any cline-yes">2x</span>
947
- <span class="cline-any cline-yes">2x</span>
948
- <span class="cline-any cline-yes">2x</span>
949
- <span class="cline-any cline-yes">2x</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-yes">2x</span>
954
- <span class="cline-any cline-yes">2x</span>
955
- <span class="cline-any cline-yes">2x</span>
956
- <span class="cline-any cline-yes">2x</span>
957
- <span class="cline-any cline-yes">2x</span>
958
- <span class="cline-any cline-yes">2x</span>
959
- <span class="cline-any cline-yes">2x</span>
960
- <span class="cline-any cline-yes">2x</span>
961
- <span class="cline-any cline-no">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
964
- <span class="cline-any cline-yes">2x</span>
965
- <span class="cline-any cline-yes">2x</span>
966
- <span class="cline-any cline-no">&nbsp;</span>
967
- <span class="cline-any cline-no">&nbsp;</span>
968
- <span class="cline-any cline-no">&nbsp;</span>
969
- <span class="cline-any cline-yes">2x</span>
970
- <span class="cline-any cline-yes">2x</span>
971
- <span class="cline-any cline-yes">2x</span>
972
- <span class="cline-any cline-yes">2x</span>
973
- <span class="cline-any cline-yes">2x</span>
974
- <span class="cline-any cline-yes">2x</span>
975
- <span class="cline-any cline-yes">2x</span>
976
- <span class="cline-any cline-no">&nbsp;</span>
977
- <span class="cline-any cline-no">&nbsp;</span>
978
- <span class="cline-any cline-no">&nbsp;</span>
979
- <span class="cline-any cline-no">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">//----------------------------------------
991
- // OBJECT UTILS
992
- //----------------------------------------
993
- import { ObjectGeneric } from './types'
994
- import { err500IfNotSet } from './error-utils'
995
- import { recursiveGenericFunctionSync } from './loop-utils'
996
- import { isset } from './isset'
997
- import { isObject } from './is-object'
998
- import { DescriptiveError } from './error-utils'
999
- import { escapeRegexp } from './regexp-utils'
1000
- &nbsp;
1001
- &nbsp;
1002
- /** Return an object:
1003
- * * with only selected fields
1004
- * * OR without masked fields
1005
- */
1006
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function simpleObjectMaskOrSelect&lt;Obj extends ObjectGeneric&gt;(</span></span>
1007
- <span class="cstat-no" title="statement not covered" > object: Obj,</span>
1008
- <span class="cstat-no" title="statement not covered" > maskedOrSelectedFields: (keyof Obj)[],</span>
1009
- <span class="cstat-no" title="statement not covered" > mode: 'mask' | 'select' = 'mask',</span>
1010
- <span class="cstat-no" title="statement not covered" > deleteKeysInsteadOfReturningAnewObject = false</span>
1011
- <span class="cstat-no" title="statement not covered" >): Obj {</span>
1012
- <span class="cstat-no" title="statement not covered" > const allKeys = Object.keys(object)</span>
1013
- <span class="cstat-no" title="statement not covered" > const keysToMask = allKeys.filter(keyName =&gt; {</span>
1014
- <span class="cstat-no" title="statement not covered" > if (mode === 'mask') return maskedOrSelectedFields.includes(keyName)</span>
1015
- <span class="cstat-no" title="statement not covered" > else return !maskedOrSelectedFields.includes(keyName)</span>
1016
- <span class="cstat-no" title="statement not covered" > })</span>
1017
- <span class="cstat-no" title="statement not covered" > if (deleteKeysInsteadOfReturningAnewObject) {</span>
1018
- <span class="cstat-no" title="statement not covered" > keysToMask.forEach(keyNameToDelete =&gt; delete object[keyNameToDelete])</span>
1019
- <span class="cstat-no" title="statement not covered" > return object</span>
1020
- <span class="cstat-no" title="statement not covered" > } else {</span>
1021
- <span class="cstat-no" title="statement not covered" > return allKeys.reduce((newObject, key) =&gt; {</span>
1022
- <span class="cstat-no" title="statement not covered" > if (!keysToMask.includes(key)) newObject[key] = object[key]</span>
1023
- <span class="cstat-no" title="statement not covered" > return newObject</span>
1024
- <span class="cstat-no" title="statement not covered" > }, {}) as Obj</span>
1025
- <span class="cstat-no" title="statement not covered" > }</span>
1026
- <span class="cstat-no" title="statement not covered" >}</span>
1027
- &nbsp;
1028
- /**
1029
- * check if **object OR array** has property Safely (avoid cannot read property x of null and such)
1030
- * @param {Object} obj object to test against
1031
- * @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`)
1032
- */
1033
- <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>
1034
- <span class="cstat-no" title="statement not covered" > if (!isset(obj) || typeof obj !== 'object') return</span>
1035
- <span class="cstat-no" title="statement not covered" > const propsArr = addr.replace(/\.?\[(\d+)\]/g, '.$1').split('.') // replace a[3] =&gt; a.3;</span>
1036
- <span class="cstat-no" title="statement not covered" > let objChain = obj</span>
1037
- <span class="cstat-no" title="statement not covered" > return propsArr.every(prop =&gt; {</span>
1038
- <span class="cstat-no" title="statement not covered" > objChain = objChain[prop]</span>
1039
- <span class="cstat-no" title="statement not covered" > return isset(objChain)</span>
1040
- <span class="cstat-no" title="statement not covered" > })</span>
1041
- <span class="cstat-no" title="statement not covered" >}</span>
1042
- &nbsp;
1043
- /** Find address in an object "a.b.c" IN { a : { b : {c : 'blah' }}} RETURNS 'blah'
1044
- * @param obj
1045
- * @param addr accept syntax like "obj.subItem.[0].sub2" OR "obj.subItem.0.sub2" OR "obj.subItem[0].sub2"
1046
- * @returns the last item of the chain OR undefined if not found
1047
- */
1048
- <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>
1049
- <span class="cstat-no" title="statement not covered" > if (addr.length === 0) return obj</span>
1050
- <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
1051
- <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>
1052
- <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>
1053
- <span class="cstat-no" title="statement not covered" > const objRef = propsArr.reduce((objChain, prop) =&gt; {</span>
1054
- <span class="cstat-no" title="statement not covered" > if (!isset(objChain) || typeof objChain !== 'object' || !isset(objChain[prop])) return</span>
1055
- <span class="cstat-no" title="statement not covered" > else return objChain[prop]</span>
1056
- <span class="cstat-no" title="statement not covered" > }, obj)</span>
1057
- <span class="cstat-no" title="statement not covered" > return objRef</span>
1058
- <span class="cstat-no" title="statement not covered" >}</span>
1059
- &nbsp;
1060
- type FindByAddressReturnFull = Array&lt;[addr: string, value: any, lastElmKey: string, parent: any[] | Record&lt;string, any&gt;]&gt;
1061
- /** Will return all objects matching that path. Eg: user.*.myVar */
1062
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function findByAddressAll&lt;ReturnAddresses extends boolean = false&gt;(</span></span>
1063
- <span class="cstat-no" title="statement not covered" > obj: Record&lt;string, any&gt;,</span>
1064
- <span class="cstat-no" title="statement not covered" > addr: string,</span>
1065
- <span class="cstat-no" title="statement not covered" > returnAddresses: ReturnAddresses = false as ReturnAddresses</span>
1066
- <span class="cstat-no" title="statement not covered" >): ReturnAddresses extends true ? FindByAddressReturnFull : Array&lt;any&gt; {</span>
1067
- <span class="cstat-no" title="statement not covered" > err500IfNotSet({ obj, addr })</span>
1068
- <span class="cstat-no" title="statement not covered" > if (addr === '') return (returnAddresses ? [addr, obj, undefined, undefined] : obj) as any</span>
1069
- <span class="cstat-no" title="statement not covered" > const addrRegexp = new RegExp('^' + escapeRegexp(</span>
1070
- <span class="cstat-no" title="statement not covered" > addr.replace(/\.?\[(\d+)\]/g, '.$1'), // replace .[4] AND [4] TO .4</span>
1071
- <span class="cstat-no" title="statement not covered" > { parseWildcard: true, wildcardNotMatchingChars: '.[' }) + '$'</span>
1072
- <span class="cstat-no" title="statement not covered" > )</span>
1073
- <span class="cstat-no" title="statement not covered" ></span>
1074
- <span class="cstat-no" title="statement not covered" > const matchingItems: any[] = []</span>
1075
- <span class="cstat-no" title="statement not covered" ></span>
1076
- <span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(obj, (item, address, lastElmKey, parent) =&gt; {</span>
1077
- <span class="cstat-no" title="statement not covered" > if (addrRegexp.test(address)) matchingItems.push(returnAddresses ? [address, item, lastElmKey, parent] : item)</span>
1078
- <span class="cstat-no" title="statement not covered" > })</span>
1079
- <span class="cstat-no" title="statement not covered" > return matchingItems</span>
1080
- <span class="cstat-no" title="statement not covered" >}</span>
1081
- &nbsp;
1082
- /** Enforce writing subItems. Eg: user.name.blah will ensure all are set until the writing of the last item
1083
- * NOTE: doesn't work when parent is array
1084
- */
1085
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objForceWrite&lt;MainObj extends Record&lt;string, any&gt;&gt;(obj: MainObj, addr: string, item, options: { doNotWriteFinalValue?: boolean } = {}): MainObj {</span></span>
1086
- <span class="cstat-no" title="statement not covered" > const { doNotWriteFinalValue = false } = options</span>
1087
- <span class="cstat-no" title="statement not covered" > const writeFinalValue = !doNotWriteFinalValue</span>
1088
- <span class="cstat-no" title="statement not covered" ></span>
1089
- <span class="cstat-no" title="statement not covered" > const chunks = addr.replace(/\.?\[(\d+)\]/g, '.[$1').split('.')</span>
1090
- <span class="cstat-no" title="statement not covered" > let lastItem: any = obj</span>
1091
- <span class="cstat-no" title="statement not covered" > chunks.forEach((chunkRaw, i) =&gt; {</span>
1092
- <span class="cstat-no" title="statement not covered" > const chunk = chunkRaw.replace(/^\[/, '')</span>
1093
- <span class="cstat-no" title="statement not covered" > if (i === chunks.length - 1) {</span>
1094
- <span class="cstat-no" title="statement not covered" > if (writeFinalValue) lastItem[chunk] = item</span>
1095
- <span class="cstat-no" title="statement not covered" > } else if (!isset(lastItem[chunk])) {</span>
1096
- <span class="cstat-no" title="statement not covered" > const nextChunk = chunks[i + 1]</span>
1097
- <span class="cstat-no" title="statement not covered" > if (isset(nextChunk) &amp;&amp; nextChunk.startsWith('[')) lastItem[chunk] = []</span>
1098
- <span class="cstat-no" title="statement not covered" > else lastItem[chunk] = {}</span>
1099
- <span class="cstat-no" title="statement not covered" > } else if (typeof lastItem[chunk] !== 'object') {</span>
1100
- <span class="cstat-no" title="statement not covered" > throw new DescriptiveError(`itemNotTypeObjectOrArrayInAddrChainForObjForceWrite`, { code: 500, origin: 'Validator', chunks: chunks.map(c =&gt; c.replace(/\[(\d+)/, '[$1]')), actualValueOfItem: lastItem[chunk], actualChunk: chunk, chunkIndex: i })</span>
1101
- <span class="cstat-no" title="statement not covered" > }</span>
1102
- <span class="cstat-no" title="statement not covered" > lastItem = lastItem[chunk]</span>
1103
- <span class="cstat-no" title="statement not covered" > })</span>
1104
- <span class="cstat-no" title="statement not covered" > return obj</span>
1105
- <span class="cstat-no" title="statement not covered" >}</span>
1106
- &nbsp;
1107
- &nbsp;
1108
- &nbsp;
1109
- &nbsp;
1110
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function forcePathInObject&lt;MainObj extends Record&lt;string, any&gt;&gt;(obj: MainObj, addr: string): MainObj {</span></span>
1111
- <span class="cstat-no" title="statement not covered" > return objForceWrite(obj, addr, undefined, { doNotWriteFinalValue: true })</span>
1112
- <span class="cstat-no" title="statement not covered" >}</span>
1113
- &nbsp;
1114
- export const objForceWritePath = forcePathInObject
1115
- &nbsp;
1116
- /** Enforce writing subItems, only if obj.addr is empty.
1117
- * Eg: user.name.blah will ensure all are set until the writing of the last item
1118
- * if user.name.blah has a value it will not change it.
1119
- * NOTE: doesn't work when parent is array
1120
- */
1121
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objForceWriteIfNotSet&lt;MainObj extends Record&lt;string, any&gt;&gt;(obj: MainObj, addr: string, item): MainObj {</span></span>
1122
- <span class="cstat-no" title="statement not covered" > if (!isset(findByAddress(obj, addr))) return objForceWrite(obj, addr, item)</span>
1123
- <span class="cstat-no" title="statement not covered" > else return obj</span>
1124
- <span class="cstat-no" title="statement not covered" >}</span>
1125
- &nbsp;
1126
- /** Merge mixins into class. Use it in the constructor like: mergeMixins(this, {myMixin: true}) */
1127
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeMixins(that, ...mixins) {</span></span>
1128
- <span class="cstat-no" title="statement not covered" > mixins.forEach(mixin =&gt; {</span>
1129
- <span class="cstat-no" title="statement not covered" > for (const method in mixin) {</span>
1130
- <span class="cstat-no" title="statement not covered" > that[method] = mixin[method]</span>
1131
- <span class="cstat-no" title="statement not covered" > }</span>
1132
- <span class="cstat-no" title="statement not covered" > })</span>
1133
- <span class="cstat-no" title="statement not covered" >}</span>
1134
- &nbsp;
1135
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function cloneObject&lt;MainObj extends Record&lt;string, any&gt;&gt;(o: MainObj): MainObj {</span></span>
1136
- <span class="cstat-no" title="statement not covered" > return JSON.parse(JSON.stringify(o))</span>
1137
- <span class="cstat-no" title="statement not covered" >}</span>
1138
- &nbsp;
1139
- /** Deep clone. WILL REMOVE circular references */
1140
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function deepClone&lt;MainObj extends Record&lt;string, any&gt;&gt;(obj: MainObj, cache = []): MainObj {</span></span>
1141
- <span class="cstat-no" title="statement not covered" ></span>
1142
- <span class="cstat-no" title="statement not covered" > let copy: any | any[]</span>
1143
- <span class="cstat-no" title="statement not covered" > // usefull to not modify 1st level objet by lower levels</span>
1144
- <span class="cstat-no" title="statement not covered" > // this is required for the same object to be referenced not in a redundant way</span>
1145
- <span class="cstat-no" title="statement not covered" > const newCache: any[] = [...cache]</span>
1146
- <span class="cstat-no" title="statement not covered" > if (obj instanceof Date) return new Date(obj) as any</span>
1147
- <span class="cstat-no" title="statement not covered" ></span>
1148
- <span class="cstat-no" title="statement not covered" > // Handle Array</span>
1149
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(obj)) {</span>
1150
- <span class="cstat-no" title="statement not covered" > if (newCache.includes(obj)) return [] as any</span>
1151
- <span class="cstat-no" title="statement not covered" > newCache.push(obj)</span>
1152
- <span class="cstat-no" title="statement not covered" > copy = []</span>
1153
- <span class="cstat-no" title="statement not covered" > for (let i = 0, len = obj.length; i &lt; len; i++) {</span>
1154
- <span class="cstat-no" title="statement not covered" > copy[i] = deepClone(obj[i], newCache as any)</span>
1155
- <span class="cstat-no" title="statement not covered" > }</span>
1156
- <span class="cstat-no" title="statement not covered" > return copy</span>
1157
- <span class="cstat-no" title="statement not covered" > }</span>
1158
- <span class="cstat-no" title="statement not covered" ></span>
1159
- <span class="cstat-no" title="statement not covered" > if (typeof obj === 'object' &amp;&amp; obj !== null &amp;&amp; Object.getPrototypeOf(obj) === Object.prototype) {</span>
1160
- <span class="cstat-no" title="statement not covered" > if (newCache.includes(obj)) return {} as any</span>
1161
- <span class="cstat-no" title="statement not covered" > newCache.push(obj)</span>
1162
- <span class="cstat-no" title="statement not covered" > copy = {}</span>
1163
- <span class="cstat-no" title="statement not covered" > for (const key in obj) {</span>
1164
- <span class="cstat-no" title="statement not covered" > if (Object.prototype.hasOwnProperty.call(obj, key)) {</span>
1165
- <span class="cstat-no" title="statement not covered" > copy[key] = deepClone(obj[key], newCache as any)</span>
1166
- <span class="cstat-no" title="statement not covered" > }</span>
1167
- <span class="cstat-no" title="statement not covered" > }</span>
1168
- <span class="cstat-no" title="statement not covered" > return copy</span>
1169
- <span class="cstat-no" title="statement not covered" > }</span>
1170
- <span class="cstat-no" title="statement not covered" ></span>
1171
- <span class="cstat-no" title="statement not covered" > return obj // number, string...</span>
1172
- <span class="cstat-no" title="statement not covered" >}</span>
1173
- &nbsp;
1174
- &nbsp;
1175
- /**
1176
- * @param {Object} obj the object on which we want to filter the keys
1177
- * @param {function} filterFunc function that returns true if the key match the wanted criteria
1178
- */
1179
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function filterKeys&lt;MainObj extends Record&lt;string, any&gt;&gt;(obj: MainObj, filter): MainObj {</span></span>
1180
- <span class="cstat-no" title="statement not covered" > const clone = cloneObject(obj)</span>
1181
- <span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(obj, (_, addr, lastElementKey) =&gt; {</span>
1182
- <span class="cstat-no" title="statement not covered" > if (!filter(lastElementKey)) deleteByAddress(clone, addr.split('.'))</span>
1183
- <span class="cstat-no" title="statement not covered" > })</span>
1184
- <span class="cstat-no" title="statement not covered" > return clone</span>
1185
- <span class="cstat-no" title="statement not covered" >}</span>
1186
- /**
1187
- * @param {Object} obj the object on which we want to delete a property
1188
- * @param {Array} addrArr addressArray on which to delete the property
1189
- */
1190
- <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>
1191
- <span class="cstat-no" title="statement not covered" > let current = obj</span>
1192
- <span class="cstat-no" title="statement not covered" > const addrArr = Array.isArray(addr) ? addr : addr.split('.')</span>
1193
- <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; addrArr.length; i++) {</span>
1194
- <span class="cstat-no" title="statement not covered" > const currentAddr = addrArr[i].replace(/(\[|\])/g, '')</span>
1195
- <span class="cstat-no" title="statement not covered" > if (i === addrArr.length - 1) delete current[currentAddr]</span>
1196
- <span class="cstat-no" title="statement not covered" > else current = current[currentAddr]</span>
1197
- <span class="cstat-no" title="statement not covered" > }</span>
1198
- <span class="cstat-no" title="statement not covered" >}</span>
1199
- &nbsp;
1200
- &nbsp;
1201
- &nbsp;
1202
- /** Remove all key/values pair if value is undefined */
1203
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objFilterUndefined&lt;MainObj extends Record&lt;string, any&gt;&gt;(o: MainObj): MainObj {</span></span>
1204
- <span class="cstat-no" title="statement not covered" > Object.keys(o).forEach(k =&gt; !isset(o[k]) &amp;&amp; delete o[k])</span>
1205
- <span class="cstat-no" title="statement not covered" > return o</span>
1206
- <span class="cstat-no" title="statement not covered" >}</span>
1207
- &nbsp;
1208
- /** Lock all 1st level props of an object to read only */
1209
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnly&lt;MainObj extends Record&lt;string, any&gt;&gt;(o: MainObj): { readonly [AA in keyof MainObj]: MainObj[AA] } {</span></span>
1210
- <span class="cstat-no" title="statement not covered" > const throwErr = () =&gt; { throw new DescriptiveError('Cannot modify object that is read only', { code: 500 }) }</span>
1211
- <span class="cstat-no" title="statement not covered" > return new Proxy(o, {</span>
1212
- <span class="cstat-no" title="statement not covered" > set: throwErr,</span>
1213
- <span class="cstat-no" title="statement not covered" > defineProperty: throwErr,</span>
1214
- <span class="cstat-no" title="statement not covered" > deleteProperty: throwErr,</span>
1215
- <span class="cstat-no" title="statement not covered" > })</span>
1216
- <span class="cstat-no" title="statement not covered" >}</span>
1217
- &nbsp;
1218
- /** Fields of the object can be created BUT NOT reassignated */
1219
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function reassignForbidden(o) {</span></span>
1220
- <span class="cstat-no" title="statement not covered" > return new Proxy(o, {</span>
1221
- <span class="cstat-no" title="statement not covered" > defineProperty: function (that, key, value) {</span>
1222
- <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>
1223
- <span class="cstat-no" title="statement not covered" > else {</span>
1224
- <span class="cstat-no" title="statement not covered" > that[key] = value</span>
1225
- <span class="cstat-no" title="statement not covered" > return true</span>
1226
- <span class="cstat-no" title="statement not covered" > }</span>
1227
- <span class="cstat-no" title="statement not covered" > },</span>
1228
- <span class="cstat-no" title="statement not covered" > deleteProperty: function (_, key) {</span>
1229
- <span class="cstat-no" title="statement not covered" > throw new DescriptiveError(`Cannot delete the property ${key.toString()} of this object`, { code: 500 })</span>
1230
- <span class="cstat-no" title="statement not covered" > }</span>
1231
- <span class="cstat-no" title="statement not covered" > })</span>
1232
- <span class="cstat-no" title="statement not covered" >}</span>
1233
- &nbsp;
1234
- /** All fileds and subFields of the object will become readOnly */
1235
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnlyRecursive(object) {</span></span>
1236
- <span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(object, (item, _, lastElementKey, parent) =&gt; {</span>
1237
- <span class="cstat-no" title="statement not covered" > if (typeof item === 'object') parent[lastElementKey] = readOnly(item)</span>
1238
- <span class="cstat-no" title="statement not covered" > })</span>
1239
- <span class="cstat-no" title="statement not covered" > return object</span>
1240
- <span class="cstat-no" title="statement not covered" >}</span>
1241
- &nbsp;
1242
- /** @deprecated use readOnlyRecursive instead */
1243
- export const readOnlyForAll = readOnlyRecursive
1244
- &nbsp;
1245
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objFilterUndefinedRecursive(obj) {</span></span>
1246
- <span class="cstat-no" title="statement not covered" > if (obj) {</span>
1247
- <span class="cstat-no" title="statement not covered" > const flattenedObj = flattenObject(obj)</span>
1248
- <span class="cstat-no" title="statement not covered" > Object.keys(flattenedObj).forEach(key =&gt; {</span>
1249
- <span class="cstat-no" title="statement not covered" > if (!isset(flattenedObj[key])) {</span>
1250
- <span class="cstat-no" title="statement not covered" > delete flattenedObj[key]</span>
1251
- <span class="cstat-no" title="statement not covered" > }</span>
1252
- <span class="cstat-no" title="statement not covered" > })</span>
1253
- <span class="cstat-no" title="statement not covered" > return unflattenObject(flattenedObj)</span>
1254
- <span class="cstat-no" title="statement not covered" > } else return obj</span>
1255
- <span class="cstat-no" title="statement not covered" >}</span>
1256
- &nbsp;
1257
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function sortObjKeyAccordingToValue(unorderedObj, ascending = true) {</span></span>
1258
- <span class="cstat-no" title="statement not covered" > const orderedObj = {}</span>
1259
- <span class="cstat-no" title="statement not covered" > const sortingConst = ascending ? 1 : -1</span>
1260
- <span class="cstat-no" title="statement not covered" > Object.keys(unorderedObj)</span>
1261
- <span class="cstat-no" title="statement not covered" > .sort((keyA, keyB) =&gt; unorderedObj[keyA] &lt; unorderedObj[keyB] ? sortingConst : -sortingConst)</span>
1262
- <span class="cstat-no" title="statement not covered" > .forEach(key =&gt; { orderedObj[key] = unorderedObj[key] })</span>
1263
- <span class="cstat-no" title="statement not covered" > return orderedObj</span>
1264
- <span class="cstat-no" title="statement not covered" >}</span>
1265
- &nbsp;
1266
- /**
1267
- * Make default value if object key do not exist
1268
- * @param {object} obj
1269
- * @param {string} addr
1270
- * @param {any} defaultValue
1271
- * @param {function} callback (obj[addr]) =&gt; processValue. Eg: myObjAddr =&gt; myObjAddr.push('bikou')
1272
- * @return obj[addr] eventually processed by the callback
1273
- */
1274
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function ensureObjectProp&lt;MainObj extends Record&lt;string, any&gt;, Addr extends string&gt;(</span></span>
1275
- <span class="cstat-no" title="statement not covered" > obj: MainObj,</span>
1276
- <span class="cstat-no" title="statement not covered" > addr: Addr,</span>
1277
- <span class="cstat-no" title="statement not covered" > defaultValue,</span>
1278
- <span class="cstat-no" title="statement not covered" > callback: (o: any) =&gt; any</span>
1279
- <span class="cstat-no" title="statement not covered" >): MainObj[Addr] {</span>
1280
- <span class="cstat-no" title="statement not covered" > err500IfNotSet({ obj, addr, defaultValue, callback })</span>
1281
- <span class="cstat-no" title="statement not covered" > if (!isset(obj[addr])) obj[addr] = defaultValue</span>
1282
- <span class="cstat-no" title="statement not covered" > if (callback) callback(obj[addr])</span>
1283
- <span class="cstat-no" title="statement not covered" > return obj[addr]</span>
1284
- <span class="cstat-no" title="statement not covered" >}</span>
1285
- &nbsp;
1286
- &nbsp;
1287
- /** object and array merge
1288
- * @warn /!\ Array will be merged and duplicate values will be deleted /!\
1289
- * @return {Object} new object result from merge
1290
- * NOTE: objects in params will NOT be modified*/
1291
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeep&lt;</span></span>
1292
- <span class="cstat-no" title="statement not covered" > O1 extends Record&lt;string, any&gt;,</span>
1293
- <span class="cstat-no" title="statement not covered" > O2 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1294
- <span class="cstat-no" title="statement not covered" > O3 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1295
- <span class="cstat-no" title="statement not covered" > O4 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1296
- <span class="cstat-no" title="statement not covered" > O5 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1297
- <span class="cstat-no" title="statement not covered" > O6 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1298
- <span class="cstat-no" title="statement not covered" >&gt;(...objects: [O1, O2?, O3?, O4?, O5?, O6?]): O1 &amp; O2 &amp; O3 &amp; O4 &amp; O5 &amp; O6 {</span>
1299
- <span class="cstat-no" title="statement not covered" > return mergeDeepConfigurable(</span>
1300
- <span class="cstat-no" title="statement not covered" > (previousVal, currentVal) =&gt; [...previousVal, ...currentVal].filter((elm, i, arr) =&gt; arr.indexOf(elm) === i),</span>
1301
- <span class="cstat-no" title="statement not covered" > (previousVal, currentVal) =&gt; mergeDeep(previousVal, currentVal),</span>
1302
- <span class="cstat-no" title="statement not covered" > undefined,</span>
1303
- <span class="cstat-no" title="statement not covered" > ...objects</span>
1304
- <span class="cstat-no" title="statement not covered" > )</span>
1305
- <span class="cstat-no" title="statement not covered" >}</span>
1306
- &nbsp;
1307
- /** object and array merge
1308
- * @warn /!\ Array will be replaced by the latest object /!\
1309
- * @return {Object} new object result from merge
1310
- * NOTE: objects in params will NOT be modified */
1311
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeepOverrideArrays&lt;</span></span>
1312
- <span class="cstat-no" title="statement not covered" > O1 extends Record&lt;string, any&gt;,</span>
1313
- <span class="cstat-no" title="statement not covered" > O2 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1314
- <span class="cstat-no" title="statement not covered" > O3 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1315
- <span class="cstat-no" title="statement not covered" > O4 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1316
- <span class="cstat-no" title="statement not covered" > O5 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1317
- <span class="cstat-no" title="statement not covered" > O6 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1318
- <span class="cstat-no" title="statement not covered" >&gt;(...objects: [O1, O2?, O3?, O4?, O5?, O6?]): O1 &amp; O2 &amp; O3 &amp; O4 &amp; O5 &amp; O6 {</span>
1319
- <span class="cstat-no" title="statement not covered" > return mergeDeepConfigurable(</span>
1320
- <span class="cstat-no" title="statement not covered" > undefined,</span>
1321
- <span class="cstat-no" title="statement not covered" > (previousVal, currentVal) =&gt; mergeDeepOverrideArrays(previousVal, currentVal),</span>
1322
- <span class="cstat-no" title="statement not covered" > undefined,</span>
1323
- <span class="cstat-no" title="statement not covered" > ...objects</span>
1324
- <span class="cstat-no" title="statement not covered" > )</span>
1325
- <span class="cstat-no" title="statement not covered" >}</span>
1326
- &nbsp;
1327
- /** object and array merge
1328
- * @param {Function} replacerForArrays item[key] = (prevValue, currentVal) =&gt; () When 2 values are arrays,
1329
- * @param {Function} replacerForObjects item[key] = (prevValue, currentVal) =&gt; () When 2 values are objects,
1330
- * @param {Function} replacerDefault item[key] = (prevValue, currentVal) =&gt; () For all other values
1331
- * @param {...Object} objects
1332
- * @return {Object} new object result from merge
1333
- * NOTE: objects in params will NOT be modified
1334
- */
1335
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeDeepConfigurable&lt;</span></span>
1336
- <span class="cstat-no" title="statement not covered" > O1 extends Record&lt;string, any&gt;,</span>
1337
- <span class="cstat-no" title="statement not covered" > O2 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1338
- <span class="cstat-no" title="statement not covered" > O3 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1339
- <span class="cstat-no" title="statement not covered" > O4 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1340
- <span class="cstat-no" title="statement not covered" > O5 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1341
- <span class="cstat-no" title="statement not covered" > O6 extends Record&lt;string, any&gt; = Record&lt;string, any&gt;,</span>
1342
- <span class="cstat-no" title="statement not covered" >&gt;(</span>
1343
- <span class="cstat-no" title="statement not covered" > replacerForArrays = (_, curr) =&gt; curr, replacerForObjects,</span>
1344
- <span class="cstat-no" title="statement not covered" > replacerDefault = (_, curr) =&gt; curr,</span>
1345
- <span class="cstat-no" title="statement not covered" > ...objects: [O1, O2?, O3?, O4?, O5?, O6?]</span>
1346
- <span class="cstat-no" title="statement not covered" >): O1 &amp; O2 &amp; O3 &amp; O4 &amp; O5 &amp; O6 {</span>
1347
- <span class="cstat-no" title="statement not covered" > return objects.reduce((actuallyMerged, obj) =&gt; {</span>
1348
- <span class="cstat-no" title="statement not covered" > if (obj &amp;&amp; typeof obj === 'object') Object.keys(obj).forEach(key =&gt; {</span>
1349
- <span class="cstat-no" title="statement not covered" > const previousVal = actuallyMerged[key]</span>
1350
- <span class="cstat-no" title="statement not covered" > const currentVal = obj[key]</span>
1351
- <span class="cstat-no" title="statement not covered" ></span>
1352
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(previousVal) &amp;&amp; Array.isArray(currentVal)) {</span>
1353
- <span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerForArrays(previousVal, currentVal)</span>
1354
- <span class="cstat-no" title="statement not covered" > } else if (isObject(previousVal) &amp;&amp; isObject(currentVal)) {</span>
1355
- <span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerForObjects(previousVal, currentVal)</span>
1356
- <span class="cstat-no" title="statement not covered" > } else {</span>
1357
- <span class="cstat-no" title="statement not covered" > actuallyMerged[key] = replacerDefault(previousVal, currentVal)</span>
1358
- <span class="cstat-no" title="statement not covered" > }</span>
1359
- <span class="cstat-no" title="statement not covered" > })</span>
1360
- <span class="cstat-no" title="statement not covered" ></span>
1361
- <span class="cstat-no" title="statement not covered" > return actuallyMerged</span>
1362
- <span class="cstat-no" title="statement not covered" > }, {}) as any</span>
1363
- <span class="cstat-no" title="statement not covered" >}</span>
1364
- &nbsp;
1365
- /** { a: {b:2}} =&gt; {'a.b':2} useful for translations
1366
- * NOTE: will remove circular references
1367
- */
1368
- <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&lt;string, any&gt; {</span></span>
1369
- <span class="cstat-no" title="statement not covered" > const { withoutArraySyntax = false, withArraySyntaxMinified = false } = config</span>
1370
- <span class="cstat-no" title="statement not covered" > const result = {}</span>
1371
- <span class="cstat-no" title="statement not covered" > const seenObjects: any[] = [] // avoidCircular reference to infinite loop</span>
1372
- <span class="cstat-no" title="statement not covered" > const recurse = (cur, prop) =&gt; {</span>
1373
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(cur)) {</span>
1374
- <span class="cstat-no" title="statement not covered" > const l = cur.length</span>
1375
- <span class="cstat-no" title="statement not covered" > let i = 0</span>
1376
- <span class="cstat-no" title="statement not covered" > if (withoutArraySyntax) recurse(cur[0], prop)</span>
1377
- <span class="cstat-no" title="statement not covered" > else {</span>
1378
- <span class="cstat-no" title="statement not covered" > for (; i &lt; l; i++) recurse(cur[i], prop + (withArraySyntaxMinified ? `.${i}` : `[${i}]`))</span>
1379
- <span class="cstat-no" title="statement not covered" > if (l == 0) result[prop] = []</span>
1380
- <span class="cstat-no" title="statement not covered" > }</span>
1381
- <span class="cstat-no" title="statement not covered" > } else if (isObject(cur)) { // is object</span>
1382
- <span class="cstat-no" title="statement not covered" > try {</span>
1383
- <span class="cstat-no" title="statement not covered" > if (seenObjects.includes(cur)) cur = deepClone(cur) // avoid circular ref but allow duplicate objects</span>
1384
- <span class="cstat-no" title="statement not covered" > else seenObjects.push(cur)</span>
1385
- <span class="cstat-no" title="statement not covered" ></span>
1386
- <span class="cstat-no" title="statement not covered" > const isEmpty = Object.keys(cur).length === 0</span>
1387
- <span class="cstat-no" title="statement not covered" ></span>
1388
- <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>
1389
- <span class="cstat-no" title="statement not covered" ></span>
1390
- <span class="cstat-no" title="statement not covered" > if (isEmpty &amp;&amp; prop) result[prop] = {}</span>
1391
- <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line @typescript-eslint/no-unused-vars</span>
1392
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1393
- <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
1394
- <span class="cstat-no" title="statement not covered" > console.warn('Circular reference in flattenObject, impossible to parse')</span>
1395
- <span class="cstat-no" title="statement not covered" > }</span>
1396
- <span class="cstat-no" title="statement not covered" > } else result[prop] = cur</span>
1397
- <span class="cstat-no" title="statement not covered" > }</span>
1398
- <span class="cstat-no" title="statement not covered" > recurse(data, '')</span>
1399
- <span class="cstat-no" title="statement not covered" > return result</span>
1400
- <span class="cstat-no" title="statement not covered" >}</span>
1401
- &nbsp;
1402
- /** {'a.b':2} =&gt; { a: {b:2}} */
1403
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function unflattenObject(data: Record&lt;string, any&gt;): Record&lt;string, any&gt; {</span></span>
1404
- <span class="cstat-no" title="statement not covered" > const newO = {}</span>
1405
- <span class="cstat-no" title="statement not covered" > for (const [addr, value] of Object.entries(data)) objForceWrite(newO, addr, value)</span>
1406
- <span class="cstat-no" title="statement not covered" > return newO</span>
1407
- <span class="cstat-no" title="statement not covered" >}</span>
1408
- &nbsp;
1409
- /** Mean to fix typing because type for Object.entries is not accurate. Ref: https://stackoverflow.com/questions/66565322/get-type-keys-in-typescript
1410
- * /!\ THIS WILL REMOVE SYMBOL AND NUMBER FROM KEY TYPES as this is 99% of the time unwanted for generic objects
1411
- */
1412
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objEntries&lt;Obj extends Record&lt;string, any&gt;&gt;(obj: Obj): ObjEntries&lt;Obj&gt; {</span></span>
1413
- <span class="cstat-no" title="statement not covered" > return Object.entries(obj) as any</span>
1414
- <span class="cstat-no" title="statement not covered" >}</span>
1415
- &nbsp;
1416
- /** Will remove Symbol and Number from keys types */
1417
- type ObjEntries&lt;T, K extends keyof T = keyof T&gt; = (K extends string ? [K, T[K]] : never)[]
1418
- &nbsp;
1419
- /** Will remove Symbol and Number from keys types */
1420
- type StringKeys&lt;T&gt; = keyof T extends infer K ? K extends string ? K : never : never
1421
- &nbsp;
1422
- /** Mean to fix typing because type for Object.keys is not accurate */
1423
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objKeys&lt;Obj extends Record&lt;string, any&gt;&gt;(obj: Obj): StringKeys&lt;Obj&gt;[] {</span></span>
1424
- <span class="cstat-no" title="statement not covered" > return Object.keys(obj) as any</span>
1425
- <span class="cstat-no" title="statement not covered" >}</span>
1426
- &nbsp;
1427
- /** Will merge all arrays of an object into a single array */
1428
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function mergeObjectArrays&lt;T extends Record&lt;string, any[]&gt;&gt;(obj: T) {</span></span>
1429
- <span class="cstat-no" title="statement not covered" > return Object.values(obj).flat() as (T[keyof T][number])[]</span>
1430
- <span class="cstat-no" title="statement not covered" >}</span>
1431
- &nbsp;
1432
- export const keys = objKeys
1433
- export const entries = objEntries
1434
- &nbsp;
1435
- &nbsp;
1436
- &nbsp;
1437
- /** A Helper to create JavascriptProxies, will add __isProxy and toJSON helper to prevent error when logging the proxy and to be able to check if the object is proxyfied */
1438
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function createProxy&lt;T extends Record&lt;string, any&gt;&gt;(obj: T, optn: {</span></span>
1439
- <span class="cstat-no" title="statement not covered" > get: Required&lt;ProxyHandler&lt;T&gt;&gt;['get'],</span>
1440
- <span class="cstat-no" title="statement not covered" > jsonRepresentation?: (obj: T) =&gt; string</span>
1441
- <span class="cstat-no" title="statement not covered" >}) {</span>
1442
- <span class="cstat-no" title="statement not covered" > return new Proxy(obj, {</span>
1443
- <span class="cstat-no" title="statement not covered" > get(target, prop, receiver) {</span>
1444
- <span class="cstat-no" title="statement not covered" > if (prop === '__isProxy') return true</span>
1445
- <span class="cstat-no" title="statement not covered" > else if (prop === 'toJSON') {</span>
1446
- <span class="cstat-no" title="statement not covered" > if ('toJSON' in target) return target.toJSON</span>
1447
- <span class="cstat-no" title="statement not covered" > else return () =&gt; (optn?.jsonRepresentation?.(target) || '[Proxy]')</span>
1448
- <span class="cstat-no" title="statement not covered" > }</span>
1449
- <span class="cstat-no" title="statement not covered" > return optn.get(target, prop, receiver)</span>
1450
- <span class="cstat-no" title="statement not covered" > }</span>
1451
- <span class="cstat-no" title="statement not covered" > })</span>
1452
- <span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
1453
-
1454
- <div class='push'></div><!-- for sticky footer -->
1455
- </div><!-- /wrapper -->
1456
- <div class='footer quiet pad2 space-top1 center small'>
1457
- Code coverage generated by
1458
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1459
- at 2025-03-20T12:55:39.327Z
1460
- </div>
1461
- <script src="prettify.js"></script>
1462
- <script>
1463
- window.onload = function () {
1464
- prettyPrint();
1465
- };
1466
- </script>
1467
- <script src="sorter.js"></script>
1468
- <script src="block-navigation.js"></script>
1469
- </body>
1470
- </html>
1471
-