# All files / utils mixins.ts

0% Statements 0/20
0% Branches 0/15
0% Functions 0/6
0% Lines 0/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    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

     export const isObject = (item: any): boolean =>
      !!item && typeof item === 'object' && !Array.isArray(item)

    export const deepMerge = <T extends object = object>(target: T, ...sources: T[]): T => {
      if (!sources.length) {
        return target
      }
      const source = sources.shift()
      if (source === undefined) {
        return target
      }

      if (isObject(target) && isObject(source)) {
        Object.keys(source).forEach(
          (key: string): void => {
            if (isObject((source as any)[key])) {
              if (!(target as any)[key]) Object.assign(target, { [key]: {} })
              deepMerge((target as any)[key], (source as any)[key])
            } else {
              Object.assign(target, { [key]: (source as any)[key] })
            }
          }
        )
      }

      return deepMerge(target, ...sources)
    }

    interface Target {
      [key: string]: any
    }

    export function omit(target: Target, fields: string[]): Omit<Target, string> {
      return Object.keys(target)
        .filter((key): boolean => !fields.includes(key))
        .reduce(
          (acc, cur): any => ({
            ...acc,
            [cur]: target[cur]
          }),
          {}
        )
    }