forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import format from 'date-fns/format'
2
3import {LogLevel, type Transport} from '#/logger/types'
4import {prepareMetadata} from '#/logger/util'
5import {IS_WEB} from '#/env'
6
7/**
8 * Used in dev mode to nicely log to the console
9 */
10export const consoleTransport: Transport = (
11 level,
12 context,
13 message,
14 metadata,
15 timestamp,
16) => {
17 const hasMetadata = Object.keys(metadata).length
18
19 if (IS_WEB) {
20 const cssColor = {
21 [LogLevel.Debug]: 'magenta',
22 [LogLevel.Info]: 'dodgerblue',
23 [LogLevel.Log]: 'green',
24 [LogLevel.Warn]: 'orange',
25 [LogLevel.Error]: 'red',
26 }[level]
27
28 const timestampStr = format(timestamp, 'HH:mm:ss')
29 const contextStr = context ? ` (${context})` : ''
30 const messageStr = message ? ` ${message.toString()}` : ''
31
32 const styledPart = `%c${timestampStr}${contextStr}%c${messageStr}`
33 const styles = [`color: ${cssColor}; font-weight: bold`, 'color: inherit']
34
35 if (hasMetadata) {
36 console.groupCollapsed(styledPart, ...styles)
37 console.log(prepareMetadata(metadata))
38 console.groupEnd()
39 } else {
40 console.log(styledPart, ...styles)
41 }
42 if (message instanceof Error) {
43 // for stacktrace
44 console.error(message)
45 }
46 } else {
47 const colorize = withColor(
48 {
49 [LogLevel.Debug]: colors.magenta,
50 [LogLevel.Info]: colors.blue,
51 [LogLevel.Log]: colors.green,
52 [LogLevel.Warn]: colors.yellow,
53 [LogLevel.Error]: colors.red,
54 }[level],
55 )
56
57 let msg = `${colorize(format(timestamp, 'HH:mm:ss'))}`
58 if (context) {
59 msg += ` ${colorize(`(${context})`)}`
60 }
61 if (message) {
62 msg += ` ${message.toString()}`
63 }
64 if (hasMetadata) {
65 msg += ` ${JSON.stringify(prepareMetadata(metadata), null, 2)}`
66 }
67 console.log(msg)
68 if (message instanceof Error) {
69 // for stacktrace
70 console.error(message)
71 }
72 }
73}
74
75/**
76 * Color handling copied from Kleur
77 *
78 * @see https://github.com/lukeed/kleur/blob/fa3454483899ddab550d08c18c028e6db1aab0e5/colors.mjs#L13
79 */
80const colors: {
81 [key: string]: [number, number]
82} = {
83 default: [0, 0],
84 blue: [36, 39],
85 green: [32, 39],
86 magenta: [35, 39],
87 red: [31, 39],
88 yellow: [33, 39],
89}
90
91function withColor([x, y]: [number, number]) {
92 const rgx = new RegExp(`\\x1b\\[${y}m`, 'g')
93 const open = `\x1b[${x}m`,
94 close = `\x1b[${y}m`
95
96 return function (txt: string) {
97 if (txt == null) return txt
98
99 return (
100 open +
101 (~('' + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) +
102 close
103 )
104 }
105}