UNPKG

3.48 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = inspect;
7
8var _nodejsCustomInspectSymbol = _interopRequireDefault(require("./nodejsCustomInspectSymbol"));
9
10function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
13
14var MAX_ARRAY_LENGTH = 10;
15var MAX_RECURSIVE_DEPTH = 2;
16/**
17 * Used to print values in error messages.
18 */
19
20function inspect(value) {
21 return formatValue(value, []);
22}
23
24function formatValue(value, seenValues) {
25 switch (_typeof(value)) {
26 case 'string':
27 return JSON.stringify(value);
28
29 case 'function':
30 return value.name ? "[function ".concat(value.name, "]") : '[function]';
31
32 case 'object':
33 if (value === null) {
34 return 'null';
35 }
36
37 return formatObjectValue(value, seenValues);
38
39 default:
40 return String(value);
41 }
42}
43
44function formatObjectValue(value, previouslySeenValues) {
45 if (previouslySeenValues.indexOf(value) !== -1) {
46 return '[Circular]';
47 }
48
49 var seenValues = [].concat(previouslySeenValues, [value]);
50 var customInspectFn = getCustomFn(value);
51
52 if (customInspectFn !== undefined) {
53 // $FlowFixMe(>=0.90.0)
54 var customValue = customInspectFn.call(value); // check for infinite recursion
55
56 if (customValue !== value) {
57 return typeof customValue === 'string' ? customValue : formatValue(customValue, seenValues);
58 }
59 } else if (Array.isArray(value)) {
60 return formatArray(value, seenValues);
61 }
62
63 return formatObject(value, seenValues);
64}
65
66function formatObject(object, seenValues) {
67 var keys = Object.keys(object);
68
69 if (keys.length === 0) {
70 return '{}';
71 }
72
73 if (seenValues.length > MAX_RECURSIVE_DEPTH) {
74 return '[' + getObjectTag(object) + ']';
75 }
76
77 var properties = keys.map(function (key) {
78 var value = formatValue(object[key], seenValues);
79 return key + ': ' + value;
80 });
81 return '{ ' + properties.join(', ') + ' }';
82}
83
84function formatArray(array, seenValues) {
85 if (array.length === 0) {
86 return '[]';
87 }
88
89 if (seenValues.length > MAX_RECURSIVE_DEPTH) {
90 return '[Array]';
91 }
92
93 var len = Math.min(MAX_ARRAY_LENGTH, array.length);
94 var remaining = array.length - len;
95 var items = [];
96
97 for (var i = 0; i < len; ++i) {
98 items.push(formatValue(array[i], seenValues));
99 }
100
101 if (remaining === 1) {
102 items.push('... 1 more item');
103 } else if (remaining > 1) {
104 items.push("... ".concat(remaining, " more items"));
105 }
106
107 return '[' + items.join(', ') + ']';
108}
109
110function getCustomFn(object) {
111 var customInspectFn = object[String(_nodejsCustomInspectSymbol.default)];
112
113 if (typeof customInspectFn === 'function') {
114 return customInspectFn;
115 }
116
117 if (typeof object.inspect === 'function') {
118 return object.inspect;
119 }
120}
121
122function getObjectTag(object) {
123 var tag = Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/]$/, '');
124
125 if (tag === 'Object' && typeof object.constructor === 'function') {
126 var name = object.constructor.name;
127
128 if (typeof name === 'string' && name !== '') {
129 return name;
130 }
131 }
132
133 return tag;
134}