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 diff --git a/packages/start/src/config/fs-routes/fs-watcher.ts b/packages/start/src/config/fs-routes/fs-watcher.ts index 0437ea947..518ff4b8b 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,24 @@ 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); - if (mod) { - const seen = new Set(); - moduleGraph.invalidateModule(mod, seen); - server.reloadModule(mod); - } + const envName = + environment === "ssr" ? VITE_ENVIRONMENTS.server : VITE_ENVIRONMENTS.client; + const devEnv = server.environments[envName]; + if (!devEnv?.moduleGraph) return; + + const mod: EnvironmentModuleNode | undefined = + devEnv.moduleGraph.getModuleById(moduleId); + if (mod) { + const seen = new Set(); + devEnv.moduleGraph.invalidateModule(mod, seen); } - if (!server.hot) { - server.ws.send({ type: "full-reload" }); + if (environment !== "ssr") { + if (mod) { + devEnv.reloadModule(mod); + } else if (devEnv.hot) { + devEnv.hot.send({ type: "full-reload" }); + } } } } 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);