mlld
Version:
mlld: llm scripting language
1 lines • 7.42 kB
Source Map (JSON)
{"version":3,"sources":["../core/utils/DirectiveTraceFormatter.ts"],"names":[],"mappings":"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","file":"DirectiveTraceFormatter-4MALUJRP.mjs","sourcesContent":["import type { DirectiveTrace } from '@core/types/trace';\n\n/**\n * Formats directive traces for display in error messages\n */\nexport class DirectiveTraceFormatter {\n private readonly LINE_WIDTH = 80;\n \n // ANSI color codes\n private readonly colors = {\n dim: '\\x1b[90m', // gray for dots/lines\n directive: '\\x1b[36m', // cyan for @directives \n variable: '\\x1b[33m', // yellow for variable names\n file: '\\x1b[90m', // gray for files\n blue: '\\x1b[34m', // blue for header\n red: '\\x1b[31m', // red for errors\n reset: '\\x1b[0m'\n };\n\n /**\n * Format a directive trace for display\n */\n format(trace: DirectiveTrace[], useColors = true, errorMessage?: string): string {\n if (trace.length === 0) return '';\n \n const c = useColors ? this.colors : {\n dim: '', directive: '', variable: '', file: '', blue: '', red: '', reset: ''\n };\n \n const lines: string[] = [];\n \n // Header with centered \"mlld error\" text\n const headerText = ' mlld error ';\n const headerPadding = Math.floor((this.LINE_WIDTH - headerText.length) / 2);\n const leftPad = '━'.repeat(headerPadding);\n const rightPad = '━'.repeat(this.LINE_WIDTH - headerPadding - headerText.length);\n \n lines.push(c.dim + leftPad + c.reset + c.blue + headerText + c.reset + c.dim + rightPad + c.reset);\n \n // If we have an error message and no failed entries, show it at the top\n if (errorMessage && !trace.some(t => t.failed)) {\n lines.push('');\n lines.push(c.red + '✘' + c.reset + ' ' + c.red + 'Error: ' + c.reset + errorMessage);\n lines.push('');\n }\n \n // Format each entry\n trace.forEach((entry, i) => {\n const indent = ' '.repeat(entry.depth);\n const prefix = i === 0 ? '' : '└── ';\n \n // Build colored parts\n const directive = c.directive + entry.directive + c.reset;\n const variable = entry.varName ? \n ' ' + c.variable + entry.varName + c.reset : '';\n const location = c.file + entry.location + c.reset;\n \n // Calculate dots needed\n const leftPart = indent + prefix + directive + variable + ' ';\n const rightPart = ' ' + location;\n \n // Strip ANSI codes for length calculation\n const leftLength = this.stripAnsi(leftPart).length;\n const rightLength = this.stripAnsi(rightPart).length;\n \n const dotsNeeded = this.LINE_WIDTH - leftLength - rightLength;\n const dots = c.dim + '.'.repeat(Math.max(dotsNeeded, 3)) + c.reset;\n \n lines.push(leftPart + dots + rightPart);\n \n // If this entry failed, show the error\n if (entry.failed && entry.errorMessage) {\n const errorIndent = entry.depth === 0 ? '' : ' '.repeat(entry.depth);\n const errorPrefix = '└── ' + c.red + '✘' + c.reset + ' ';\n \n // Split the error message to show file info and error details separately\n const match = entry.errorMessage.match(/^(.+?\\.mld failed to parse at line \\d+): (.+)$/);\n if (match) {\n const [_, fileInfo, errorDetails] = match;\n lines.push(errorIndent + errorPrefix + c.red + fileInfo + ':' + c.reset);\n lines.push(errorIndent + ' ' + c.reset + errorDetails);\n } else {\n // Fallback for other error formats\n lines.push(errorIndent + errorPrefix + c.red + entry.errorMessage + c.reset);\n }\n }\n });\n \n // Footer\n lines.push(c.dim + '━'.repeat(this.LINE_WIDTH) + c.reset);\n \n return lines.join('\\n');\n }\n \n /**\n * Strip ANSI escape codes from a string\n */\n private stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n }\n}"]}