UNPKG

@teaui/core

Version:

A high-level terminal UI library for Node

174 lines 5.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.colorize = void 0; exports.isDebugging = isDebugging; exports.inspect = inspect; const ansi_1 = require("./ansi"); let _debug = false; function isDebugging(enabled) { if (enabled !== undefined) { _debug = enabled; } return _debug; } function isEmpty(object) { for (const key in object) { return false; } return true; } const MAX = 200; function inspect(value, wrap = true, recursionDepth = 0, visited = new Set()) { if (value && (typeof value === 'object' || typeof value === 'function')) { if (visited.has(value)) { return (0, ansi_1.red)('[Circular]'); } else { visited = new Set(visited); visited.add(value); } } if (recursionDepth >= 10) { return (0, ansi_1.red)('...'); } if (value instanceof Set) { return `new Set(${inspect(Array.from(value.values()), wrap, recursionDepth, visited)})`; } if (value instanceof Map) { return `new Map(${inspect(value.entries(), wrap, recursionDepth, visited)})`; } const tab = ' '.repeat(recursionDepth); const innerTab = tab + ' '; if (Array.isArray(value)) { if (value.length === 0) { return '[]'; } const values = value.map(val => inspect(val, wrap, recursionDepth + 1, visited)); const count = values.reduce((len, val) => len + val.length, 0); const newline = wrap && count > MAX; let inner; if (newline) { const [prev, line] = values.reduce(([prev, line], value) => { if (line.length + value.length > MAX) { return [(prev ? prev + `,\n${innerTab}` : '') + line, value]; } return [prev, line ? line + ', ' + value : value]; }, ['', '']); inner = (prev ? prev + `,\n${innerTab}` : '') + line; } else { inner = values.join(', '); } return newline ? `[\n${innerTab}${inner}\n${tab}]` : `[ ${inner} ]`; } else if (typeof value === 'string') { return exports.colorize.string(value, recursionDepth > 0); } else if (typeof value === 'symbol') { return exports.colorize.symbol(value); } else if (typeof value === 'number' || typeof value === 'boolean' || value === undefined || value === null) { return exports.colorize.format(value); } else if (typeof value === 'function') { return `function${value.name ? ` ${value.name}` : ''}() {…}`; } else if (value instanceof Object && value.constructor !== Object && isEmpty(value)) { return `${value.constructor.name}({})`; } const name = value.constructor === undefined ? '' : value.constructor.name === 'Object' ? '' : value.constructor.name.concat(' '); const keys = Object.keys(value); if (keys.length === 0) { return '{}'; } // weird ReactFiberNode one-off if ('$$typeof' in value && '_owner' in value) { const { _owner: _, ...remainder } = value; return inspect(remainder, wrap, recursionDepth, visited); } const values = keys.map(key => `${exports.colorize.key(key)}: ${inspect(value[key], wrap, recursionDepth + 1, visited)}`); const count = values.reduce((len, val) => len + val.length, 0); const newline = wrap && count > MAX; let inner; if (newline) { const [prev, line] = values.reduce(([prev, line], value) => { if (line.length + value.length > MAX) { return [(prev ? prev + `,\n${innerTab}` : '') + line, value]; } return [prev, line ? line + ', ' + value : line]; }, ['', '']); inner = (prev ? prev + `,\n${innerTab}` : '') + line; inner = values.join(`,\n${innerTab}`); } else { inner = values.join(', '); } return newline ? `${name}{\n${innerTab}${inner}\n${tab}}` : `${name}{ ${inner} }`; } exports.colorize = { format: function (input) { switch (typeof input) { case 'string': return exports.colorize.string(input); case 'symbol': return exports.colorize.symbol(input); case 'number': return exports.colorize.number(input); case 'undefined': return exports.colorize.undefined(); case 'object': return exports.colorize['null'](); default: return String(input); } }, number: function (input) { return (0, ansi_1.yellow)(''.concat(String(input))); }, symbol: function (input) { return (0, ansi_1.red)(''.concat(String(input))); }, string: function (input, doQuote = true) { let quote; if (doQuote) { if (input.includes("'")) { quote = '"'; input = input.replaceAll('"', '\\"'); } else { quote = "'"; input = input.replaceAll("'", "\\'"); } } else { quote = ''; } input = input.replaceAll(/\n/g, '⤦'); input = input.replaceAll(/\x1b/g, '␛'); return (0, ansi_1.green)(quote.concat(input, quote)); }, key: function (input) { return (0, ansi_1.cyan)(String(input)); }, boolean: function (input) { return (0, ansi_1.yellow)(''.concat(String(input))); }, undefined: function () { return (0, ansi_1.gray)('undefined'); }, null: function () { return (0, ansi_1.bold)('null'); }, }; //# sourceMappingURL=inspect.js.map