Skip to content

⬅️ Back to Table of Contents

📄 deepMerge

📊 Analysis Summary

Metric Count
🔧 Functions 2
📑 Type Aliases 1

📚 Table of Contents

🛠️ File Location:

📂 packages/utils/src/eslint-utils/deepMerge.ts

Functions

isObjectNotArray(obj: unknown): obj is ObjectLike

Check if the variable contains an object strictly rejecting arrays

Returns: undefined true if obj is an object

Raw JSDoc
/**
 * Check if the variable contains an object strictly rejecting arrays
 * @returns `true` if obj is an object
 */

Calls:

  • Array.isArray
Code
export function isObjectNotArray(obj: unknown): obj is ObjectLike {
  return typeof obj === 'object' && obj != null && !Array.isArray(obj);
}

deepMerge(first: ObjectLike, second: ObjectLike): Record<string, unknown>

Pure function - doesn't mutate either parameter! Merges two objects together deeply, overwriting the properties in first with the properties in second

Parameters:

  • first any: The first object
  • second any: The second object

Returns: undefined a new object

Raw JSDoc
/**
 * Pure function - doesn't mutate either parameter!
 * Merges two objects together deeply, overwriting the properties in first with the properties in second
 * @param first The first object
 * @param second The second object
 * @returns a new object
 */

Calls:

  • Object.keys
  • Object.fromEntries
  • [...keys].map
  • isObjectNotArray
  • deepMerge

Internal Comments:

// get the unique set of keys across both objects (x2)
// object type (x3)
// value type (x3)

Code
export function deepMerge(
  first: ObjectLike = {},
  second: ObjectLike = {},
): Record<string, unknown> {
  // get the unique set of keys across both objects
  const keys = new Set([...Object.keys(first), ...Object.keys(second)]);

  return Object.fromEntries(
    [...keys].map(key => {
      const firstHasKey = key in first;
      const secondHasKey = key in second;
      const firstValue = first[key];
      const secondValue = second[key];

      let value;
      if (firstHasKey && secondHasKey) {
        if (isObjectNotArray(firstValue) && isObjectNotArray(secondValue)) {
          // object type
          value = deepMerge(firstValue, secondValue);
        } else {
          // value type
          value = secondValue;
        }
      } else if (firstHasKey) {
        value = firstValue;
      } else {
        value = secondValue;
      }
      return [key, value];
    }),
  );
}

Type Aliases

ObjectLike<T = unknown>

type ObjectLike<T = unknown> = Record<string, T>;

Generated by Syntax Scribe