1 | var prettyBytes = require('prettier-bytes')
|
2 | var jsonParse = require('fast-json-parse')
|
3 | var prettyMs = require('pretty-ms')
|
4 | var padLeft = require('pad-left')
|
5 | var split = require('split2')
|
6 | var chalk = require('chalk')
|
7 | var nl = '\n'
|
8 |
|
9 | var emojiLog = {
|
10 | warn: '⚠️',
|
11 | info: '✨',
|
12 | error: '🚨',
|
13 | debug: '🐛',
|
14 | fatal: '💀',
|
15 | trace: '🔍'
|
16 | }
|
17 |
|
18 | module.exports = PinoColada
|
19 |
|
20 | function 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 | }
|