object.js
2.72 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
'use strict';
var util = require('util');
module.exports = {
maxDepthFactory: maxDepthFactory,
serialize: serialize,
toJSON: toJSON,
toStringFactory: toStringFactory,
};
function createSerializer() {
var seen = createWeakSet();
return function (key, value) {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return undefined;
}
seen.add(value);
}
return serialize(key, value);
};
}
/**
* @return {WeakSet<object>}
*/
function createWeakSet() {
if (typeof WeakSet !== 'undefined') {
return new WeakSet();
}
var cache = [];
return {
add: function (value) { cache.push(value) },
has: function (value) { return cache.indexOf(value) !== -1 },
};
}
function maxDepth(data, depth) {
if (!data) {
return data;
}
if (depth < 1) {
if (isArray(data)) return '[array]';
if (typeof data === 'object' && data) return '[object]';
return data;
}
if (isArray(data)) {
return data.map(function (child) {
return maxDepth(child, depth - 1);
});
}
if (typeof data !== 'object') {
return data;
}
if (data && typeof data.toISOString === 'function') {
return data;
}
// noinspection PointlessBooleanExpressionJS
if (data === null) {
return null;
}
if (data instanceof Error) {
return data;
}
var newJson = {};
for (var i in data) {
if (!Object.prototype.hasOwnProperty.call(data, i)) continue;
newJson[i] = maxDepth(data[i], depth - 1);
}
return newJson;
}
function maxDepthFactory(depth) {
depth = depth || 6;
return function maxDepthFunction(data) {
return maxDepth(data, depth);
};
}
function serialize(key, value) {
if (value instanceof Error) {
return value.stack;
}
if (!value) {
return value;
}
if (typeof value.toJSON === 'function') {
return value.toJSON();
}
if (typeof value === 'function') {
return '[function] ' + value.toString();
}
return value;
}
function toJSON(data) {
return JSON.parse(JSON.stringify(data, createSerializer()));
}
function toStringFactory(inspectOptions) {
return function toStringFunction(data) {
var simplifiedData = data.map(function (item) {
if (item === undefined) {
return undefined;
}
var str = JSON.stringify(item, createSerializer(), ' ');
if (str === undefined) {
return undefined;
}
return JSON.parse(str);
});
if (util.formatWithOptions) {
simplifiedData.unshift(inspectOptions || {});
return util.formatWithOptions.apply(util, simplifiedData);
}
return util.format.apply(util, simplifiedData);
};
}
function isArray(value) {
return Object.prototype.toString.call(value) === '[object Array]';
}