import { colors, stripAnsi } from "./chunk-4L7RY2JA.js"; import { publicDirURL } from "./chunk-OSUFJZHZ.js"; import { BaseComponent } from "./chunk-4YEN7HVQ.js"; // src/templates/error_stack_source/main.ts import { extname } from "path"; import { highlightText } from "@speed-highlight/core"; import { highlightText as cliHighlightText } from "@speed-highlight/core/terminal"; var GUTTER = "\u2503"; var POINTER = "\u276F"; var LANGS_MAP = { ".tsx": "ts", ".jsx": "js", ".js": "js", ".ts": "ts", ".css": "css", ".json": "json", ".html": "html", ".astro": "ts", ".vue": "ts" }; var ErrorStackSource = class extends BaseComponent { cssFile = new URL("./error_stack_source/style.css", publicDirURL); /** * The toHTML method is used to output the HTML for the * web view */ async toHTML(props) { const frame = props.frame; if (frame.type === "native" || !frame.source || !frame.fileName) { return ""; } const language = LANGS_MAP[extname(frame.fileName)] ?? "plain"; const highlightMarginTop = `${frame.source.findIndex((chunk) => { return chunk.lineNumber === frame.lineNumber; }) * 24}px`; const highlight = `
`; let code = await highlightText( frame.source.map((chunk) => chunk.chunk).join("\n"), language, true ); code = code.replace( '${highlight}${code}`;
}
/**
* The toANSI method is used to output the text for the console
*/
async toANSI(props) {
const frame = props.frame;
if (frame.type === "native" || !frame.source || !frame.fileName) {
return "";
}
const language = LANGS_MAP[extname(frame.fileName)] ?? "plain";
const largestLineNumber = Math.max(...frame.source.map(({ lineNumber }) => lineNumber));
const lineNumberCols = String(largestLineNumber).length;
const code = frame.source.map(({ chunk }) => chunk).join("\n");
const highlighted = await cliHighlightText(code, language);
return `
${highlighted.split("\n").map((line, index) => {
const lineNumber = frame.source[index].lineNumber;
const alignedLineNumber = String(lineNumber).padStart(lineNumberCols, " ");
if (lineNumber === props.frame.lineNumber) {
return ` ${colors.bgRed(`${POINTER} ${alignedLineNumber} ${GUTTER} ${stripAnsi(line)}`)}`;
}
return ` ${colors.dim(alignedLineNumber)} ${colors.dim(GUTTER)} ${line}`;
}).join("\n")}
`;
}
};
export {
ErrorStackSource
};