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"));
+}