UNPKG

2.01 kBJavaScriptView Raw
1const logUpdate = require('log-update')
2const chalk = require('chalk')
3const emoji = require('./emoji')
4
5class Logger {
6 constructor(options) {
7 if (options) {
8 this.setOptions(options)
9 }
10 }
11
12 setOptions({ logLevel, debug, silly, quiet, logUpdate } = {}) {
13 if (debug) {
14 logLevel = 4
15 } else if (quiet) {
16 logLevel = 1
17 } else if (silly) {
18 logLevel = 5
19 }
20 this.logLevel = typeof logLevel === 'number' ? logLevel : 3
21 this.useLogUpdate = typeof logUpdate === 'boolean' ? logUpdate : true
22 }
23
24 clear() {
25 if (this.useLogUpdate) {
26 logUpdate.clear()
27 }
28 }
29
30 write(message, persistent = false) {
31 if (persistent) {
32 this.clear()
33 console.log(message)
34 return
35 }
36 if (this.useLogUpdate) {
37 logUpdate(message)
38 } else {
39 console.log(message)
40 }
41 }
42
43 // Debug message
44 // Always persisted
45 debug(title, message = '') {
46 if (this.logLevel < 4) {
47 return
48 }
49
50 this.write(`${chalk.bold(title)} ${chalk.dim(message)}`, true)
51 }
52
53 // Like debug for even more debug...
54 silly(title, message) {
55 if (this.logLevel < 5) {
56 return
57 }
58
59 this.write(`${chalk.bold(title)} ${chalk.dim(message)}`, true)
60 }
61
62 // Normal log
63 // Persist by default
64 log(message, update) {
65 if (this.logLevel < 3) {
66 return
67 }
68
69 this.write(message, !update)
70 }
71
72 // Warn status
73 warn(message) {
74 if (this.logLevel < 2) {
75 return
76 }
77
78 this.status(emoji.warning, message)
79 }
80
81 // Error status
82 error(err) {
83 if (this.logLevel < 1) {
84 return
85 }
86
87 // TODO: handle error class too
88 return this.status(emoji.error, err)
89 }
90
91 // Status message should be persisted
92 // Unless `update` is set
93 status(emoji, message, update) {
94 if (this.logLevel < 3) {
95 return
96 }
97
98 if (update && this.useLogUpdate) {
99 return logUpdate(`${emoji} ${message}`)
100 }
101
102 this.clear()
103 console.log(`${emoji} ${message}`)
104 }
105}
106
107module.exports = new Logger()