import { getSharedHighlighter } from "@pierre/diffs";
import { toHtml } from "hast-util-to-html";
import { renderToStaticMarkup } from "react-dom/server";
import { describe, expect, it } from "vite-plus/test";
import { createIncrementalHighlightedDocument } from "../../lib/incrementalHighlighting";
import { HighlightedCodeLines } from "./HighlightedCodeLines";
describe("highlighted code lines", () => {
it("preserves Shiki HTML, including colors, escaping, whitespace, and blank lines", async () => {
const highlighter = await getSharedHighlighter({
langs: ["typescript"],
themes: ["pierre-dark", "pierre-light"],
preferredHighlighter: "shiki-wasm",
});
for (const theme of ["pierre-dark", "pierre-light"] as const) {
const highlight = createIncrementalHighlightedDocument(highlighter, "typescript", theme);
const code =
'const html = "
";\n\n/* multi\nline */\n\tconst x = 1;\n';
for (let end = 0; end <= code.length; end++) {
const root = highlight(code.slice(0, end));
expect(renderToStaticMarkup()).toBe(toHtml(root));
}
}
});
});