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 const colorize = withColor(
19 {
20 [LogLevel.Debug]: colors.magenta,
21 [LogLevel.Info]: colors.blue,
22 [LogLevel.Log]: colors.green,
23 [LogLevel.Warn]: colors.yellow,
24 [LogLevel.Error]: colors.red,
25 }[level],
26 )
27
28 let msg = `${colorize(format(timestamp, 'HH:mm:ss'))}`
29 if (context) {
30 msg += ` ${colorize(`(${context})`)}`
31 }
32 if (message) {
33 msg += ` ${message.toString()}`
34 }
35
36 if (IS_WEB) {
37 if (hasMetadata) {
38 console.groupCollapsed(msg)
39 console.log(prepareMetadata(metadata))
40 console.groupEnd()
41 } else {
42 console.log(msg)
43 }
44 if (message instanceof Error) {
45 // for stacktrace
46 console.error(message)
47 }
48 } else {
49 if (hasMetadata) {
50 msg += ` ${JSON.stringify(prepareMetadata(metadata), null, 2)}`
51 }
52 console.log(msg)
53 if (message instanceof Error) {
54 // for stacktrace
55 console.error(message)
56 }
57 }
58}
59
60/**
61 * Color handling copied from Kleur
62 *
63 * @see https://github.com/lukeed/kleur/blob/fa3454483899ddab550d08c18c028e6db1aab0e5/colors.mjs#L13
64 */
65const colors: {
66 [key: string]: [number, number]
67} = {
68 default: [0, 0],
69 blue: [36, 39],
70 green: [32, 39],
71 magenta: [35, 39],
72 red: [31, 39],
73 yellow: [33, 39],
74}
75
76function withColor([x, y]: [number, number]) {
77 const rgx = new RegExp(`\\x1b\\[${y}m`, 'g')
78 const open = `\x1b[${x}m`,
79 close = `\x1b[${y}m`
80
81 return function (txt: string) {
82 if (txt == null) return txt
83
84 return (
85 open +
86 (~('' + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) +
87 close
88 )
89 }
90}