| 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); } |
| |
| 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) { |
| // $FlowFixMe(>=0.90.0) |
| 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; |
| } |