import { extractFrames, Frame, isCommonFrame } from "./stack"; export interface Runtime { objToStderr(obj: unknown): void; } class defaultRuntime implements Runtime { objToStderr(obj: unknown): void { console.log(obj); } } export default { TimestampFieldName: "time", TimestampFieldFormatter: (time: Date): string => time.toISOString(), LevelFieldName: "level", LevelTraceValue: "trace", LevelDebugValue: "debug", LevelInfoValue: "info", LevelWarnValue: "warn", LevelErrorValue: "error", LevelFatalValue: "fatal", MessageFieldName: "message", ErrorFieldName: "error", ErrorFieldFormatter: (err: unknown): string | undefined => { if (err === null || err === undefined) { return undefined; } else if (isError(err)) { return `${err.name}: ${err.message}`; } else if (isErrorLike(err)) { return err.message; } else if (typeof err === "object") { return JSON.stringify(err); } else { return String(err); } }, CallerFieldName: "caller", StackFieldName: "stack", StackFieldFormatter: (err: unknown): Frame[] | undefined => isError(err) ? extractFrames(err.stack)?.filter((frame) => !isCommonFrame(frame)) : undefined, Runtime: new defaultRuntime() as Runtime, /** The ParamHook allows us to pass a function in which can populate additional fields into all log messages */ ParamHook: (): Record => { return {}; }, }; function isError(err: unknown): err is Error { return err instanceof Error; } function isErrorLike(err: unknown): err is { message: string } { return typeof err === "object" && err !== null && "message" in err; }