headplane/server/dev/hot-server.ts

57 lines
1.3 KiB
TypeScript
Raw Normal View History

2025-02-19 18:09:42 -05:00
import { type ViteDevServer, createServer } from 'vite';
import log from '~server/utils/log';
2025-01-17 08:33:22 +00:00
2025-02-19 18:09:42 -05:00
// TODO: Remove env.NODE_ENV
2025-01-17 08:33:22 +00:00
let server: ViteDevServer | undefined;
export async function loadDevtools() {
2025-02-19 18:09:42 -05:00
log.info('DEVX', 'Starting Vite Development server');
2025-01-17 08:33:22 +00:00
process.env.NODE_ENV = 'development';
// This is loading the ROOT vite.config.ts
server = await createServer({
server: {
middlewareMode: true,
2025-02-19 18:09:42 -05:00
},
2025-01-17 08:33:22 +00:00
});
// We can't just do ssrLoadModule for virtual:react-router/server-build
// because for hot reload to work server side it needs to be imported
// using builtin import in its own file.
2025-02-19 18:09:42 -05:00
const handler = await server.ssrLoadModule('./server/dev/dev-handler.ts');
2025-01-17 08:33:22 +00:00
return {
server,
handler: handler.default,
};
}
export async function stacksafeTry(
devtools: {
2025-02-19 18:09:42 -05:00
server: ViteDevServer;
handler: (req: Request, context: unknown) => Promise<Response>;
2025-01-17 08:33:22 +00:00
},
req: Request,
2025-02-19 18:09:42 -05:00
context: unknown,
2025-01-17 08:33:22 +00:00
) {
try {
const result = await devtools.handler(req, context);
return result;
} catch (error) {
log.error('DEVX', 'Error in request handler', error);
if (typeof error === 'object' && error instanceof Error) {
devtools.server.ssrFixStacktrace(error);
}
throw error;
}
}
if (import.meta.hot) {
import.meta.hot.on('vite:beforeFullReload', () => {
server?.close();
});
import.meta.hot.dispose(() => {
server?.close();
});
}