From bacf9cf64f3af0e38c92a1054ba44eacf636973f Mon Sep 17 00:00:00 2001 From: Atila Fassina Date: Fri, 3 Apr 2026 17:25:15 +0200 Subject: [PATCH 1/4] fix: update routes graph when new file is created --- .../start/src/config/fs-routes/fs-watcher.ts | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/packages/start/src/config/fs-routes/fs-watcher.ts b/packages/start/src/config/fs-routes/fs-watcher.ts index 0437ea947..36cd30517 100644 --- a/packages/start/src/config/fs-routes/fs-watcher.ts +++ b/packages/start/src/config/fs-routes/fs-watcher.ts @@ -1,11 +1,10 @@ import type { EnvironmentModuleNode, FSWatcher, - ModuleGraph, - ModuleNode, PluginOption, ViteDevServer, } from "vite"; +import { VITE_ENVIRONMENTS } from "../constants.ts"; import { moduleId } from "./index.ts"; import type { BaseFileSystemRouter } from "./router.ts"; @@ -32,30 +31,20 @@ function createRoutesReloader( return () => routes.removeEventListener("reload", handleRoutesReload); function handleRoutesReload(): void { - if (environment === "ssr") { - // Handle server environment HMR reload - const serverEnv = server.environments.server; - if (serverEnv && serverEnv.moduleGraph) { - const mod: EnvironmentModuleNode | undefined = - serverEnv.moduleGraph.getModuleById(moduleId); - if (mod) { - const seen = new Set(); - serverEnv.moduleGraph.invalidateModule(mod, seen); - } - } - } else { - // Handle client environment HMR reload - const { moduleGraph }: { moduleGraph: ModuleGraph } = server; - const mod: ModuleNode | undefined = moduleGraph.getModuleById(moduleId); + const envName = + environment === "ssr" ? VITE_ENVIRONMENTS.server : VITE_ENVIRONMENTS.client; + const devEnv = server.environments[envName]; + if (devEnv && devEnv.moduleGraph) { + const mod: EnvironmentModuleNode | undefined = + devEnv.moduleGraph.getModuleById(moduleId); if (mod) { - const seen = new Set(); - moduleGraph.invalidateModule(mod, seen); - server.reloadModule(mod); + const seen = new Set(); + devEnv.moduleGraph.invalidateModule(mod, seen); } } - if (!server.hot) { - server.ws.send({ type: "full-reload" }); + if (devEnv && devEnv.hot) { + devEnv.hot.send({ type: "full-reload" }); } } } From c8b86d73cb7490cd2b0691ffcefc45b9cd3c13e8 Mon Sep 17 00:00:00 2001 From: Atila Fassina Date: Fri, 3 Apr 2026 17:33:10 +0200 Subject: [PATCH 2/4] add changeset --- .changeset/purple-taxes-join.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/purple-taxes-join.md diff --git a/.changeset/purple-taxes-join.md b/.changeset/purple-taxes-join.md new file mode 100644 index 000000000..db35aabe9 --- /dev/null +++ b/.changeset/purple-taxes-join.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +reload ssr server when new route files are created in dev From 61ff6d8739436305a941354c0b197a46f4e6a299 Mon Sep 17 00:00:00 2001 From: Atila Fassina Date: Fri, 3 Apr 2026 17:42:07 +0200 Subject: [PATCH 3/4] only trigger a full-reload if module wasn't in the graph before --- .../start/src/config/fs-routes/fs-watcher.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/start/src/config/fs-routes/fs-watcher.ts b/packages/start/src/config/fs-routes/fs-watcher.ts index 36cd30517..518ff4b8b 100644 --- a/packages/start/src/config/fs-routes/fs-watcher.ts +++ b/packages/start/src/config/fs-routes/fs-watcher.ts @@ -34,17 +34,21 @@ function createRoutesReloader( const envName = environment === "ssr" ? VITE_ENVIRONMENTS.server : VITE_ENVIRONMENTS.client; const devEnv = server.environments[envName]; - if (devEnv && devEnv.moduleGraph) { - const mod: EnvironmentModuleNode | undefined = - devEnv.moduleGraph.getModuleById(moduleId); - if (mod) { - const seen = new Set(); - devEnv.moduleGraph.invalidateModule(mod, seen); - } + if (!devEnv?.moduleGraph) return; + + const mod: EnvironmentModuleNode | undefined = + devEnv.moduleGraph.getModuleById(moduleId); + if (mod) { + const seen = new Set(); + devEnv.moduleGraph.invalidateModule(mod, seen); } - if (devEnv && devEnv.hot) { - devEnv.hot.send({ type: "full-reload" }); + if (environment !== "ssr") { + if (mod) { + devEnv.reloadModule(mod); + } else if (devEnv.hot) { + devEnv.hot.send({ type: "full-reload" }); + } } } } From 01b550568014b4545c7c9f66f80faef28d6fe2e9 Mon Sep 17 00:00:00 2001 From: Atila Fassina Date: Fri, 3 Apr 2026 21:43:29 +0200 Subject: [PATCH 4/4] routes without component don't render --- packages/start/src/server/handler.ts | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index 206bc9e26..3b0609db9 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -43,21 +43,23 @@ export function createBaseHandler( const mod = await match.handler.import(); const fn = event.request.method === "HEAD" ? mod["HEAD"] || mod["GET"] : mod[event.request.method]; - (event as APIEvent).params = match.params || {}; - // @ts-expect-error - sharedConfig.context = { event }; - const res = await fn!(event); - if (res !== undefined) { - if (res instanceof Response) return produceResponseWithEventHeaders(res); - - return res; + if (typeof fn === "function") { + (event as APIEvent).params = match.params || {}; + // @ts-expect-error + sharedConfig.context = { event }; + const res = await fn(event); + if (res !== undefined) { + if (res instanceof Response) return produceResponseWithEventHeaders(res); + + return res; + } + if (event.request.method !== "GET") { + throw new Error( + `API handler for ${event.request.method} "${event.request.url}" did not return a response.`, + ); + } + if (!match.isPage) return; } - if (event.request.method !== "GET") { - throw new Error( - `API handler for ${event.request.method} "${event.request.url}" did not return a response.`, - ); - } - if (!match.isPage) return; } const context = await createPageEvent(event);