All files deepEquals.js

100% Statements 31/31
90.91% Branches 30/33
100% Functions 5/5
100% Lines 29/29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 6836x       60x 24x     36x 8x 5x       5x 2x       1x     28x 3x     25x 17x 2x     15x 15x 15x 2x     13x 13x   13x 2x       11x     11x   18x           5x       6x   8x     4x    
const hasOwn = (object, key) =>
  Object.prototype.hasOwnProperty.call(object, key)
export default function deepEquals(equals, deepObjects) {
  function deep(valueA, valueB) {
    if (equals(valueA, valueB)) {
      return true
    }
 
    if (Array.isArray(valueA)) {
      if (!Array.isArray(valueB) || valueA.length !== valueB.length) {
        return false
      }
 
      // Check deep equality of each value in A against the same indexed value in B
      if (!valueA.every((value, index) => deep(value, valueB[index]))) {
        return false
      }
 
      // could not find unequal items
      return true
    }
 
    if (Array.isArray(valueB)) {
      return false
    }
 
    if (typeof valueA === 'object') {
      if (typeof valueB !== 'object') {
        return false
      }
 
      const isANull = valueA === null
      const isBNull = valueB === null
      if (isANull || isBNull) {
        return isANull === isBNull
      }
 
      const aKeys = Object.keys(valueA)
      const bKeys = Object.keys(valueB)
 
      if (aKeys.length !== bKeys.length) {
        return false
      }
 
      // Should we compare with shallow equivalence or deep equivalence?
      const equalityChecker = deepObjects ? deep : equals
 
      // Check if objects share same keys, and each of those keys are equal
      if (
        !aKeys.every(
          aKey =>
            hasOwn(valueA, aKey) &&
              hasOwn(valueB, aKey) &&
              equalityChecker(valueA[aKey], valueB[aKey])
        )
      ) {
        return false
      }
 
      // could not find unequal keys or values
      return true
    }
    return false
  }
 
  return deep
}