mirror of
https://github.com/vercel-labs/json-render.git
synced 2026-10-20 06:19:57 +08:00
* add react-email workspace dependencies * add react-email package * add react-email example with Vercel Invite, Stripe Welcome and Nike Receipt * add render tests for react-email package * fix missing style prop on stripe-welcome logo Image * add react email documentation * add json render react email skill * fix @internal/react-state alias in vitest config Pre-existing issue: vitest could not resolve @internal/react-state, causing 6 test suites in packages/react and packages/react-pdf to fail. * fix PR review feedback - fix tsconfig: remove rootDir, expand include for test imports - fix render tests: add non-null assertions for noUncheckedIndexedAccess - fix dev script: add portless to match other examples - fix .env.example: correct comment from video to email generation - fix docs: add blank line before heading in installation page * merge latest * fix: update tsconfig extends from @repo to @internal/typescript-config * fixes * fixes --------- Co-authored-by: WManzoli <willmanzoli@gmail.com> Co-authored-by: Chris Tate <chris@ctate.dev>
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import {
|
|
renderToHtml,
|
|
renderToPlainText,
|
|
} from "@json-render/react-email/render";
|
|
import { examples } from "@/lib/examples";
|
|
import type { Spec } from "@json-render/core";
|
|
|
|
export async function GET(req: Request) {
|
|
const { searchParams } = new URL(req.url);
|
|
const name = searchParams.get("name") ?? "vercel-invite";
|
|
const plain = searchParams.get("plain") === "1";
|
|
|
|
const example = examples.find((e) => e.name === name);
|
|
if (!example) {
|
|
return new Response("Example not found", { status: 404 });
|
|
}
|
|
|
|
return emailResponse(example.spec, plain);
|
|
}
|
|
|
|
export async function POST(req: Request) {
|
|
const { spec, plain } = (await req.json()) as {
|
|
spec: Spec;
|
|
plain?: boolean;
|
|
};
|
|
|
|
if (!spec || !spec.root || !spec.elements) {
|
|
return new Response("Invalid spec", { status: 400 });
|
|
}
|
|
|
|
return emailResponse(spec, plain ?? false);
|
|
}
|
|
|
|
async function emailResponse(spec: Spec, plain: boolean) {
|
|
const content = plain
|
|
? await renderToPlainText(spec)
|
|
: await renderToHtml(spec);
|
|
|
|
return new Response(content, {
|
|
headers: {
|
|
"Content-Type": plain
|
|
? "text/plain; charset=utf-8"
|
|
: "text/html; charset=utf-8",
|
|
"Cache-Control": "no-store",
|
|
},
|
|
});
|
|
}
|