UNPKG

json-colorz

Version:

display a json or javascript object in the console with colorz

212 lines (172 loc) 5.23 kB
var colorz = require('colorz') function engine () { var options function kindOf (value) { if (value === null) return 'null' if (value === undefined) return 'undefined' if (Array.isArray(value)) return 'array' return typeof value === 'object' ? Object.prototype.toString.call(value) .replace(/^\[object |\]$/g, '') .toLowerCase() : typeof value } function isObject (obj) { return Object.prototype.toString.call(obj) === '[object Object]' } function filter (arr, fn) { var result = [] var val var i = -1 var j = -1 var len = arr.length while (++i < len) { val = arr[i] if (fn(val, i, arr)) result[++j] = val } return result } function repeat (str, n) { var result = '' while (n > 0) { if (n % 2) result += str n = Math.floor(n / 2) str += str } return result } function indent (str, char, num) { if (num === 0) return str char = num > 1 ? repeat(char, num) : char var re = /^(?!\s*$)/mg return str.replace(re, char) } function getType (value) { var map = { 'number' : 'num', 'string' : 'str', 'boolean' : 'bool', 'function' : 'func', 'null' : 'null', 'undefined' : 'undef', 'object' : 'obj', 'array' : 'arr', 'regexp' : 'regex', 'date' : 'date' } return map[kindOf(value)] || map['' + value] } function cleanObject (obj) { var lastKey = '' var key for (key in obj) { // get object's prototype last key for placement of trailing comma lastKey = key } return lastKey } function cleanArray (arr) { if (options.display.xarr) return arr return filter(arr, function (item) { return ['func', 'date'].indexOf(getType(item)) === -1 }) } function generateLevel (level) { var levelStr = repeat(' ', options.level.spaces) var opts = options.level if (options.level.show && levelStr.length) { levelStr = levelStr.replace(' ', useColorProvider(opts.char, opts.color)) } return repeat(levelStr, level) } function hasChild (obj) { var key for (key in obj) { if (Array.isArray(obj[key]) || isObject(obj[key])) return true } } function colorify (value, level) { var type = getType(value) var color = options.colors[type] return generateLevel(type === 'func' ? 0 : level) + (type === 'str' ? colorifySpec('"', 'quot') : '') + useColorProvider(formatOutputType(value, type, level), color) + (type === 'str' ? colorifySpec('"', 'quot') : '') } function colorifySpec (char, type, level) { return generateLevel(level) + useColorProvider('' + char, options.colors[type]) } function useColorProvider (str, color) { if (!color) return str if (options.params.colored) { if (Array.isArray(color) && color.length > 1) { return useColorProvider(colorz[color[0]](str), color.slice(1)) } else { return colorz[Array.isArray(color) ? color[0] : color](str) } } return str } function formatOutputType (value, type, level) { if (type === 'func') { if (options.display.func) { var str = value.toString().split(/\n/) var first = str[0] + '\n' var rest = str.slice(1) return first + indent(rest.join('\n'), ' ', generateLevel(level).length) } else { return '[Function]' } } if (type === 'date' && !options.display.date) return '[Date]' return '' + value } return { gen: function (json, level, isChild) { var colored = '' var result var key level = level || 0 if (isObject(json)) { var lastKey = cleanObject(json) colored += colorifySpec('{', 'brack', isChild ? 0 : level) + '\n' level++ for (key in json) { result = colorifySpec(key, 'attr', level) + colorifySpec(': ', 'punc') + this.gen(json[key], level, true) + (key !== lastKey ? colorifySpec(',', 'punc') : '') colored += result + '\n' } colored += colorifySpec('}', 'brack', --level) } else if (Array.isArray(json)) { json = cleanArray(json) if (hasChild(json)) { result = json.map(function (item) { return this.gen(item, level + 1) }.bind(this)) colored += colorifySpec('[', 'brack', isChild ? 0 : level) colored += result.join(colorifySpec(', ', 'punc') + '\n') colored += colorifySpec(']', 'brack', level) } else { var coloredArray = colorifySpec('[', 'brack', isChild ? 0 : level) for (key in json) { coloredArray += colorify(json[key]) + (json.length - 1 > key ? colorifySpec(', ', 'punc') : '') } colored += coloredArray + colorifySpec(']', 'brack') } } else { return generateLevel(isChild ? 0 : level) + colorify(json, typeof json === 'function' ? level : '') } return colored }, setOptions: function (opts) { options = opts return this } } } module.exports = engine()