Skip to content

Commit f856b70

Browse files
authored
add fswatcher (#1945)
1 parent 57e3724 commit f856b70

2 files changed

Lines changed: 86 additions & 11 deletions

File tree

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import type {
2+
EnvironmentModuleNode,
3+
FSWatcher,
4+
ModuleGraph,
5+
ModuleNode,
6+
PluginOption,
7+
ViteDevServer
8+
} from "vite";
9+
import { moduleId, RouterBuilder } from "./index.js";
10+
11+
interface CompiledRouter {
12+
removeRoute(path: string): void;
13+
addRoute(path: string): void;
14+
updateRoute(path: string): void;
15+
addEventListener(event: "reload", handler: () => void): void;
16+
removeEventListener(event: "reload", handler: () => void): void;
17+
}
18+
19+
function setupWatcher(watcher: FSWatcher, routes: CompiledRouter): void {
20+
watcher.on("unlink", path => routes.removeRoute(path));
21+
watcher.on("add", path => routes.addRoute(path));
22+
watcher.on("change", path => routes.updateRoute(path));
23+
}
24+
25+
function createRoutesReloader(
26+
server: ViteDevServer,
27+
routes: CompiledRouter,
28+
environment: "client" | "server"
29+
): () => void {
30+
routes.addEventListener("reload", handleRoutesReload);
31+
return () => routes.removeEventListener("reload", handleRoutesReload);
32+
33+
function handleRoutesReload(): void {
34+
if (environment === "server") {
35+
// Handle server environment HMR reload
36+
const serverEnv = server.environments.server;
37+
if (serverEnv && serverEnv.moduleGraph) {
38+
const mod: EnvironmentModuleNode | undefined =
39+
serverEnv.moduleGraph.getModuleById(moduleId);
40+
if (mod) {
41+
const seen = new Set<EnvironmentModuleNode>();
42+
serverEnv.moduleGraph.invalidateModule(mod, seen);
43+
}
44+
}
45+
} else {
46+
// Handle client environment HMR reload
47+
const { moduleGraph }: { moduleGraph: ModuleGraph } = server;
48+
const mod: ModuleNode | undefined = moduleGraph.getModuleById(moduleId);
49+
if (mod) {
50+
const seen = new Set<ModuleNode>();
51+
moduleGraph.invalidateModule(mod, seen);
52+
server.reloadModule(mod);
53+
}
54+
}
55+
56+
if (!server.config.server.hmr) {
57+
server.ws.send({ type: "full-reload" });
58+
}
59+
}
60+
}
61+
62+
export const fileSystemWatcher = (
63+
routers: Record<"client" | "server", RouterBuilder>
64+
): PluginOption => {
65+
const plugin: PluginOption = {
66+
name: "fs-watcher",
67+
apply: "serve",
68+
async configureServer(server: ViteDevServer) {
69+
Object.keys(routers).forEach(environment => {
70+
const router = routers[environment as keyof typeof routers](server.config);
71+
(globalThis as any).ROUTERS[environment] = router;
72+
73+
setupWatcher(server.watcher, router);
74+
createRoutesReloader(server, router, environment as keyof typeof routers);
75+
});
76+
}
77+
};
78+
return plugin;
79+
};

packages/start/src/config/fs-routes/index.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { relative } from "node:path";
22
import type { PluginOption, ResolvedConfig } from "vite";
3+
4+
import { fileSystemWatcher } from "./fs-watcher.js";
35
import type { BaseFileSystemRouter } from "./router.js";
46
import { treeShake } from "./tree-shake.js";
57

@@ -14,11 +16,8 @@ export interface FsRoutesArgs {
1416
handlers: Record<"client" | "server", string>;
1517
}
1618

17-
export function fsRoutes({
18-
routers,
19-
handlers
20-
}: FsRoutesArgs): Array<PluginOption> {
21-
(globalThis as any).ROUTERS = {};
19+
export function fsRoutes({ routers, handlers }: FsRoutesArgs): Array<PluginOption> {
20+
(globalThis as any).ROUTERS = routers;
2221

2322
return [
2423
{
@@ -34,11 +33,7 @@ export function fsRoutes({
3433
if (id !== moduleId) return;
3534
const js = jsCode();
3635

37-
const router = routers[this.environment.name as keyof typeof routers](
38-
this.environment.config
39-
);
40-
41-
(globalThis as any).ROUTERS[this.environment.name] = router;
36+
const router = (globalThis as any).ROUTERS[this.environment.name];
4237

4338
const routes = await router.getRoutes();
4439

@@ -91,7 +86,8 @@ export default ${routesCode}`;
9186
return code;
9287
}
9388
},
94-
treeShake()
89+
treeShake(),
90+
fileSystemWatcher(routers)
9591
];
9692
}
9793

0 commit comments

Comments
 (0)