18 lines · 888 B
import { createServerFn } from "@tanstack/react-start";
import { resolveMentions } from "~/server/mentions";
import { requireViewer, viewerMiddleware } from "./middleware";
import { limitHeavy } from "~/server/limits";
import { z } from "zod";
import { renderMarkdown } from "~/server/markdown";
import { markdownBody } from "~/lib/validation";

export const previewMarkdown = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(z.object({ owner: z.string().nullable(), repo: z.string().nullable(), body: markdownBody }))
  .handler(async ({ data, context }) => {
    await limitHeavy(requireViewer(context.viewer));
    const markdownContext =
      data.owner && data.repo ? { owner: data.owner, repo: data.repo, ref: "HEAD", basePath: "" } : null;
    return { html: renderMarkdown(data.body, markdownContext, await resolveMentions([data.body])) };
  });