topkat-utils 1.2.100 → 1.2.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/coverage/clover.xml +1767 -0
  2. package/coverage/coverage-final.json +16 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/clean-stack-trace.ts.html +205 -0
  6. package/coverage/lcov-report/config.ts.html +340 -0
  7. package/coverage/lcov-report/error-utils.ts.html +700 -0
  8. package/coverage/lcov-report/favicon.png +0 -0
  9. package/coverage/lcov-report/index.html +326 -0
  10. package/coverage/lcov-report/is-empty.ts.html +103 -0
  11. package/coverage/lcov-report/is-nodejs.ts.html +109 -0
  12. package/coverage/lcov-report/is-object.ts.html +91 -0
  13. package/coverage/lcov-report/isset.ts.html +91 -0
  14. package/coverage/lcov-report/logger-utils.ts.html +1156 -0
  15. package/coverage/lcov-report/loop-utils.ts.html +382 -0
  16. package/coverage/lcov-report/object-utils.ts.html +1393 -0
  17. package/coverage/lcov-report/prettify.css +1 -0
  18. package/coverage/lcov-report/prettify.js +2 -0
  19. package/coverage/lcov-report/regexp-utils.ts.html +205 -0
  20. package/coverage/lcov-report/remove-circular-json-stringify.ts.html +139 -0
  21. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  22. package/coverage/lcov-report/sorter.js +196 -0
  23. package/coverage/lcov-report/string-utils.ts.html +922 -0
  24. package/coverage/lcov-report/timer-utils.ts.html +289 -0
  25. package/coverage/lcov-report/transaction-utils.ts.html +268 -0
  26. package/coverage/lcov.info +2151 -0
  27. package/dist/jest.config.d.ts +7 -0
  28. package/dist/jest.config.js +21 -0
  29. package/dist/jest.config.js.map +1 -0
  30. package/dist/src/timer-utils.d.ts +2 -0
  31. package/dist/src/timer-utils.js +9 -1
  32. package/dist/src/timer-utils.js.map +1 -1
  33. package/dist/src/transaction-utils.js +3 -2
  34. package/dist/src/transaction-utils.js.map +1 -1
  35. package/dist/src/transaction-utils.spec.d.ts +1 -0
  36. package/dist/src/transaction-utils.spec.js +49 -0
  37. package/dist/src/transaction-utils.spec.js.map +1 -0
  38. package/jest.config.ts +22 -0
  39. package/package.json +14 -8
  40. package/src/timer-utils.ts +11 -0
  41. package/src/transaction-utils.spec.ts +74 -0
  42. package/src/transaction-utils.ts +3 -2
  43. package/tsconfig.json +2 -1
@@ -0,0 +1,922 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for string-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> string-utils.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">32.97% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>92/279</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/23</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">32.97% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>92/279</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
346
+ <span class="cline-any cline-yes">2x</span>
347
+ <span class="cline-any cline-yes">2x</span>
348
+ <span class="cline-any cline-yes">2x</span>
349
+ <span class="cline-any cline-yes">2x</span>
350
+ <span class="cline-any cline-yes">2x</span>
351
+ <span class="cline-any cline-yes">2x</span>
352
+ <span class="cline-any cline-yes">2x</span>
353
+ <span class="cline-any cline-yes">2x</span>
354
+ <span class="cline-any cline-yes">2x</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-yes">2x</span>
360
+ <span class="cline-any cline-yes">2x</span>
361
+ <span class="cline-any cline-yes">2x</span>
362
+ <span class="cline-any cline-yes">2x</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-yes">2x</span>
368
+ <span class="cline-any cline-yes">2x</span>
369
+ <span class="cline-any cline-yes">2x</span>
370
+ <span class="cline-any cline-yes">2x</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-yes">2x</span>
376
+ <span class="cline-any cline-no">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-yes">2x</span>
381
+ <span class="cline-any cline-yes">2x</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-no">&nbsp;</span>
385
+ <span class="cline-any cline-no">&nbsp;</span>
386
+ <span class="cline-any cline-yes">2x</span>
387
+ <span class="cline-any cline-no">&nbsp;</span>
388
+ <span class="cline-any cline-yes">2x</span>
389
+ <span class="cline-any cline-no">&nbsp;</span>
390
+ <span class="cline-any cline-no">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-yes">2x</span>
393
+ <span class="cline-any cline-yes">2x</span>
394
+ <span class="cline-any cline-yes">2x</span>
395
+ <span class="cline-any cline-yes">2x</span>
396
+ <span class="cline-any cline-yes">2x</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-no">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-no">&nbsp;</span>
401
+ <span class="cline-any cline-no">&nbsp;</span>
402
+ <span class="cline-any cline-yes">2x</span>
403
+ <span class="cline-any cline-yes">2x</span>
404
+ <span class="cline-any cline-yes">2x</span>
405
+ <span class="cline-any cline-yes">2x</span>
406
+ <span class="cline-any cline-yes">2x</span>
407
+ <span class="cline-any cline-yes">2x</span>
408
+ <span class="cline-any cline-yes">2x</span>
409
+ <span class="cline-any cline-yes">2x</span>
410
+ <span class="cline-any cline-yes">2x</span>
411
+ <span class="cline-any cline-yes">2x</span>
412
+ <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-no">&nbsp;</span>
417
+ <span class="cline-any cline-no">&nbsp;</span>
418
+ <span class="cline-any cline-no">&nbsp;</span>
419
+ <span class="cline-any cline-no">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-no">&nbsp;</span>
422
+ <span class="cline-any cline-no">&nbsp;</span>
423
+ <span class="cline-any cline-no">&nbsp;</span>
424
+ <span class="cline-any cline-no">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-no">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-no">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-no">&nbsp;</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-no">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-no">&nbsp;</span>
467
+ <span class="cline-any cline-no">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-yes">2x</span>
470
+ <span class="cline-any cline-yes">2x</span>
471
+ <span class="cline-any cline-yes">2x</span>
472
+ <span class="cline-any cline-yes">2x</span>
473
+ <span class="cline-any cline-yes">2x</span>
474
+ <span class="cline-any cline-yes">2x</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
477
+ <span class="cline-any cline-no">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-yes">2x</span>
496
+ <span class="cline-any cline-yes">2x</span>
497
+ <span class="cline-any cline-yes">2x</span>
498
+ <span class="cline-any cline-yes">2x</span>
499
+ <span class="cline-any cline-yes">2x</span>
500
+ <span class="cline-any cline-yes">2x</span>
501
+ <span class="cline-any cline-yes">2x</span>
502
+ <span class="cline-any cline-yes">2x</span>
503
+ <span class="cline-any cline-yes">2x</span>
504
+ <span class="cline-any cline-yes">2x</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-no">&nbsp;</span>
511
+ <span class="cline-any cline-no">&nbsp;</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
516
+ <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-no">&nbsp;</span>
518
+ <span class="cline-any cline-no">&nbsp;</span>
519
+ <span class="cline-any cline-no">&nbsp;</span>
520
+ <span class="cline-any cline-no">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
522
+ <span class="cline-any cline-yes">2x</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-yes">2x</span>
527
+ <span class="cline-any cline-yes">2x</span>
528
+ <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-no">&nbsp;</span>
533
+ <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-no">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-no">&nbsp;</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-yes">2x</span>
548
+ <span class="cline-any cline-yes">2x</span>
549
+ <span class="cline-any cline-yes">2x</span>
550
+ <span class="cline-any cline-yes">2x</span>
551
+ <span class="cline-any cline-yes">2x</span>
552
+ <span class="cline-any cline-yes">2x</span>
553
+ <span class="cline-any cline-yes">2x</span>
554
+ <span class="cline-any cline-yes">2x</span>
555
+ <span class="cline-any cline-yes">2x</span>
556
+ <span class="cline-any cline-yes">2x</span>
557
+ <span class="cline-any cline-yes">2x</span>
558
+ <span class="cline-any cline-yes">2x</span>
559
+ <span class="cline-any cline-yes">2x</span>
560
+ <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-yes">2x</span>
571
+ <span class="cline-any cline-yes">2x</span>
572
+ <span class="cline-any cline-yes">2x</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</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-yes">2x</span>
594
+ <span class="cline-any cline-yes">2x</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-no">&nbsp;</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-yes">2x</span>
604
+ <span class="cline-any cline-yes">2x</span>
605
+ <span class="cline-any cline-yes">2x</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-yes">2x</span>
615
+ <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">//----------------------------------------
625
+ // STRING UTILS
626
+ //----------------------------------------
627
+ import { err500IfEmptyOrNotSet } from './error-utils'
628
+ import { ObjectGeneric } from './types'
629
+ import { isset } from './isset'
630
+ &nbsp;
631
+ const getWordBits = <span class="fstat-no" title="function not covered" >(wb: string[] | [string[]]): string[] =&gt; Array.isArray(wb[0]) ? wb[0] : wb as any</span>
632
+ &nbsp;
633
+ /**Eg: camelCase */
634
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function camelCase(...wordBits: string[] | [string[]]): string {</span></span>
635
+ <span class="cstat-no" title="statement not covered" > const wordBitsReal = getWordBits(wordBits)</span>
636
+ <span class="cstat-no" title="statement not covered" > return wordBitsReal.filter(e =&gt; e).map((w, i) =&gt; i === 0 ? w.toLowerCase() : capitalize1st(w, true)).join('')</span>
637
+ <span class="cstat-no" title="statement not covered" >}</span>
638
+ &nbsp;
639
+ /**Eg: snake_case
640
+ * trimmed but not lowerCased
641
+ */
642
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function snakeCase(...wordBits: string[] | [string[]]): string {</span></span>
643
+ <span class="cstat-no" title="statement not covered" > const wordBitsReal = getWordBits(wordBits)</span>
644
+ <span class="cstat-no" title="statement not covered" > return wordBitsReal.filter(e =&gt; e).map(w =&gt; w.trim()).join('_')</span>
645
+ <span class="cstat-no" title="statement not covered" >}</span>
646
+ /**Eg: kebab-case
647
+ * trimmed AND lowerCased
648
+ * undefined, null... =&gt; ''
649
+ */
650
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function kebabCase(...wordBits: string[] | [string[]]): string {</span></span>
651
+ <span class="cstat-no" title="statement not covered" > const wordBitsReal = getWordBits(wordBits)</span>
652
+ <span class="cstat-no" title="statement not covered" > return wordBitsReal.filter(e =&gt; e).map(w =&gt; w.trim().toLowerCase()).join('-')</span>
653
+ <span class="cstat-no" title="statement not covered" >}</span>
654
+ /**Eg: PascalCase undefined, null... =&gt; '' */
655
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function pascalCase(...wordBits: string[] | [string[]]): string {</span></span>
656
+ <span class="cstat-no" title="statement not covered" > const wordBitsReal = getWordBits(wordBits)</span>
657
+ <span class="cstat-no" title="statement not covered" > return wordBitsReal.filter(e =&gt; e).map(w =&gt; capitalize1st(w, true)).join('')</span>
658
+ <span class="cstat-no" title="statement not covered" >}</span>
659
+ &nbsp;
660
+ /**Eg: Titlecase undefined, null... =&gt; '' */
661
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function titleCase(...wordBits: string[] | [string[]]): string {</span></span>
662
+ <span class="cstat-no" title="statement not covered" > const wordBitsReal = getWordBits(wordBits)</span>
663
+ <span class="cstat-no" title="statement not covered" > return capitalize1st(wordBitsReal.filter(e =&gt; e).map(w =&gt; w.trim()).join(''), true)</span>
664
+ <span class="cstat-no" title="statement not covered" >}</span>
665
+ &nbsp;
666
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function capitalize1st(str = '', lowercaseTheRest = false): string { return str ? str[0].toUpperCase() + (lowercaseTheRest ? str.toLowerCase() : str).slice(1) : str }</span></span>
667
+ &nbsp;
668
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function camelCaseToWords(str: string): string[] {</span></span>
669
+ <span class="cstat-no" title="statement not covered" > return str ? str.trim().replace(/([A-Z])/g, '-$1').toLowerCase().split('-') : []</span>
670
+ <span class="cstat-no" title="statement not covered" >}</span>
671
+ &nbsp;
672
+ /** GIVEN A STRING '{ blah;2}, ['nested,(what,ever)']' AND A SEPARATOR ",""
673
+ * This will return the content separated by first level of separators
674
+ * @return ["{ blah;2}", "['nested,(what,ever)']"]
675
+ */
676
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function getValuesBetweenSeparator(str: string, separator: string, removeTrailingSpaces = true) {</span></span>
677
+ <span class="cstat-no" title="statement not covered" > err500IfEmptyOrNotSet({ separator, str })</span>
678
+ <span class="cstat-no" title="statement not covered" > const { outer } = getValuesBetweenStrings(str, separator, undefined, undefined, undefined, removeTrailingSpaces)</span>
679
+ <span class="cstat-no" title="statement not covered" > return outer</span>
680
+ <span class="cstat-no" title="statement not covered" >}</span>
681
+ &nbsp;
682
+ &nbsp;
683
+ /** GIVEN A STRING "a: [ 'str', /[^]]/, '[aa]]]str', () =&gt; [ nestedArray ] ], b: ['arr']"
684
+ * @return matching: [ "'str', /[^]]/, '[aa]]]str', () =&gt; [ nestedArray ]", "'arr'" ], between: [ "a:", ", b: " ]
685
+ * @param str base string
686
+ * @param openingOrSeparator opening character OR separator if closing not set
687
+ * @param closing
688
+ * @param ignoreBetweenOpen default ['\'', '`', '"', '/'], when reaching an opening char, it will ignore all until it find the corresponding closing char
689
+ * @param ignoreBetweenClose default ['\'', '`', '"', '/'] list of corresponding closing chars
690
+ */
691
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function getValuesBetweenStrings(str: string, openingOrSeparator, closing, ignoreBetweenOpen = ['\'', '`', '"', '/'], ignoreBetweenClose = ['\'', '`', '"', '/'], removeTrailingSpaces = true) {</span></span>
692
+ <span class="cstat-no" title="statement not covered" > err500IfEmptyOrNotSet({ openingOrSeparator, str })</span>
693
+ <span class="cstat-no" title="statement not covered" ></span>
694
+ <span class="cstat-no" title="statement not covered" > str = str.replace(/&lt;&lt;/g, '§§"').replace(/&gt;&gt;/g, '"§§')</span>
695
+ <span class="cstat-no" title="statement not covered" ></span>
696
+ <span class="cstat-no" title="statement not covered" > const arrayValues: string[] = []</span>
697
+ <span class="cstat-no" title="statement not covered" > const betweenArray: string[] = []</span>
698
+ <span class="cstat-no" title="statement not covered" > let level = 0</span>
699
+ <span class="cstat-no" title="statement not covered" > let ignoreUntil: boolean | string = false</span>
700
+ <span class="cstat-no" title="statement not covered" > let actualValue = ''</span>
701
+ <span class="cstat-no" title="statement not covered" > let precedingChar = ''</span>
702
+ <span class="cstat-no" title="statement not covered" ></span>
703
+ <span class="cstat-no" title="statement not covered" > let separatorMode = false</span>
704
+ <span class="cstat-no" title="statement not covered" > if (!closing) separatorMode = true</span>
705
+ <span class="cstat-no" title="statement not covered" ></span>
706
+ <span class="cstat-no" title="statement not covered" > const separator = separatorMode ? openingOrSeparator : false</span>
707
+ <span class="cstat-no" title="statement not covered" > const openingChars = separatorMode ? ['(', '{', '['] : [openingOrSeparator]</span>
708
+ <span class="cstat-no" title="statement not covered" > const closingChars = separatorMode ? [')', '}', ']'] : [closing]</span>
709
+ <span class="cstat-no" title="statement not covered" ></span>
710
+ <span class="cstat-no" title="statement not covered" > const pushActualValue = () =&gt; {</span>
711
+ <span class="cstat-no" title="statement not covered" > if (level === 0) betweenArray.push(removeTrailingSpaces ? actualValue.replace(/(?:^\s+|\s+$)/g, '') : actualValue)</span>
712
+ <span class="cstat-no" title="statement not covered" > else arrayValues.push(removeTrailingSpaces ? actualValue.replace(/(?:^\s+|\s+$)/g, '') : actualValue)</span>
713
+ <span class="cstat-no" title="statement not covered" > actualValue = ''</span>
714
+ <span class="cstat-no" title="statement not covered" > }</span>
715
+ <span class="cstat-no" title="statement not covered" ></span>
716
+ <span class="cstat-no" title="statement not covered" > str.split('').forEach(char =&gt; {</span>
717
+ <span class="cstat-no" title="statement not covered" > // handle unwanted nested structure like characters in a strings that may be a unmatched closing / opening character</span>
718
+ <span class="cstat-no" title="statement not covered" > // Eg: {'azer}aze'}</span>
719
+ <span class="cstat-no" title="statement not covered" > if (ignoreUntil &amp;&amp; char === ignoreUntil &amp;&amp; precedingChar !== '\\') ignoreUntil = false</span>
720
+ <span class="cstat-no" title="statement not covered" > else if (ignoreUntil &amp;&amp; char !== ignoreUntil) true</span>
721
+ <span class="cstat-no" title="statement not covered" > else if (ignoreBetweenOpen.includes(char)) {</span>
722
+ <span class="cstat-no" title="statement not covered" > const indexChar = ignoreBetweenOpen.findIndex(char2 =&gt; char2 === char)</span>
723
+ <span class="cstat-no" title="statement not covered" > ignoreUntil = ignoreBetweenClose[indexChar]</span>
724
+ <span class="cstat-no" title="statement not covered" > } else if (openingChars.includes(char)) {</span>
725
+ <span class="cstat-no" title="statement not covered" > // handle nested structures</span>
726
+ <span class="cstat-no" title="statement not covered" > if (!separatorMode &amp;&amp; level === 0) pushActualValue()</span>
727
+ <span class="cstat-no" title="statement not covered" > level++</span>
728
+ <span class="cstat-no" title="statement not covered" > if (!separatorMode) return</span>
729
+ <span class="cstat-no" title="statement not covered" > } else if (closingChars.includes(char)) {</span>
730
+ <span class="cstat-no" title="statement not covered" > // handle nested structures</span>
731
+ <span class="cstat-no" title="statement not covered" > if (!separatorMode &amp;&amp; level === 1) pushActualValue()</span>
732
+ <span class="cstat-no" title="statement not covered" > level--</span>
733
+ <span class="cstat-no" title="statement not covered" > } else if (separatorMode &amp;&amp; level === 0 &amp;&amp; char === separator) {</span>
734
+ <span class="cstat-no" title="statement not covered" > // SEPARATOR MODE</span>
735
+ <span class="cstat-no" title="statement not covered" > pushActualValue()</span>
736
+ <span class="cstat-no" title="statement not covered" > return</span>
737
+ <span class="cstat-no" title="statement not covered" > }</span>
738
+ <span class="cstat-no" title="statement not covered" > actualValue += char</span>
739
+ <span class="cstat-no" title="statement not covered" > precedingChar = char</span>
740
+ <span class="cstat-no" title="statement not covered" > })</span>
741
+ <span class="cstat-no" title="statement not covered" ></span>
742
+ <span class="cstat-no" title="statement not covered" > pushActualValue()</span>
743
+ <span class="cstat-no" title="statement not covered" ></span>
744
+ <span class="cstat-no" title="statement not covered" > const replaceValz = arr =&gt; arr.map(v =&gt; v.replace(/§§"/g, '&lt;&lt;').replace(/"§§/g, '&gt;&gt;')).filter(v =&gt; v)</span>
745
+ <span class="cstat-no" title="statement not covered" ></span>
746
+ <span class="cstat-no" title="statement not covered" > return { inner: replaceValz(arrayValues), outer: replaceValz(betweenArray) }</span>
747
+ <span class="cstat-no" title="statement not covered" >}</span>
748
+ &nbsp;
749
+ /** Remove accentued character from string and eventually special chars and numbers
750
+ * @param {String} str input string
751
+ * @param {Object} config { removeSpecialChars: false, removeNumbers: false, removeSpaces: false }
752
+ * @returns String with all accentued char replaced by their non accentued version + config formattting
753
+ */
754
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function convertAccentedCharacters(str: string, config: { removeNumbers?: boolean, removeSpecialChars?: boolean, removeSpaces?: boolean } = {}) {</span></span>
755
+ <span class="cstat-no" title="statement not covered" > let output = str</span>
756
+ <span class="cstat-no" title="statement not covered" > .trim()</span>
757
+ <span class="cstat-no" title="statement not covered" > .replace(/[àáâãäå]/g, 'a')</span>
758
+ <span class="cstat-no" title="statement not covered" > .replace(/[ÀÁÂÃÄÅ]/g, 'A')</span>
759
+ <span class="cstat-no" title="statement not covered" > .replace(/ç/g, 'c')</span>
760
+ <span class="cstat-no" title="statement not covered" > .replace(/Ç/g, 'C')</span>
761
+ <span class="cstat-no" title="statement not covered" > .replace(/[èéêë]/g, 'e')</span>
762
+ <span class="cstat-no" title="statement not covered" > .replace(/[ÈÉÊË]/g, 'E')</span>
763
+ <span class="cstat-no" title="statement not covered" > .replace(/[ìíîï]/g, 'i')</span>
764
+ <span class="cstat-no" title="statement not covered" > .replace(/[ÌÍÎÏ]/g, 'I')</span>
765
+ <span class="cstat-no" title="statement not covered" > .replace(/[ôö]/g, 'o')</span>
766
+ <span class="cstat-no" title="statement not covered" > .replace(/[ÔÖ]/g, 'O')</span>
767
+ <span class="cstat-no" title="statement not covered" > .replace(/[ùúû]/g, 'u')</span>
768
+ <span class="cstat-no" title="statement not covered" > .replace(/[ÙÚÛ]/g, 'U')</span>
769
+ <span class="cstat-no" title="statement not covered" > if (config.removeNumbers === true) output = output.replace(/\d+/g, '')</span>
770
+ <span class="cstat-no" title="statement not covered" > if (config.removeSpecialChars === true) output = output.replace(/[^A-Za-z0-9 ]/g, '')</span>
771
+ <span class="cstat-no" title="statement not covered" > if (config.removeSpaces === true) output = output.replace(/\s+/g, '')</span>
772
+ <span class="cstat-no" title="statement not covered" > return output</span>
773
+ <span class="cstat-no" title="statement not covered" >}</span>
774
+ &nbsp;
775
+ &nbsp;
776
+ let generatedTokens: string[] = [] // cache to avoid collision
777
+ let lastTs = Date.now()
778
+ /** minLength 8 if unique
779
+ * @param {Number} length default: 20
780
+ * @param {Boolean} unique default: true. Generate a real unique token base on the date. min length will be min 8 in this case
781
+ * @param {string} mode one of ['alphanumeric', 'hexadecimal']
782
+ * NOTE: to generate a mongoDB Random Id, use the params: 24, true, 'hexadecimal'
783
+ */
784
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function generateToken(length = 20, unique = true, mode: 'alphanumeric' | 'hexadecimal' = 'alphanumeric') {</span></span>
785
+ <span class="cstat-no" title="statement not covered" > const charConvNumeric = mode === 'alphanumeric' ? 36 : 16</span>
786
+ <span class="cstat-no" title="statement not covered" > if (unique &amp;&amp; length &lt; 8) throw new Error('generateToken can not be used with less than 8 characters when unique is set to true')</span>
787
+ <span class="cstat-no" title="statement not covered" > let token: string</span>
788
+ <span class="cstat-no" title="statement not covered" > let tokenTs: number</span>
789
+ <span class="cstat-no" title="statement not covered" > do {</span>
790
+ <span class="cstat-no" title="statement not covered" > tokenTs = Date.now()</span>
791
+ <span class="cstat-no" title="statement not covered" > token = unique ? tokenTs.toString(charConvNumeric) : ''</span>
792
+ <span class="cstat-no" title="statement not covered" > while (token.length &lt; length) token += Math.random().toString(charConvNumeric).substr(2, 1) // char alphaNumeric aléatoire</span>
793
+ <span class="cstat-no" title="statement not covered" > } while (generatedTokens.includes(token))</span>
794
+ <span class="cstat-no" title="statement not covered" > if (lastTs &lt; tokenTs) {</span>
795
+ <span class="cstat-no" title="statement not covered" > generatedTokens = [] // reset generated token on new timestamp because cannot collide</span>
796
+ <span class="cstat-no" title="statement not covered" > lastTs = Date.now()</span>
797
+ <span class="cstat-no" title="statement not covered" > }</span>
798
+ <span class="cstat-no" title="statement not covered" > generatedTokens.push(token)</span>
799
+ <span class="cstat-no" title="statement not covered" > return token</span>
800
+ <span class="cstat-no" title="statement not covered" >}</span>
801
+ &nbsp;
802
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function generateObjectId() {</span></span>
803
+ <span class="cstat-no" title="statement not covered" > return generateToken(24, true, 'hexadecimal')</span>
804
+ <span class="cstat-no" title="statement not covered" >}</span>
805
+ &nbsp;
806
+ &nbsp;
807
+ /** Useful to join differents bits of url with normalizing slashes
808
+ * * urlPathJoin('https://', 'www.kikou.lol/', '/user', '//2//') =&gt; https://www.kikou.lol/user/2
809
+ * * urlPathJoin('http:/', 'kikou.lol') =&gt; https://www.kikou.lol
810
+ */
811
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function urlPathJoin(...bits: string[]) {</span></span>
812
+ <span class="cstat-no" title="statement not covered" > return bits</span>
813
+ <span class="cstat-no" title="statement not covered" > .join('/')</span>
814
+ <span class="cstat-no" title="statement not covered" > .replace(/\/+/g, '/') // replace double slash</span>
815
+ <span class="cstat-no" title="statement not covered" > .replace(/(^\/|\/$)/g, '') // remove starting and trailing slash</span>
816
+ <span class="cstat-no" title="statement not covered" > .replace(/(https?:)\/\/?/, '$1//') // make sure there is 2 slashes after http(s)</span>
817
+ <span class="cstat-no" title="statement not covered" >}</span>
818
+ &nbsp;
819
+ /** @deprecated use urlPathJoin instead // file path using ONLY SLASH and not antislash on windows. Remove also starting and trailing slashes */
820
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function pathJoinSafe(...pathBits: string[]) {</span></span>
821
+ <span class="cstat-no" title="statement not covered" > return pathBits</span>
822
+ <span class="cstat-no" title="statement not covered" > .join('/')</span>
823
+ <span class="cstat-no" title="statement not covered" > .replace(/\/+/g, '/') // replace double slash</span>
824
+ <span class="cstat-no" title="statement not covered" > .replace(/(^\/|\/$)/g, '') // remove starting and trailing slash</span>
825
+ <span class="cstat-no" title="statement not covered" >}</span>
826
+ &nbsp;
827
+ &nbsp;
828
+ export type MiniTemplaterOptions = {
829
+ valueWhenNotSet: string
830
+ regexp: RegExp
831
+ valueWhenContentUndefined: string
832
+ }
833
+ /** Replace variables in a string like: `Hello {{userName}}!`
834
+ * @param {String} content
835
+ * @param {Object} varz object with key =&gt; value === toReplace =&gt; replacer
836
+ * @param {Object} options
837
+ * * valueWhenNotSet =&gt; replacer for undefined values. Default: ''
838
+ * * regexp =&gt; must be 'g' and first capturing group matching the value to replace. Default: /{{\s*([^}]*)\s*}}/g
839
+ */
840
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function miniTemplater(content: string, varz: ObjectGeneric, options: Partial&lt;MiniTemplaterOptions&gt; = {}): string {</span></span>
841
+ <span class="cstat-no" title="statement not covered" > const options2: MiniTemplaterOptions = {</span>
842
+ <span class="cstat-no" title="statement not covered" > valueWhenNotSet: '',</span>
843
+ <span class="cstat-no" title="statement not covered" > regexp: /{{\s*([^}]*)\s*}}/g,</span>
844
+ <span class="cstat-no" title="statement not covered" > valueWhenContentUndefined: '',</span>
845
+ <span class="cstat-no" title="statement not covered" > ...options,</span>
846
+ <span class="cstat-no" title="statement not covered" > }</span>
847
+ <span class="cstat-no" title="statement not covered" > return isset(content) ? content.replace(options2.regexp, (_, $1) =&gt; isset(varz[$1]) ? varz[$1] : options2.valueWhenNotSet) : options2.valueWhenContentUndefined</span>
848
+ <span class="cstat-no" title="statement not covered" >}</span>
849
+ &nbsp;
850
+ &nbsp;
851
+ /** Clean output for outside world. All undefined / null / NaN / Infinity values are changed to '-' */
852
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function cln(val, replacerInCaseItIsUndefinNaN = '-') { return ['undefined', undefined, 'indéfini', 'NaN', NaN, Infinity, null].includes(val) ? replacerInCaseItIsUndefinNaN : val }</span></span>
853
+ &nbsp;
854
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function nbOccurenceInString(baseString: string, searchedString: string, allowOverlapping: boolean = false) {</span></span>
855
+ <span class="cstat-no" title="statement not covered" ></span>
856
+ <span class="cstat-no" title="statement not covered" > if (searchedString.length === 0) return baseString.length + 1</span>
857
+ <span class="cstat-no" title="statement not covered" ></span>
858
+ <span class="cstat-no" title="statement not covered" > let n = 0</span>
859
+ <span class="cstat-no" title="statement not covered" > let pos = 0</span>
860
+ <span class="cstat-no" title="statement not covered" > const step = allowOverlapping ? 1 : searchedString.length</span>
861
+ <span class="cstat-no" title="statement not covered" ></span>
862
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-constant-condition</span>
863
+ <span class="cstat-no" title="statement not covered" > while (true) {</span>
864
+ <span class="cstat-no" title="statement not covered" > pos = baseString.indexOf(searchedString, pos)</span>
865
+ <span class="cstat-no" title="statement not covered" > if (pos &gt;= 0) {</span>
866
+ <span class="cstat-no" title="statement not covered" > ++n</span>
867
+ <span class="cstat-no" title="statement not covered" > pos += step</span>
868
+ <span class="cstat-no" title="statement not covered" > } else break</span>
869
+ <span class="cstat-no" title="statement not covered" > }</span>
870
+ <span class="cstat-no" title="statement not covered" > return n</span>
871
+ <span class="cstat-no" title="statement not covered" >}</span>
872
+ &nbsp;
873
+ /** typed lower case. Eg: if you pass 'A' | 'B', the resulting type will be 'a' | 'b' */
874
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function lowerCase&lt;T extends string&gt;(string: T) {</span></span>
875
+ <span class="cstat-no" title="statement not covered" > return string?.toLocaleLowerCase() as Lowercase&lt;T&gt;</span>
876
+ <span class="cstat-no" title="statement not covered" >}</span>
877
+ &nbsp;
878
+ /** typed upper case. Eg: if you pass 'a' | 'b', the resulting type will be 'A' | 'B' */
879
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function upperCase&lt;T extends string&gt;(string: T) {</span></span>
880
+ <span class="cstat-no" title="statement not covered" > return string?.toLocaleUpperCase() as Uppercase&lt;T&gt;</span>
881
+ <span class="cstat-no" title="statement not covered" >}</span>
882
+ &nbsp;
883
+ /** Parse strings like 'true', 'false', '123', 'null' to their real type equivalent. Actual string is returned if nothing matches.
884
+ * * /!\ for typing please profide a type parameter like `parseStringVariable&lt;boolean&gt;('true')` */
885
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function parseStringVariable&lt;T = any&gt;(val: any): T {</span></span>
886
+ <span class="cstat-no" title="statement not covered" > if (val === 'undefined') return undefined as any</span>
887
+ <span class="cstat-no" title="statement not covered" > else if (val === 'true') return true as any</span>
888
+ <span class="cstat-no" title="statement not covered" > else if (val === 'false') return false as any</span>
889
+ <span class="cstat-no" title="statement not covered" > else if (val === 'null') return null as any</span>
890
+ <span class="cstat-no" title="statement not covered" > else if (/^[0-9]+$/.test(val)) return Number(val) as any</span>
891
+ <span class="cstat-no" title="statement not covered" > else return val as any</span>
892
+ <span class="cstat-no" title="statement not covered" >}</span>
893
+ &nbsp;
894
+ /** return val === 'true' || val === true */
895
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function parseStringAsBoolean(val: string | boolean | undefined) {</span></span>
896
+ <span class="cstat-no" title="statement not covered" > return val === 'true' || val === true</span>
897
+ <span class="cstat-no" title="statement not covered" >}</span>
898
+ &nbsp;
899
+ /** return Number(val) */
900
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function parseStringAsNumber(val: string | number) {</span></span>
901
+ <span class="cstat-no" title="statement not covered" > return Number(val)</span>
902
+ <span class="cstat-no" title="statement not covered" >}</span>
903
+ &nbsp;</pre></td></tr></table></pre>
904
+
905
+ <div class='push'></div><!-- for sticky footer -->
906
+ </div><!-- /wrapper -->
907
+ <div class='footer quiet pad2 space-top1 center small'>
908
+ Code coverage generated by
909
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
910
+ at 2024-08-30T12:49:01.025Z
911
+ </div>
912
+ <script src="prettify.js"></script>
913
+ <script>
914
+ window.onload = function () {
915
+ prettyPrint();
916
+ };
917
+ </script>
918
+ <script src="sorter.js"></script>
919
+ <script src="block-navigation.js"></script>
920
+ </body>
921
+ </html>
922
+