-
Notifications
You must be signed in to change notification settings - Fork 3
/
stringify.js
94 lines (86 loc) · 2.41 KB
/
stringify.js
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
var typeName = require('type-name'),
globalConstructors = [
Boolean,
Date,
Number,
RegExp,
String
];
function defaultStringifier (config) {
function stringify(obj, depth) {
if (typeof depth !== 'number') {
depth = config.stringifyDepth;
}
return stringifyAny(obj, depth);
}
function stringifyAny(obj, depth) {
switch(typeof obj) {
case 'string':
case 'boolean':
return JSON.stringify(obj);
case 'number':
return stringifyNumber(obj);
case 'function':
return '#function#';
case 'undefined':
return 'undefined';
case 'object':
if (obj === null) {
return 'null';
} else if (Array.isArray(obj)) {
return stringifyArray(obj, depth);
} else {
return stringifyObject(obj, depth);
}
break;
default:
break;
}
}
function stringifyNumber(num) {
if (isNaN(num)) {
return 'NaN';
}
if (!isFinite(num)) {
return num === Infinity ? 'Infinity' : '-Infinity';
}
return JSON.stringify(num);
}
function stringifyArray(ary, depth) {
depth -= 1;
if (depth === 0) {
return '#Array#';
}
return '[' + ary.map(function (elem, idx) {
return stringifyAny(elem, depth);
}).join(',') + ']';
}
function stringifyObject(obj, depth) {
var pairs, cname;
depth -= 1;
if (obj instanceof RegExp) {
return obj.toString();
}
cname = typeName(obj);
if (cname === '') {
cname = 'Object';
}
if (globalConstructors.some(function (ctor) { return obj instanceof ctor; })) {
return 'new ' + cname + '(' + JSON.stringify(obj) + ')';
}
if (depth === 0) {
return '#' + cname + '#';
}
pairs = [];
Object.keys(obj).forEach(function (key) {
var val = stringifyAny(obj[key], depth);
if (!/^[A-Za-z_]+$/.test(key)) {
key = JSON.stringify(key);
}
pairs.push(key + ':' + val);
});
return cname + '{' + pairs.join(',') + '}';
}
return stringify;
}
module.exports = defaultStringifier;