fliphub-monorepo
Version:
the builder of builders
315 lines (279 loc) • 8.34 kB
JavaScript
// @TODO:
// var ref = null
// if (msg.helpers) {
// ref = msg.helpers
// delete msg.helpers
// }
//
// https://developer.mozilla.org/en-US/docs/Web/API/Console/table
// https://github.com/Automattic/cli-table
require('./inspector')
require('./timer')
const chalk = require('chalk')
const clc = require('cli-color')
global.inspector = require('./inspect')
// http://tostring.it/2014/06/23/advanced-logging-with-nodejs/
// http://www.100percentjs.com/best-way-debug-node-js/
// https://www.loggly.com/ultimate-guide/node-logging-basics/
// https://www.npmjs.com/package/cli-color
const clrs = [
'black', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'gray',
]
const bgColors = [
'bgBlack', 'bgRed', 'bgGreen', 'bgYellow', 'bgBlue', 'bgMagenta', 'bgCyan', 'bgWhite',
]
const em = [
'italic', 'bold', 'underline',
]
const xterm = {
colors: {
'orange': 202,
},
bg: {
'orange': 236,
},
}
const combinations = clrs.concat(bgColors).concat(em)
// global.sleep = (time) => {
// if (!time) time = 200
// var i = 0
// while (i < time) {
// i++
// console.log('eh?')
// // sleep()
// }
// }
// https://github.com/npm/npmlog
// @TODO: more args, but this kind of forces a nice terseness
function log(message, options) {
const tosource = require('tosource')
if (typeof options === 'string') options = {level: options}
var defaults = {
level: 'debug',
space: false,
color: 'purple',
verbose: false,
source: false,
text: false,
time: true,
data: false,
}
options = Object.assign(defaults, options)
if (options.name) options.level = options.name
if (options.data) {
if (options.level !== 'debug') options.level = message
message = options.data
}
if (Number.isInteger(options.space)) console.log('\n'.repeat(options.space))
if (options.space === true) console.log('\n\n\n')
try {
if (typeof options.color === 'function' || options.color === false) {}
else if (!options.color || (!chalk[options.color] && !options.color.includes('.')))
options.color = 'magenta'
// var {level, color} = options
var level = options.level
var color = options.color
var text = options.text
if (color === 'purple') color = 'magenta'
if (typeof message != 'string' && options.verbose) {
// const omitDeep = require('omit-deep-lodash')
// const _ = require('lodash')
// _.omit(message, 'helpers', 'fs', 'ws')
// message = util.inspect(message, {
// showHidden: true,
// depth: null,
// showProxy: true,
// maxArrayLength: null,
// colors: true,
// // colors: {}
// })
// console.log(message)
// message = omitDeep(message, ['helpers', 'flags', 'ws'])
const util = require('util')
const PrettyError = require('pretty-error')
let err = false
if (message && message.stack) {
const pe = new PrettyError()
err = console.log(pe.render(message))
delete message.stack
message.message = message.message.split('\n')
// delete message.message
}
message = inspector(message)
// const emptyFnReg = /(\[Function\] \[length]: [0-9]+, \[name]: '')/gmi
// (?:.*)
// usually works but was causing an infinite loop...
// const emptyFnReg = /(\{(?:.*)\[Function\](?:.*)\[length]:(?:.*),(?:.*)\[name]:(?:.*)''(?:.*))/gm
// const matches = message.match(emptyFnReg)
// if (matches) {
// -> // message = message.replace(emptyFnReg, chalk.italic('[NoNameFn]'))
//
//
// // message = message.replace(/: undefined,/, chalk.black('undefined'))
// // console.log(matches)
// // process.exit(1)
// // message = JSON.stringify(message)
// // console.log(message)
// // process.exit(1)
// }
}
if (typeof message === 'object' && options.source) message = tosource(message)
var logger = chalk
// maybe we colored with something not in chalk
// like xterm
if (typeof color === 'function') logger = color
else if (color === false) logger = msg => msg
else if (color.includes('.'))
color.split('.').forEach(clr => logger = logger[clr])
else if (combinations.includes(color))
logger = logger[color]
let lvl
if (text)
lvl = `${logger(message)}`
else
lvl = `${logger(level)}:`
if (options.time) {
let data = new Date()
let hour = data.getHours()
let min = data.getMinutes()
let sec = data.getSeconds()
let ms = data.getMilliseconds()
hour = hour < 10 ? `0${hour}` : hour
min = min < 10 ? `0${min}` : min
sec = sec < 10 ? `0${sec}` : sec
ms = ms < 10 ? `0${sec}` : ms
// message = chalk.yellow(`${hour}:${min}:${sec}:${ms} `) + message
// lvl = chalk.yellow(`:${ms}: `) + lvl
lvl = chalk.yellow(`${min}:${sec}:${ms}: `) + lvl
}
if (text)
console.log(lvl)
else
console.log(lvl, message)
if (Number.isInteger(options.space)) console.log('\n'.repeat(options.space))
if (options.space === true) console.log('\n\n\n')
clc.reset
} catch (e) {
console.log(e)
console.log(`${color}${(level)}:`, message)
clc.reset
}
}
function underline(str) {
return '\x1B[4m' + str + '\x1B[24m'
}
function bold(str) {
return '\x1B[1m' + str + '\x1B[22m'
}
log.underline = underline
log.bold = bold
log.verbose = function(msg, options) {
var defaults = {
verbose: true,
level: 'verbose',
}
options = Object.assign(defaults, options)
log(msg, options)
}
log.text = function(msg, options) {
var defaults = {
text: true,
}
options = Object.assign(defaults, options)
log(msg, options)
}
log.text.color = function(msg, color, options) {
var defaults = {
text: true,
color,
}
options = Object.assign(defaults, options)
log(msg, options)
}
clrs.forEach(clr => {
log.text.color[clr] = function(msg, options) {
var defaults = {
text: true,
color: clr,
}
options = Object.assign(defaults, options)
log(msg, options)
}
})
log.text.color.xterm = function(msg, color, options) {
// console.log(color)
// if (!color)
if (typeof color === 'string' && color.includes('.')) {
const colorArr = color.split('.')
const txt = colorArr.shift()
const bg = colorArr.pop()
// color = clc[txt][bg]
color = clc.xterm(txt).bgXterm(bg)
}
else if (Number.isInteger(color))
color = clc.xterm(color)
else
color = clc.xterm(202).bgXterm(236)
options = Object.assign({
text: true,
// time: false,
color: false,
}, options)
// console.log(color('eh'))
log(color(msg), options)
}
log.error = function(msg, options) {
var defaults = {
level: 'error',
verbose: true,
color: 'bgRed.black',
}
options = Object.assign(defaults, options)
log(msg, options)
}
log.warn = function(msg, options) {
var defaults = {
level: '⚠ warning',
color: 'bgYellow.black',
}
options = Object.assign(defaults, options)
log(msg, options)
}
log.debug = function(msg, options) {
var defaults = {
level: 'DEBUG::::::::::',
color: 'bgBlue.white',
space: 20,
}
options = Object.assign(defaults, options)
log(msg, options)
}
log.exit = function() {
// let all = arguments // Object.values(arguments)
// log.verbose(all)
for (let arg of arguments) log.verbose(arg)
console.warn('log.exit')
setTimeout(() => process.exit(1), 1)
throw new Error('log.exit.trace')
}
console._log = log
console._color = log.text.color
console._text = log.text
console._error = log.error
console._warn = log.warn
console._verbose = log.verbose
console._exit = log.exit
console._debug = log.debug
// Object.defineProperty(console, 'exit', {value: console.exit})
// Object.defineProperty(console, 'debug', {value: console.debug})
// Object.defineProperty(console, 'debug', {value: console.debug})
// Object.defineProperty(console, 'debug', {value: console.debug})
console.exit = console._exit
console.color = console._color
console.error = console._error
console.verbose = console._verbose
console.text = console._text
console.debug = console._debug
console.xterm = log.text.color.xterm
// if (!console.debug) console.debug = console.debug
module.exports = log