{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Logging } from \"@google-cloud/logging\";\n\ntype LogMethod = (message: string, payload?: Record<string, unknown>, labels?: Record<string, string>) => void;\n\nexport interface Logger {\n  debug: LogMethod;\n  info: LogMethod;\n  notice: LogMethod;\n  warning: LogMethod;\n  error: LogMethod;\n  critical: LogMethod;\n  alert: LogMethod;\n  emergency: LogMethod;\n}\n\n// Resolved once at module load — no per-call branching.\n// LOGGER_TARGET accepts a comma-separated list of backends: \"gcp\", \"console\", or \"gcp,console\".\nconst rawTargets = process.env.LOGGER_TARGET;\nconst targets = rawTargets\n  ? new Set(rawTargets.toLowerCase().split(\",\").map(s => s.trim()).filter(Boolean))\n  : null;\n\nconst USE_GCP     = targets ? targets.has(\"gcp\")    : !!process.env.GOOGLE_CLOUD_PROJECT;\nconst USE_CONSOLE = targets ? targets.has(\"console\") : !process.env.GOOGLE_CLOUD_PROJECT;\nconst CONSOLE_PRETTY = process.env.LOGGER_CONSOLE_FORMAT?.toLowerCase() !== \"plain\";\nconst noop = (): void => {};\n\nconst envLabels: Record<string, string> = {};\nif (process.env.ENVIRONMENT) envLabels.environment  = process.env.ENVIRONMENT;\nif (process.env.SERVICE)     envLabels.service      = process.env.SERVICE;\nif (process.env.VERSION)     envLabels.version      = process.env.VERSION;\n\n// GCP Log singleton — shared across all logger() calls.\nconst gcpLog = USE_GCP ? (() => {\n  try {\n    const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? \"local\";\n    return new Logging({ projectId: process.env.GOOGLE_CLOUD_PROJECT }).log(logName);\n  } catch {\n    return null;\n  }\n})() : null;\n\nconst ANSI_RED = \"\\x1b[31m\";\nconst ANSI_YELLOW = \"\\x1b[33m\";\nconst ANSI_RESET = \"\\x1b[0m\";\n\n// Formats a pretty console log line: \"{emoji} {local timestamp} [(scope) ]{message}[\\n  {payload}]\"\n// Optional color wraps timestamp and scope+message (used for warning=yellow, error+=red when pretty format is on).\nfunction consoleLine(emoji: string, message: string, payload?: Record<string, unknown>, scope?: string, color?: string): string {\n  const d = new Date();\n  const ts = d.toLocaleString(\"sv-SE\") + \".\" + String(d.getMilliseconds()).padStart(3, \"0\");\n  const scopePart = scope ? `(${scope}) ` : \"\";\n  const suffix = payload ? \"\\n\\x1b[38;5;66m\" + JSON.stringify(payload, null, 2).replace(/^/gm, \"    \") + ANSI_RESET : \"\";\n  const tsPart = color ? color + ts + ANSI_RESET : \"\\x1b[90m\" + ts + ANSI_RESET;\n  const body = scopePart + message;\n  const coloredBody = color ? color + body + ANSI_RESET : body;\n  return `${emoji} ${tsPart}  ${coloredBody}${suffix}`;\n}\n\n// Plain console line: \"[(scope) ]{message}[ {payload}]\"\nfunction consolePlain(message: string, payload?: Record<string, unknown>, scope?: string): string {\n  const scopePart = scope ? `(${scope}) ` : \"\";\n  const suffix = payload ? \" \" + JSON.stringify(payload, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n  return `${scopePart}${message}${suffix}`;\n}\n\nexport function logger(scope?: string): Logger {\n  const instanceLabels: Record<string, string> = {\n    ...envLabels,\n    ...(scope ? { scope } : {}),\n  };\n\n  function resolveLabels(extraLabels?: Record<string, string>): Record<string, string> | undefined {\n    const merged = { ...instanceLabels, ...extraLabels };\n    return Object.keys(merged).length ? merged : undefined;\n  }\n\n  function gcpMeta(severity: string, extraLabels?: Record<string, string>): Record<string, unknown> {\n    const labels = resolveLabels(extraLabels);\n    return labels ? { severity, labels } : { severity };\n  }\n\n  function gcpData(message: string, payload?: Record<string, unknown>): string | Record<string, unknown> {\n    return payload ? { message, ...payload } : message;\n  }\n\n  const backends: Logger[] = [];\n\n  if (gcpLog) {\n    const g = gcpLog;\n    const gw = (sev: string, msg: string, p?: Record<string, unknown>, l?: Record<string, string>): void => {\n      g.write(g.entry(gcpMeta(sev, l), gcpData(msg, p))).catch(noop);\n    };\n    backends.push({\n      debug:     (msg, p, l) => gw(\"DEBUG\",     msg, p, l),\n      info:      (msg, p, l) => gw(\"INFO\",      msg, p, l),\n      notice:    (msg, p, l) => gw(\"NOTICE\",    msg, p, l),\n      warning:   (msg, p, l) => gw(\"WARNING\",   msg, p, l),\n      error:     (msg, p, l) => gw(\"ERROR\",     msg, p, l),\n      critical:  (msg, p, l) => gw(\"CRITICAL\",  msg, p, l),\n      alert:     (msg, p, l) => gw(\"ALERT\",     msg, p, l),\n      emergency: (msg, p, l) => gw(\"EMERGENCY\", msg, p, l),\n    });\n  }\n\n  if (USE_CONSOLE || backends.length === 0) {\n    if (CONSOLE_PRETTY) {\n      const cw = (emoji: string, color: string | undefined, msg: string, p?: Record<string, unknown>): void => {\n        console.log(consoleLine(emoji, msg, p, scope, color));\n      };\n      backends.push({\n        debug:     (msg, p) => cw(\"🐞\", undefined,   msg, p),\n        info:      (msg, p) => cw(\"⚪️\", undefined,   msg, p),\n        notice:    (msg, p) => cw(\"🔵\", undefined,   msg, p),\n        warning:   (msg, p) => cw(\"🟡\", ANSI_YELLOW, msg, p),\n        error:     (msg, p) => cw(\"🔴\", ANSI_RED,    msg, p),\n        critical:  (msg, p) => cw(\"⛔️\", ANSI_RED,    msg, p),\n        alert:     (msg, p) => cw(\"❗️\", ANSI_RED,    msg, p),\n        emergency: (msg, p) => cw(\"🚨\", ANSI_RED,    msg, p),\n      });\n    } else {\n      const pw = (msg: string, p?: Record<string, unknown>): void => {\n        console.log(consolePlain(msg, p, scope));\n      };\n      backends.push({\n        debug: pw, info: pw, notice: pw, warning: pw,\n        error: pw, critical: pw, alert: pw, emergency: pw,\n      });\n    }\n  }\n\n  return backends.length === 1\n    ? backends[0]\n    : {\n        debug:     (msg, p, l): void => { backends.forEach(b => b.debug(msg, p, l));     },\n        info:      (msg, p, l): void => { backends.forEach(b => b.info(msg, p, l));      },\n        notice:    (msg, p, l): void => { backends.forEach(b => b.notice(msg, p, l));    },\n        warning:   (msg, p, l): void => { backends.forEach(b => b.warning(msg, p, l));   },\n        error:     (msg, p, l): void => { backends.forEach(b => b.error(msg, p, l));     },\n        critical:  (msg, p, l): void => { backends.forEach(b => b.critical(msg, p, l));  },\n        alert:     (msg, p, l): void => { backends.forEach(b => b.alert(msg, p, l));     },\n        emergency: (msg, p, l): void => { backends.forEach(b => b.emergency(msg, p, l)); },\n      };\n}\n\nexport default logger;\n"],"mappings":"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","names":[]}