route.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import {
  2. renderToHtml,
  3. renderToPlainText,
  4. } from "@json-render/react-email/render";
  5. import { examples } from "@/lib/examples";
  6. import type { Spec } from "@json-render/core";
  7. export async function GET(req: Request) {
  8. const { searchParams } = new URL(req.url);
  9. const name = searchParams.get("name") ?? "vercel-invite";
  10. const plain = searchParams.get("plain") === "1";
  11. const example = examples.find((e) => e.name === name);
  12. if (!example) {
  13. return new Response("Example not found", { status: 404 });
  14. }
  15. return emailResponse(example.spec, plain);
  16. }
  17. export async function POST(req: Request) {
  18. const { spec, plain } = (await req.json()) as {
  19. spec: Spec;
  20. plain?: boolean;
  21. };
  22. if (!spec || !spec.root || !spec.elements) {
  23. return new Response("Invalid spec", { status: 400 });
  24. }
  25. return emailResponse(spec, plain ?? false);
  26. }
  27. async function emailResponse(spec: Spec, plain: boolean) {
  28. const content = plain
  29. ? await renderToPlainText(spec)
  30. : await renderToHtml(spec);
  31. return new Response(content, {
  32. headers: {
  33. "Content-Type": plain
  34. ? "text/plain; charset=utf-8"
  35. : "text/html; charset=utf-8",
  36. "Cache-Control": "no-store",
  37. },
  38. });
  39. }