@modern-js/server-core
Version:
A Progressive React Framework for modern web development.
107 lines (106 loc) • 3.74 kB
JavaScript
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
import { getLoaderCtx } from "../../helper";
import { sortRoutes } from "../../utils";
import { CustomServer } from "../customServer";
import { requestLatencyMiddleware } from "../monitors";
export * from "./inject";
const renderPlugin = () => ({
name: "@modern-js/plugin-render",
setup(api) {
return {
async prepare() {
const { middlewares, routes, render, distDirectory: pwd, renderMiddlewares } = api.useAppContext();
const hooks = api.getHooks();
const config = api.useConfigContext();
if (!routes) {
return;
}
const customServer = new CustomServer(hooks, pwd);
const pageRoutes = getPageRoutes(routes);
middlewares.push({
name: "page-latency",
handler: requestLatencyMiddleware()
});
for (const route of pageRoutes) {
var _config_server;
const { urlPath: originUrlPath, entryName = MAIN_ENTRY_NAME } = route;
const urlPath = originUrlPath.endsWith("/") ? `${originUrlPath}*` : `${originUrlPath}/*`;
if (((_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.disableHook) !== true) {
const customServerHookMiddleware = customServer.getHookMiddleware(entryName, routes);
middlewares.push({
name: "custom-server-hook",
path: urlPath,
handler: customServerHookMiddleware
});
}
renderMiddlewares === null || renderMiddlewares === void 0 ? void 0 : renderMiddlewares.forEach((m) => {
middlewares.push({
name: m.name,
path: urlPath,
handler: m.handler
});
});
const customServerMiddleware = await customServer.getServerMiddleware();
customServerMiddleware && middlewares.push({
name: "custom-server-middleware",
path: urlPath,
handler: customServerMiddleware
});
render && middlewares.push({
name: `render`,
path: urlPath,
handler: createRenderHandler(render)
});
}
}
};
}
});
function getPageRoutes(routes) {
return routes.filter((route) => !route.isApi).sort(sortRoutes);
}
function createRenderHandler(render) {
return async (c, _) => {
var _c_env_node;
const logger = c.get("logger");
const reporter = c.get("reporter");
const monitors = c.get("monitors");
const templates = c.get("templates") || {};
const serverManifest = c.get("serverManifest") || {};
const rscServerManifest = c.get("rscServerManifest");
const rscClientManifest = c.get("rscClientManifest");
const rscSSRManifest = c.get("rscSSRManifest");
const locals = c.get("locals");
const metrics = c.get("metrics");
const matchPathname = c.get("matchPathname");
const matchEntryName = c.get("matchEntryName");
const loaderContext = getLoaderCtx(c);
const request = c.req.raw;
const nodeReq = (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req;
const res = await render(request, {
nodeReq,
monitors,
logger,
reporter,
templates,
metrics,
serverManifest,
rscServerManifest,
rscClientManifest,
rscSSRManifest,
loaderContext,
locals,
matchPathname,
matchEntryName
});
const { body, status, headers } = res;
const headersData = {};
headers.forEach((v, k) => {
headersData[k] = v;
});
return c.body(body, status, headersData);
};
}
export {
renderPlugin
};