Skip to content

Commit d0ac7ba

Browse files
Fix typegen watcher leak on dev restart (#12331)
1 parent 10a1eff commit d0ac7ba

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

.changeset/nice-cobras-sparkle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@react-router/dev": patch
3+
---
4+
5+
Ensure typegen file watcher is cleaned up when Vite dev server restarts

packages/react-router-dev/typegen/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ export async function run(rootDirectory: string) {
1515
await writeAll(ctx);
1616
}
1717

18+
export type Watcher = {
19+
close: () => Promise<void>;
20+
};
21+
1822
export async function watch(
1923
rootDirectory: string,
2024
{ logger }: { logger?: vite.Logger } = {}
21-
) {
25+
): Promise<Watcher> {
2226
const ctx = await createContext({ rootDirectory, watch: true });
2327
await writeAll(ctx);
2428
logger?.info(pc.green("generated types"), { timestamp: true, clear: true });
@@ -38,6 +42,10 @@ export async function watch(
3842
});
3943
}
4044
});
45+
46+
return {
47+
close: async () => await ctx.configLoader.close(),
48+
};
4149
}
4250

4351
async function createContext({

packages/react-router-dev/vite/plugin.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
409409
let cssModulesManifest: Record<string, string> = {};
410410
let viteChildCompiler: Vite.ViteDevServer | null = null;
411411
let reactRouterConfigLoader: ConfigLoader;
412+
let typegenWatcherPromise: Promise<Typegen.Watcher> | undefined;
412413
let logger: Vite.Logger;
413414
let firstLoad = true;
414415

@@ -748,7 +749,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
748749
viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd();
749750

750751
if (viteCommand === "serve") {
751-
Typegen.watch(rootDirectory, {
752+
typegenWatcherPromise = Typegen.watch(rootDirectory, {
752753
// ignore `info` logs from typegen since they are redundant when Vite plugin logs are active
753754
logger: vite.createLogger("warn", { prefix: "[react-router]" }),
754755
});
@@ -1246,6 +1247,9 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
12461247
async buildEnd() {
12471248
await viteChildCompiler?.close();
12481249
await reactRouterConfigLoader.close();
1250+
1251+
let typegenWatcher = await typegenWatcherPromise;
1252+
await typegenWatcher?.close();
12491253
},
12501254
},
12511255
{

0 commit comments

Comments
 (0)