si-funciona 2.6.2 → 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.
package/README.md CHANGED
@@ -359,18 +359,19 @@ Optional flag will include the inherited keys from prototype chain when set.
359
359
  ### objectHelpers.mergeObjectsBase([options]) ⇒ <code>module:objectHelpers~mergeObjectsCallback</code> \| <code>mergeObjectsCallback</code>
360
360
  Perform a deep merge of objects. This will return a function that will combine all objects and sub-objects.
361
361
  Objects having the same attributes will overwrite from last object to first.
362
- NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
363
- 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.
364
365
 
365
366
  **Kind**: static method of [<code>objectHelpers</code>](#module_objectHelpers)
366
367
 
367
368
  | Param | Type | Default | Description |
368
369
  | --- | --- | --- | --- |
369
370
  | [options] | <code>Object</code> | <code>{}</code> | |
370
- | [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. |
371
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. |
372
- | [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. |
373
- | [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. |
374
375
  | [options.useClone] | <code>boolean</code> | <code>false</code> | |
375
376
 
376
377
  <a name="module_objectHelpers.mapObject"></a>
@@ -525,8 +526,6 @@ Get a nested property value from an object.
525
526
 
526
527
  ### objectHelpers.cloneObject(object, [options]) ⇒ <code>Object</code>
527
528
  Clone objects for manipulation without data corruption, returns a copy of the provided object.
528
- NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
529
- have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
530
529
 
531
530
  **Kind**: static method of [<code>objectHelpers</code>](#module_objectHelpers)
532
531
 
@@ -534,9 +533,9 @@ have circular references. A high mapLimit may lead to heavy memory usage and slo
534
533
  | --- | --- | --- | --- |
535
534
  | object | <code>Object</code> | | The original object that is being cloned |
536
535
  | [options] | <code>Object</code> | <code>{}</code> | |
537
- | [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). |
538
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. |
539
- | [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. |
540
539
 
541
540
  <a name="module_objectHelpers..handleRetainObjects"></a>
542
541
 
@@ -1966,14 +1966,12 @@
1966
1966
  function _interopRequireDefault (e) { return e && e.__esModule ? e : { default: e } }
1967
1967
  /**
1968
1968
  * Clone objects for manipulation without data corruption, returns a copy of the provided object.
1969
- * NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
1970
- * have circular references. A high mapLimit may lead to heavy memory usage and slow performance.
1971
1969
  * @memberOf module:objectHelpers
1972
1970
  * @param {Object} object - The original object that is being cloned
1973
1971
  * @param {Object} [options={}]
1974
- * @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).
1975
1973
  * @param {number} [options.depthLimit=-1] - Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited.
1976
- * @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.
1977
1975
  * @returns {Object}
1978
1976
  */
1979
1977
  const cloneObject = (object, {
@@ -2513,91 +2511,89 @@
2513
2511
  })
2514
2512
  exports.default = void 0
2515
2513
  require('core-js/modules/esnext.iterator.constructor.js')
2516
- require('core-js/modules/esnext.iterator.find.js')
2517
2514
  require('core-js/modules/esnext.iterator.map.js')
2518
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')
2519
2529
  const _isCloneable = _interopRequireDefault(require('./isCloneable'))
2520
2530
  const _reduceObject = _interopRequireDefault(require('./reduceObject'))
2521
- const _relevancyFilter = _interopRequireDefault(require('../functions/relevancyFilter'))
2522
2531
  const _setValue = _interopRequireDefault(require('./setValue'))
2523
2532
  function _interopRequireDefault (e) { return e && e.__esModule ? e : { default: e } }
2524
2533
  /**
2525
2534
  * Perform a deep merge of objects. This will return a function that will combine all objects and sub-objects.
2526
2535
  * Objects having the same attributes will overwrite from last object to first.
2527
- * NOTE: Use the mapLimit and relevancyRange to resolve "too much recursion" when the object is large and is known to
2528
- * 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.
2529
2539
  * @memberOf module:objectHelpers
2530
2540
  * @param {Object} [options={}]
2531
- * @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.
2532
2543
  * @param {number} [options.depthLimit=-1] - Control how many nested levels deep will be used, -1 = no limit, >-1 = nth level limited.
2533
- * @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.
2534
- * @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.
2535
2547
  * @param {boolean} [options.useClone=false]
2536
2548
  * @returns {module:objectHelpers~mergeObjectsCallback|mergeObjectsCallback}
2537
2549
  */
2538
2550
  const mergeObjectsBase = ({
2539
- mapLimit = 100,
2540
2551
  depthLimit = -1,
2541
- relevancyRange = 1000,
2542
2552
  map = [],
2543
2553
  useClone = false
2544
- } = {}) => (...objects) => {
2545
- const firstObject = useClone ? Array.isArray(objects[0]) ? [] : {} : objects.shift()
2546
- if (objects.length < 1) {
2547
- return firstObject
2548
- }
2549
- if (depthLimit === 0) {
2550
- return firstObject
2551
- }
2552
- return objects.reduce((newObj, arg) => {
2553
- if (!arg) {
2554
- 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
2555
2559
  }
2556
- map.push({
2557
- source: arg,
2558
- object: newObj,
2559
- relevance: map.length
2560
- })
2561
- map = (0, _relevancyFilter.default)(map, {
2562
- mapLimit,
2563
- relevancyRange
2564
- })
2565
- return (0, _reduceObject.default)(arg, (returnObj, value, key) => {
2566
- if ((0, _isCloneable.default)(value)) {
2567
- let objectValue = newObj[key]
2568
- const exists = map.find(existing => existing.source === value)
2569
- if (exists) {
2570
- exists.relevance = map.length + 1
2571
- return (0, _setValue.default)(key, exists.object, returnObj)
2572
- }
2573
- if (!(0, _isCloneable.default)(objectValue) || !objectValue) {
2574
- objectValue = useClone ? Array.isArray(value) ? [] : {} : value
2575
- }
2576
- if ((0, _isCloneable.default)(objectValue)) {
2577
- return (0, _setValue.default)(key, mergeObjectsBase({
2578
- mapLimit,
2579
- depthLimit: depthLimit - 1,
2580
- relevancyRange,
2581
- map,
2582
- useClone
2583
- })(objectValue, value), returnObj)
2584
- }
2585
- map.push({
2586
- source: value,
2587
- object: objectValue,
2588
- relevance: map.length
2589
- })
2590
- map = (0, _relevancyFilter.default)(map, {
2591
- mapLimit,
2592
- relevancyRange
2593
- })
2560
+ if (depth === 0) {
2561
+ return firstObject
2562
+ }
2563
+ return objects.reduce((newObj, arg) => {
2564
+ if (!arg) {
2565
+ return newObj
2594
2566
  }
2595
- return (0, _setValue.default)(key, value, returnObj)
2596
- }, newObj)
2597
- }, 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)
2598
2594
  }
2599
2595
  const _default = exports.default = mergeObjectsBase
2600
- }, { '../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 }],
2601
2597
  59: [function (require, module, exports) {
2602
2598
  'use strict'
2603
2599