mirror of
https://github.com/CamHenlin/MessagesForMacintosh.git
synced 2024-11-29 23:49:20 +00:00
125 lines
3.2 KiB
JavaScript
125 lines
3.2 KiB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; 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); }
|
|
|
|
/* eslint-disable flowtype/no-weak-types */
|
|
import nodejsCustomInspectSymbol from "./nodejsCustomInspectSymbol.mjs";
|
|
var MAX_ARRAY_LENGTH = 10;
|
|
var MAX_RECURSIVE_DEPTH = 2;
|
|
/**
|
|
* Used to print values in error messages.
|
|
*/
|
|
|
|
export default function inspect(value) {
|
|
return formatValue(value, []);
|
|
}
|
|
|
|
function formatValue(value, seenValues) {
|
|
switch (_typeof(value)) {
|
|
case 'string':
|
|
return JSON.stringify(value);
|
|
|
|
case 'function':
|
|
return value.name ? "[function ".concat(value.name, "]") : '[function]';
|
|
|
|
case 'object':
|
|
if (value === null) {
|
|
return 'null';
|
|
}
|
|
|
|
return formatObjectValue(value, seenValues);
|
|
|
|
default:
|
|
return String(value);
|
|
}
|
|
}
|
|
|
|
function formatObjectValue(value, previouslySeenValues) {
|
|
if (previouslySeenValues.indexOf(value) !== -1) {
|
|
return '[Circular]';
|
|
}
|
|
|
|
var seenValues = [].concat(previouslySeenValues, [value]);
|
|
var customInspectFn = getCustomFn(value);
|
|
|
|
if (customInspectFn !== undefined) {
|
|
var customValue = customInspectFn.call(value); // check for infinite recursion
|
|
|
|
if (customValue !== value) {
|
|
return typeof customValue === 'string' ? customValue : formatValue(customValue, seenValues);
|
|
}
|
|
} else if (Array.isArray(value)) {
|
|
return formatArray(value, seenValues);
|
|
}
|
|
|
|
return formatObject(value, seenValues);
|
|
}
|
|
|
|
function formatObject(object, seenValues) {
|
|
var keys = Object.keys(object);
|
|
|
|
if (keys.length === 0) {
|
|
return '{}';
|
|
}
|
|
|
|
if (seenValues.length > MAX_RECURSIVE_DEPTH) {
|
|
return '[' + getObjectTag(object) + ']';
|
|
}
|
|
|
|
var properties = keys.map(function (key) {
|
|
var value = formatValue(object[key], seenValues);
|
|
return key + ': ' + value;
|
|
});
|
|
return '{ ' + properties.join(', ') + ' }';
|
|
}
|
|
|
|
function formatArray(array, seenValues) {
|
|
if (array.length === 0) {
|
|
return '[]';
|
|
}
|
|
|
|
if (seenValues.length > MAX_RECURSIVE_DEPTH) {
|
|
return '[Array]';
|
|
}
|
|
|
|
var len = Math.min(MAX_ARRAY_LENGTH, array.length);
|
|
var remaining = array.length - len;
|
|
var items = [];
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
items.push(formatValue(array[i], seenValues));
|
|
}
|
|
|
|
if (remaining === 1) {
|
|
items.push('... 1 more item');
|
|
} else if (remaining > 1) {
|
|
items.push("... ".concat(remaining, " more items"));
|
|
}
|
|
|
|
return '[' + items.join(', ') + ']';
|
|
}
|
|
|
|
function getCustomFn(object) {
|
|
var customInspectFn = object[String(nodejsCustomInspectSymbol)];
|
|
|
|
if (typeof customInspectFn === 'function') {
|
|
return customInspectFn;
|
|
}
|
|
|
|
if (typeof object.inspect === 'function') {
|
|
return object.inspect;
|
|
}
|
|
}
|
|
|
|
function getObjectTag(object) {
|
|
var tag = Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/]$/, '');
|
|
|
|
if (tag === 'Object' && typeof object.constructor === 'function') {
|
|
var name = object.constructor.name;
|
|
|
|
if (typeof name === 'string' && name !== '') {
|
|
return name;
|
|
}
|
|
}
|
|
|
|
return tag;
|
|
}
|