UNPKG

elysia-remix

Version:

Use React Router v7 or Remix with Elysia with HMR support!

70 lines (67 loc) 2.07 kB
import { join } from 'node:path'; import { join as join$1 } from 'node:path/posix'; import { Elysia, file } from 'elysia'; import { createRequestHandler } from 'react-router'; import { u as universalGlob } from './utils-WsggFj7T.js'; import 'node:fs'; async function reactRouter(options) { const cwd = process.env.REMIX_ROOT ?? process.cwd(); const mode = options?.mode ?? process.env.NODE_ENV ?? "development"; const buildDirectory = join(cwd, options?.buildDirectory ?? "build"); const serverBuildPath = join( buildDirectory, "server", options?.serverBuildFile ?? "index.js" ); const elysia = new Elysia({ name: "elysia-react-router", seed: options }); let vite; if (mode !== "production") { vite = await import('vite').then((vite2) => { return vite2.createServer({ ...options?.vite, server: { ...options?.vite?.server, middlewareMode: true } }); }); } let hooks = {}; if (vite) { const { connectToWeb } = await import('connect-to-web'); hooks = { beforeHandle: ({ request }) => { return connectToWeb((req, res, next) => { vite.middlewares(req, res, next); })(request.clone()); } }; } else { const clientDirectory = join(buildDirectory, "client"); const glob = universalGlob(`${clientDirectory}/**`); for (const path of glob) { elysia.get( // TODO: find more nice way join$1(path.substring(clientDirectory.length)).replaceAll("\\", "/"), () => options?.production?.wrapStaticResponse?.(file(path)) ?? file(path) ); } } elysia.all( "*", async function processRemixSSR(context) { const handler = createRequestHandler( vite ? await vite.ssrLoadModule("virtual:react-router/server-build") : await import(serverBuildPath), mode ); const loadContext = await options?.getLoadContext?.(context); return handler(context.request, loadContext); }, hooks ); return elysia; } export { reactRouter };