Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/purple-taxes-join.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solidjs/start": patch
---

reload ssr server when new route files are created in dev
41 changes: 17 additions & 24 deletions packages/start/src/config/fs-routes/fs-watcher.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -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<EnvironmentModuleNode>();
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<ModuleNode>();
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<EnvironmentModuleNode>();
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" });
}
}
}
}
Expand Down
30 changes: 16 additions & 14 deletions packages/start/src/server/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading