presta
Version:
Hyper minimal framework for the modern web.
91 lines (73 loc) • 1.91 kB
text/typescript
import c, { Kleur } from 'kleur'
import { getCurrentPrestaInstance } from './currentPrestaInstance'
import { Env } from './constants'
export enum Levels {
Debug = 'debug',
Info = 'info',
Warn = 'warn',
Err = 'error',
}
export type Message = {
level?: Levels
label: string | number
message?: string
duration?: string | number
error?: Error
}
let logs: any[] = []
const colors = {
[Levels.Debug]: 'magenta',
[Levels.Info]: 'blue',
[Levels.Warn]: 'yellow',
[Levels.Err]: 'red',
}
export { c as colors }
export function getLogs() {
if (!process.env.TESTING) {
throw new Error('Internal method was called outside test mode')
}
return logs
}
export function logger(message: Message) {
if (process.env.TESTING) {
logs.push(message)
} else {
const debug = getCurrentPrestaInstance().debug
const context = getCurrentPrestaInstance().env === Env.PRODUCTION ? 'prod' : 'dev'
if (!debug && message.level === Levels.Debug) return
console.log(
[
c.gray(context),
c[colors[message.level || 'info'] as keyof Kleur](message.label),
message.message,
message.duration ? c.gray('+' + message.duration) : '',
message.error ? `\n\n${message.error.stack || message.error}\n\n` : '',
]
.filter(Boolean)
.join(' ')
)
}
}
export function debug(message: Message) {
logger({ level: Levels.Debug, ...message })
}
export function info(message: Message) {
logger({ level: Levels.Info, ...message })
}
export function warn(message: Message) {
logger({ level: Levels.Warn, ...message })
}
export function error(message: Message) {
logger({ level: Levels.Err, ...message })
}
export function raw(...args: any[]) {
if (process.env.TESTING) {
logs.push(args)
} else {
console.log(...args)
}
}
export function newline() {
if (process.env.TESTING) return
console.log('')
}