Blame view

天文台pc/tianwentai-ui/node_modules/@mui/utils/esm/deepmerge/deepmerge.js 2.21 KB
bc518174   王天杨   提交两个项目文件
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
  import * as React from 'react';
  import { isValidElementType } from 'react-is';
  
  // https://github.com/sindresorhus/is-plain-obj/blob/main/index.js
  export function isPlainObject(item) {
    if (typeof item !== 'object' || item === null) {
      return false;
    }
    const prototype = Object.getPrototypeOf(item);
    return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in item) && !(Symbol.iterator in item);
  }
  function deepClone(source) {
    if (/*#__PURE__*/React.isValidElement(source) || isValidElementType(source) || !isPlainObject(source)) {
      return source;
    }
    const output = {};
    Object.keys(source).forEach(key => {
      output[key] = deepClone(source[key]);
    });
    return output;
  }
  
  /**
   * Merge objects deeply.
   * It will shallow copy React elements.
   *
   * If `options.clone` is set to `false` the source object will be merged directly into the target object.
   *
   * @example
   * ```ts
   * deepmerge({ a: { b: 1 }, d: 2 }, { a: { c: 2 }, d: 4 });
   * // => { a: { b: 1, c: 2 }, d: 4 }
   * ````
   *
   * @param target The target object.
   * @param source The source object.
   * @param options The merge options.
   * @param options.clone Set to `false` to merge the source object directly into the target object.
   * @returns The merged object.
   */
  export default function deepmerge(target, source, options = {
    clone: true
  }) {
    const output = options.clone ? {
      ...target
    } : target;
    if (isPlainObject(target) && isPlainObject(source)) {
      Object.keys(source).forEach(key => {
        if (/*#__PURE__*/React.isValidElement(source[key]) || isValidElementType(source[key])) {
          output[key] = source[key];
        } else if (isPlainObject(source[key]) &&
        // Avoid prototype pollution
        Object.prototype.hasOwnProperty.call(target, key) && isPlainObject(target[key])) {
          // Since `output` is a clone of `target` and we have narrowed `target` in this block we can cast to the same type.
          output[key] = deepmerge(target[key], source[key], options);
        } else if (options.clone) {
          output[key] = isPlainObject(source[key]) ? deepClone(source[key]) : source[key];
        } else {
          output[key] = source[key];
        }
      });
    }
    return output;
  }