{"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/lsklog.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\":\"info\",\"time\":1639528619417,\"ns\":\"lsk:rabbit\",\"msg\":\"[watch] finished 4092654\"}\n// {\"time\":null,\"reqId\":\"2srlW-ycUSEJyQE8U8tZk\",\"method\":\"GET\",\"host\":\"buzzguru.com\",\"url\":\"/youtube/channels/5b686e12aeb42f00176245de/products/5ebe7d93ff9c79dc14a1664c\",\"ua\":\"Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)\",\"ip\":\"95.108.213.58, 10.101.3.140\",\"status\":200,\"length\":115268,\"duration\":1287.031414}\n\nimport { ILoggerInternalMessageFormat } from '../..';\nimport { ILoggerInternalMessage } from '../../types';\nimport { toString } from '../../utils/toString';\nimport { parseArgs } from './utils';\n\nexport const lsklogLevels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\nexport const lsklogWebLevels = [\n  'reqId',\n  'method',\n  'host',\n  'ua',\n  'ip',\n  'url',\n  'status',\n  'length',\n  'duration',\n];\n\nexport const isLsklog = (json: any): boolean =>\n  Boolean(lsklogLevels.includes(json.level) && json.ns);\nexport const isLskLikelog = (json: any): boolean => Boolean(lsklogLevels.includes(json.level));\n\nexport const isLsklogWeb = (req: any): boolean =>\n  Boolean(req && (req.name === 'req' || (req.method && req.host && req.url))); // reqId\nexport const isLsklogWebFinal = (req: any): boolean =>\n  Boolean(isLsklogWeb(req) && (req.status || req.duration || req.length));\n\nexport const parseLsklog = (json: any): ILoggerInternalMessage => {\n  // console.log('parseLsklog', { ns });\n  const { level, time, msg, ns, name, ...data } = json;\n  const meta = {\n    level,\n    time,\n    msg,\n    ns,\n    name,\n  };\n  if (!isLsklogWeb(json)) {\n    return {\n      format: ILoggerInternalMessageFormat.lsklogweb,\n      meta,\n      args: parseArgs(msg, data),\n    };\n  }\n  const { reqId, method, host, ua, ip, url, status, length, duration, ...data2 } = data;\n  return {\n    format: ILoggerInternalMessageFormat.lsklog,\n    meta: {\n      ...meta,\n      method,\n      host,\n      reqId,\n      ua,\n      ip,\n      url,\n      status,\n      duration,\n      length,\n    },\n    args: parseArgs(msg, data2),\n  };\n};\n\nexport const stringifyLsklog = (json: any): string => {\n  const { level, time, ...props } = json;\n  return toString({\n    level,\n    time: +time,\n    ...props,\n  });\n};\n"],"mappings":"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","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","lsklogLevels","lsklogWebLevels","isLsklog","__name","json","Boolean","includes","level","ns","isLskLikelog","isLsklogWeb","req","name","method","host","url","isLsklogWebFinal","status","duration","length","parseLsklog","time","msg","data","meta","format","ILoggerInternalMessageFormat","lsklogweb","args","parseArgs","reqId","ua","ip","data2","lsklog","stringifyLsklog","props","toString"]}