UNPKG

@modern-js/server-core

Version:

A Progressive React Framework for modern web development.

107 lines (106 loc) 3.74 kB
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 };