{"version":3,"sources":["../../../src/types.ts","../../../src/Logger.ts","../../../src/getEnvConfig.ts","../../../src/utils/createMsg.ts","../../../src/utils/stringify.ts","../../../src/utils/toString.ts","../../../src/pretty/formats/utils.ts","../../../src/pretty/utils.ts","../../../src/themeize.ts","../../../src/pretty/formats/logrus.ts"],"sourcesContent":["// eslint-disable-next-line import/named\nimport { Color } from '@lskjs/colors';\n\nexport type LoggerLevelType = 'fatal' | 'error' | 'warn' | 'debug' | 'info' | 'trace' | 'log';\n\nexport interface ILoggerProps {\n  prefix?: string;\n  ns?: string;\n  name?: string;\n  level?: LoggerLevelType;\n  format?: string;\n  on?: Array<RegExp>;\n  off?: Array<RegExp>;\n}\nexport interface ILoggerMessage {\n  code?: any;\n  name?: string | null;\n  ns?: string | null;\n  level?: string | number;\n  time?: string | number | Date;\n  msg?: string | null;\n  data?: any;\n}\n\nexport interface ILogger extends ILoggerProps {\n  trace(...args: any[]): void;\n  info(...args: any[]): void;\n  debug(...args: any[]): void;\n  warn(...args: any[]): void;\n  error(...args: any[]): void;\n  fatal(...args: any[]): void;\n  log(...args: any[]): void;\n}\n\nexport type ILoggerMeta = {\n  ns?: string;\n  name?: string;\n  level?: LoggerLevelType;\n  time?: Date;\n\n  method?: string;\n  host?: string;\n  reqId?: string | number;\n  ua?: string;\n  ip?: string;\n  url?: string;\n  status?: string;\n  duration?: number;\n  length?: number;\n};\n\n// eslint-disable-next-line no-shadow\nexport enum ILoggerInternalMessageFormat {\n  bunyan = 'bunyan',\n  lsklog = 'lsklog',\n  lsklogweb = 'lsklogweb',\n  logrus = 'logrus',\n  raw = 'raw',\n}\n\nexport type ILoggerInternalMessage = {\n  format: ILoggerInternalMessageFormat | null;\n  meta: ILoggerMeta;\n  args: any[];\n};\n\nexport type ThemeKey = LoggerLevelType;\nexport type Theme = Record<ThemeKey, Color[]>;\n","/* eslint-disable no-nested-ternary */\n// import debug from 'debug';\nimport { omitNull } from '@lskjs/algos';\n\nimport { levelsPriority } from './config';\nimport { defaultFormat, getEnvConfig } from './getEnvConfig';\nimport { stringify } from './pretty/formats';\nimport { isLsklogWeb } from './pretty/formats/lsklog';\n// import { tryPrettyFormat } from './pretty/tryPrettyFormat';\nimport { prettyFormat } from './pretty/prettyFormat';\nimport { ILogger, ILoggerMessage, ILoggerProps, LoggerLevelType } from './types';\nimport { anyRegExps } from './utils/anyRegExps';\n\nexport class Logger implements ILogger {\n  prefix?: string;\n  ns?: string;\n  name?: string;\n  format?: string = defaultFormat;\n  level: LoggerLevelType = 'trace';\n  on: RegExp[] = [];\n  off: RegExp[] = [];\n  constructor(props: ILoggerProps | string = {}) {\n    if (typeof props === 'string') {\n      this.setProps({ name: props, ...getEnvConfig() });\n    } else {\n      this.setProps(props);\n    }\n  }\n  setProps({ prefix, ns, name, level, format, on = [], off = [] }: ILoggerProps): void {\n    if (prefix) this.prefix = prefix;\n    if (ns) this.ns = ns;\n    if (on) this.on = on;\n    if (off) this.off = off;\n    if (name) this.name = name;\n    if (format) this.format = format;\n    if (level) {\n      if (!levelsPriority[level]) {\n        throw new Error(`Incorrect level: ${this.level}`);\n      }\n      this.level = level;\n    }\n    if (!this.level) this.level = 'trace';\n    if (!this.level) this.level = 'trace';\n    if (!this.format) this.format = 'lsk';\n    if (!this.off) this.off = [];\n    if (!this.on) this.on = [];\n  }\n\n  static create(props: ILoggerProps): ILogger {\n    return new this(props);\n  }\n  createChild(...propsArray: ILoggerProps[]): ILogger {\n    const ns = [this.ns, this.name].filter(Boolean).join('.'); // TODO: подумать, а правильно ли соединять ns и name\n    // @ts-ignore\n    return new this.constructor(this, { colors: null, ns }, ...propsArray);\n  }\n  getLevelPriority(level: LoggerLevelType): number {\n    return levelsPriority[level] || 0;\n  }\n  canLog(level: LoggerLevelType): boolean {\n    const logLevel = this.getLevelPriority(level);\n    const currentLevel = this.getLevelPriority(this.level);\n    if (this.ns && anyRegExps(this.off, this.ns)) return false;\n    if (this.ns && anyRegExps(this.on, this.ns)) return true;\n    return logLevel >= currentLevel;\n  }\n  fatal(...args: any[]): void {\n    if (!this.canLog('fatal')) return;\n    this.__log('fatal', ...args);\n  }\n  error(...args: any[]): void {\n    if (!this.canLog('error')) return;\n    this.__log('error', ...args);\n  }\n  warn(...args: any[]): void {\n    if (!this.canLog('warn')) return;\n    this.__log('warn', ...args);\n  }\n  debug(...args: any[]): void {\n    if (!this.canLog('debug')) return;\n    this.__log('debug', ...args);\n  }\n  info(...args: any[]): void {\n    if (!this.canLog('info')) return;\n    this.__log('info', ...args);\n  }\n  trace(...args: any[]): void {\n    if (!this.canLog('trace')) return;\n    this.__log('trace', ...args);\n  }\n  // log(...args: any[]): void {\n  //   if (!this.canLog('log')) return;\n  //   this.__log('log', ...args);\n  // }\n  log(...args: any[]): void {\n    // @ts-ignore\n    // eslint-disable-next-line no-console\n    if (console._log) {\n      // @ts-ignore\n      // eslint-disable-next-line no-console\n      console._log(...args);\n    } else {\n      // eslint-disable-next-line no-console\n      console.log(...args);\n    }\n  }\n  __log(level: LoggerLevelType, ...args: any[]): void {\n    const [mainArg, ...otherArgs] = args;\n    let meta: ILoggerMessage = {\n      name: this.name,\n      ns: this.ns,\n      level,\n      time: new Date(),\n    };\n    let passArgs = args;\n    if (isLsklogWeb(mainArg)) {\n      meta = {\n        ...meta,\n        ...mainArg,\n      };\n      // console.log({mainArg})\n      passArgs = otherArgs;\n    }\n    // // eslint-disable-next-line no-param-reassign\n    // if (LOG_FORMAT() !== 'none' && LOG_FORMAT() !== 'pretty') args = args.map((arg) => toString(arg));\n\n    // if (LOG_DATA()) meta.data = passArgs;\n    if (this.format === 'none') return;\n    const data = omitNull(meta as Record<string, unknown>);\n    if (this.format === 'pretty') {\n      this.log(...prettyFormat(data, ...passArgs));\n      return;\n    }\n    // console.log({ args, data, str, 'LOG_FORMAT()': LOG_FORMAT() });\n    this.log(stringify(this.format || 'lsk', data, ...passArgs));\n  }\n}\n\nexport default Logger;\n","import { omitNull } from '@lskjs/algos';\nimport { ObjectLike } from '@lskjs/algos/types';\nimport { getEnvVar, isClient, isDev } from '@lskjs/env';\n\nimport { parseNs } from './utils/parseNs';\n\nexport const defaultFormat = isDev || isClient ? 'pretty' : 'lsk';\n\nexport const getEnvConfig = (): ObjectLike<string | RegExp[]> => {\n  const debug = getEnvVar('DEBUG', '') || '';\n  const isSilent =\n    typeof process && (!!+process.env.LSK_SILENT! || process.argv?.includes('--silent'));\n  const isTrace = debug.startsWith('lsk') || debug.startsWith('*');\n  const format = getEnvVar('LOG_FORMAT', getEnvVar('DEBUG_FORMAT', defaultFormat));\n  const { on, off } = parseNs(debug);\n  // eslint-disable-next-line no-nested-ternary\n  const defaultLevel = isSilent ? 'error' : isTrace ? 'trace' : 'debug';\n  const level = getEnvVar('LOG_LEVEL', getEnvVar('DEBUG_LEVEL', defaultLevel));\n  const res = omitNull<string | null | RegExp[]>({\n    format,\n    level,\n    on,\n    off,\n  }) as ObjectLike<string | RegExp[]>;\n  return res;\n};\n\nexport default getEnvConfig;\n","import { getCode, getMessage, isError } from '@lskjs/err';\n\nimport { toString } from './toString';\n\nexport const getErrCode = (args: any[]) =>\n  args.map((arg) => (isError(arg) ? getCode(arg) : null)).filter(Boolean)[0];\n\nexport const createMsg = (args: any[]) => {\n  if (!args.length) return null;\n  return args\n    .map((arg) => {\n      if (isError(arg)) {\n        return getMessage(arg);\n      }\n      return toString(arg);\n    })\n    .join(' ');\n};\n\nexport default createMsg;\n","export * from 'fast-safe-stringify';\nexport { default as stringify } from 'fast-safe-stringify';\nexport { default } from 'fast-safe-stringify';\n","import { stringify } from './stringify';\n\nexport const toString = (props: any, arg1: any = null, arg2 = 0) =>\n  typeof props === 'object' ? stringify(props, arg1, arg2) : String(props);\n\nexport default toString;\n","import { tryJSONparse } from '@lskjs/env';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const parseArgs = (msg: any, data: any): any[] => {\n  const args = [];\n  if (msg !== null) args.push(tryJSONparse(msg));\n  if (Object.keys(data).length) args.push(data);\n  return args;\n};\n","/* eslint-disable no-nested-ternary */\nimport { colorize } from '@lskjs/colors';\nimport { getEnvVar } from '@lskjs/env';\nimport _prettyBytes from 'pretty-bytes';\nimport _prettyTime from 'pretty-time';\n\nimport { contentColors } from '../config';\nimport { themeize, themeizeRandom } from '../themeize';\nimport { LoggerLevelType } from '../types';\nimport { hashCode } from '../utils/hashCode';\nimport { isLsklogWebFinal } from './formats/lsklog';\n\nconst LOG_VIEW = getEnvVar('LOG_VIEW', 'short');\n\nconst leftPad = (str: string, length: number) => String(str).padStart(length);\nconst rightPad = (str: string, length: number) => String(str).padEnd(length);\n\nlet prettyPathLength = 20;\nexport const prettyPath = (url: string, defaultUrlPad = 0) => {\n  prettyPathLength = Math.max((url && url.length) || 0, prettyPathLength, defaultUrlPad);\n  return rightPad(url, prettyPathLength);\n};\n\nexport const getStatusLevel = (status: number): LoggerLevelType | null =>\n  status >= 500\n    ? 'error'\n    : status >= 400\n    ? 'warn'\n    : status >= 300\n    ? 'debug'\n    : // : status === 200\n      //   ? null // eslint-disable-line\n      // : 'log';\n      null;\n\nexport const prettyStatus = (status: number) => {\n  let level = getStatusLevel(status);\n  if (!level) level = status !== 200 ? 'log' : null;\n  return themeize(leftPad(String(status), 3), level);\n};\n\nexport const prettyReqId = (reqId: number) => leftPad(`#${reqId}`, 3);\n\nexport const prettyMethod = (method: string) => {\n  // eslint-disable-next-line no-nested-ternary\n  const level: LoggerLevelType | null =\n    method === 'REMOVE' ? 'error' : method === 'WS' ? 'debug' : null;\n  return themeize(leftPad(method, 4), level);\n};\n\nexport const prettyTime = (ms: number, format = ''): string | null => {\n  if (!Number.isFinite(ms)) return null;\n\n  const level: LoggerLevelType | null = ms >= 10 * 1000 ? 'error' : ms >= 3 * 1000 ? 'warn' : null;\n  const formats = ['m', 's', 'ms'];\n  const f = formats.includes(format) ? format : '';\n\n  const ns = Math.floor(Math.abs(ms) * 10 ** 6);\n  const res = _prettyTime(ns, f);\n  return themeize(leftPad(res, 5), level);\n};\n\nexport const prettySize = (bytes: number, seperator = ''): string | null => {\n  if (!Number.isFinite(bytes)) return null;\n\n  const raw = _prettyBytes(bytes, { maximumFractionDigits: 1 }).split(' ');\n  const size = raw[1];\n  const value = +raw[0] >= 100 ? Math.round(+raw[0]) : +raw[0];\n\n  return `${value}${seperator}${size}`;\n};\n\nexport const prettyNs = (names: string[], mainName?: string | null): string => {\n  // TODO: придумать когда name не очень нужен\n  const finalNames: string[] = [...names, mainName].filter(Boolean).map(String);\n  return finalNames.map((name: any) => themeizeRandom(name, name)).join(':');\n};\n\nexport function prettyMarker(key: string | number): string {\n  // https://www.alt-codes.net/\n  const markers = ['○', '•', '♠', '♠', '♦', '♥', '☼', '♂', '♀', '♪', '§'];\n  const marker = markers[hashCode(key) % markers.length];\n  return themeizeRandom(marker, String(key));\n}\n\nexport const prettyLevel = (level: LoggerLevelType): string => {\n  let str = LOG_VIEW === 'short' ? (level[0] || '').toLowerCase() : leftPad(level, 5);\n  str = `[${str}]`;\n  return themeize(str, level);\n};\n\nconst highlightRegexp = /\\[[^\"\\]]+]/gm;\nexport const prettyContent = (...args: any[]): any[] => {\n  const colored: any[] = [];\n  args.forEach((arg) => {\n    if (typeof arg === 'string') {\n      let i = 0;\n      colored.push(\n        arg.replace(highlightRegexp, (match) => {  //eslint-disable-line\n          return colorize(match, contentColors[i++ % contentColors.length]);\n        }),\n      );\n    } else {\n      colored.push(arg);\n    }\n  });\n  return colored;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const getUrlLevel = (req: any): LoggerLevelType =>\n  getStatusLevel(req.status) || isLsklogWebFinal(req) ? 'debug' : 'trace';\n\nexport const prettyUrl = (req: any): string => {\n  const isFinalUrl = isLsklogWebFinal(req);\n  const level = getUrlLevel(req); // , { level }: { level?: string | null } = {}\n  return [\n    prettyLevel(level),\n    [prettyMarker(req.reqId), prettyMethod(req.method)].join(''),\n    prettyPath(req.url),\n    prettyReqId(req.reqId),\n    isFinalUrl && req.method !== 'WS' ? prettyStatus(req.status) : null,\n    !isFinalUrl && '⧗⧖⧗',\n    isFinalUrl && prettyTime(req.duration),\n    isFinalUrl && req.method !== 'WS' ? prettySize(req.length) : null,\n    // !isFinalUrl && '[...]',\n    // !isFinalUrl && '⧖…⧗',\n  ]\n    .filter(Boolean)\n    .join(' ');\n};\n\n// export default pretty;\n","import { colorize } from '@lskjs/colors';\n\nimport { randomColors, theme } from './config';\nimport { ThemeKey } from './types';\nimport hashCode from './utils/hashCode';\n\nexport function themeizeRandom(str: string, randomName?: string | number | null): string {\n  const colors = randomColors[hashCode(randomName || '') % randomColors.length] || [];\n  return colorize(str, colors);\n}\n\nexport function themeize(str: string, themeKey?: ThemeKey | null): string {\n  const colors = themeKey ? theme[themeKey] : [];\n  return colorize(str, colors);\n}\n","// https://github.com/sirupsen/logrus\n// {\"level\":\"warning\",\"msg\":\"The group's number increased tremendously!\", \"number\":122,\"omg\":true,\"time\":\"2014-03-10 19:57:38.562471297 -0400 EDT\"}\n\nimport { ILoggerInternalMessageFormat } from '../..';\nimport { ILoggerInternalMessage, LoggerLevelType } from '../../types';\nimport { toString } from '../../utils/toString';\nimport { parseArgs } from './utils';\n\ntype LogrusLevel = 'trace' | 'debug' | 'info' | 'warning' | 'error' | 'fatal' | 'panic';\n\nexport const logrusLevels: LogrusLevel[] = [\n  'trace',\n  'debug',\n  'info',\n  'warning',\n  'error',\n  'fatal',\n  'panic',\n];\nconst logrusToLskLevels: Record<LogrusLevel, LoggerLevelType> = {\n  trace: 'trace',\n  debug: 'debug',\n  info: 'info',\n  warning: 'warn',\n  error: 'error',\n  fatal: 'fatal',\n  panic: 'fatal',\n};\nconst lskToLogrusLevels: Record<LoggerLevelType, LogrusLevel> = {\n  log: 'trace',\n  trace: 'trace',\n  debug: 'debug',\n  info: 'info',\n  warn: 'warning',\n  error: 'error',\n  fatal: 'fatal',\n};\n\nexport const isLogrus = (json: any): boolean =>\n  Boolean(json.msg && logrusLevels.includes(json.level));\n// export const isLogrus = (json: any): boolean => Boolean(json.msg && json.time && logrusLevels.includes(json.level));\n\nexport const parseLogrus = (json: any): ILoggerInternalMessage => {\n  const { level, time, msg, ...data } = json;\n  return {\n    format: ILoggerInternalMessageFormat.logrus,\n    meta: {\n      level: logrusToLskLevels[level as LogrusLevel],\n      time: new Date(time),\n    },\n    args: parseArgs(msg, data),\n  };\n};\nexport const stringifyLogrus = (json: any): string => {\n  const { level, time, ...props } = json;\n  return toString({\n    level: lskToLogrusLevels[level as LoggerLevelType],\n    time: time.toISOString(),\n    ...props,\n  });\n};\n"],"mappings":"ydAoDOA,YAAKA,EAA4B,CAA5BA,EACVC,OAAAA,SADUD,EAEVE,OAAAA,SAFUF,EAGVG,UAAAA,YAHUH,EAIVI,OAAAA,SAJUJ,EAKVK,IAAAA,QALUL,IAAAA,EAAAA,CAAAA,EAAAA,EClDZ,OAASM,YAAAA,OAAgB,eCFzB,OAASC,YAAAA,MAAgB,eAEzB,OAASC,aAAAA,EAAWC,YAAAA,EAAUC,SAAAA,MAAa,aCF3C,OAASC,WAAAA,EAASC,cAAAA,EAAYC,WAAAA,MAAe,aCA7C,IAAAC,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,cAAAA,IAAAC,EAAAH,EAAAI,GAAA,UAAAA,MAAc,sBACd,OAAoBC,WAAXH,MAA4B,sBACrC,OAASA,WAAAA,MAAe,sBCAjB,IAAMI,EAAWC,EAAA,CAACC,EAAYC,EAAY,KAAMC,EAAO,IAC5D,OAAOF,GAAU,SAAWG,EAAUH,EAAOC,EAAMC,CAAAA,EAAQE,OAAOJ,CAAAA,EAD5C,YCFxB,OAASK,gBAAAA,MAAoB,aAGtB,IAAMC,EAAYC,EAAA,CAACC,EAAUC,IAAAA,CAClC,IAAMC,EAAO,CAAA,EACb,OAAIF,IAAQ,MAAME,EAAKC,KAAKC,EAAaJ,CAAAA,CAAAA,EACrCK,OAAOC,KAAKL,CAAAA,EAAMM,QAAQL,EAAKC,KAAKF,CAAAA,EACjCC,CACT,EALyB,aCFzB,OAASM,YAAAA,OAAgB,gBACzB,OAASC,aAAAA,MAAiB,aAC1B,OAAOC,OAAkB,eACzB,OAAOC,OAAiB,cCJxB,OAASC,YAAAA,OAAgB,gBDYzB,IAAMC,GAAWC,EAAU,WAAY,OAAA,EEFhC,IAAMC,EAA8B,CACzC,QACA,QACA,OACA,UACA,QACA,QACA,SAEIC,EAA0D,CAC9DC,MAAO,QACPC,MAAO,QACPC,KAAM,OACNC,QAAS,OACTC,MAAO,QACPC,MAAO,QACPC,MAAO,OACT,EACMC,EAA0D,CAC9DC,IAAK,QACLR,MAAO,QACPC,MAAO,QACPC,KAAM,OACNO,KAAM,UACNL,MAAO,QACPC,MAAO,OACT,EAEaK,EAAWC,EAACC,GACvBC,GAAQD,EAAKE,KAAOhB,EAAaiB,SAASH,EAAKI,KAAK,GAD9B,YAIXC,EAAcN,EAACC,GAAAA,CAC1B,GAAM,CAAEI,MAAAA,EAAOE,KAAAA,EAAMJ,IAAAA,EAAK,GAAGK,CAAAA,EAASP,EACtC,MAAO,CACLQ,OAAQC,EAA6BC,OACrCC,KAAM,CACJP,MAAOjB,EAAkBiB,CAAAA,EACzBE,KAAM,IAAIM,KAAKN,CAAAA,CACjB,EACAO,KAAMC,EAAUZ,EAAKK,CAAAA,CACvB,CACF,EAV2B,eAWdQ,EAAkBhB,EAACC,GAAAA,CAC9B,GAAM,CAAEI,MAAAA,EAAOE,KAAAA,EAAM,GAAGU,CAAAA,EAAUhB,EAClC,OAAOiB,EAAS,CACdb,MAAOT,EAAkBS,CAAAA,EACzBE,KAAMA,EAAKY,YAAW,EACtB,GAAGF,CACL,CAAA,CACF,EAP+B","names":["ILoggerInternalMessageFormat","bunyan","lsklog","lsklogweb","logrus","raw","omitNull","omitNull","getEnvVar","isClient","isDev","getCode","getMessage","isError","stringify_exports","__export","default","__reExport","fast_safe_stringify_star","stringify","toString","__name","props","arg1","arg2","stringify","String","tryJSONparse","parseArgs","__name","msg","data","args","push","tryJSONparse","Object","keys","length","colorize","getEnvVar","_prettyBytes","_prettyTime","colorize","LOG_VIEW","getEnvVar","logrusLevels","logrusToLskLevels","trace","debug","info","warning","error","fatal","panic","lskToLogrusLevels","log","warn","isLogrus","__name","json","Boolean","msg","includes","level","parseLogrus","time","data","format","ILoggerInternalMessageFormat","logrus","meta","Date","args","parseArgs","stringifyLogrus","props","toString","toISOString"]}