si-funciona 2.6.1 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +48 -19
  2. package/browser/siFunciona.js +80 -77
  3. package/browser/siFunciona.min.js +1 -1
  4. package/dist/helpers/arrays/BasicQueue.d.ts +64 -64
  5. package/dist/helpers/arrays/BasicQueue.js +61 -61
  6. package/dist/helpers/arrays/addUniqueToArray.d.ts +9 -9
  7. package/dist/helpers/arrays/addUniqueToArray.js +16 -16
  8. package/dist/helpers/arrays/buildArray.d.ts +10 -10
  9. package/dist/helpers/arrays/buildArray.js +25 -25
  10. package/dist/helpers/arrays/buildArrayOfReferences.d.ts +10 -10
  11. package/dist/helpers/arrays/buildArrayOfReferences.js +22 -22
  12. package/dist/helpers/arrays/compareArrays.d.ts +96 -96
  13. package/dist/helpers/arrays/compareArrays.js +96 -96
  14. package/dist/helpers/arrays/mergeArrays.d.ts +8 -8
  15. package/dist/helpers/arrays/mergeArrays.js +21 -21
  16. package/dist/helpers/arrays/uniqueArray.d.ts +8 -8
  17. package/dist/helpers/arrays/uniqueArray.js +16 -16
  18. package/dist/helpers/arrays.d.ts +27 -27
  19. package/dist/helpers/arrays.js +74 -74
  20. package/dist/helpers/descriptors/assignDescriptor.d.ts +13 -13
  21. package/dist/helpers/descriptors/assignDescriptor.js +57 -57
  22. package/dist/helpers/descriptors/assignDescriptorDetail.d.ts +13 -13
  23. package/dist/helpers/descriptors/assignDescriptorDetail.js +36 -36
  24. package/dist/helpers/descriptors/checkClearValues.d.ts +11 -11
  25. package/dist/helpers/descriptors/checkClearValues.js +20 -20
  26. package/dist/helpers/descriptors/checkDescriptorComplete.d.ts +10 -10
  27. package/dist/helpers/descriptors/checkDescriptorComplete.js +19 -19
  28. package/dist/helpers/descriptors/cloneDescriptor.d.ts +9 -9
  29. package/dist/helpers/descriptors/cloneDescriptor.js +35 -35
  30. package/dist/helpers/descriptors/cloneDescriptorDetail.d.ts +9 -9
  31. package/dist/helpers/descriptors/cloneDescriptorDetail.js +26 -26
  32. package/dist/helpers/descriptors/compareDescriptor.d.ts +12 -12
  33. package/dist/helpers/descriptors/compareDescriptor.js +32 -32
  34. package/dist/helpers/descriptors/describeObject.d.ts +14 -14
  35. package/dist/helpers/descriptors/describeObject.js +52 -52
  36. package/dist/helpers/descriptors/describeObjectDetail.d.ts +13 -13
  37. package/dist/helpers/descriptors/describeObjectDetail.js +37 -37
  38. package/dist/helpers/descriptors/describeObjectMap.d.ts +35 -35
  39. package/dist/helpers/descriptors/describeObjectMap.js +107 -107
  40. package/dist/helpers/descriptors/nextReference.d.ts +12 -12
  41. package/dist/helpers/descriptors/nextReference.js +30 -30
  42. package/dist/helpers/descriptors/sameDescriptor.d.ts +12 -12
  43. package/dist/helpers/descriptors/sameDescriptor.js +21 -21
  44. package/dist/helpers/descriptors/samples/descriptor.d.ts +34 -34
  45. package/dist/helpers/descriptors/samples/descriptor.js +22 -22
  46. package/dist/helpers/descriptors/samples/descriptorDetail.d.ts +42 -42
  47. package/dist/helpers/descriptors/samples/descriptorDetail.js +24 -24
  48. package/dist/helpers/descriptors/samples/descriptorMap.d.ts +16 -16
  49. package/dist/helpers/descriptors/samples/descriptorMap.js +14 -14
  50. package/dist/helpers/descriptors/samples/mappedDescriptorMap.d.ts +10 -10
  51. package/dist/helpers/descriptors/samples/mappedDescriptorMap.js +287 -287
  52. package/dist/helpers/descriptors.d.ts +56 -56
  53. package/dist/helpers/descriptors.js +129 -129
  54. package/dist/helpers/functions/callWithParams.d.ts +10 -10
  55. package/dist/helpers/functions/callWithParams.js +16 -16
  56. package/dist/helpers/functions/curry.d.ts +10 -10
  57. package/dist/helpers/functions/curry.js +16 -16
  58. package/dist/helpers/functions/delay.d.ts +20 -20
  59. package/dist/helpers/functions/delay.js +31 -31
  60. package/dist/helpers/functions/makeBasicQueue.d.ts +9 -9
  61. package/dist/helpers/functions/makeBasicQueue.js +18 -18
  62. package/dist/helpers/functions/onBodyLoad.d.ts +9 -9
  63. package/dist/helpers/functions/onBodyLoad.js +75 -75
  64. package/dist/helpers/functions/pipe.d.ts +9 -9
  65. package/dist/helpers/functions/pipe.js +17 -17
  66. package/dist/helpers/functions/preloadParams.d.ts +19 -19
  67. package/dist/helpers/functions/preloadParams.js +20 -20
  68. package/dist/helpers/functions/queueManager.d.ts +48 -48
  69. package/dist/helpers/functions/queueManager.js +123 -123
  70. package/dist/helpers/functions/queueTimeout.d.ts +20 -20
  71. package/dist/helpers/functions/queueTimeout.js +22 -22
  72. package/dist/helpers/functions/relevancyFilter.d.ts +34 -34
  73. package/dist/helpers/functions/relevancyFilter.js +33 -33
  74. package/dist/helpers/functions/trace.d.ts +13 -13
  75. package/dist/helpers/functions/trace.js +24 -24
  76. package/dist/helpers/functions.d.ts +40 -40
  77. package/dist/helpers/functions.js +105 -105
  78. package/dist/helpers/numbers/absoluteMax.d.ts +9 -9
  79. package/dist/helpers/numbers/absoluteMax.js +15 -15
  80. package/dist/helpers/numbers/absoluteMin.d.ts +9 -9
  81. package/dist/helpers/numbers/absoluteMin.js +15 -15
  82. package/dist/helpers/numbers/compare.d.ts +12 -12
  83. package/dist/helpers/numbers/compare.js +18 -18
  84. package/dist/helpers/numbers/greatestCommonDivisor.d.ts +9 -9
  85. package/dist/helpers/numbers/greatestCommonDivisor.js +15 -15
  86. package/dist/helpers/numbers/leastCommonMultiple.d.ts +9 -9
  87. package/dist/helpers/numbers/leastCommonMultiple.js +17 -17
  88. package/dist/helpers/numbers/lowestCommonDenominator.d.ts +9 -9
  89. package/dist/helpers/numbers/lowestCommonDenominator.js +19 -19
  90. package/dist/helpers/numbers/randomInteger.d.ts +18 -12
  91. package/dist/helpers/numbers/randomInteger.js +24 -18
  92. package/dist/helpers/numbers/randomNumber.d.ts +13 -12
  93. package/dist/helpers/numbers/randomNumber.js +19 -18
  94. package/dist/helpers/numbers/simplestRatio.d.ts +8 -8
  95. package/dist/helpers/numbers/simplestRatio.js +28 -28
  96. package/dist/helpers/numbers.d.ts +30 -30
  97. package/dist/helpers/numbers.js +89 -89
  98. package/dist/helpers/objects/cloneObject.d.ts +2 -4
  99. package/dist/helpers/objects/cloneObject.js +2 -4
  100. package/dist/helpers/objects/dotGet.d.ts +11 -11
  101. package/dist/helpers/objects/dotGet.js +59 -59
  102. package/dist/helpers/objects/dotNotate.d.ts +27 -27
  103. package/dist/helpers/objects/dotNotate.js +79 -79
  104. package/dist/helpers/objects/dotSet.d.ts +11 -11
  105. package/dist/helpers/objects/dotSet.js +53 -53
  106. package/dist/helpers/objects/dotUnset.d.ts +10 -10
  107. package/dist/helpers/objects/dotUnset.js +52 -52
  108. package/dist/helpers/objects/emptyObject.d.ts +8 -8
  109. package/dist/helpers/objects/emptyObject.js +17 -17
  110. package/dist/helpers/objects/filterObject.d.ts +26 -26
  111. package/dist/helpers/objects/filterObject.js +33 -33
  112. package/dist/helpers/objects/isCloneable.d.ts +8 -8
  113. package/dist/helpers/objects/isCloneable.js +16 -16
  114. package/dist/helpers/objects/isEqual.d.ts +16 -16
  115. package/dist/helpers/objects/isEqual.js +100 -100
  116. package/dist/helpers/objects/isInstanceObject.d.ts +8 -8
  117. package/dist/helpers/objects/isInstanceObject.js +26 -26
  118. package/dist/helpers/objects/isObject.d.ts +8 -8
  119. package/dist/helpers/objects/isObject.js +14 -14
  120. package/dist/helpers/objects/mapObject.d.ts +25 -25
  121. package/dist/helpers/objects/mapObject.js +25 -25
  122. package/dist/helpers/objects/mergeObjects.d.ts +12 -12
  123. package/dist/helpers/objects/mergeObjects.js +19 -19
  124. package/dist/helpers/objects/mergeObjectsBase.d.ts +9 -6
  125. package/dist/helpers/objects/mergeObjectsBase.js +59 -61
  126. package/dist/helpers/objects/mergeObjectsBase.min.js +1 -1
  127. package/dist/helpers/objects/mergeObjectsMutable.d.ts +12 -12
  128. package/dist/helpers/objects/mergeObjectsMutable.js +17 -17
  129. package/dist/helpers/objects/objectKeys.d.ts +13 -13
  130. package/dist/helpers/objects/objectKeys.js +39 -39
  131. package/dist/helpers/objects/objectValues.d.ts +13 -13
  132. package/dist/helpers/objects/objectValues.js +20 -20
  133. package/dist/helpers/objects/reduceObject.d.ts +30 -30
  134. package/dist/helpers/objects/reduceObject.js +25 -25
  135. package/dist/helpers/objects/setAndReturnValue.d.ts +13 -13
  136. package/dist/helpers/objects/setAndReturnValue.js +19 -19
  137. package/dist/helpers/objects/setValue.d.ts +14 -14
  138. package/dist/helpers/objects/setValue.js +21 -21
  139. package/dist/helpers/objects.d.ts +1 -1
  140. package/dist/helpers/objects.js +177 -177
  141. package/dist/helpers/strings/camelCase.d.ts +8 -8
  142. package/dist/helpers/strings/camelCase.js +19 -19
  143. package/dist/helpers/strings/kabobCase.d.ts +8 -8
  144. package/dist/helpers/strings/kabobCase.js +18 -18
  145. package/dist/helpers/strings/makeFilepath.d.ts +9 -9
  146. package/dist/helpers/strings/makeFilepath.js +49 -49
  147. package/dist/helpers/strings/makeRelativePath.d.ts +9 -9
  148. package/dist/helpers/strings/makeRelativePath.js +43 -43
  149. package/dist/helpers/strings/regexEscape.d.ts +8 -8
  150. package/dist/helpers/strings/regexEscape.js +15 -15
  151. package/dist/helpers/strings/snakeCase.d.ts +8 -8
  152. package/dist/helpers/strings/snakeCase.js +18 -18
  153. package/dist/helpers/strings/strAfter.d.ts +9 -9
  154. package/dist/helpers/strings/strAfter.js +18 -18
  155. package/dist/helpers/strings/strAfterLast.d.ts +9 -9
  156. package/dist/helpers/strings/strAfterLast.js +18 -18
  157. package/dist/helpers/strings/strBefore.d.ts +9 -9
  158. package/dist/helpers/strings/strBefore.js +18 -18
  159. package/dist/helpers/strings/strBeforeLast.d.ts +9 -9
  160. package/dist/helpers/strings/strBeforeLast.js +18 -18
  161. package/dist/helpers/strings/titleCase.d.ts +8 -8
  162. package/dist/helpers/strings/titleCase.js +19 -19
  163. package/dist/helpers/strings/ucFirst.d.ts +8 -8
  164. package/dist/helpers/strings/ucFirst.js +14 -14
  165. package/dist/helpers/strings/words.d.ts +9 -9
  166. package/dist/helpers/strings/words.js +15 -15
  167. package/dist/helpers/strings.d.ts +38 -38
  168. package/dist/helpers/strings.js +121 -121
  169. package/dist/main.d.ts +15 -15
  170. package/dist/main.js +103 -103
  171. package/package.json +4 -4
package/README.md CHANGED
@@ -249,6 +249,7 @@ Simplify working with object by providing array-like parsing. Also, provides clo
249
249
  * [.mapObject(obj, fn, [thisArg])](#module_objectHelpers.mapObject) ⇒ <code>Object</code> \| <code>Array</code>
250
250
  * [.isObject(object)](#module_objectHelpers.isObject) ⇒ <code>boolean</code>
251
251
  * [.isInstanceObject(object)](#module_objectHelpers.isInstanceObject) ⇒ <code>boolean</code>
252
+ * [.isEqual(first, second)](#module_objectHelpers.isEqual) ⇒ <code>boolean</code>
252
253
  * [.isCloneable(value)](#module_objectHelpers.isCloneable) ⇒ <code>boolean</code>
253
254
  * [.filterObject(obj, fn, [thisArg])](#module_objectHelpers.filterObject) ⇒ <code>Object</code> \| <code>Array</code>
254
255
  * [.emptyObject(item)](#module_objectHelpers.emptyObject) ⇒ <code>boolean</code>
@@ -358,18 +359,19 @@ Optional flag will include the inherited keys from prototype chain when set.
358
359
  ### objectHelpers.mergeObjectsBase([options]) ⇒ <code>module:objectHelpers~mergeObjectsCallback</code> \| <code>mergeObjectsCallback</code>
359
360
  Perform a deep merge of objects. This will return a function that will combine all objects and sub-objects.
360
361
  Objects having the same attributes will overwrite from last object to first.
361
- NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
362
- have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
362
+ Every call of the returned function keeps its own record of the objects it has already visited (so circular
363
+ references are followed only once, and an object which is referenced in several places is merged once), and nothing
364
+ is remembered between calls: the results of separate calls never share state or go stale.
363
365
 
364
366
  **Kind**: static method of [<code>objectHelpers</code>](#module_objectHelpers)
365
367
 
366
368
  | Param | Type | Default | Description |
367
369
  | --- | --- | --- | --- |
368
370
  | [options] | <code>Object</code> | <code>{}</code> | |
369
- | [options.mapLimit] | <code>number</code> | <code>100</code> | Size of temporary reference array used in memory before assessing relevancy. |
371
+ | [options.mapLimit] | <code>number</code> | <code>100</code> | Deprecated and ignored: the record of visited objects is now scoped to a single call, so it does not need trimming. |
370
372
  | [options.depthLimit] | <code>number</code> | <code>-1</code> | Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited. |
371
- | [options.relevancyRange] | <code>number</code> | <code>1000</code> | Total reference map length subtract this range, any relevancy less than that amount at time of evaluation will be removed. |
372
- | [options.map] | <code>Iterable</code> \| <code>array</code> | <code>[]</code> | A predetermined list of references gathered (to be passed to itself during recursion). |
373
+ | [options.relevancyRange] | <code>number</code> | <code>1000</code> | Deprecated and ignored: see mapLimit. |
374
+ | [options.map] | <code>Iterable</code> \| <code>array</code> | <code>[]</code> | A predetermined list of references (source and the object it should resolve to) which every call starts from. It is only read, never added to. |
373
375
  | [options.useClone] | <code>boolean</code> | <code>false</code> | |
374
376
 
375
377
  <a name="module_objectHelpers.mapObject"></a>
@@ -409,6 +411,26 @@ Check if the current object has inherited properties.
409
411
  | --- | --- |
410
412
  | object | <code>Object</code> \| <code>Array</code> |
411
413
 
414
+ <a name="module_objectHelpers.isEqual"></a>
415
+
416
+ ### objectHelpers.isEqual(first, second) ⇒ <code>boolean</code>
417
+ Check whether two values are equal by value, however they are stored: two separately made arrays or objects with the
418
+ same contents are equal, while two references only need to be the same when the value is a function.
419
+ - Primitives are equal when they are the same value (and NaN equals NaN)
420
+ - Arrays are equal when they have the same elements in the same order
421
+ - Objects are equal when they have the same prototype (the same kind of object) and the same own properties with
422
+ equal values, the order of the properties does not matter
423
+ - Dates, regular expressions, Maps and Sets are compared by what they hold
424
+ - Circular references are handled: a pair of objects which is already being compared is taken to be equal
425
+
426
+ **Kind**: static method of [<code>objectHelpers</code>](#module_objectHelpers)
427
+ **Returns**: <code>boolean</code> - True when the values are equal.
428
+
429
+ | Param | Type | Description |
430
+ | --- | --- | --- |
431
+ | first | <code>\*</code> | The first value. |
432
+ | second | <code>\*</code> | The second value. |
433
+
412
434
  <a name="module_objectHelpers.isCloneable"></a>
413
435
 
414
436
  ### objectHelpers.isCloneable(value) ⇒ <code>boolean</code>
@@ -504,8 +526,6 @@ Get a nested property value from an object.
504
526
 
505
527
  ### objectHelpers.cloneObject(object, [options]) ⇒ <code>Object</code>
506
528
  Clone objects for manipulation without data corruption, returns a copy of the provided object.
507
- NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
508
- have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
509
529
 
510
530
  **Kind**: static method of [<code>objectHelpers</code>](#module_objectHelpers)
511
531
 
@@ -513,9 +533,9 @@ have circular references. A high mapLimit may lead to heavy memory usage and slo
513
533
  | --- | --- | --- | --- |
514
534
  | object | <code>Object</code> | | The original object that is being cloned |
515
535
  | [options] | <code>Object</code> | <code>{}</code> | |
516
- | [options.mapLimit] | <code>number</code> | <code>100</code> | Size of temporary reference array used in memory before assessing relevancy. |
536
+ | [options.mapLimit] | <code>number</code> | <code>100</code> | Deprecated and ignored (circular references are handled without trimming). |
517
537
  | [options.depthLimit] | <code>number</code> | <code>-1</code> | Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited. |
518
- | [options.relevancyRange] | <code>number</code> | <code>1000</code> | Total reference map length subtract this range, any relevancy less than that amount at time of evaluation will be removed. |
538
+ | [options.relevancyRange] | <code>number</code> | <code>1000</code> | Deprecated and ignored: see mapLimit. |
519
539
 
520
540
  <a name="module_objectHelpers..handleRetainObjects"></a>
521
541
 
@@ -577,31 +597,40 @@ Reduce several numbers to their simplest form / ratio
577
597
  <a name="module_numberHelpers.randomNumber"></a>
578
598
 
579
599
  ### numberHelpers.randomNumber(range, [offset], [interval]) ⇒ <code>number</code>
580
- Create a single random number within provided range. And with optional offset,
581
- The distance between the result numbers can be adjusted with interval.
600
+ Create a single random number from offset up to (but never including) offset + range. With optional offset,
601
+ the distance between the result numbers can be adjusted with interval. Matches randomInteger, which gives the
602
+ whole numbers of the same span.
582
603
 
583
604
  **Kind**: static method of [<code>numberHelpers</code>](#module_numberHelpers)
584
605
 
585
606
  | Param | Type | Default | Description |
586
607
  | --- | --- | --- | --- |
587
- | range | <code>number</code> | | Choose the breadth of the random number (0-100 would be 100 for range) |
588
- | [offset] | <code>number</code> | <code>0</code> | Choose the starting number (1-10 would be 1 for offset, 9 for range) |
589
- | [interval] | <code>number</code> | <code>1</code> | Choose the distance between numbers (~5, ~10, ~15 would be 5 for interval, 1 for offset, 2 for range) |
608
+ | range | <code>number</code> | | Choose the breadth of the random number (0 up to, but not including, 100 would be 100 for range) |
609
+ | [offset] | <code>number</code> | <code>0</code> | Choose the starting number (1 up to, but not including, 10 would be 1 for offset, 9 for range) |
610
+ | [interval] | <code>number</code> | <code>1</code> | Choose the multiplier applied to the result (~5, ~10, ~15 would be 5 for interval, 1 for offset, 2 for range) |
590
611
 
591
612
  <a name="module_numberHelpers.randomInteger"></a>
592
613
 
593
614
  ### numberHelpers.randomInteger(range, [offset], [interval]) ⇒ <code>number</code>
594
- Create a single random integer within provide range. And with optional offset,
595
- The distance between the result numbers can be adjusted with interval.
615
+ Create a single random integer from a set of `range` possible values, starting at the optional offset.
616
+ With no offset the result is 0 to range - 1 (so range is the number of possible values, the same as an array length
617
+ when choosing an index). The distance between the result numbers can be adjusted with interval.
596
618
 
597
619
  **Kind**: static method of [<code>numberHelpers</code>](#module_numberHelpers)
598
620
 
599
621
  | Param | Type | Default | Description |
600
622
  | --- | --- | --- | --- |
601
- | range | <code>number</code> | | Choose the breadth of the random number (0-100 would be 100 for range) |
602
- | [offset] | <code>number</code> | <code>0</code> | Choose the starting number (1-10 would be 1 for offset, 9 for range) |
603
- | [interval] | <code>number</code> | <code>1</code> | Choose the distance between numbers (5, 10, 15 would be 5 for interval, 1 for offset, 2 for range) |
623
+ | range | <code>number</code> | | The number of possible values (0-99 would be 100 for range) |
624
+ | [offset] | <code>number</code> | <code>0</code> | Choose the starting number (1-10 would be 1 for offset, 10 for range) |
625
+ | [interval] | <code>number</code> | <code>1</code> | Choose the distance between numbers (5, 10, 15 would be 5 for interval, 1 for offset, 3 for range) |
604
626
 
627
+ **Example**
628
+ ```js
629
+ randomInteger(1) // always 0 (one possible value)
630
+ randomInteger(2) // 0 or 1
631
+ randomInteger(3, 1, 5) // 5, 10 or 15
632
+ items[randomInteger(items.length)] // a random valid index
633
+ ```
605
634
  <a name="module_numberHelpers.lowestCommonDenominator"></a>
606
635
 
607
636
  ### numberHelpers.lowestCommonDenominator(...numbers) ⇒ <code>number</code>
@@ -1707,13 +1707,19 @@
1707
1707
  })
1708
1708
  exports.default = void 0
1709
1709
  /**
1710
- * Create a single random integer within provide range. And with optional offset,
1711
- * The distance between the result numbers can be adjusted with interval.
1710
+ * Create a single random integer from a set of `range` possible values, starting at the optional offset.
1711
+ * With no offset the result is 0 to range - 1 (so range is the number of possible values, the same as an array length
1712
+ * when choosing an index). The distance between the result numbers can be adjusted with interval.
1713
+ * @example
1714
+ * randomInteger(1) // always 0 (one possible value)
1715
+ * randomInteger(2) // 0 or 1
1716
+ * randomInteger(3, 1, 5) // 5, 10 or 15
1717
+ * items[randomInteger(items.length)] // a random valid index
1712
1718
  * @memberOf module:numberHelpers
1713
- * @param {number} range - Choose the breadth of the random number (0-100 would be 100 for range)
1714
- * @param {number} [offset=0] - Choose the starting number (1-10 would be 1 for offset, 9 for range)
1719
+ * @param {number} range - The number of possible values (0-99 would be 100 for range)
1720
+ * @param {number} [offset=0] - Choose the starting number (1-10 would be 1 for offset, 10 for range)
1715
1721
  * @param {number} [interval=1] - Choose the distance between numbers (5, 10, 15 would be 5 for interval, 1 for
1716
- * offset, 2 for range)
1722
+ * offset, 3 for range)
1717
1723
  * @returns {number}
1718
1724
  */
1719
1725
  const randomInteger = (range, offset = 0, interval = 1) => (Math.floor(Math.random() * range) + offset) * interval
@@ -1727,13 +1733,14 @@
1727
1733
  })
1728
1734
  exports.default = void 0
1729
1735
  /**
1730
- * Create a single random number within provided range. And with optional offset,
1731
- * The distance between the result numbers can be adjusted with interval.
1736
+ * Create a single random number from offset up to (but never including) offset + range. With optional offset,
1737
+ * the distance between the result numbers can be adjusted with interval. Matches randomInteger, which gives the
1738
+ * whole numbers of the same span.
1732
1739
  * @memberOf module:numberHelpers
1733
- * @param {number} range - Choose the breadth of the random number (0-100 would be 100 for range)
1734
- * @param {number} [offset=0] - Choose the starting number (1-10 would be 1 for offset, 9 for range)
1735
- * @param {number} [interval=1] - Choose the distance between numbers (~5, ~10, ~15 would be 5 for interval, 1 for
1736
- * offset, 2 for range)
1740
+ * @param {number} range - Choose the breadth of the random number (0 up to, but not including, 100 would be 100 for range)
1741
+ * @param {number} [offset=0] - Choose the starting number (1 up to, but not including, 10 would be 1 for offset, 9 for range)
1742
+ * @param {number} [interval=1] - Choose the multiplier applied to the result (~5, ~10, ~15 would be 5 for interval,
1743
+ * 1 for offset, 2 for range)
1737
1744
  * @returns {number}
1738
1745
  */
1739
1746
  const randomNumber = (range, offset = 0, interval = 1) => (Math.random() * range + offset) * interval
@@ -1959,14 +1966,12 @@
1959
1966
  function _interopRequireDefault (e) { return e && e.__esModule ? e : { default: e } }
1960
1967
  /**
1961
1968
  * Clone objects for manipulation without data corruption, returns a copy of the provided object.
1962
- * NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
1963
- * have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
1964
1969
  * @memberOf module:objectHelpers
1965
1970
  * @param {Object} object - The original object that is being cloned
1966
1971
  * @param {Object} [options={}]
1967
- * @param {number} [options.mapLimit=100] - Size of temporary reference array used in memory before assessing relevancy.
1972
+ * @param {number} [options.mapLimit=100] - Deprecated and ignored (circular references are handled without trimming).
1968
1973
  * @param {number} [options.depthLimit=-1] - Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited.
1969
- * @param {number} [options.relevancyRange=1000] - Total reference map length subtract this range, any relevancy less than that amount at time of evaluation will be removed.
1974
+ * @param {number} [options.relevancyRange=1000] - Deprecated and ignored: see mapLimit.
1970
1975
  * @returns {Object}
1971
1976
  */
1972
1977
  const cloneObject = (object, {
@@ -2506,91 +2511,89 @@
2506
2511
  })
2507
2512
  exports.default = void 0
2508
2513
  require('core-js/modules/esnext.iterator.constructor.js')
2509
- require('core-js/modules/esnext.iterator.find.js')
2510
2514
  require('core-js/modules/esnext.iterator.map.js')
2511
2515
  require('core-js/modules/esnext.iterator.reduce.js')
2516
+ require('core-js/modules/esnext.map.delete-all.js')
2517
+ require('core-js/modules/esnext.map.every.js')
2518
+ require('core-js/modules/esnext.map.filter.js')
2519
+ require('core-js/modules/esnext.map.find.js')
2520
+ require('core-js/modules/esnext.map.find-key.js')
2521
+ require('core-js/modules/esnext.map.includes.js')
2522
+ require('core-js/modules/esnext.map.key-of.js')
2523
+ require('core-js/modules/esnext.map.map-keys.js')
2524
+ require('core-js/modules/esnext.map.map-values.js')
2525
+ require('core-js/modules/esnext.map.merge.js')
2526
+ require('core-js/modules/esnext.map.reduce.js')
2527
+ require('core-js/modules/esnext.map.some.js')
2528
+ require('core-js/modules/esnext.map.update.js')
2512
2529
  const _isCloneable = _interopRequireDefault(require('./isCloneable'))
2513
2530
  const _reduceObject = _interopRequireDefault(require('./reduceObject'))
2514
- const _relevancyFilter = _interopRequireDefault(require('../functions/relevancyFilter'))
2515
2531
  const _setValue = _interopRequireDefault(require('./setValue'))
2516
2532
  function _interopRequireDefault (e) { return e && e.__esModule ? e : { default: e } }
2517
2533
  /**
2518
2534
  * Perform a deep merge of objects. This will return a function that will combine all objects and sub-objects.
2519
2535
  * Objects having the same attributes will overwrite from last object to first.
2520
- * NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
2521
- * have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
2536
+ * Every call of the returned function keeps its own record of the objects it has already visited (so circular
2537
+ * references are followed only once, and an object which is referenced in several places is merged once), and nothing
2538
+ * is remembered between calls: the results of separate calls never share state or go stale.
2522
2539
  * @memberOf module:objectHelpers
2523
2540
  * @param {Object} [options={}]
2524
- * @param {number} [options.mapLimit=100] - Size of temporary reference array used in memory before assessing relevancy.
2541
+ * @param {number} [options.mapLimit=100] - Deprecated and ignored: the record of visited objects is now scoped to a
2542
+ * single call, so it does not need trimming.
2525
2543
  * @param {number} [options.depthLimit=-1] - Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited.
2526
- * @param {number} [options.relevancyRange=1000] - Total reference map length subtract this range, any relevancy less than that amount at time of evaluation will be removed.
2527
- * @param {Iterable|array} [options.map=[]] - A predetermined list of references gathered (to be passed to itself during recursion).
2544
+ * @param {number} [options.relevancyRange=1000] - Deprecated and ignored: see mapLimit.
2545
+ * @param {Iterable|array} [options.map=[]] - A predetermined list of references (source and the object it should
2546
+ * resolve to) which every call starts from. It is only read, never added to.
2528
2547
  * @param {boolean} [options.useClone=false]
2529
2548
  * @returns {module:objectHelpers~mergeObjectsCallback|mergeObjectsCallback}
2530
2549
  */
2531
2550
  const mergeObjectsBase = ({
2532
- mapLimit = 100,
2533
2551
  depthLimit = -1,
2534
- relevancyRange = 1000,
2535
2552
  map = [],
2536
2553
  useClone = false
2537
- } = {}) => (...objects) => {
2538
- const firstObject = useClone ? Array.isArray(objects[0]) ? [] : {} : objects.shift()
2539
- if (objects.length < 1) {
2540
- return firstObject
2541
- }
2542
- if (depthLimit === 0) {
2543
- return firstObject
2544
- }
2545
- return objects.reduce((newObj, arg) => {
2546
- if (!arg) {
2547
- return newObj
2554
+ } = {}) => {
2555
+ const merge = (visited, depth, objects) => {
2556
+ const firstObject = useClone ? Array.isArray(objects[0]) ? [] : {} : objects.shift()
2557
+ if (objects.length < 1) {
2558
+ return firstObject
2548
2559
  }
2549
- map.push({
2550
- source: arg,
2551
- object: newObj,
2552
- relevance: map.length
2553
- })
2554
- map = (0, _relevancyFilter.default)(map, {
2555
- mapLimit,
2556
- relevancyRange
2557
- })
2558
- return (0, _reduceObject.default)(arg, (returnObj, value, key) => {
2559
- if ((0, _isCloneable.default)(value)) {
2560
- let objectValue = newObj[key]
2561
- const exists = map.find(existing => existing.source === value)
2562
- if (exists) {
2563
- exists.relevance = map.length + 1
2564
- return (0, _setValue.default)(key, exists.object, returnObj)
2565
- }
2566
- if (!(0, _isCloneable.default)(objectValue) || !objectValue) {
2567
- objectValue = useClone ? Array.isArray(value) ? [] : {} : value
2568
- }
2569
- if ((0, _isCloneable.default)(objectValue)) {
2570
- return (0, _setValue.default)(key, mergeObjectsBase({
2571
- mapLimit,
2572
- depthLimit: depthLimit - 1,
2573
- relevancyRange,
2574
- map,
2575
- useClone
2576
- })(objectValue, value), returnObj)
2577
- }
2578
- map.push({
2579
- source: value,
2580
- object: objectValue,
2581
- relevance: map.length
2582
- })
2583
- map = (0, _relevancyFilter.default)(map, {
2584
- mapLimit,
2585
- relevancyRange
2586
- })
2560
+ if (depth === 0) {
2561
+ return firstObject
2562
+ }
2563
+ return objects.reduce((newObj, arg) => {
2564
+ if (!arg) {
2565
+ return newObj
2587
2566
  }
2588
- return (0, _setValue.default)(key, value, returnObj)
2589
- }, newObj)
2590
- }, firstObject || {})
2567
+ if (!visited.has(arg)) {
2568
+ visited.set(arg, newObj)
2569
+ }
2570
+ return (0, _reduceObject.default)(arg, (returnObj, value, key) => {
2571
+ if ((0, _isCloneable.default)(value)) {
2572
+ if (visited.has(value)) {
2573
+ return (0, _setValue.default)(key, visited.get(value), returnObj)
2574
+ }
2575
+ let objectValue = newObj[key]
2576
+ if (!(0, _isCloneable.default)(objectValue) || !objectValue) {
2577
+ if (!useClone) {
2578
+ // Merging by reference: the source object is used as it is, there is nothing to merge it into.
2579
+ visited.set(value, value)
2580
+ return (0, _setValue.default)(key, value, returnObj)
2581
+ }
2582
+ objectValue = Array.isArray(value) ? [] : {}
2583
+ }
2584
+ return (0, _setValue.default)(key, merge(visited, depth - 1, [objectValue, value]), returnObj)
2585
+ }
2586
+ return (0, _setValue.default)(key, value, returnObj)
2587
+ }, newObj)
2588
+ }, firstObject || {})
2589
+ }
2590
+ return (...objects) => merge(new Map(map.map(({
2591
+ source,
2592
+ object
2593
+ }) => [source, object])), depthLimit, objects)
2591
2594
  }
2592
2595
  const _default = exports.default = mergeObjectsBase
2593
- }, { '../functions/relevancyFilter': 32, './isCloneable': 52, './reduceObject': 62, './setValue': 64, 'core-js/modules/esnext.iterator.constructor.js': 214, 'core-js/modules/esnext.iterator.find.js': 217, 'core-js/modules/esnext.iterator.map.js': 219, 'core-js/modules/esnext.iterator.reduce.js': 220 }],
2596
+ }, { './isCloneable': 52, './reduceObject': 62, './setValue': 64, 'core-js/modules/esnext.iterator.constructor.js': 214, 'core-js/modules/esnext.iterator.map.js': 219, 'core-js/modules/esnext.iterator.reduce.js': 220, 'core-js/modules/esnext.map.delete-all.js': 222, 'core-js/modules/esnext.map.every.js': 223, 'core-js/modules/esnext.map.filter.js': 224, 'core-js/modules/esnext.map.find-key.js': 225, 'core-js/modules/esnext.map.find.js': 226, 'core-js/modules/esnext.map.includes.js': 227, 'core-js/modules/esnext.map.key-of.js': 228, 'core-js/modules/esnext.map.map-keys.js': 229, 'core-js/modules/esnext.map.map-values.js': 230, 'core-js/modules/esnext.map.merge.js': 231, 'core-js/modules/esnext.map.reduce.js': 232, 'core-js/modules/esnext.map.some.js': 233, 'core-js/modules/esnext.map.update.js': 234 }],
2594
2597
  59: [function (require, module, exports) {
2595
2598
  'use strict'
2596
2599