import { renderHtmlPage } from "./html.ts";
import { renderMarkdownPage } from "./markdown.ts";
import { ARTIFACT_ENTRY_FILES, isRegisteredArtifactStack } from "./stacks.ts";
import type { ArtifactStack, RenderArtifactDetails } from "./types.ts";
import { validateHtmlArtifact } from "./validation/html.ts";
import { validateMarkdownArtifact } from "./validation/markdown.ts";
import type { ArtifactPageChrome } from "./viewer-ui.ts";
export interface ArtifactRenderer {
stack: ArtifactStack;
entryFile: string;
validate: (
entryPath: string,
) => Promise>;
render: (
source: string,
title: string,
artifact?: string | ArtifactPageChrome,
) => string;
}
/** Built-in renderer registry: the single dispatch point for artifact stacks. */
const ARTIFACT_RENDERERS = Object.freeze({
markdown: {
stack: "markdown",
entryFile: ARTIFACT_ENTRY_FILES.markdown,
validate: validateMarkdownArtifact,
render: renderMarkdownPage,
},
html: {
stack: "html",
entryFile: ARTIFACT_ENTRY_FILES.html,
validate: validateHtmlArtifact,
render: renderHtmlPage,
},
} satisfies Record);
export function getArtifactRenderer(stack: string): ArtifactRenderer {
if (!isRegisteredArtifactStack(stack)) {
throw new Error(`Unsupported artifact stack: ${stack}`);
}
return ARTIFACT_RENDERERS[stack];
}