elysia-remix
Version:
Use React Router v7 or Remix with Elysia with HMR support!
70 lines (67 loc) • 2.07 kB
JavaScript
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 };