This repository has been archived by the owner on Aug 10, 2022. It is now read-only.
/
logger.ts
93 lines (84 loc) · 2.32 KB
/
logger.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* eslint-disable no-console */
/* eslint-disable class-methods-use-this */
import chalk from "chalk"
import { toError } from "./helpers"
export type Logger = {
info(...args: unknown[]): void
success(...args: unknown[]): void
error(...args: unknown[]): void
warn(...args: unknown[]): void
promise<T>(description: string, promise: Promise<T> | T): Promise<T>
block<T>(description: string, block: () => Promise<T> | T): Promise<T>
}
export type ConsoleLoggerLevel = "info" | "success" | "error" | "warn"
export type ConsoleLoggerConfig = {
name?: string
levels?: ConsoleLoggerLevel[]
}
export function createConsoleLogger(config: ConsoleLoggerConfig = {}): Logger {
const prefix = config.name ? chalk.gray`[${config.name}]` : ""
const levels = new Set<ConsoleLoggerLevel>(
config.levels || ["info", "success", "error", "warn"],
)
const logger: Logger = {
info(...args) {
if (levels.has("info")) {
console.info(prefix, chalk.cyan`[i]`, ...args)
}
},
success(...args) {
if (levels.has("success")) {
console.info(prefix, chalk.green`[s]`, ...args)
}
},
error(...args) {
if (levels.has("error")) {
console.error(prefix, chalk.red`[e]`, ...args)
}
},
warn(...args) {
if (levels.has("warn")) {
console.warn(prefix, chalk.yellow`[w]`, ...args)
}
},
async promise(description, promise) {
const startTime = Date.now()
try {
logger.info(description, chalk.gray`...`)
const result = await promise
logger.success(
description,
chalk.green`done`,
chalk.gray`(${Date.now() - startTime}ms)`,
)
return result
} catch (error) {
logger.error(
description,
chalk.red`failed`,
chalk.gray`(${Date.now() - startTime}ms)`,
)
logger.error(toError(error).stack || toError(error).message)
throw error
}
},
async block(description, block) {
return logger.promise(description, block())
},
}
return logger
}
export function createNoopLogger(): Logger {
return {
info() {},
success() {},
error() {},
warn() {},
async promise(_description, promise) {
return promise
},
async block(_description, block) {
return block()
},
}
}