UNPKG

2.21 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports.default = diff;
8var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11/* eslint no-proto: 0 */
12
13function createArray() {
14 var arr = [];
15 arr.__proto__ = new Array();
16 arr.__proto__.format = function toString() {
17 return this.map(function (obj) {
18 return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, obj), {}, {
19 path: obj.path.join(' > ')
20 });
21 });
22 };
23 arr.__proto__.toString = function toString() {
24 return JSON.stringify(this.format(), null, 2);
25 };
26 return arr;
27}
28function diff(obj1, obj2) {
29 var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
30 var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
31 var diffList = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : createArray();
32 if (depth <= 0) return diffList;
33 var keys = new Set([].concat((0, _toConsumableArray2.default)(Object.keys(obj1)), (0, _toConsumableArray2.default)(Object.keys(obj2))));
34 keys.forEach(function (key) {
35 var value1 = obj1[key];
36 var value2 = obj2[key];
37
38 // Same value
39 if (value1 === value2) return;
40 var type1 = (0, _typeof2.default)(value1);
41 var type2 = (0, _typeof2.default)(value2);
42
43 // Diff type
44 if (type1 !== type2) {
45 diffList.push({
46 path: path.concat(key),
47 value1: value1,
48 value2: value2
49 });
50 return;
51 }
52
53 // NaN
54 if (Number.isNaN(value1) && Number.isNaN(value2)) {
55 return;
56 }
57
58 // Object & Array
59 if (type1 === 'object' && value1 !== null && value2 !== null) {
60 diff(value1, value2, depth - 1, path.concat(key), diffList);
61 return;
62 }
63
64 // Rest
65 diffList.push({
66 path: path.concat(key),
67 value1: value1,
68 value2: value2
69 });
70 });
71 return diffList;
72}
\No newline at end of file