Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 94 95 96 97 98 99 100 101 102 103 104 105 | import type { ColorKeys } from '../../triple-beam/type'
import type { TransformFunction } from '../type'
import { styleText } from '@https-enable/colors'
import { LEVEL, MESSAGE } from '../../triple-beam'
export type ColorMap = Record<string, string | string[]>
export interface ColorizeOptions {
/**
* If set to `true` the color will be applied to the `level`.
*/
level?: boolean
/**
* If set to `true` the color will be applied to the `message` and `level`.
*/
all?: boolean
/**
* If set to `true` the color will be applied to the `message`.
*/
message?: boolean
/**
* An object containing the colors for the log levels. For example: `{ info: 'blue', error: 'red' }`.
*/
colors?: Record<string, ColorKeys>
}
/**
* 颜色处理器类
*/
export class Colorizer {
static allColors: Record<string, ColorKeys[] | ColorKeys> = {}
options: ColorizeOptions
constructor(opts: ColorizeOptions = {}) {
if (opts.colors) {
this.addColors(opts.colors)
}
this.options = opts
}
/**
* 添加颜色配置到静态属性
*/
static addColors(colors: ColorMap) {
const nextColors = Object.entries(colors).reduce((acc, [level, spec]) => {
acc[level] = typeof spec === 'string' ? spec.split(/\s+/) : spec
return acc
}, {} as Record<string, string[]>)
Colorizer.allColors = { ...Colorizer.allColors, ...nextColors as Record<string, ColorKeys[]> }
return Colorizer.allColors
}
/**
* 实例方法添加颜色配置
*/
addColors(colors: ColorMap) {
return Colorizer.addColors(colors)
}
/**
* 执行颜色处理的核心方法
*/
private colorize(lookup: string, level: string, message?: string): string {
if (typeof message === 'undefined') {
message = level
}
const colorSpec = Colorizer.allColors[lookup]
if (!colorSpec) {
return String(message)
}
return styleText(colorSpec, message)
}
/**
* 转换日志信息的入口方法
*/
transform: TransformFunction<ColorizeOptions> = (info, opts) => {
const options = { ...this.options, ...opts }
const levelKey = info[LEVEL] || info.level
// 处理完整消息
if (options.all && typeof info[MESSAGE] === 'string') {
info[MESSAGE] = this.colorize(levelKey, info.level, info[MESSAGE])
}
// 处理级别字段
if (options.level || options.all || !options.message) {
info.level = this.colorize(levelKey, info.level)
}
// 处理消息字段
if (options.all || options.message) {
info.message = this.colorize(levelKey, info.level, info.message)
}
return info
}
}
export default (opts: ColorizeOptions = {}) => new Colorizer(opts)
export { Colorizer as Format }
|