From f2c7e3277f3f7f4180012bcf0bb94e00ac960101 Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Sun, 12 Oct 2025 14:59:13 -0700 Subject: [PATCH] Fix generate_urls handler to reuse parsed request body --- handlers/generate_urls.ts | 27 +++++++++++++++++++++++---- tests/generate-urls.test.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 tests/generate-urls.test.ts diff --git a/handlers/generate_urls.ts b/handlers/generate_urls.ts index 7d66480..70c8238 100644 --- a/handlers/generate_urls.ts +++ b/handlers/generate_urls.ts @@ -16,10 +16,26 @@ export const generateUrlsHandler = async ( } try { - const body = await req.json() - const { fs_map, entrypoint } = body + const body = ctx.requestBody + if (!body || typeof body !== "object") { + return new Response( + JSON.stringify({ + ok: false, + error: "Invalid or missing JSON body", + }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ) + } + + const { fs_map, entrypoint } = body as { + fs_map?: Record + entrypoint?: string + } + + const fsMap = fs_map ?? ctx.fsMap + const resolvedEntrypoint = entrypoint ?? ctx.entrypoint - if (!fs_map) { + if (!fsMap) { return new Response( JSON.stringify({ ok: false, error: "No fsMap provided" }), { status: 400, headers: { "Content-Type": "application/json" } }, @@ -27,7 +43,10 @@ export const generateUrlsHandler = async ( } return new Response( - getHtmlForGeneratedUrlPage({ fsMap: fs_map, entrypoint }, ctx.host), + getHtmlForGeneratedUrlPage( + { fsMap, entrypoint: resolvedEntrypoint }, + ctx.host, + ), { headers: { "Content-Type": "text/html" }, }, diff --git a/tests/generate-urls.test.ts b/tests/generate-urls.test.ts new file mode 100644 index 0000000..e3464ab --- /dev/null +++ b/tests/generate-urls.test.ts @@ -0,0 +1,26 @@ +import { test, expect } from "bun:test" +import { getTestServer } from "./fixtures/get-test-server" + +test("POST /generate_urls returns HTML without re-reading the body", async () => { + const { serverUrl } = await getTestServer() + + const response = await fetch(`${serverUrl}/generate_urls`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + fs_map: { + "index.tsx": `export default () => ( + + + +)`, + }, + entrypoint: "index.tsx", + }), + }) + + expect(response.status).toBe(200) + expect(response.headers.get("content-type")).toContain("text/html") + const html = await response.text() + expect(html).toContain("svg.tscircuit.com - Generated URLs") +})