Skip to content

Commit eb4fb78

Browse files
committed
feat: add warnOnce to logger
1 parent 724d108 commit eb4fb78

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

src/utils/logger.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ export interface Logger {
2121
level: LogLevel
2222
info: (...args: any[]) => void
2323
warn: (...args: any[]) => void
24+
warnOnce: (...args: any[]) => void
2425
error: (...args: any[]) => void
2526
success: (...args: any[]) => void
2627
}
2728

29+
function format(msgs: any[]) {
30+
return msgs.filter((arg) => arg !== undefined && arg !== false).join(' ')
31+
}
32+
2833
export function createLogger(
2934
level: LogLevel = 'info',
3035
{ customLogger, console = globalThis.console }: LoggerOptions = {},
@@ -33,31 +38,45 @@ export function createLogger(
3338
return customLogger
3439
}
3540

36-
function output(type: LogType, ...msgs: any[]) {
41+
function output(type: LogType, msg: string) {
3742
const thresh = LogLevels[logger.level]
3843
if (thresh < LogLevels[type]) return
3944

4045
const method = type === 'info' ? 'log' : type
41-
console[method](...msgs.filter((arg) => arg !== undefined && arg !== false))
46+
console[method](msg)
4247
}
4348

49+
const warnedMessages = new Set<string>()
50+
4451
const logger: Logger = {
4552
level,
4653

47-
info(...args: any[]): void {
48-
output('info', blue`ℹ`, ...args)
54+
info(...msgs: any[]): void {
55+
output('info', `${blue`ℹ`} ${format(msgs)}`)
4956
},
5057

51-
warn(...args: any[]): void {
52-
output('warn', '\n', bgYellow` WARN `, ...args, '\n')
58+
warn(...msgs: any[]): void {
59+
const message = format(msgs)
60+
warnedMessages.add(message)
61+
output('warn', `\n${bgYellow` WARN `} ${message}\n`)
62+
},
63+
64+
warnOnce(...msgs: any[]): void {
65+
const message = format(msgs)
66+
if (warnedMessages.has(message)) {
67+
return
68+
}
69+
warnedMessages.add(message)
70+
71+
output('warn', `\n${bgYellow` WARN `} ${message}\n`)
5372
},
5473

55-
error(...args: any[]): void {
56-
output('error', '\n', bgRed` ERROR `, ...args, '\n')
74+
error(...msgs: any[]): void {
75+
output('error', `\n${bgRed` ERROR `} ${format(msgs)}\n`)
5776
},
5877

59-
success(...args: any[]): void {
60-
output('info', green`✔`, ...args)
78+
success(...msgs: any[]): void {
79+
output('info', `${green`✔`} ${format(msgs)}`)
6180
},
6281
}
6382
return logger

0 commit comments

Comments
 (0)