58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
import log from '~server/log';
|
|
import { createServer, type ViteDevServer } from 'vite';
|
|
import { type createRequestHandler } from 'react-router';
|
|
|
|
let server: ViteDevServer | undefined;
|
|
export async function loadDevtools() {
|
|
log.info('DEVX', 'Starting Vite Development server')
|
|
process.env.NODE_ENV = 'development';
|
|
|
|
// This is loading the ROOT vite.config.ts
|
|
server = await createServer({
|
|
server: {
|
|
middlewareMode: true,
|
|
}
|
|
});
|
|
|
|
// 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.
|
|
const handler = await server.ssrLoadModule('./server/dev-handler.ts');
|
|
return {
|
|
server,
|
|
handler: handler.default,
|
|
};
|
|
}
|
|
|
|
export async function stacksafeTry(
|
|
devtools: {
|
|
server: ViteDevServer,
|
|
handler: any, // import() is dynamic
|
|
},
|
|
req: Request,
|
|
context: unknown
|
|
) {
|
|
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) {
|
|
console.log('got 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();
|
|
});
|
|
}
|