UNPKG

3.73 kBJavaScriptView Raw
1var prettyBytes = require('prettier-bytes')
2var jsonParse = require('fast-json-parse')
3var prettyMs = require('pretty-ms')
4var padLeft = require('pad-left')
5var split = require('split2')
6var chalk = require('chalk')
7var nl = '\n'
8
9var emojiLog = {
10 warn: '⚠️',
11 info: '✨',
12 error: '🚨',
13 debug: '🐛',
14 fatal: '💀',
15 trace: '🔍'
16}
17
18module.exports = PinoColada
19
20function PinoColada () {
21 return split(parse)
22
23 function parse (line) {
24 var obj = jsonParse(line)
25 if (!obj.value || obj.err) return line + nl
26 obj = obj.value
27
28 if (!obj.level) return line + nl
29 if (typeof obj.level === 'number') convertLogNumber(obj)
30
31 return output(obj) + nl
32 }
33
34 function convertLogNumber (obj) {
35 if (!obj.message) obj.message = obj.msg
36 if (obj.level === 20) obj.level = 'debug'
37 if (obj.level === 30) obj.level = 'info'
38 if (obj.level === 40) obj.level = 'warn'
39 if (obj.level === 50) obj.level = 'error'
40 if (obj.level === 60) obj.level = 'fatal'
41 }
42
43 function output (obj) {
44 var output = []
45
46 if (!obj.level) obj.level = 'userlvl'
47 if (!obj.name) obj.name = ''
48
49 output.push(formatDate())
50 output.push(formatLevel(obj.level))
51 output.push(formatName(obj.name))
52 output.push(formatMessage(obj))
53
54 var req = obj.req
55 var res = obj.res
56 var statusCode = (res) ? res.statusCode : obj.statusCode
57 var responseTime = obj.responseTime || obj.elapsed
58 var method = (req) ? req.method : obj.method
59 var contentLength = obj.contentLength
60 var url = (req) ? req.url : obj.url
61
62 if (method != null) {
63 output.push(formatMethod(method))
64 output.push(formatStatusCode(statusCode))
65 }
66 if (url != null) output.push(formatUrl(url))
67 if (contentLength != null) output.push(formatBundleSize(contentLength))
68 if (responseTime != null) output.push(formatLoadTime(responseTime))
69
70 return output.filter(noEmpty).join(' ')
71 }
72
73 function formatDate () {
74 var date = new Date()
75 var hours = padLeft(date.getHours().toString(), 2, '0')
76 var minutes = padLeft(date.getMinutes().toString(), 2, '0')
77 var seconds = padLeft(date.getSeconds().toString(), 2, '0')
78 var prettyDate = hours + ':' + minutes + ':' + seconds
79 return chalk.gray(prettyDate)
80 }
81
82 function formatLevel (level) {
83 return emojiLog[level] + ' '
84 }
85
86 function formatName (name) {
87 return chalk.blue(name)
88 }
89
90 function formatMessage (obj) {
91 if (obj.level === 'error') return chalk.dim.red(obj.message)
92 if (obj.level === 'trace') return chalk.dim.white(obj.message)
93 if (obj.level === 'warn') return chalk.dim.magenta(obj.message)
94 if (obj.level === 'debug') return chalk.dim.yellow(obj.message)
95 if (obj.level === 'fatal') return chalk.bgRed(obj.message) + nl + obj.stack
96 if (obj.level === 'info' || obj.level === 'userlvl') return formatMessageName(obj.message)
97 }
98
99 function formatUrl (url) {
100 return chalk.white(url)
101 }
102
103 function formatMethod (method) {
104 return chalk.white(method)
105 }
106
107 function formatStatusCode (statusCode) {
108 statusCode = statusCode || 'xxx'
109 return chalk.white(statusCode)
110 }
111
112 function formatLoadTime (elapsedTime) {
113 var elapsed = parseInt(elapsedTime, 10)
114 var time = time > 9999 ? prettyMs(elapsed) : elapsed + 'ms'
115 return chalk.gray(time)
116 }
117
118 function formatBundleSize (bundle) {
119 var bytes = parseInt(bundle, 10)
120 var size = prettyBytes(bytes).replace(/ /, '')
121 return chalk.gray(size)
122 }
123
124 function formatMessageName (message) {
125 if (message === 'request') return chalk.dim.green('<--')
126 if (message === 'response') return chalk.dim.green('-->')
127 return chalk.dim.green(message)
128 }
129
130 function noEmpty (val) {
131 return !!val
132 }
133}