@loglayer/transport-simple-pretty-terminal
Version:
Pretty log output in the terminal / browser / Next.js for the LogLayer logging library.
1 lines • 50.3 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["Utils.indent","Utils.getMaxIndexLength","prettyjson\n .render","LoggerlessTransport"],"sources":["../src/themes.ts","../src/vendor/utils.js","../src/vendor/prettyjson.js","../src/views/utils.ts","../src/views/SimpleView.ts","../src/SimplePrettyTerminalTransport.ts","../src/index.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport type { SimplePrettyTerminalTheme } from \"./types.js\";\n\n/**\n * Moonlight - A dark theme with cool blue tones\n * Inspired by moonlit nights and modern IDEs\n *\n * Color Palette:\n * - Primary: Cool blues and soft greens\n * - Accents: Warm yellows and soft reds\n * - Background: Assumes dark terminal (black or very dark grey)\n *\n * Best used with:\n * - Dark terminal themes\n * - Night-time coding sessions\n * - Environments where eye strain is a concern\n */\nexport const moonlight: SimplePrettyTerminalTheme = {\n colors: {\n trace: chalk.rgb(114, 135, 153), // Muted blue-grey for less important info\n debug: chalk.rgb(130, 170, 255), // Soft blue that pops but doesn't strain\n info: chalk.rgb(195, 232, 141), // Sage green for good readability\n warn: chalk.rgb(255, 203, 107), // Warm yellow, less harsh than pure yellow\n error: chalk.rgb(247, 118, 142), // Soft red that stands out without being aggressive\n fatal: chalk.bgRgb(247, 118, 142).white, // Inverted soft red for maximum visibility\n },\n logIdColor: chalk.rgb(84, 98, 117), // Darker blue-grey for secondary information\n dataValueColor: chalk.rgb(209, 219, 231), // Light grey-blue for primary content\n dataKeyColor: chalk.rgb(130, 170, 255), // Matching debug blue for consistency\n};\n\n/**\n * Sunlight - A light theme with warm tones\n * Inspired by daylight reading and paper documentation\n *\n * Color Palette:\n * - Primary: Deep, rich colors that contrast well with white\n * - Accents: Earth tones and deep jewel tones\n * - Background: Assumes light terminal (white or very light grey)\n *\n * Best used with:\n * - Light terminal themes\n * - Daytime coding sessions\n * - High-glare environments\n * - Printed documentation\n */\nexport const sunlight: SimplePrettyTerminalTheme = {\n colors: {\n trace: chalk.rgb(110, 110, 110), // Dark grey for subtle information\n debug: chalk.rgb(32, 96, 159), // Deep blue for strong contrast on white\n info: chalk.rgb(35, 134, 54), // Forest green, easier on the eyes than bright green\n warn: chalk.rgb(176, 95, 0), // Brown-orange for natural warning color\n error: chalk.rgb(191, 0, 0), // Deep red for clear visibility on light backgrounds\n fatal: chalk.bgRgb(191, 0, 0).white, // White on deep red for critical issues\n },\n logIdColor: chalk.rgb(110, 110, 110),\n dataValueColor: chalk.rgb(0, 0, 0),\n dataKeyColor: chalk.rgb(32, 96, 159),\n};\n\n/**\n * Neon - A dark theme with vibrant cyberpunk colors\n * Inspired by neon-lit cityscapes and retro-futuristic aesthetics\n *\n * Color Palette:\n * - Primary: Electric blues and hot pinks\n * - Accents: Bright purples and cyber greens\n * - Background: Assumes dark terminal (black or very dark grey)\n *\n * Best used with:\n * - Dark terminal themes\n * - High-contrast preferences\n * - Modern, tech-focused applications\n */\nexport const neon: SimplePrettyTerminalTheme = {\n colors: {\n trace: chalk.rgb(108, 108, 255), // Electric blue\n debug: chalk.rgb(255, 82, 246), // Hot pink\n info: chalk.rgb(0, 255, 163), // Cyber green\n warn: chalk.rgb(255, 231, 46), // Electric yellow\n error: chalk.rgb(255, 53, 91), // Neon red\n fatal: chalk.bgRgb(255, 53, 91).rgb(0, 255, 163), // Neon red bg with cyber green text\n },\n logIdColor: chalk.rgb(187, 134, 252), // Bright purple\n dataValueColor: chalk.rgb(255, 255, 255), // Pure white\n dataKeyColor: chalk.rgb(0, 255, 240), // Cyan\n};\n\n/**\n * Nature - A light theme with organic, earthy colors\n * Inspired by forest landscapes and natural elements\n *\n * Color Palette:\n * - Primary: Deep forest greens and rich browns\n * - Accents: Autumn reds and golden yellows\n * - Background: Assumes light terminal (white or very light grey)\n *\n * Best used with:\n * - Light terminal themes\n * - Nature-inspired interfaces\n * - Applications focusing on readability\n */\nexport const nature: SimplePrettyTerminalTheme = {\n colors: {\n trace: chalk.rgb(101, 115, 126), // Slate grey\n debug: chalk.rgb(34, 139, 34), // Forest green\n info: chalk.rgb(46, 139, 87), // Sea green\n warn: chalk.rgb(218, 165, 32), // Golden rod\n error: chalk.rgb(139, 69, 19), // Saddle brown\n fatal: chalk.bgRgb(139, 69, 19).white, // Brown background with white text\n },\n logIdColor: chalk.rgb(101, 115, 126),\n dataValueColor: chalk.rgb(0, 0, 0),\n dataKeyColor: chalk.rgb(34, 139, 34),\n};\n\n/**\n * Pastel - A soft, calming theme with gentle colors\n * Inspired by watercolor paintings and soft aesthetics\n *\n * Color Palette:\n * - Primary: Soft pastels and muted tones\n * - Accents: Gentle pinks and light blues\n * - Background: Assumes light terminal (white or very light grey)\n *\n * Best used with:\n * - Light terminal themes\n * - Long coding sessions\n * - Reduced visual stress\n */\nexport const pastel: SimplePrettyTerminalTheme = {\n colors: {\n trace: chalk.rgb(200, 200, 200), // Light grey\n debug: chalk.rgb(173, 216, 230), // Light blue\n info: chalk.rgb(144, 238, 144), // Light green\n warn: chalk.rgb(255, 218, 185), // Peach\n error: chalk.rgb(255, 182, 193), // Light pink\n fatal: chalk.bgRgb(255, 182, 193).rgb(105, 105, 105), // Light pink bg with dim grey text\n },\n logIdColor: chalk.rgb(200, 200, 200),\n dataValueColor: chalk.rgb(105, 105, 105),\n dataKeyColor: chalk.rgb(173, 216, 230),\n};\n","/**\n * Creates a string with the same length as `numSpaces` parameter\n **/\nexport function indent(numSpaces) {\n return new Array(numSpaces + 1).join(\" \");\n}\n\n/**\n * Gets the string length of the longer index in a hash\n **/\nexport function getMaxIndexLength(input) {\n var maxWidth = 0;\n\n Object.getOwnPropertyNames(input).forEach((key) => {\n // Skip undefined values.\n if (input[key] === undefined) {\n return;\n }\n\n maxWidth = Math.max(maxWidth, key.length);\n });\n return maxWidth;\n}\n\nexport function isIsoStringDate(isoString) {\n if (typeof isoString !== \"string\") {\n return false;\n }\n // More flexible regex that handles:\n // - Optional milliseconds\n // - Optional timezone offset or Z\n // - Optional T separator (space also valid)\n if (!/^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?$/.test(isoString)) {\n return false;\n }\n const testDate = new Date(isoString);\n return !Number.isNaN(testDate.getTime());\n}\n","// @ts-nocheck\nimport chalk from \"chalk\";\nimport * as Utils from \"./utils.js\";\nimport { isIsoStringDate } from \"./utils.js\";\n\nconst conflictChars = /[^\\w\\s\\n\\r\\v\\t.,]/i;\n\n// Helper function to detect if an object should be printed or ignored\nconst isPrintable = (input, options) => input !== undefined || options.renderUndefined;\n\n// Helper function to detect if an object can be directly serializable\nconst isSerializable = (input, onlyPrimitives, options) => {\n if (\n typeof input === \"boolean\" ||\n typeof input === \"number\" ||\n typeof input === \"function\" ||\n input === null ||\n input === undefined ||\n input instanceof Date\n ) {\n return true;\n }\n if (typeof input === \"string\" && input.indexOf(\"\\n\") === -1) {\n return true;\n }\n\n if (options.inlineArrays && !onlyPrimitives) {\n if (Array.isArray(input) && isSerializable(input[0], true, options)) {\n return true;\n }\n }\n\n return false;\n};\n\n/**\n * @param {Function} colorFn\n * @param {PrettyJSONOptions} options\n */\nconst getColorRenderer = (colorFn, options) => {\n if (options.noColor) {\n return (text) => text;\n }\n\n if (typeof colorFn !== \"function\") {\n return (text) => text;\n }\n\n return colorFn;\n};\n\nconst addColorToData = (input, options) => {\n if (options.noColor) {\n return input;\n }\n\n if (input instanceof Date) {\n return getColorRenderer(options.dateColor, options)(input.toISOString());\n }\n if (typeof input === \"string\") {\n if (isIsoStringDate(input)) {\n return getColorRenderer(options.dateColor, options)(input);\n }\n // Print strings in regular terminal color\n return getColorRenderer(options.stringColor, options)(input);\n }\n\n const sInput = `${input}`;\n\n if (typeof input === \"boolean\") {\n return getColorRenderer(options.booleanColor, options)(sInput);\n }\n if (input === null || input === undefined) {\n return getColorRenderer(options.nullUndefinedColor, options)(sInput);\n }\n if (typeof input === \"number\") {\n if (input >= 0) {\n return getColorRenderer(options.positiveNumberColor, options)(sInput);\n }\n return getColorRenderer(options.negativeNumberColor, options)(sInput);\n }\n if (typeof input === \"function\") {\n return \"function() {}\";\n }\n\n if (Array.isArray(input)) {\n return input.join(\", \");\n }\n\n return sInput;\n};\n\nconst colorMultilineString = (options, line) => getColorRenderer(options.multilineStringColor, options)(line);\n\nconst indentLines = (string, spaces, options) => {\n let lines = string.split(\"\\n\");\n lines = lines.map((line) => Utils.indent(spaces) + colorMultilineString(options, line));\n return lines.join(\"\\n\");\n};\n\nconst renderToArray = (data, options, indentation) => {\n if (typeof data === \"string\" && data.match(conflictChars) && options.escape) {\n data = JSON.stringify(data);\n }\n\n if (!isPrintable(data, options)) {\n return [];\n }\n\n if (isSerializable(data, false, options)) {\n return [Utils.indent(indentation) + addColorToData(data, options)];\n }\n\n // Unserializable string means it's multiline\n if (typeof data === \"string\") {\n return [\n Utils.indent(indentation) + colorMultilineString(options, '\"\"\"'),\n indentLines(data, indentation + options.defaultIndentation, options),\n Utils.indent(indentation) + colorMultilineString(options, '\"\"\"'),\n ];\n }\n\n if (Array.isArray(data)) {\n // If the array is empty, render the `emptyArrayMsg`\n if (data.length === 0) {\n return [Utils.indent(indentation) + options.emptyArrayMsg];\n }\n\n // If arrays should be collapsed and there's data, show [...]\n if (options.collapseArrays && data.length > 0) {\n return [`${Utils.indent(indentation)}[... ${data.length} items]`];\n }\n\n const outputArray = [];\n\n data.forEach((element) => {\n if (!isPrintable(element, options)) {\n return;\n }\n\n // Prepend the dash at the beginning of each array's element line\n let line = \"- \";\n line = getColorRenderer(options.dashColor, options)(line);\n line = Utils.indent(indentation) + line;\n\n // If the element of the array is a string, bool, number, or null\n // render it in the same line\n if (isSerializable(element, false, options)) {\n line += renderToArray(element, options, 0)[0];\n outputArray.push(line);\n\n // If the element is an array or object, render it in next line\n } else {\n outputArray.push(line);\n outputArray.push.apply(outputArray, renderToArray(element, options, indentation + options.defaultIndentation));\n }\n });\n\n return outputArray;\n }\n\n if (data instanceof Error) {\n return renderToArray(\n {\n message: data.message,\n stack: data.stack.split(\"\\n\"),\n },\n options,\n indentation,\n );\n }\n\n // If values alignment is enabled, get the size of the longest index\n // to align all the values\n const maxIndexLength = options.noAlign ? 0 : Utils.getMaxIndexLength(data);\n let key;\n const output = [];\n\n Object.getOwnPropertyNames(data).forEach((i) => {\n if (!isPrintable(data[i], options)) {\n return;\n }\n\n // Prepend the index at the beginning of the line\n key = `${i}: `;\n key = getColorRenderer(options.keysColor, options)(key);\n key = Utils.indent(indentation) + key;\n\n // If the value is serializable, render it in the same line\n if (isSerializable(data[i], false, options)) {\n const nextIndentation = options.noAlign ? 0 : maxIndexLength - i.length;\n key += renderToArray(data[i], options, nextIndentation)[0];\n output.push(key);\n\n // If the index is an array or object, render it in next line\n } else {\n output.push(key);\n output.push.apply(output, renderToArray(data[i], options, indentation + options.defaultIndentation));\n }\n });\n return output;\n};\n/**\n * @typedef {Object} PrettyJSONOptions\n * @property {Function} [stringColor=null] Chalk color function for strings\n * @property {Function} [multilineStringColor=null] Chalk color function for multiline strings\n * @property {Function} [keysColor=chalk.green] Chalk color function for keys in hashes\n * @property {Function} [dashColor=chalk.green] Chalk color function for dashes in arrays\n * @property {Function} [numberColor=chalk.blue] Default Chalk color function for numbers\n * @property {Function} [positiveNumberColor=numberColor] Chalk color function for positive numbers\n * @property {Function} [negativeNumberColor=numberColor] Chalk color function for negative numbers\n * @property {Function} [booleanColor=chalk.cyan] Chalk color function for boolean values\n * @property {Function} [nullUndefinedColor=chalk.grey] Chalk color function for null || undefined\n * @property {Function} [dateColor=chalk.magenta] Chalk color function for Date objects\n * @property {number} [defaultIndentation=2] Indentation spaces per object level\n * @property {string} [emptyArrayMsg=\"(empty array)\"] Replace empty strings with\n * @property {boolean} [noColor] Flag to disable colors\n * @property {boolean} [noAlign] Flag to disable alignment\n * @property {boolean} [escape] Flag to escape printed content\n * @property {boolean} [collapseArrays] Flag to collapse arrays\n */\n/**\n * Mutating function that ensures we have a valid options object\n * @param {PrettyJSONOptions} options\n * @returns PrettyJSONOptions\n */\nconst validateOptionsAndSetDefaults = (options) => {\n options = options || {};\n options.emptyArrayMsg = options.emptyArrayMsg || \"(empty array)\";\n options.keysColor = options.keysColor || chalk.green;\n options.dashColor = options.dashColor || chalk.green;\n options.booleanColor = options.booleanColor || chalk.cyan;\n options.nullUndefinedColor = options.nullUndefinedColor || chalk.grey;\n options.numberColor = options.numberColor || chalk.blue;\n options.positiveNumberColor = options.positiveNumberColor || options.numberColor;\n options.negativeNumberColor = options.negativeNumberColor || options.numberColor;\n options.dateColor = options.dateColor || chalk.magenta;\n options.defaultIndentation = options.defaultIndentation || 2;\n options.noColor = !!options.noColor;\n options.noAlign = !!options.noAlign;\n options.escape = !!options.escape;\n options.renderUndefined = !!options.renderUndefined;\n options.collapseArrays = !!options.collapseArrays;\n\n options.stringColor = options.stringColor || null;\n options.multilineStringColor = options.multilineStringColor || options.stringColor || null;\n\n return options;\n};\n/**\n * ### Render function\n * *Parameters:*\n *\n * @param {*} data: Data to render\n * @param {PrettyJSONOptions} options: Hash of different options\n * @param {*} indentation **`indentation`**: Base indentation of the output\n *\n * *Example of options hash:*\n *\n * {\n * emptyArrayMsg: '(empty)', // Rendered message on empty strings\n * keysColor: 'blue', // Color for keys in hashes\n * dashColor: 'red', // Color for the dashes in arrays\n * stringColor: 'grey', // Color for strings\n * multilineStringColor: 'cyan' // Color for multiline strings\n * defaultIndentation: 2 // Indentation on nested objects\n * }\n * @returns string with the rendered data\n */\nexport function render(data, options, indentation) {\n // Default values\n indentation = indentation || 0;\n options = validateOptionsAndSetDefaults(options);\n\n return renderToArray(data, options, indentation).join(\"\\n\");\n}\n\n/**\n * ### Render from string function\n * *Parameters:*\n *\n * @param {*} data: Data to render\n * @param {PrettyJSONOptions} options: Hash of different options\n * @param {*} indentation **`indentation`**: Base indentation of the output\n *\n * *Example of options hash:*\n *\n * {\n * emptyArrayMsg: '(empty)', // Rendered message on empty strings\n * keysColor: 'blue', // Color for keys in hashes\n * dashColor: 'red', // Color for the dashes in arrays\n * defaultIndentation: 2 // Indentation on nested objects\n * }\n */\nexport function renderString(data, options, indentation) {\n let output = \"\";\n let parsedData;\n // If the input is not a string or if it's empty, just return an empty string\n if (typeof data !== \"string\" || data === \"\") {\n return \"\";\n }\n\n // Remove non-JSON characters from the beginning string\n if (data[0] !== \"{\" && data[0] !== \"[\") {\n let beginingOfJson;\n if (data.indexOf(\"{\") === -1) {\n beginingOfJson = data.indexOf(\"[\");\n } else if (data.indexOf(\"[\") === -1) {\n beginingOfJson = data.indexOf(\"{\");\n } else if (data.indexOf(\"{\") < data.indexOf(\"[\")) {\n beginingOfJson = data.indexOf(\"{\");\n } else {\n beginingOfJson = data.indexOf(\"[\");\n }\n output += `${data.substr(0, beginingOfJson)}\\n`;\n data = data.substr(beginingOfJson);\n }\n\n try {\n parsedData = JSON.parse(data);\n } catch (_e) {\n // Return an error in case of an invalid JSON\n return `${chalk.red(\"Error:\")} Not valid JSON!`;\n }\n\n // Call the real render() method\n output += exports.render(parsedData, options, indentation);\n return output;\n}\n","import chalk from \"chalk\";\nimport { format } from \"date-fns\";\nimport type { ColorConfig, ViewConfig } from \"../types.js\";\n\n/**\n * Formats a timestamp into a readable string.\n *\n * @param timestamp - Unix timestamp in milliseconds\n * @param colorFn - Chalk function to color the timestamp\n * @param timestampFormat - Custom format string (date-fns) or function. Defaults to \"HH:mm:ss.SSS\"\n * @returns Formatted timestamp string\n */\nexport function formatTimestamp(\n timestamp: number,\n colorFn: typeof chalk.white,\n timestampFormat: string | ((timestamp: number) => string) = \"HH:mm:ss.SSS\",\n): string {\n let formattedTime: string;\n\n if (typeof timestampFormat === \"function\") {\n formattedTime = timestampFormat(timestamp);\n } else {\n const date = new Date(timestamp);\n formattedTime = format(date, timestampFormat);\n }\n\n return colorFn(`[${formattedTime}]`);\n}\n\n/**\n * Gets the appropriate color function for a log level.\n *\n * @param level - Log level string\n * @param colors - Color configuration object\n * @returns Chalk function for the log level\n */\nexport function getLevelColor(level: string, colors: ColorConfig): typeof chalk.white {\n const levelLower = level.toLowerCase();\n\n switch (levelLower) {\n case \"trace\":\n return colors.trace || chalk.white;\n case \"debug\":\n return colors.debug || chalk.white;\n case \"info\":\n return colors.info || chalk.white;\n case \"warn\":\n return colors.warn || chalk.white;\n case \"error\":\n return colors.error || chalk.white;\n case \"fatal\":\n return colors.fatal || chalk.white;\n default:\n return colors.info || chalk.white;\n }\n}\n\n/**\n * Formats a value for display.\n */\nexport function formatValue(value: any, expanded = false, collapseArrays = true): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return value.toString();\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (Array.isArray(value)) return expanded ? JSON.stringify(value) : collapseArrays ? \"[...]\" : value.toString();\n if (typeof value === \"object\") return expanded ? JSON.stringify(value) : \"{...}\";\n return value.toString();\n}\n\n/**\n * Formats structured data for inline display with depth limiting.\n *\n * @param data - The data to format\n * @param config - View configuration for colors\n * @param maxDepth - Maximum depth for nested objects\n * @param expanded - Whether to show full depth (for inline view mode)\n * @param collapseArrays - Whether to collapse arrays to summary format\n * @returns Formatted data string\n */\nexport function formatInlineData(\n data: any,\n config: Required<ViewConfig>,\n maxDepth: number,\n expanded = false,\n collapseArrays = true,\n): string {\n if (!data) return \"\";\n\n const pairs: string[] = [];\n const traverse = (obj: any, prefix = \"\", depth = 0) => {\n if (!expanded && depth >= maxDepth) return;\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n if (expanded) {\n pairs.push(`${config.dataKeyColor(fullKey)}=${config.dataValueColor(JSON.stringify(value))}`);\n } else {\n traverse(value, fullKey, depth + 1);\n }\n } else {\n pairs.push(\n `${config.dataKeyColor(fullKey)}=${config.dataValueColor(formatValue(value, expanded, collapseArrays))}`,\n );\n }\n }\n };\n\n traverse(data);\n const result = pairs.join(\" \");\n // Remove truncation - inline view should show complete data without truncation\n return result;\n}\n","import type { LogEntry, PrettyTerminalViewMode, Runtime, SimpleViewConfig } from \"../types.js\";\nimport * as prettyjson from \"../vendor/prettyjson.js\";\nimport { formatInlineData, formatTimestamp, getLevelColor } from \"./utils.js\";\n\n/**\n * Handles rendering of the simple view mode.\n * Supports three display modes:\n * - Message-only: Shows timestamp, level and message\n * - Inline: Shows all details with complete data inline\n * - Expanded: Shows timestamp, level, and message on first line, with data on indented separate lines\n */\nexport class SimpleView {\n private config: SimpleViewConfig;\n private viewMode: PrettyTerminalViewMode;\n private maxInlineDepth: number;\n private showLogId: boolean;\n private timestampFormat: string | ((timestamp: number) => string);\n private collapseArrays: boolean;\n private flattenNestedObjects: boolean;\n private runtime: Runtime;\n private includeDataInBrowserConsole: boolean;\n\n constructor(config: SimpleViewConfig) {\n this.config = config;\n this.viewMode = config.viewMode;\n this.maxInlineDepth = config.maxInlineDepth;\n this.showLogId = config.showLogId;\n this.timestampFormat = config.timestampFormat;\n this.collapseArrays = config.collapseArrays !== false;\n this.flattenNestedObjects = config.flattenNestedObjects !== false;\n this.runtime = config.runtime;\n this.includeDataInBrowserConsole = config.includeDataInBrowserConsole || false;\n }\n\n public getConfig(): SimpleViewConfig {\n return this.config;\n }\n\n public getViewMode(): PrettyTerminalViewMode {\n return this.viewMode;\n }\n\n /**\n * Writes a message to the appropriate output based on runtime\n */\n private writeMessage(message: string, level?: string, data?: any): void {\n if (this.runtime === \"node\") {\n // Use process.stdout.write for Node.js\n process?.stdout?.write?.(`${message}\\n`);\n } else {\n // Use appropriate console method based on log level for browser\n const shouldIncludeData = this.includeDataInBrowserConsole && data !== undefined;\n\n switch (level) {\n case \"trace\":\n if (shouldIncludeData) {\n console.debug(message, data);\n } else {\n console.debug(message);\n }\n break;\n case \"debug\":\n if (shouldIncludeData) {\n console.debug(message, data);\n } else {\n console.debug(message);\n }\n break;\n case \"info\":\n if (shouldIncludeData) {\n console.info(message, data);\n } else {\n console.info(message);\n }\n break;\n case \"warn\":\n if (shouldIncludeData) {\n console.warn(message, data);\n } else {\n console.warn(message);\n }\n break;\n case \"error\":\n case \"fatal\":\n if (shouldIncludeData) {\n console.error(message, data);\n } else {\n console.error(message);\n }\n break;\n default:\n if (shouldIncludeData) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n break;\n }\n }\n }\n\n /**\n * Renders a single log entry based on the current view mode\n */\n public renderLogLine(entry: LogEntry): void {\n const levelColor = getLevelColor(entry.level, this.config.config.colors);\n const chevron = levelColor(`▶ ${entry.level.toUpperCase()} `);\n const message = entry.message || \"(no message)\";\n const timestamp = formatTimestamp(entry.timestamp, this.config.config.logIdColor, this.timestampFormat);\n\n // Parse data for browser console inclusion\n const parsedData = entry.data ? JSON.parse(entry.data) : undefined;\n\n switch (this.viewMode) {\n case \"message-only\": {\n // Message-only view shows timestamp, level and message\n const condensedLine = `${timestamp} ${chevron}${message}`;\n this.writeMessage(condensedLine, entry.level, parsedData);\n break;\n }\n\n case \"inline\": {\n // Inline view shows all details with complete data inline\n const logId = this.showLogId ? this.config.config.logIdColor(`[${entry.id}]`) : \"\";\n const fullData = entry.data\n ? formatInlineData(\n JSON.parse(entry.data),\n this.config.config,\n this.maxInlineDepth,\n !this.flattenNestedObjects,\n this.collapseArrays,\n )\n : \"\";\n const expandedLine = `${timestamp} ${chevron}${logId ? `${logId} ` : \"\"}${message}${fullData ? ` ${fullData}` : \"\"}`;\n // Don't wrap inline mode to preserve full content\n this.writeMessage(expandedLine, entry.level, parsedData);\n break;\n }\n\n case \"expanded\": {\n // Expanded view shows timestamp, level, and message on first line, with data on indented separate lines\n const logId = this.showLogId ? this.config.config.logIdColor(`[${entry.id}]`) : \"\";\n const firstLine = `${timestamp} ${chevron}${logId ? `${logId} ` : \"\"}${message}`;\n this.writeMessage(firstLine, entry.level, parsedData);\n\n if (entry.data) {\n const jsonLines = prettyjson\n .render(JSON.parse(entry.data), {\n defaultIndentation: 2,\n keysColor: this.config.config.dataKeyColor,\n dashColor: this.config.config.dataKeyColor,\n numberColor: this.config.config.dataValueColor,\n stringColor: this.config.config.dataValueColor,\n multilineStringColor: this.config.config.dataValueColor,\n positiveNumberColor: this.config.config.dataValueColor,\n negativeNumberColor: this.config.config.dataValueColor,\n booleanColor: this.config.config.dataValueColor,\n nullUndefinedColor: this.config.config.dataValueColor,\n dateColor: this.config.config.dataValueColor,\n collapseArrays: this.collapseArrays,\n })\n .split(\"\\n\");\n\n // Add each line with proper indentation (2 spaces at the beginning)\n for (const line of jsonLines) {\n if (line.trim() !== \"\") {\n this.writeMessage(` ${line}`, entry.level);\n }\n }\n }\n break;\n }\n\n default: {\n // Default to full view for any unexpected view modes\n const logId = this.showLogId ? this.config.config.logIdColor(`[${entry.id}]`) : \"\";\n const fullData = entry.data\n ? formatInlineData(JSON.parse(entry.data), this.config.config, this.maxInlineDepth, true, this.collapseArrays)\n : \"\";\n const expandedLine = `${timestamp} ${chevron}${logId ? `${logId} ` : \"\"}${message}${fullData ? ` ${fullData}` : \"\"}`;\n this.writeMessage(expandedLine, entry.level, parsedData);\n break;\n }\n }\n }\n}\n","/**\n * A transport for LogLayer that provides simple pretty terminal output.\n * This transport displays logs with theming and formatting but without interactive features.\n *\n * Features:\n * - Real-time log display with color-coded levels\n * - Configurable themes and colors\n * - Three view modes: inline, message-only, expanded\n * - JSON data pretty printing\n * - No interactive features (no keyboard navigation, no input)\n * - Browser and Node.js runtime support\n *\n * Usage:\n * ```typescript\n * const transport = new SimplePrettyTerminalTransport({\n * maxInlineDepth: 4,\n * maxInlineLength: 120,\n * theme: customTheme,\n * viewMode: \"inline\",\n * runtime: \"node\" // or \"browser\"\n * });\n * ```\n */\n\nimport type { LogLayerTransportParams } from \"@loglayer/transport\";\nimport { LoggerlessTransport } from \"@loglayer/transport\";\nimport chalk from \"chalk\";\nimport { sprintf } from \"sprintf-js\";\nimport { moonlight } from \"./themes.js\";\nimport type { PrettyTerminalViewMode, SimplePrettyTerminalConfig } from \"./types.js\";\nimport { SimpleView } from \"./views/SimpleView.js\";\n\n/**\n * Main transport class that handles simple pretty terminal output.\n * This class provides the display functionality of PrettyTerminal without interactive features.\n *\n * The transport supports three view modes:\n * 1. Inline: Shows all information with complete data structures inline (no truncation)\n * 2. Message-only: Shows only the timestamp, log level and message for a cleaner output (no data shown)\n * 3. Expanded: Shows timestamp, level, and message on first line, with data on indented separate lines\n */\nexport class SimplePrettyTerminalTransport extends LoggerlessTransport {\n /** Handles rendering and formatting of logs */\n private renderer: SimpleView;\n\n /** Configuration options */\n private config: SimplePrettyTerminalConfig;\n\n /**\n * Creates a new SimplePrettyTerminalTransport instance.\n *\n * @param config - Configuration options for the transport\n */\n constructor(config: SimplePrettyTerminalConfig) {\n super(config);\n\n // Store configuration\n this.config = config;\n\n // If transport is disabled, don't initialize anything\n if (config.enabled === false) {\n return;\n }\n\n // Initialize configuration with defaults\n const maxInlineDepth = config.maxInlineDepth || 4;\n const theme = config.theme || moonlight;\n const viewMode = config.viewMode || \"inline\";\n const showLogId = config.showLogId || false;\n const timestampFormat = config.timestampFormat || \"HH:mm:ss.SSS\";\n const collapseArrays = config.collapseArrays !== false; // Default to true\n const flattenNestedObjects = config.flattenNestedObjects !== false; // Default to true\n const runtime = config.runtime;\n const includeDataInBrowserConsole = config.includeDataInBrowserConsole || false;\n\n // Initialize view configuration with defaults\n const viewConfig = {\n colors: {\n trace: chalk.gray, // Lowest level, used for verbose output\n debug: chalk.blue, // Debug information\n info: chalk.green, // Normal operation\n warn: chalk.yellow, // Warning conditions\n error: chalk.red, // Error conditions\n fatal: chalk.bgRed.white, // Critical errors\n ...theme.colors,\n },\n logIdColor: theme.logIdColor || chalk.dim,\n dataValueColor: theme.dataValueColor || chalk.white,\n dataKeyColor: theme.dataKeyColor || chalk.dim,\n };\n\n // Initialize the renderer\n this.renderer = new SimpleView({\n viewMode,\n maxInlineDepth,\n showLogId,\n timestampFormat,\n collapseArrays,\n flattenNestedObjects,\n runtime,\n includeDataInBrowserConsole,\n config: viewConfig,\n });\n }\n\n /**\n * Generates a random ID for each log entry.\n * Uses base36 encoding for compact, readable IDs.\n *\n * @returns A 6-character string ID\n * @example\n * \"a1b2c3\" // Example generated ID\n */\n private generateId(): string {\n return Math.random().toString(36).substring(2, 8);\n }\n\n /**\n * Applies sprintf formatting to messages if enabled and applicable.\n * If the first message is a format string and there are additional arguments,\n * formats them using sprintf-js.\n *\n * @param messages - Array of message strings\n * @returns Formatted message string\n */\n private formatMessages(messages: any[]): string {\n if (!this.config.enableSprintf || messages.length < 2) {\n return messages.join(\" \");\n }\n\n const [format, ...args] = messages;\n\n // Only apply sprintf if the first argument is a string\n if (typeof format !== \"string\") {\n return messages.join(\" \");\n }\n\n try {\n return sprintf(format, ...args);\n } catch (_error) {\n // If sprintf fails, return original messages joined\n return messages.join(\" \");\n }\n }\n\n /**\n * Main transport method that receives logs from LogLayer.\n * This method is called for each log event and handles:\n * - Generating a unique ID for the log\n * - Converting the log data to a storable format\n * - Rendering the log using the SimpleView renderer\n *\n * @param logLevel - The severity level of the log\n * @param messages - Array of message strings to be joined\n * @param data - Additional structured data to be logged\n * @param hasData - Whether the log includes additional data\n * @returns The original messages array\n */\n shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[] {\n // If transport is disabled, return messages without processing\n if (this.config.enabled === false) {\n return messages;\n }\n\n const entry = {\n id: this.generateId(),\n timestamp: Date.now(),\n level: logLevel,\n message: this.formatMessages(messages),\n data: hasData ? JSON.stringify(data) : null,\n };\n\n this.renderer.renderLogLine(entry);\n return messages;\n }\n\n /**\n * Changes the view mode for log display.\n *\n * @param viewMode - The new view mode to use\n */\n setViewMode(viewMode: PrettyTerminalViewMode): void {\n if (this.config.enabled === false) {\n return;\n }\n\n // Rebuild the viewConfig as in the constructor\n const theme = this.config.theme || moonlight;\n const runtime = this.config.runtime;\n const viewConfig = {\n colors: {\n trace: chalk.gray,\n debug: chalk.blue,\n info: chalk.green,\n warn: chalk.yellow,\n error: chalk.red,\n fatal: chalk.bgRed.white,\n ...theme.colors,\n },\n logIdColor: theme.logIdColor || chalk.dim,\n dataValueColor: theme.dataValueColor || chalk.white,\n dataKeyColor: theme.dataKeyColor || chalk.dim,\n };\n\n this.renderer = new SimpleView({\n viewMode,\n maxInlineDepth: this.config.maxInlineDepth || 4,\n showLogId: this.config.showLogId || false,\n timestampFormat: this.config.timestampFormat || \"HH:mm:ss.SSS\",\n collapseArrays: this.config.collapseArrays !== false,\n flattenNestedObjects: this.config.flattenNestedObjects !== false,\n runtime,\n includeDataInBrowserConsole: this.config.includeDataInBrowserConsole || false,\n config: viewConfig,\n });\n }\n\n /**\n * Gets the current view mode.\n *\n * @returns The current view mode\n */\n getViewMode(): PrettyTerminalViewMode {\n return this.renderer.getViewMode();\n }\n}\n","import { SimplePrettyTerminalTransport } from \"./SimplePrettyTerminalTransport.js\";\nimport type {\n PrettyTerminalViewMode,\n Runtime,\n SimplePrettyTerminalConfig,\n SimplePrettyTerminalTheme,\n} from \"./types.js\";\n\n// Export chalk for custom theme creation\nexport * from \"chalk\";\n// Export all built-in themes\nexport * from \"./themes.js\";\n// Export essential types for configuration and custom themes\nexport type { PrettyTerminalViewMode, Runtime, SimplePrettyTerminalConfig, SimplePrettyTerminalTheme };\n// Export the main transport class (for advanced usage)\nexport { SimplePrettyTerminalTransport };\n\n// Main convenience function for creating the transport\nexport function getSimplePrettyTerminal(config: SimplePrettyTerminalConfig) {\n return new SimplePrettyTerminalTransport(config);\n}\n"],"mappings":"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