topkat-utils 1.2.117 → 1.3.4

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 (51) hide show
  1. package/README.md +260 -219
  2. package/coverage/clover.xml +523 -427
  3. package/coverage/coverage-final.json +10 -10
  4. package/coverage/lcov-report/clean-stack-trace.ts.html +13 -10
  5. package/coverage/lcov-report/config.ts.html +2 -2
  6. package/coverage/lcov-report/error-utils.ts.html +2 -2
  7. package/coverage/lcov-report/index.html +56 -56
  8. package/coverage/lcov-report/is-empty.ts.html +1 -1
  9. package/coverage/lcov-report/is-nodejs.ts.html +1 -1
  10. package/coverage/lcov-report/is-object.ts.html +1 -1
  11. package/coverage/lcov-report/isset.ts.html +1 -1
  12. package/coverage/lcov-report/logger-utils.ts.html +215 -215
  13. package/coverage/lcov-report/loop-utils.ts.html +179 -8
  14. package/coverage/lcov-report/math-utils.ts.html +35 -8
  15. package/coverage/lcov-report/object-utils.ts.html +20 -8
  16. package/coverage/lcov-report/regexp-utils.ts.html +45 -12
  17. package/coverage/lcov-report/remove-circular-json-stringify.ts.html +1 -1
  18. package/coverage/lcov-report/string-utils.ts.html +54 -12
  19. package/coverage/lcov-report/timer-utils.ts.html +2 -2
  20. package/coverage/lcov-report/transaction-utils.ts.html +1 -1
  21. package/coverage/lcov.info +626 -607
  22. package/dist/src/clean-stack-trace.js +1 -0
  23. package/dist/src/clean-stack-trace.js.map +1 -1
  24. package/dist/src/error-utils.js +1 -1
  25. package/dist/src/error-utils.js.map +1 -1
  26. package/dist/src/loop-utils.d.ts +54 -2
  27. package/dist/src/loop-utils.js +48 -2
  28. package/dist/src/loop-utils.js.map +1 -1
  29. package/dist/src/math-utils.d.ts +1 -1
  30. package/dist/src/math-utils.js +6 -2
  31. package/dist/src/math-utils.js.map +1 -1
  32. package/dist/src/object-utils.d.ts +3 -1
  33. package/dist/src/object-utils.js +7 -4
  34. package/dist/src/object-utils.js.map +1 -1
  35. package/dist/src/regexp-utils.d.ts +9 -4
  36. package/dist/src/regexp-utils.js +8 -5
  37. package/dist/src/regexp-utils.js.map +1 -1
  38. package/dist/src/string-utils.d.ts +13 -4
  39. package/dist/src/string-utils.js +16 -6
  40. package/dist/src/string-utils.js.map +1 -1
  41. package/dist/src/timer-utils.d.ts +1 -1
  42. package/dist/src/timer-utils.js +1 -1
  43. package/package.json +45 -8
  44. package/src/clean-stack-trace.ts +1 -0
  45. package/src/error-utils.ts +1 -1
  46. package/src/loop-utils.ts +59 -2
  47. package/src/math-utils.ts +11 -2
  48. package/src/object-utils.ts +6 -2
  49. package/src/regexp-utils.ts +17 -6
  50. package/src/string-utils.ts +19 -5
  51. package/src/timer-utils.ts +1 -1
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">46.22% </span>
26
+ <span class="strong">47.23% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>49/106</span>
28
+ <span class='fraction'>77/163</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">46.22% </span>
47
+ <span class="strong">47.23% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>49/106</span>
49
+ <span class='fraction'>77/163</span>
50
50
  </div>
51
51
 
52
52
 
@@ -169,13 +169,86 @@
169
169
  <a name='L104'></a><a href='#L104'>104</a>
170
170
  <a name='L105'></a><a href='#L105'>105</a>
171
171
  <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
173
230
  <span class="cline-any cline-yes">2x</span>
174
231
  <span class="cline-any cline-yes">2x</span>
175
232
  <span class="cline-any cline-yes">2x</span>
176
233
  <span class="cline-any cline-yes">2x</span>
177
234
  <span class="cline-any cline-yes">2x</span>
178
235
  <span class="cline-any cline-yes">2x</span>
236
+ <span class="cline-any cline-yes">2x</span>
237
+ <span class="cline-any cline-yes">2x</span>
238
+ <span class="cline-any cline-yes">2x</span>
239
+ <span class="cline-any cline-yes">2x</span>
240
+ <span class="cline-any cline-yes">2x</span>
241
+ <span class="cline-any cline-yes">2x</span>
242
+ <span class="cline-any cline-yes">2x</span>
243
+ <span class="cline-any cline-yes">2x</span>
244
+ <span class="cline-any cline-yes">2x</span>
245
+ <span class="cline-any cline-yes">2x</span>
246
+ <span class="cline-any cline-yes">2x</span>
247
+ <span class="cline-any cline-yes">2x</span>
248
+ <span class="cline-any cline-yes">2x</span>
249
+ <span class="cline-any cline-yes">2x</span>
250
+ <span class="cline-any cline-no">&nbsp;</span>
251
+ <span class="cline-any cline-no">&nbsp;</span>
179
252
  <span class="cline-any cline-no">&nbsp;</span>
180
253
  <span class="cline-any cline-no">&nbsp;</span>
181
254
  <span class="cline-any cline-no">&nbsp;</span>
@@ -184,6 +257,34 @@
184
257
  <span class="cline-any cline-no">&nbsp;</span>
185
258
  <span class="cline-any cline-no">&nbsp;</span>
186
259
  <span class="cline-any cline-no">&nbsp;</span>
260
+ <span class="cline-any cline-no">&nbsp;</span>
261
+ <span class="cline-any cline-no">&nbsp;</span>
262
+ <span class="cline-any cline-no">&nbsp;</span>
263
+ <span class="cline-any cline-no">&nbsp;</span>
264
+ <span class="cline-any cline-no">&nbsp;</span>
265
+ <span class="cline-any cline-no">&nbsp;</span>
266
+ <span class="cline-any cline-no">&nbsp;</span>
267
+ <span class="cline-any cline-no">&nbsp;</span>
268
+ <span class="cline-any cline-no">&nbsp;</span>
269
+ <span class="cline-any cline-no">&nbsp;</span>
270
+ <span class="cline-any cline-no">&nbsp;</span>
271
+ <span class="cline-any cline-no">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-no">&nbsp;</span>
274
+ <span class="cline-any cline-yes">2x</span>
275
+ <span class="cline-any cline-yes">2x</span>
276
+ <span class="cline-any cline-yes">2x</span>
277
+ <span class="cline-any cline-yes">2x</span>
278
+ <span class="cline-any cline-yes">2x</span>
279
+ <span class="cline-any cline-yes">2x</span>
280
+ <span class="cline-any cline-yes">2x</span>
281
+ <span class="cline-any cline-yes">2x</span>
282
+ <span class="cline-any cline-yes">2x</span>
283
+ <span class="cline-any cline-yes">2x</span>
284
+ <span class="cline-any cline-yes">2x</span>
285
+ <span class="cline-any cline-yes">2x</span>
286
+ <span class="cline-any cline-yes">2x</span>
287
+ <span class="cline-any cline-yes">2x</span>
187
288
  <span class="cline-any cline-yes">2x</span>
188
289
  <span class="cline-any cline-yes">2x</span>
189
290
  <span class="cline-any cline-no">&nbsp;</span>
@@ -238,6 +339,19 @@
238
339
  <span class="cline-any cline-no">&nbsp;</span>
239
340
  <span class="cline-any cline-no">&nbsp;</span>
240
341
  <span class="cline-any cline-no">&nbsp;</span>
342
+ <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-no">&nbsp;</span>
346
+ <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-no">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
241
355
  <span class="cline-any cline-yes">2x</span>
242
356
  <span class="cline-any cline-yes">2x</span>
243
357
  <span class="cline-any cline-yes">2x</span>
@@ -282,7 +396,37 @@ import { ObjectGeneric } from './types'
282
396
  import { err500IfNotSet } from './error-utils'
283
397
  import { isObject } from './is-object'
284
398
  &nbsp;
285
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function forI&lt;T extends any[] | any&gt;(nbIterations: number, callback: (number: number, previousValue, arrayOfPreviousValues: any[]) =&gt; T): T[] {</span></span>
399
+ /**
400
+ * Iterates over a specified number of times, passing each iteration's result to the next callback
401
+ * @returns Array containing results from all iterations
402
+ *
403
+ * @example
404
+ * ```typescript
405
+ * // Generate Fibonacci sequence
406
+ * forI(8, (i, prev, results) =&gt; {
407
+ * if (i &lt;= 1) return 1
408
+ * return results[i-1] + results[i-2]
409
+ * })
410
+ * ```
411
+ * // Returns: [1, 1, 2, 3, 5, 8, 13, 21]
412
+ */
413
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function forI&lt;T extends any[] | any&gt;(</span></span>
414
+ <span class="cstat-no" title="statement not covered" > /** Number of times to iterate */</span>
415
+ <span class="cstat-no" title="statement not covered" > nbIterations: number,</span>
416
+ <span class="cstat-no" title="statement not covered" > /** Function called for each iteration with:</span>
417
+ <span class="cstat-no" title="statement not covered" > * - number: Current iteration index (0-based)</span>
418
+ <span class="cstat-no" title="statement not covered" > * - previousValue: Result from previous iteration</span>
419
+ <span class="cstat-no" title="statement not covered" > * - arrayOfPreviousValues: Array of all previous results</span>
420
+ <span class="cstat-no" title="statement not covered" > */</span>
421
+ <span class="cstat-no" title="statement not covered" > callback: (</span>
422
+ <span class="cstat-no" title="statement not covered" > /** Current iteration index (0-based) */</span>
423
+ <span class="cstat-no" title="statement not covered" > number: number,</span>
424
+ <span class="cstat-no" title="statement not covered" > /** Result from previous iteration */</span>
425
+ <span class="cstat-no" title="statement not covered" > previousValue,</span>
426
+ <span class="cstat-no" title="statement not covered" > /** Array of all previous results */</span>
427
+ <span class="cstat-no" title="statement not covered" > arrayOfPreviousValues: any[]</span>
428
+ <span class="cstat-no" title="statement not covered" > ) =&gt; T</span>
429
+ <span class="cstat-no" title="statement not covered" >): T[] {</span>
286
430
  <span class="cstat-no" title="statement not covered" > const results: any[] = []</span>
287
431
  <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; nbIterations; i++) {</span>
288
432
  <span class="cstat-no" title="statement not covered" > const prevValue = results[results.length - 1]</span>
@@ -291,6 +435,20 @@ import { isObject } from './is-object'
291
435
  <span class="cstat-no" title="statement not covered" > return results</span>
292
436
  <span class="cstat-no" title="statement not covered" >}</span>
293
437
  &nbsp;
438
+ /**
439
+ * Iterates over a specified number of times, passing each iteration's result to the next callback
440
+ * @returns Array containing results from all iterations
441
+ *
442
+ * @example
443
+ * ```typescript
444
+ * // Generate Fibonacci sequence ASYNC
445
+ * await forI(8, async (i, prev, results) =&gt; {
446
+ * if (i &lt;= 1) return 1
447
+ * return new Promise(resolve =&gt; setTimeout(() =&gt; resolve(results[i-1] + results[i-2]), 100))
448
+ * })
449
+ * ```
450
+ * // Returns: [1, 1, 2, 3, 5, 8, 13, 21]
451
+ */
294
452
  export <span class="fstat-no" title="function not covered" >async function forIasync&lt;T extends any[] | any&gt;(nbIterations: number, callback: (number) =&gt; T): Promise&lt;T[]&gt; {</span>
295
453
  <span class="cstat-no" title="statement not covered" > const results: any[] = []</span>
296
454
  <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; nbIterations; i++) {</span>
@@ -320,7 +478,20 @@ export type RecursiveConfig = {
320
478
  * NOTE: will remove circular references
321
479
  * /!\ check return values
322
480
  */
323
- export <span class="fstat-no" title="function not covered" >async function recursiveGenericFunction(item: ObjectGeneric | any[], callback: RecursiveCallback, config: RecursiveConfig = {}, addr$ = '', lastElementKey: string | number = '', parent?, techFieldToAvoidCircularDependency: any[] = []) {</span>
481
+ export <span class="fstat-no" title="function not covered" >async function recursiveGenericFunction(</span>
482
+ <span class="cstat-no" title="statement not covered" > /** The object or array you want to recursively browse */</span>
483
+ <span class="cstat-no" title="statement not covered" > item: ObjectGeneric | any[],</span>
484
+ <span class="cstat-no" title="statement not covered" > /** The callback you want to apply on items including the main one */</span>
485
+ <span class="cstat-no" title="statement not covered" > callback: RecursiveCallback,</span>
486
+ <span class="cstat-no" title="statement not covered" > /** Optional configuration object */</span>
487
+ <span class="cstat-no" title="statement not covered" > config: RecursiveConfig = {},</span>
488
+ <span class="cstat-no" title="statement not covered" > /** Optional base address for the callback function */</span>
489
+ <span class="cstat-no" title="statement not covered" > addr$ = '',</span>
490
+ <span class="cstat-no" title="statement not covered" > /** Technical field */</span>
491
+ <span class="cstat-no" title="statement not covered" > lastElementKey: string | number = '',</span>
492
+ <span class="cstat-no" title="statement not covered" > parent?,</span>
493
+ <span class="cstat-no" title="statement not covered" > techFieldToAvoidCircularDependency: any[] = []</span>
494
+ <span class="cstat-no" title="statement not covered" >) {</span>
324
495
  <span class="cstat-no" title="statement not covered" > err500IfNotSet({ callback })</span>
325
496
  <span class="cstat-no" title="statement not covered" ></span>
326
497
  <span class="cstat-no" title="statement not covered" > if (!config.isObjectTestFunction) config.isObjectTestFunction = isObject</span>
@@ -388,7 +559,7 @@ export <span class="fstat-no" title="function not covered" >async function recur
388
559
  <div class='footer quiet pad2 space-top1 center small'>
389
560
  Code coverage generated by
390
561
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
391
- at 2025-03-13T19:05:26.769Z
562
+ at 2025-03-16T15:53:34.514Z
392
563
  </div>
393
564
  <script src="prettify.js"></script>
394
565
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">58% </span>
26
+ <span class="strong">50.84% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>29/50</span>
28
+ <span class='fraction'>30/59</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">58% </span>
47
+ <span class="strong">50.84% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>29/50</span>
49
+ <span class='fraction'>30/59</span>
50
50
  </div>
51
51
 
52
52
 
@@ -112,15 +112,33 @@
112
112
  <a name='L47'></a><a href='#L47'>47</a>
113
113
  <a name='L48'></a><a href='#L48'>48</a>
114
114
  <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
116
125
  <span class="cline-any cline-yes">2x</span>
117
126
  <span class="cline-any cline-yes">2x</span>
118
127
  <span class="cline-any cline-yes">2x</span>
119
128
  <span class="cline-any cline-yes">2x</span>
120
129
  <span class="cline-any cline-yes">2x</span>
121
130
  <span class="cline-any cline-no">&nbsp;</span>
131
+ <span class="cline-any cline-no">&nbsp;</span>
132
+ <span class="cline-any cline-no">&nbsp;</span>
133
+ <span class="cline-any cline-yes">2x</span>
122
134
  <span class="cline-any cline-yes">2x</span>
123
135
  <span class="cline-any cline-no">&nbsp;</span>
136
+ <span class="cline-any cline-no">&nbsp;</span>
137
+ <span class="cline-any cline-no">&nbsp;</span>
138
+ <span class="cline-any cline-no">&nbsp;</span>
139
+ <span class="cline-any cline-no">&nbsp;</span>
140
+ <span class="cline-any cline-no">&nbsp;</span>
141
+ <span class="cline-any cline-no">&nbsp;</span>
124
142
  <span class="cline-any cline-yes">2x</span>
125
143
  <span class="cline-any cline-yes">2x</span>
126
144
  <span class="cline-any cline-no">&nbsp;</span>
@@ -167,9 +185,18 @@
167
185
  import { isset } from './isset'
168
186
  &nbsp;
169
187
  /** Round with custom number of decimals (default:0) */
170
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function round(number: number | string, decimals = 0) { return Math.round((typeof number === 'number' ? number : parseFloat(number)) * Math.pow(10, decimals)) / Math.pow(10, decimals) }</span></span>
188
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function round(number: number | string, decimals = 0) {</span></span>
189
+ <span class="cstat-no" title="statement not covered" > return Math.round((typeof number === 'number' ? number : parseFloat(number)) * Math.pow(10, decimals)) / Math.pow(10, decimals)</span>
190
+ <span class="cstat-no" title="statement not covered" >}</span>
191
+ &nbsp;
171
192
  /** Round with custom number of decimals (default:2) */
172
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function round2(number: number | string, decimals = 2) { return round(number, decimals) }</span></span>
193
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function round2&lt;T extends 'number' | 'string' = 'string'&gt;(</span></span>
194
+ <span class="cstat-no" title="statement not covered" > number: number | string,</span>
195
+ <span class="cstat-no" title="statement not covered" > decimals = 2,</span>
196
+ <span class="cstat-no" title="statement not covered" > format: T = 'string' as T</span>
197
+ <span class="cstat-no" title="statement not covered" >) {</span>
198
+ <span class="cstat-no" title="statement not covered" > return (format === 'string' ? Number(number).toFixed(decimals) : round(number, decimals)) as T extends 'number' ? number : string</span>
199
+ <span class="cstat-no" title="statement not covered" >}</span>
173
200
  &nbsp;
174
201
  /** Is number between two numbers (including those numbers) */
175
202
  <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function isBetween(number: number, min: number, max: number, inclusive = true) { return inclusive ? number &lt;= max &amp;&amp; number &gt;= min : number &lt; max &amp;&amp; number &gt; min }</span></span>
@@ -217,7 +244,7 @@ import { isset } from './isset'
217
244
  <div class='footer quiet pad2 space-top1 center small'>
218
245
  Code coverage generated by
219
246
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
220
- at 2025-03-13T19:05:26.769Z
247
+ at 2025-03-16T15:53:34.514Z
221
248
  </div>
222
249
  <script src="prettify.js"></script>
223
250
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">28.63% </span>
26
+ <span class="strong">29.05% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>126/440</span>
28
+ <span class='fraction'>129/444</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">28.63% </span>
47
+ <span class="strong">29.05% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>126/440</span>
49
+ <span class='fraction'>129/444</span>
50
50
  </div>
51
51
 
52
52
 
@@ -502,7 +502,11 @@
502
502
  <a name='L437'></a><a href='#L437'>437</a>
503
503
  <a name='L438'></a><a href='#L438'>438</a>
504
504
  <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
506
510
  <span class="cline-any cline-yes">2x</span>
507
511
  <span class="cline-any cline-yes">2x</span>
508
512
  <span class="cline-any cline-yes">2x</span>
@@ -754,6 +758,9 @@
754
758
  <span class="cline-any cline-no">&nbsp;</span>
755
759
  <span class="cline-any cline-no">&nbsp;</span>
756
760
  <span class="cline-any cline-yes">2x</span>
761
+ <span class="cline-any cline-yes">2x</span>
762
+ <span class="cline-any cline-yes">2x</span>
763
+ <span class="cline-any cline-yes">2x</span>
757
764
  <span class="cline-any cline-no">&nbsp;</span>
758
765
  <span class="cline-any cline-no">&nbsp;</span>
759
766
  <span class="cline-any cline-no">&nbsp;</span>
@@ -909,6 +916,7 @@
909
916
  <span class="cline-any cline-no">&nbsp;</span>
910
917
  <span class="cline-any cline-no">&nbsp;</span>
911
918
  <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
912
920
  <span class="cline-any cline-yes">2x</span>
913
921
  <span class="cline-any cline-yes">2x</span>
914
922
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1022,7 +1030,7 @@ type FindByAddressReturnFull = Array&lt;[addr: string, value: any, lastElmKey: s
1022
1030
  <span class="cstat-no" title="statement not covered" > if (addr === '') return (returnAddresses ? [addr, obj, undefined, undefined] : obj) as any</span>
1023
1031
  <span class="cstat-no" title="statement not covered" > const addrRegexp = new RegExp('^' + escapeRegexp(</span>
1024
1032
  <span class="cstat-no" title="statement not covered" > addr.replace(/\.?\[(\d+)\]/g, '.$1'), // replace .[4] AND [4] TO .4</span>
1025
- <span class="cstat-no" title="statement not covered" > { parseStarChar: true, wildcardNotMatchingChars: '.[' }) + '$'</span>
1033
+ <span class="cstat-no" title="statement not covered" > { parseWildcard: true, wildcardNotMatchingChars: '.[' }) + '$'</span>
1026
1034
  <span class="cstat-no" title="statement not covered" > )</span>
1027
1035
  <span class="cstat-no" title="statement not covered" ></span>
1028
1036
  <span class="cstat-no" title="statement not covered" > const matchingItems: any[] = []</span>
@@ -1186,13 +1194,16 @@ export const objForceWritePath = forcePathInObject
1186
1194
  <span class="cstat-no" title="statement not covered" >}</span>
1187
1195
  &nbsp;
1188
1196
  /** All fileds and subFields of the object will become readOnly */
1189
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnlyForAll(object) {</span></span>
1197
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function readOnlyRecursive(object) {</span></span>
1190
1198
  <span class="cstat-no" title="statement not covered" > recursiveGenericFunctionSync(object, (item, _, lastElementKey, parent) =&gt; {</span>
1191
1199
  <span class="cstat-no" title="statement not covered" > if (typeof item === 'object') parent[lastElementKey] = readOnly(item)</span>
1192
1200
  <span class="cstat-no" title="statement not covered" > })</span>
1193
1201
  <span class="cstat-no" title="statement not covered" > return object</span>
1194
1202
  <span class="cstat-no" title="statement not covered" >}</span>
1195
1203
  &nbsp;
1204
+ /** @deprecated use readOnlyRecursive instead */
1205
+ export const readOnlyForAll = readOnlyRecursive
1206
+ &nbsp;
1196
1207
  <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function objFilterUndefinedRecursive(obj) {</span></span>
1197
1208
  <span class="cstat-no" title="statement not covered" > if (obj) {</span>
1198
1209
  <span class="cstat-no" title="statement not covered" > const flattenedObj = flattenObject(obj)</span>
@@ -1339,6 +1350,7 @@ export const objForceWritePath = forcePathInObject
1339
1350
  <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>
1340
1351
  <span class="cstat-no" title="statement not covered" ></span>
1341
1352
  <span class="cstat-no" title="statement not covered" > if (isEmpty &amp;&amp; prop) result[prop] = {}</span>
1353
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line @typescript-eslint/no-unused-vars</span>
1342
1354
  <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1343
1355
  <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
1344
1356
  <span class="cstat-no" title="statement not covered" > console.warn('Circular reference in flattenObject, impossible to parse')</span>
@@ -1387,7 +1399,7 @@ export const entries = objEntries</pre></td></tr></table></pre>
1387
1399
  <div class='footer quiet pad2 space-top1 center small'>
1388
1400
  Code coverage generated by
1389
1401
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1390
- at 2025-03-13T19:05:26.769Z
1402
+ at 2025-03-16T15:53:34.514Z
1391
1403
  </div>
1392
1404
  <script src="prettify.js"></script>
1393
1405
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">43.9% </span>
26
+ <span class="strong">40.38% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>18/41</span>
28
+ <span class='fraction'>21/52</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">43.9% </span>
47
+ <span class="strong">40.38% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>18/41</span>
49
+ <span class='fraction'>21/52</span>
50
50
  </div>
51
51
 
52
52
 
@@ -103,7 +103,18 @@
103
103
  <a name='L38'></a><a href='#L38'>38</a>
104
104
  <a name='L39'></a><a href='#L39'>39</a>
105
105
  <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
107
118
  <span class="cline-any cline-yes">2x</span>
108
119
  <span class="cline-any cline-yes">2x</span>
109
120
  <span class="cline-any cline-yes">2x</span>
@@ -112,6 +123,17 @@
112
123
  <span class="cline-any cline-yes">2x</span>
113
124
  <span class="cline-any cline-yes">2x</span>
114
125
  <span class="cline-any cline-yes">2x</span>
126
+ <span class="cline-any cline-yes">2x</span>
127
+ <span class="cline-any cline-yes">2x</span>
128
+ <span class="cline-any cline-yes">2x</span>
129
+ <span class="cline-any cline-no">&nbsp;</span>
130
+ <span class="cline-any cline-no">&nbsp;</span>
131
+ <span class="cline-any cline-no">&nbsp;</span>
132
+ <span class="cline-any cline-no">&nbsp;</span>
133
+ <span class="cline-any cline-no">&nbsp;</span>
134
+ <span class="cline-any cline-no">&nbsp;</span>
135
+ <span class="cline-any cline-no">&nbsp;</span>
136
+ <span class="cline-any cline-no">&nbsp;</span>
115
137
  <span class="cline-any cline-no">&nbsp;</span>
116
138
  <span class="cline-any cline-no">&nbsp;</span>
117
139
  <span class="cline-any cline-no">&nbsp;</span>
@@ -148,13 +170,24 @@
148
170
  //----------------------------------------
149
171
  import { C } from './logger-utils'
150
172
  &nbsp;
151
- /** ESCAPE REGEXP
152
- * * parseStarChar =&gt; config will replace '*' by '.*?' which is the best for 'match all until'
153
- * * wildcardNotMatchingChars =&gt; list of characters not to match, eg: '.[' will match all except '.' and '[' /!\ will be outputted as a regexp [^.[] so don't forget to ESCAPE characters like ']' =&gt; '\]'
173
+ /**
174
+ * Will escape all special character in a string to output a valid regexp string to put in RegExp(myString)
175
+ * * Eg: from `'path.*.addr(*)'` will output `'aa\..*?\.addr\(.*?\)'` so regexp match `'path.random.addr(randomItem)'`
176
+ * * Options:
177
+ * * parseWildcard =&gt; config will replace '*' by '.*?' which is the best for 'match all until'
178
+ * * wildcardNotMatchingChars =&gt; if provided, will replace '*' by `[^${wildcardNotMatchingChars}]` instead of '.*?'. This allows wildcard not to match certains characters
154
179
  */
155
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function escapeRegexp(str: string, config: { parseStarChar?: boolean, wildcardNotMatchingChars?: string } = {}): string {</span></span>
156
- <span class="cstat-no" title="statement not covered" > const { parseStarChar = false, wildcardNotMatchingChars } = config</span>
157
- <span class="cstat-no" title="statement not covered" > if (parseStarChar) return str.replace(/[-[\]{}()+?.,\\^$|#\s]/g, '\\$&amp;').replace(/\*/g, wildcardNotMatchingChars ? `[^${wildcardNotMatchingChars}]` : '.*?')</span>
180
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export function escapeRegexp(</span></span>
181
+ <span class="cstat-no" title="statement not covered" > str: string,</span>
182
+ <span class="cstat-no" title="statement not covered" > config: {</span>
183
+ <span class="cstat-no" title="statement not covered" > /** will replace '*' by '.*?' which is the best for 'match all until' */</span>
184
+ <span class="cstat-no" title="statement not covered" > parseWildcard?: boolean,</span>
185
+ <span class="cstat-no" title="statement not covered" > /** if provided, will replace '*' by `[^${wildcardNotMatchingChars}]` instead of '.*?'. This allows wildcard not to match certains characters */</span>
186
+ <span class="cstat-no" title="statement not covered" > wildcardNotMatchingChars?: string</span>
187
+ <span class="cstat-no" title="statement not covered" > } = {}</span>
188
+ <span class="cstat-no" title="statement not covered" >): string {</span>
189
+ <span class="cstat-no" title="statement not covered" > const { parseWildcard = false, wildcardNotMatchingChars } = config</span>
190
+ <span class="cstat-no" title="statement not covered" > if (parseWildcard) return str.replace(/[-[\]{}()+?.,\\^$|#\s]/g, '\\$&amp;').replace(/\*/g, wildcardNotMatchingChars ? `[^${wildcardNotMatchingChars}]` : '.*?')</span>
158
191
  <span class="cstat-no" title="statement not covered" > else return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&amp;')</span>
159
192
  <span class="cstat-no" title="statement not covered" >}</span>
160
193
  &nbsp;
@@ -190,7 +223,7 @@ import { C } from './logger-utils'
190
223
  <div class='footer quiet pad2 space-top1 center small'>
191
224
  Code coverage generated by
192
225
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
193
- at 2025-03-13T19:05:26.769Z
226
+ at 2025-03-16T15:53:34.514Z
194
227
  </div>
195
228
  <script src="prettify.js"></script>
196
229
  <script>
@@ -124,7 +124,7 @@
124
124
  <div class='footer quiet pad2 space-top1 center small'>
125
125
  Code coverage generated by
126
126
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
127
- at 2025-03-13T19:05:26.769Z
127
+ at 2025-03-16T15:53:34.514Z
128
128
  </div>
129
129
  <script src="prettify.js"></script>
130
130
  <script>