{"version":3,"file":"log-node.mjs","names":[],"sources":["../../../src/node/log/log-node.ts"],"sourcesContent":["import type { LogHandler, LogHandlerOptions, LogMessage } from '../../common/log/log-base'\nimport process from 'node:process'\nimport tty from 'node:tty'\nimport { valueToBoolean } from '../../common/data/convert'\nimport { renderMessages } from '../../common/data/message'\nimport { LogLevelError, LogLevelInfo, LogLevelWarn } from '../../common/log/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../../common/log/log-filter'\nimport { formatMilliseconds, getTimestamp } from '../../common/time'\nimport { getSourceLocation, getSourceLocationByPrecedingPattern, getStack } from './log-util'\n\nfunction shouldUseColor(): boolean {\n  try {\n    return valueToBoolean(process.env.ZEED_COLOR, tty.isatty(process.stdout.fd))\n  }\n  catch (err) {}\n  return false\n}\n\nlet defaultUseColor: boolean | undefined\n\nconst colors = [6, 2, 3, 4, 5, 1]\n\nfunction nodeSelectColorByName(namespace: string) {\n  let hash = 0\n  for (let i = 0; i < namespace.length; i++) {\n    hash = (hash << 5) - hash + namespace.charCodeAt(i)\n    hash |= 0 // Convert to 32bit integer\n  }\n  return colors[Math.abs(hash) % colors.length]\n}\n\nconst namespaces: Record<string, any> = {}\n\nlet startTime: number | undefined\n\nfunction log(...args: any[]) {\n  process.stdout.write(`${renderMessages(args)}\\n`)\n}\n\n// const _browserStyleMap = {\n//   [BOLD]: { \"font-weight\": \"bold\" },\n//   [UNBOLD]: { \"font-weight\": \"normal\" },\n//   [BLUE]: { color: \"blue\" },\n//   [GREEN]: { color: \"green\" },\n//   [GREY]: { color: \"grey\" },\n//   [RED]: { color: \"red\" },\n//   [PURPLE]: { color: \"purple\" },\n//   [ORANGE]: { color: \"orange\" },\n//   [UNCOLOR]: { color: \"black\" },\n// }\n\nconst TTY_STYLE = {\n  BOLD: '\\u001B[1m',\n  UNBOLD: '\\u001B[2m',\n  RED: '\\u001B[31m',\n  GREEN: '\\u001B[32m',\n  BLUE: '\\u001B[34m',\n  PURPLE: '\\u001B[35m',\n  GRAY: '\\u001B[37m',\n  ORANGE: '\\u001B[38;5;208m',\n  UNCOLOR: '\\u001B[0m',\n}\n\nenum COLOR {\n  RED = 1,\n  GREEN = 2,\n  BLUE = 4,\n  PURPLE = 5,\n  GRAY = 7,\n  ORANGE = 8,\n}\n\nconst colorEnd = '\\u001B[0m'\n\nexport function colorString(text: string, colorCode: number) {\n  const colorStart = colorCode === COLOR.ORANGE\n    ? TTY_STYLE.ORANGE\n    : `\\u001B[3${colorCode < 8 ? colorCode : `8;5;${colorCode}`}m`\n  return `${colorStart}${text}${colorEnd}`\n}\n\nexport function colorStringList(\n  list: Array<any>,\n  style: string,\n  bold = true,\n) {\n  return list.map((value) => {\n    if (typeof value !== 'string')\n      return value\n    let start = style\n    let end = colorEnd\n    if (bold) {\n      start = `${TTY_STYLE.BOLD}${start}`\n      end = `${end}${TTY_STYLE.BOLD}`\n    }\n    return `${start}${value}${end}`\n  })\n}\n\nfunction shouldUseStack(): boolean {\n  try {\n    return valueToBoolean(process.env.ZEED_STACK, false)\n  }\n  catch (err) {}\n  return false\n}\n\nlet defaultUseStack: boolean | undefined\n\nexport const loggerStackTraceDebug = 'loggerStackTraceDebug-7d38e5a9214b58d29734374cdb9521fd964d7485'\n\nexport function LoggerNodeHandler(opt: LogHandlerOptions = {}): LogHandler {\n  defaultUseColor ??= shouldUseColor()\n\n  defaultUseStack ??= shouldUseStack()\n\n  startTime ??= getTimestamp()\n\n  const {\n    level = undefined,\n    filter = undefined,\n    colors = defaultUseColor,\n    levelHelper = true,\n    nameBrackets = true,\n    padding = 0,\n    fill = 0,\n    stack = defaultUseStack,\n    time = true,\n  } = opt\n  const matchesNamespace = useNamespaceFilter(filter)\n  const matchesLevel = useLevelFilter(level)\n  return (msg: LogMessage) => {\n    if (!matchesLevel(msg.level))\n      return\n    if (!matchesNamespace(msg.name))\n      return\n    const timeNow = getTimestamp()\n    const name = msg.name || ''\n    let ninfo = namespaces[name || '']\n    if (ninfo == null) {\n      ninfo = {\n        color: nodeSelectColorByName(name),\n        // time: timeNow\n      }\n      namespaces[name] = ninfo\n    }\n    const timeDiffString = formatMilliseconds(timeNow - startTime!)\n\n    let args: string[]\n\n    let displayName = nameBrackets ? `[${name}]` : name\n\n    if (padding > 0)\n      displayName = displayName.padStart(padding, ' ')\n\n    if (fill > 0)\n      displayName = displayName.padEnd(fill, ' ')\n\n    if (colors) {\n      const c = ninfo.color\n      args = [`${colorString(displayName, c)} | `] // nameBrackets ? [`%c[${name}]`] : [`%c${name}`]\n      if (msg.level === LogLevelWarn)\n        args.push(...colorStringList(msg.messages, TTY_STYLE.ORANGE))\n      else if (msg.level === LogLevelError)\n        args.push(...colorStringList(msg.messages, TTY_STYLE.RED))\n      else\n        args.push(...msg.messages)\n      if (time)\n        args.push(colorString(`+${timeDiffString}`, c))\n    }\n    else {\n      args = [displayName, ...msg.messages]\n      if (time)\n        args.push(`+${timeDiffString}`)\n    }\n\n    if (msg.messages?.[0] === loggerStackTraceDebug) {\n      try {\n        // eslint-disable-next-line no-console\n        console.log(getStack())\n      }\n      catch (err) { }\n    }\n\n    // Probably time consuming\n    if (stack) {\n      let line = ''\n      if (typeof stack === 'boolean') {\n        line = getSourceLocationByPrecedingPattern(\n          ['at Function.', 'at null.log (', 'at log ('],\n          true,\n        )\n        if (!line)\n          line = getSourceLocation(0, true)\n      }\n      else {\n        const depth = typeof stack === 'number' ? stack : 3\n        line = getSourceLocation(depth, true)\n      }\n      if (line)\n        args.push(colorString(`(${line})`, COLOR.GRAY))\n    }\n\n    const sep = '|'\n    const charLevel = '.'\n\n    switch (msg.level) {\n      case LogLevelInfo:\n        if (levelHelper)\n          args[0] = `I${sep}${charLevel}   ${args[0]}`\n        log(...args)\n        break\n      case LogLevelWarn:\n        if (levelHelper) {\n          args[0] = (colors\n            ? colorString(`W${sep}${charLevel}${charLevel}  `, COLOR.ORANGE)\n            : `W${sep}${charLevel}${charLevel}  `) + args[0]\n        }\n        log(...args)\n        break\n      case LogLevelError:\n        if (levelHelper) {\n          args[0] = (colors\n            ? colorString(`E${sep}${charLevel}${charLevel}${charLevel} `, COLOR.RED)\n            : `E${sep}${charLevel}${charLevel}${charLevel} `) + args[0]\n        }\n        log(...args)\n        break\n      default:\n        if (levelHelper)\n          args[0] = `D${sep}    ${args[0]}`\n        log(...args)\n        break\n    }\n  }\n}\n"],"mappings":"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"}