From 56c7e8208c52664c4f89f9427ba15929baba3d72 Mon Sep 17 00:00:00 2001 From: dennev <221695162+dennev@users.noreply.github.com> Date: Sat, 19 Jul 2025 19:47:27 +0900 Subject: [PATCH 1/3] fix: Enhance route matching to return `isPage` flag and add tests for plain text API response and Missing page handling that has both api/file routes. --- packages/start/src/router/routes.ts | 19 ++++++++++++++--- packages/start/src/server/handler.ts | 1 + packages/tests/src/app.tsx | 6 ++++++ packages/tests/src/routes/[...404].tsx | 21 +++++++++++++++++++ packages/tests/src/routes/api/text-plain.tsx | 5 +++++ .../tests/src/routes/text-plain-response.tsx | 15 +++++++++++++ 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 packages/tests/src/routes/[...404].tsx create mode 100644 packages/tests/src/routes/api/text-plain.tsx create mode 100644 packages/tests/src/routes/text-plain-response.tsx diff --git a/packages/start/src/router/routes.ts b/packages/start/src/router/routes.ts index de383ac34..fe569b31a 100644 --- a/packages/start/src/router/routes.ts +++ b/packages/start/src/router/routes.ts @@ -60,14 +60,27 @@ function defineRoutes(fileRoutes: Route[]) { export function matchAPIRoute(path: string, method: string) { const match = router.lookup(path); if (match && match.route) { - const handler = - method === "HEAD" ? match.route["$HEAD"] || match.route["$GET"] : match.route[`$${method}`]; + const route = match.route; + + // Find the appropriate handler for the HTTP method + const handler = method === "HEAD" + ? route.$HEAD || route.$GET + : route[`$${method}`]; + if (handler === undefined) return; + + // Check if this is a page route + const isPage = route.page === true && route.$component !== undefined; + + // Return comprehensive route information return { handler, - params: match.params + params: match.params, + isPage }; } + + return undefined; } function containsHTTP(route: Route) { diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index effd00735..01714c1ac 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -59,6 +59,7 @@ export function createBaseHandler( `API handler for ${event.request.method} "${event.request.url}" did not return a response.` ); } + if (!match.isPage) return; } // render diff --git a/packages/tests/src/app.tsx b/packages/tests/src/app.tsx index a84fd3f03..b9b16070c 100644 --- a/packages/tests/src/app.tsx +++ b/packages/tests/src/app.tsx @@ -50,6 +50,12 @@ export default function App() {
  • generator server function
  • +
  • + Not Found +
  • +
  • + Text Plain Response +
  • {props.children} diff --git a/packages/tests/src/routes/[...404].tsx b/packages/tests/src/routes/[...404].tsx new file mode 100644 index 000000000..7d71e47bc --- /dev/null +++ b/packages/tests/src/routes/[...404].tsx @@ -0,0 +1,21 @@ +import { Title } from "@solidjs/meta"; +import { HttpStatusCode } from "@solidjs/start"; +import type { APIEvent } from "@solidjs/start/server"; + +export const GET = (event: APIEvent) => { + if (event.request.headers.get("accept") !== "application/json") return; + return { notFound: "API" }; +}; + +export default function NotFound() { + return ( +
    + Not Found + +

    Page Not Found

    +

    + {"Your page cannot be found... >_<"} +

    +
    + ); +} diff --git a/packages/tests/src/routes/api/text-plain.tsx b/packages/tests/src/routes/api/text-plain.tsx new file mode 100644 index 000000000..ee2b97c54 --- /dev/null +++ b/packages/tests/src/routes/api/text-plain.tsx @@ -0,0 +1,5 @@ +import type { APIEvent } from "@solidjs/start/server"; + +export const GET = (event: APIEvent) => { + return new Response("Text Plain Response"); +}; diff --git a/packages/tests/src/routes/text-plain-response.tsx b/packages/tests/src/routes/text-plain-response.tsx new file mode 100644 index 000000000..5fc11d61d --- /dev/null +++ b/packages/tests/src/routes/text-plain-response.tsx @@ -0,0 +1,15 @@ +export default function App() { + const handleClick = (e: Event) => { + // e.preventDefault(); + + window.location.href = "/api/text-plain"; + }; + + return ( +
    + + Text Plain Response + +
    + ); +}; From 51a261df84170159114f56bbf9204df3eb10cd58 Mon Sep 17 00:00:00 2001 From: dennev <221695162+dennev@users.noreply.github.com> Date: Sat, 16 Aug 2025 15:39:45 +0900 Subject: [PATCH 2/3] chore: add changeset for route matching enhancements and tests --- .changeset/slow-eagles-wear.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/slow-eagles-wear.md diff --git a/.changeset/slow-eagles-wear.md b/.changeset/slow-eagles-wear.md new file mode 100644 index 000000000..0ca32b23b --- /dev/null +++ b/.changeset/slow-eagles-wear.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Enhance route matching to return `isPage` flag and add tests for plain text API response and Missing page handling that has both api/file routes. From 79d710a1e547fa16eb4277567de70b1b12c71f54 Mon Sep 17 00:00:00 2001 From: dennev <221695162+dennev@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:35:56 +0900 Subject: [PATCH 3/3] fix: update API route to use `respondWith` for plain text response handling --- packages/tests/src/routes/api/text-plain.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/tests/src/routes/api/text-plain.tsx b/packages/tests/src/routes/api/text-plain.tsx index ee2b97c54..89d9ae907 100644 --- a/packages/tests/src/routes/api/text-plain.tsx +++ b/packages/tests/src/routes/api/text-plain.tsx @@ -1,5 +1,3 @@ -import type { APIEvent } from "@solidjs/start/server"; - -export const GET = (event: APIEvent) => { - return new Response("Text Plain Response"); -}; +export function GET(e: { nativeEvent: { respondWith: (arg0: Response) => void; }; }) { + e.nativeEvent.respondWith(new Response("test")); +}