@modern-js/server-core 2.47.1-alpha.0 → 2.47.1-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/base/adapters/node/bff.js +1 -1
- package/dist/cjs/base/adapters/node/middlewares/templates.js +1 -1
- package/dist/cjs/base/adapters/node/node.js +5 -0
- package/dist/cjs/base/index.js +2 -0
- package/dist/cjs/base/middlewares/customServer/index.js +5 -1
- package/dist/cjs/base/middlewares/dataHandler.js +37 -2
- package/dist/cjs/base/middlewares/renderHandler/index.js +3 -3
- package/dist/cjs/base/middlewares/renderHandler/render.js +23 -4
- package/dist/esm/base/adapters/node/bff.js +1 -1
- package/dist/esm/base/adapters/node/middlewares/templates.js +1 -1
- package/dist/esm/base/adapters/node/node.js +6 -1
- package/dist/esm/base/index.js +2 -1
- package/dist/esm/base/middlewares/customServer/index.js +5 -1
- package/dist/esm/base/middlewares/dataHandler.js +34 -1
- package/dist/esm/base/middlewares/renderHandler/index.js +3 -3
- package/dist/esm/base/middlewares/renderHandler/render.js +23 -4
- package/dist/types/base/index.d.ts +1 -1
- package/dist/types/base/middlewares/dataHandler.d.ts +6 -0
- package/dist/types/base/middlewares/renderHandler/index.d.ts +1 -1
- package/dist/types/base/middlewares/renderHandler/render.d.ts +1 -1
- package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +1 -3
- package/package.json +4 -4
|
@@ -37,13 +37,13 @@ const bindBFFHandler = async (server, options) => {
|
|
|
37
37
|
await runner.gather(collector);
|
|
38
38
|
const webOnly = await (0, import_utils.isWebOnly)();
|
|
39
39
|
let handler;
|
|
40
|
-
const renderHandler = (0, import_middlewares.getRenderHandler)(options);
|
|
41
40
|
if (webOnly) {
|
|
42
41
|
handler = async (c, next) => {
|
|
43
42
|
c.body("");
|
|
44
43
|
await next();
|
|
45
44
|
};
|
|
46
45
|
} else {
|
|
46
|
+
const renderHandler = enableHandleWeb ? await (0, import_middlewares.getRenderHandler)(options) : null;
|
|
47
47
|
handler = await server.runner.prepareApiServer({
|
|
48
48
|
pwd: options.pwd,
|
|
49
49
|
prefix,
|
|
@@ -52,7 +52,7 @@ async function getHtmlTemplates(pwd, routes) {
|
|
|
52
52
|
}
|
|
53
53
|
function createInjectHtml(pwd, routes) {
|
|
54
54
|
return async (c, next) => {
|
|
55
|
-
if (
|
|
55
|
+
if (!c.get("templates") && routes) {
|
|
56
56
|
const templates = await getHtmlTemplates(pwd, routes);
|
|
57
57
|
c.set("templates", templates);
|
|
58
58
|
}
|
|
@@ -28,6 +28,7 @@ var import_stream = require("./polyfills/stream");
|
|
|
28
28
|
var import_install = require("./polyfills/install");
|
|
29
29
|
(0, import_install.installGlobals)();
|
|
30
30
|
const createWebRequest = (req, res) => {
|
|
31
|
+
var _req_url;
|
|
31
32
|
const headerRecord = [];
|
|
32
33
|
const len = req.rawHeaders.length;
|
|
33
34
|
for (let i = 0; i < len; i += 2) {
|
|
@@ -44,6 +45,10 @@ const createWebRequest = (req, res) => {
|
|
|
44
45
|
signal: controller.signal
|
|
45
46
|
};
|
|
46
47
|
res.on("close", () => controller.abort());
|
|
48
|
+
if (!(method === "GET" || method === "HEAD") && ((_req_url = req.url) === null || _req_url === void 0 ? void 0 : _req_url.includes("__loader"))) {
|
|
49
|
+
init.body = (0, import_stream.createReadableStreamFromReadable)(req);
|
|
50
|
+
init.duplex = "half";
|
|
51
|
+
}
|
|
47
52
|
const url = `http://${req.headers.host}${req.url}`;
|
|
48
53
|
const request = new Request(url, init);
|
|
49
54
|
return request;
|
package/dist/cjs/base/index.js
CHANGED
|
@@ -28,6 +28,7 @@ __export(base_exports, {
|
|
|
28
28
|
createNodeServer: () => import_node.createNodeServer,
|
|
29
29
|
createServerBase: () => createServerBase,
|
|
30
30
|
createStaticMiddleware: () => import_node.createStaticMiddleware,
|
|
31
|
+
createWebRequest: () => import_node.createWebRequest,
|
|
31
32
|
favionFallbackMiddleware: () => import_middlewares.favionFallbackMiddleware,
|
|
32
33
|
getRenderHandler: () => import_middlewares.getRenderHandler,
|
|
33
34
|
httpCallBack2HonoMid: () => import_node.httpCallBack2HonoMid,
|
|
@@ -62,6 +63,7 @@ function createServerBase(options) {
|
|
|
62
63
|
createNodeServer,
|
|
63
64
|
createServerBase,
|
|
64
65
|
createStaticMiddleware,
|
|
66
|
+
createWebRequest,
|
|
65
67
|
favionFallbackMiddleware,
|
|
66
68
|
getRenderHandler,
|
|
67
69
|
httpCallBack2HonoMid,
|
|
@@ -28,6 +28,10 @@ var import_constants = require("../../constants");
|
|
|
28
28
|
var import_context = require("./context");
|
|
29
29
|
const noop = () => {
|
|
30
30
|
};
|
|
31
|
+
const isHtmlResponse = (response) => {
|
|
32
|
+
const contentType = response.headers.get("content-type");
|
|
33
|
+
return contentType === null || contentType === void 0 ? void 0 : contentType.includes("text/html");
|
|
34
|
+
};
|
|
31
35
|
class CustomServer {
|
|
32
36
|
getHookMiddleware(entryName, routes) {
|
|
33
37
|
return async (c, next) => {
|
|
@@ -61,7 +65,7 @@ class CustomServer {
|
|
|
61
65
|
return void 0;
|
|
62
66
|
}
|
|
63
67
|
await next();
|
|
64
|
-
if (c.finalized && !c.res.body) {
|
|
68
|
+
if (c.finalized && (!c.res.body || !isHtmlResponse(c.res))) {
|
|
65
69
|
return void 0;
|
|
66
70
|
}
|
|
67
71
|
if (routeInfo.isStream) {
|
|
@@ -28,7 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var dataHandler_exports = {};
|
|
30
30
|
__export(dataHandler_exports, {
|
|
31
|
-
bindDataHandlers: () => bindDataHandlers
|
|
31
|
+
bindDataHandlers: () => bindDataHandlers,
|
|
32
|
+
createDataHandlers: () => createDataHandlers,
|
|
33
|
+
dataHandler: () => dataHandler
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(dataHandler_exports);
|
|
34
36
|
var import_utils = require("@modern-js/utils");
|
|
@@ -40,6 +42,16 @@ const bindDataHandlers = async (server, routes, distDir) => {
|
|
|
40
42
|
server.all(`${route.urlPath === "/" ? "*" : `${route.urlPath}/*`}`, createDataHandler(routes, bundlePath));
|
|
41
43
|
});
|
|
42
44
|
};
|
|
45
|
+
const createDataHandlers = async (routes, distDir) => {
|
|
46
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
47
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
48
|
+
routes.forEach((route) => {
|
|
49
|
+
const bundlePath = path.join(distDir, import_utils.SERVER_BUNDLE_DIRECTORY, `${route.entryName || import_utils.MAIN_ENTRY_NAME}-server-loaders.js`);
|
|
50
|
+
const dataHandler2 = createDataHandler(routes, bundlePath);
|
|
51
|
+
handlers.set(`${route.entryName || import_utils.MAIN_ENTRY_NAME}`, dataHandler2);
|
|
52
|
+
});
|
|
53
|
+
return handlers;
|
|
54
|
+
};
|
|
43
55
|
const createDataHandler = (serverRoutes, buildModulePath) => {
|
|
44
56
|
return async (context, next) => {
|
|
45
57
|
let buildModule;
|
|
@@ -63,7 +75,30 @@ const createDataHandler = (serverRoutes, buildModulePath) => {
|
|
|
63
75
|
return response ? response : next();
|
|
64
76
|
};
|
|
65
77
|
};
|
|
78
|
+
const dataHandler = async (request, { routeInfo, serverRoutes, pwd, reporter, logger }) => {
|
|
79
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
80
|
+
const serverLoaderBundlePath = path.join(pwd, import_utils.SERVER_BUNDLE_DIRECTORY, `${routeInfo.entryName || import_utils.MAIN_ENTRY_NAME}-server-loaders.js`);
|
|
81
|
+
let serverLoaderModule;
|
|
82
|
+
try {
|
|
83
|
+
serverLoaderModule = await Promise.resolve().then(() => __toESM(require(serverLoaderBundlePath)));
|
|
84
|
+
} catch (_) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const { routes, handleRequest } = serverLoaderModule;
|
|
88
|
+
const response = await handleRequest({
|
|
89
|
+
request,
|
|
90
|
+
serverRoutes,
|
|
91
|
+
context: {
|
|
92
|
+
logger,
|
|
93
|
+
reporter
|
|
94
|
+
},
|
|
95
|
+
routes
|
|
96
|
+
});
|
|
97
|
+
return response;
|
|
98
|
+
};
|
|
66
99
|
// Annotate the CommonJS export names for ESM import in node:
|
|
67
100
|
0 && (module.exports = {
|
|
68
|
-
bindDataHandlers
|
|
101
|
+
bindDataHandlers,
|
|
102
|
+
createDataHandlers,
|
|
103
|
+
dataHandler
|
|
69
104
|
});
|
|
@@ -44,7 +44,7 @@ function createRenderHandler(render) {
|
|
|
44
44
|
return res;
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
function getRenderHandler(options) {
|
|
47
|
+
async function getRenderHandler(options) {
|
|
48
48
|
const { routes, pwd, config } = options;
|
|
49
49
|
if (routes && routes.length > 0) {
|
|
50
50
|
var _config_server, _options_config_security;
|
|
@@ -81,8 +81,8 @@ async function bindRenderHandler(server, options) {
|
|
|
81
81
|
const customServerMiddleware = customServer.getServerMiddleware();
|
|
82
82
|
server.use(urlPath, customServerMiddleware);
|
|
83
83
|
}
|
|
84
|
-
const render = getRenderHandler(options);
|
|
85
|
-
render && server.
|
|
84
|
+
const render = await getRenderHandler(options);
|
|
85
|
+
render && server.all("*", createRenderHandler(render));
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -24,8 +24,9 @@ module.exports = __toCommonJS(render_exports);
|
|
|
24
24
|
var import_utils = require("@modern-js/utils");
|
|
25
25
|
var import_request = require("../../utils/request");
|
|
26
26
|
var import_utils2 = require("../../utils");
|
|
27
|
+
var import_dataHandler = require("../dataHandler");
|
|
27
28
|
var import_ssrRender = require("./ssrRender");
|
|
28
|
-
function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
|
|
29
|
+
async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
|
|
29
30
|
return async (req, { logger, nodeReq, reporter, tpls }) => {
|
|
30
31
|
const routeInfo = matchRoute(req, routes);
|
|
31
32
|
if (!routeInfo) {
|
|
@@ -41,7 +42,7 @@ function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }
|
|
|
41
42
|
throw new Error(`Can't found entry ${routeInfo.entryName} html `);
|
|
42
43
|
}
|
|
43
44
|
const renderMode = getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR);
|
|
44
|
-
|
|
45
|
+
const renderOptions = {
|
|
45
46
|
pwd,
|
|
46
47
|
mode: "string",
|
|
47
48
|
html,
|
|
@@ -51,8 +52,23 @@ function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }
|
|
|
51
52
|
nonce,
|
|
52
53
|
logger,
|
|
53
54
|
nodeReq,
|
|
54
|
-
reporter
|
|
55
|
-
|
|
55
|
+
reporter,
|
|
56
|
+
serverRoutes: routes
|
|
57
|
+
};
|
|
58
|
+
switch (renderMode) {
|
|
59
|
+
case "data":
|
|
60
|
+
let response = await (0, import_dataHandler.dataHandler)(req, renderOptions);
|
|
61
|
+
if (!response) {
|
|
62
|
+
response = await (0, import_ssrRender.ssrRender)(req, renderOptions);
|
|
63
|
+
}
|
|
64
|
+
return response;
|
|
65
|
+
case "ssr":
|
|
66
|
+
return (0, import_ssrRender.ssrRender)(req, renderOptions);
|
|
67
|
+
case "csr":
|
|
68
|
+
return csrRender(html);
|
|
69
|
+
default:
|
|
70
|
+
throw new Error(`Unknown render mode: ${renderMode}`);
|
|
71
|
+
}
|
|
56
72
|
};
|
|
57
73
|
}
|
|
58
74
|
function matchRoute(req, routes) {
|
|
@@ -68,6 +84,9 @@ function matchRoute(req, routes) {
|
|
|
68
84
|
function getRenderMode(req, framework, isSSR, forceCSR) {
|
|
69
85
|
const query = (0, import_request.parseQuery)(req);
|
|
70
86
|
if (isSSR) {
|
|
87
|
+
if (query.__loader) {
|
|
88
|
+
return "data";
|
|
89
|
+
}
|
|
71
90
|
if (forceCSR && (query.csr || req.headers.get(`x-${(0, import_utils.cutNameByHyphen)(framework)}-ssr-fallback`))) {
|
|
72
91
|
return "csr";
|
|
73
92
|
}
|
|
@@ -14,13 +14,13 @@ const bindBFFHandler = async (server, options) => {
|
|
|
14
14
|
await runner.gather(collector);
|
|
15
15
|
const webOnly = await isWebOnly();
|
|
16
16
|
let handler;
|
|
17
|
-
const renderHandler = getRenderHandler(options);
|
|
18
17
|
if (webOnly) {
|
|
19
18
|
handler = async (c, next) => {
|
|
20
19
|
c.body("");
|
|
21
20
|
await next();
|
|
22
21
|
};
|
|
23
22
|
} else {
|
|
23
|
+
const renderHandler = enableHandleWeb ? await getRenderHandler(options) : null;
|
|
24
24
|
handler = await server.runner.prepareApiServer({
|
|
25
25
|
pwd: options.pwd,
|
|
26
26
|
prefix,
|
|
@@ -19,7 +19,7 @@ async function getHtmlTemplates(pwd, routes) {
|
|
|
19
19
|
}
|
|
20
20
|
function createInjectHtml(pwd, routes) {
|
|
21
21
|
return async (c, next) => {
|
|
22
|
-
if (
|
|
22
|
+
if (!c.get("templates") && routes) {
|
|
23
23
|
const templates = await getHtmlTemplates(pwd, routes);
|
|
24
24
|
c.set("templates", templates);
|
|
25
25
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createServer, ServerResponse } from "node:http";
|
|
2
|
-
import { writeReadableStreamToWritable } from "./polyfills/stream";
|
|
2
|
+
import { createReadableStreamFromReadable, writeReadableStreamToWritable } from "./polyfills/stream";
|
|
3
3
|
import { installGlobals } from "./polyfills/install";
|
|
4
4
|
installGlobals();
|
|
5
5
|
const createWebRequest = (req, res) => {
|
|
6
|
+
var _req_url;
|
|
6
7
|
const headerRecord = [];
|
|
7
8
|
const len = req.rawHeaders.length;
|
|
8
9
|
for (let i = 0; i < len; i += 2) {
|
|
@@ -19,6 +20,10 @@ const createWebRequest = (req, res) => {
|
|
|
19
20
|
signal: controller.signal
|
|
20
21
|
};
|
|
21
22
|
res.on("close", () => controller.abort());
|
|
23
|
+
if (!(method === "GET" || method === "HEAD") && ((_req_url = req.url) === null || _req_url === void 0 ? void 0 : _req_url.includes("__loader"))) {
|
|
24
|
+
init.body = createReadableStreamFromReadable(req);
|
|
25
|
+
init.duplex = "half";
|
|
26
|
+
}
|
|
22
27
|
const url = `http://${req.headers.host}${req.url}`;
|
|
23
28
|
const request = new Request(url, init);
|
|
24
29
|
return request;
|
package/dist/esm/base/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ServerBase } from "./serverBase";
|
|
2
2
|
import { createErrorHtml } from "./utils";
|
|
3
3
|
import { AGGRED_DIR } from "./constants";
|
|
4
|
-
import { httpCallBack2HonoMid, createNodeServer, loadServerEnv, connectMid2HonoMid, sendResponse, createStaticMiddleware, bindBFFHandler, registerMockHandlers, createInjectHtml } from "./adapters/node";
|
|
4
|
+
import { httpCallBack2HonoMid, createNodeServer, loadServerEnv, connectMid2HonoMid, sendResponse, createStaticMiddleware, bindBFFHandler, registerMockHandlers, createInjectHtml, createWebRequest } from "./adapters/node";
|
|
5
5
|
import { favionFallbackMiddleware, bindDataHandlers, injectReporter, getRenderHandler, injectLogger, bindRenderHandler } from "./middlewares";
|
|
6
6
|
function createServerBase(options) {
|
|
7
7
|
if (options == null) {
|
|
@@ -21,6 +21,7 @@ export {
|
|
|
21
21
|
createNodeServer,
|
|
22
22
|
createServerBase,
|
|
23
23
|
createStaticMiddleware,
|
|
24
|
+
createWebRequest,
|
|
24
25
|
favionFallbackMiddleware,
|
|
25
26
|
getRenderHandler,
|
|
26
27
|
httpCallBack2HonoMid,
|
|
@@ -5,6 +5,10 @@ import { ServerReportTimings } from "../../constants";
|
|
|
5
5
|
import { createAfterMatchCtx, createAfterRenderCtx, createCustomMiddlewaresCtx, createAfterStreamingRenderContext } from "./context";
|
|
6
6
|
const noop = () => {
|
|
7
7
|
};
|
|
8
|
+
const isHtmlResponse = (response) => {
|
|
9
|
+
const contentType = response.headers.get("content-type");
|
|
10
|
+
return contentType === null || contentType === void 0 ? void 0 : contentType.includes("text/html");
|
|
11
|
+
};
|
|
8
12
|
class CustomServer {
|
|
9
13
|
getHookMiddleware(entryName, routes) {
|
|
10
14
|
return async (c, next) => {
|
|
@@ -38,7 +42,7 @@ class CustomServer {
|
|
|
38
42
|
return void 0;
|
|
39
43
|
}
|
|
40
44
|
await next();
|
|
41
|
-
if (c.finalized && !c.res.body) {
|
|
45
|
+
if (c.finalized && (!c.res.body || !isHtmlResponse(c.res))) {
|
|
42
46
|
return void 0;
|
|
43
47
|
}
|
|
44
48
|
if (routeInfo.isStream) {
|
|
@@ -7,6 +7,16 @@ const bindDataHandlers = async (server, routes, distDir) => {
|
|
|
7
7
|
server.all(`${route.urlPath === "/" ? "*" : `${route.urlPath}/*`}`, createDataHandler(routes, bundlePath));
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
const createDataHandlers = async (routes, distDir) => {
|
|
11
|
+
const path = await getPathModule();
|
|
12
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
13
|
+
routes.forEach((route) => {
|
|
14
|
+
const bundlePath = path.join(distDir, SERVER_BUNDLE_DIRECTORY, `${route.entryName || MAIN_ENTRY_NAME}-server-loaders.js`);
|
|
15
|
+
const dataHandler2 = createDataHandler(routes, bundlePath);
|
|
16
|
+
handlers.set(`${route.entryName || MAIN_ENTRY_NAME}`, dataHandler2);
|
|
17
|
+
});
|
|
18
|
+
return handlers;
|
|
19
|
+
};
|
|
10
20
|
const createDataHandler = (serverRoutes, buildModulePath) => {
|
|
11
21
|
return async (context, next) => {
|
|
12
22
|
let buildModule;
|
|
@@ -30,6 +40,29 @@ const createDataHandler = (serverRoutes, buildModulePath) => {
|
|
|
30
40
|
return response ? response : next();
|
|
31
41
|
};
|
|
32
42
|
};
|
|
43
|
+
const dataHandler = async (request, { routeInfo, serverRoutes, pwd, reporter, logger }) => {
|
|
44
|
+
const path = await getPathModule();
|
|
45
|
+
const serverLoaderBundlePath = path.join(pwd, SERVER_BUNDLE_DIRECTORY, `${routeInfo.entryName || MAIN_ENTRY_NAME}-server-loaders.js`);
|
|
46
|
+
let serverLoaderModule;
|
|
47
|
+
try {
|
|
48
|
+
serverLoaderModule = await import(serverLoaderBundlePath);
|
|
49
|
+
} catch (_) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const { routes, handleRequest } = serverLoaderModule;
|
|
53
|
+
const response = await handleRequest({
|
|
54
|
+
request,
|
|
55
|
+
serverRoutes,
|
|
56
|
+
context: {
|
|
57
|
+
logger,
|
|
58
|
+
reporter
|
|
59
|
+
},
|
|
60
|
+
routes
|
|
61
|
+
});
|
|
62
|
+
return response;
|
|
63
|
+
};
|
|
33
64
|
export {
|
|
34
|
-
bindDataHandlers
|
|
65
|
+
bindDataHandlers,
|
|
66
|
+
createDataHandlers,
|
|
67
|
+
dataHandler
|
|
35
68
|
};
|
|
@@ -20,7 +20,7 @@ function createRenderHandler(render) {
|
|
|
20
20
|
return res;
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
function getRenderHandler(options) {
|
|
23
|
+
async function getRenderHandler(options) {
|
|
24
24
|
const { routes, pwd, config } = options;
|
|
25
25
|
if (routes && routes.length > 0) {
|
|
26
26
|
var _config_server, _options_config_security;
|
|
@@ -57,8 +57,8 @@ async function bindRenderHandler(server, options) {
|
|
|
57
57
|
const customServerMiddleware = customServer.getServerMiddleware();
|
|
58
58
|
server.use(urlPath, customServerMiddleware);
|
|
59
59
|
}
|
|
60
|
-
const render = getRenderHandler(options);
|
|
61
|
-
render && server.
|
|
60
|
+
const render = await getRenderHandler(options);
|
|
61
|
+
render && server.all("*", createRenderHandler(render));
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
export {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { cutNameByHyphen } from "@modern-js/utils";
|
|
2
2
|
import { parseQuery } from "../../utils/request";
|
|
3
3
|
import { createErrorHtml, sortRoutes } from "../../utils";
|
|
4
|
+
import { dataHandler } from "../dataHandler";
|
|
4
5
|
import { ssrRender } from "./ssrRender";
|
|
5
|
-
function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
|
|
6
|
+
async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
|
|
6
7
|
return async (req, { logger, nodeReq, reporter, tpls }) => {
|
|
7
8
|
const routeInfo = matchRoute(req, routes);
|
|
8
9
|
if (!routeInfo) {
|
|
@@ -18,7 +19,7 @@ function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }
|
|
|
18
19
|
throw new Error(`Can't found entry ${routeInfo.entryName} html `);
|
|
19
20
|
}
|
|
20
21
|
const renderMode = getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR);
|
|
21
|
-
|
|
22
|
+
const renderOptions = {
|
|
22
23
|
pwd,
|
|
23
24
|
mode: "string",
|
|
24
25
|
html,
|
|
@@ -28,8 +29,23 @@ function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }
|
|
|
28
29
|
nonce,
|
|
29
30
|
logger,
|
|
30
31
|
nodeReq,
|
|
31
|
-
reporter
|
|
32
|
-
|
|
32
|
+
reporter,
|
|
33
|
+
serverRoutes: routes
|
|
34
|
+
};
|
|
35
|
+
switch (renderMode) {
|
|
36
|
+
case "data":
|
|
37
|
+
let response = await dataHandler(req, renderOptions);
|
|
38
|
+
if (!response) {
|
|
39
|
+
response = await ssrRender(req, renderOptions);
|
|
40
|
+
}
|
|
41
|
+
return response;
|
|
42
|
+
case "ssr":
|
|
43
|
+
return ssrRender(req, renderOptions);
|
|
44
|
+
case "csr":
|
|
45
|
+
return csrRender(html);
|
|
46
|
+
default:
|
|
47
|
+
throw new Error(`Unknown render mode: ${renderMode}`);
|
|
48
|
+
}
|
|
33
49
|
};
|
|
34
50
|
}
|
|
35
51
|
function matchRoute(req, routes) {
|
|
@@ -45,6 +61,9 @@ function matchRoute(req, routes) {
|
|
|
45
61
|
function getRenderMode(req, framework, isSSR, forceCSR) {
|
|
46
62
|
const query = parseQuery(req);
|
|
47
63
|
if (isSSR) {
|
|
64
|
+
if (query.__loader) {
|
|
65
|
+
return "data";
|
|
66
|
+
}
|
|
48
67
|
if (forceCSR && (query.csr || req.headers.get(`x-${cutNameByHyphen(framework)}-ssr-fallback`))) {
|
|
49
68
|
return "csr";
|
|
50
69
|
}
|
|
@@ -2,7 +2,7 @@ import type { ServerBaseOptions, Next, Middleware, HonoEnv } from '../core/serve
|
|
|
2
2
|
import { ServerBase } from './serverBase';
|
|
3
3
|
export { createErrorHtml } from './utils';
|
|
4
4
|
export { AGGRED_DIR } from './constants';
|
|
5
|
-
export { httpCallBack2HonoMid, createNodeServer, loadServerEnv, connectMid2HonoMid, sendResponse, createStaticMiddleware, bindBFFHandler, registerMockHandlers, createInjectHtml, } from './adapters/node';
|
|
5
|
+
export { httpCallBack2HonoMid, createNodeServer, loadServerEnv, connectMid2HonoMid, sendResponse, createStaticMiddleware, bindBFFHandler, registerMockHandlers, createInjectHtml, createWebRequest, } from './adapters/node';
|
|
6
6
|
export { favionFallbackMiddleware, bindDataHandlers, injectReporter, getRenderHandler, injectLogger, bindRenderHandler, } from './middlewares';
|
|
7
7
|
export type { BindRenderHandleOptions } from './middlewares';
|
|
8
8
|
export declare function createServerBase<E extends HonoEnv>(options: ServerBaseOptions): ServerBase<E>;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { ServerRoute } from '@modern-js/types';
|
|
2
|
+
import { Middleware } from '../../core/server';
|
|
2
3
|
import type { ServerBase } from '../serverBase';
|
|
4
|
+
import { SSRRenderOptions } from './renderHandler/ssrRender';
|
|
3
5
|
export declare const bindDataHandlers: (server: ServerBase, routes: ServerRoute[], distDir: string) => Promise<void>;
|
|
6
|
+
export declare const createDataHandlers: (routes: ServerRoute[], distDir: string) => Promise<Map<string, Middleware>>;
|
|
7
|
+
export declare const dataHandler: (request: Request, { routeInfo, serverRoutes, pwd, reporter, logger, }: SSRRenderOptions & {
|
|
8
|
+
serverRoutes: ServerRoute[];
|
|
9
|
+
}) => Promise<Response | void>;
|
|
@@ -5,5 +5,5 @@ export type BindRenderHandleOptions = {
|
|
|
5
5
|
metaName?: string;
|
|
6
6
|
staticGenerate?: boolean;
|
|
7
7
|
};
|
|
8
|
-
export declare function getRenderHandler(options: ServerBaseOptions & BindRenderHandleOptions): Render | null
|
|
8
|
+
export declare function getRenderHandler(options: ServerBaseOptions & BindRenderHandleOptions): Promise<Render | null>;
|
|
9
9
|
export declare function bindRenderHandler(server: ServerBase, options: ServerBaseOptions & BindRenderHandleOptions): Promise<void>;
|
|
@@ -8,5 +8,5 @@ interface CreateRenderOptions {
|
|
|
8
8
|
forceCSR?: boolean;
|
|
9
9
|
nonce?: string;
|
|
10
10
|
}
|
|
11
|
-
export declare function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce, }: CreateRenderOptions): Render
|
|
11
|
+
export declare function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce, }: CreateRenderOptions): Promise<Render>;
|
|
12
12
|
export {};
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
/// <reference types="dist/types/core/server" />
|
|
3
3
|
import type { IncomingMessage } from 'http';
|
|
4
4
|
import type { Logger, Reporter, ServerRoute } from '@modern-js/types';
|
|
5
|
-
interface SSRRenderOptions {
|
|
5
|
+
export interface SSRRenderOptions {
|
|
6
6
|
pwd: string;
|
|
7
|
-
mode: 'string' | 'stream';
|
|
8
7
|
html: string;
|
|
9
8
|
routeInfo: ServerRoute;
|
|
10
9
|
staticGenerate: boolean;
|
|
@@ -15,4 +14,3 @@ interface SSRRenderOptions {
|
|
|
15
14
|
nonce?: string;
|
|
16
15
|
}
|
|
17
16
|
export declare function ssrRender(request: Request, { routeInfo, pwd, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, }: SSRRenderOptions): Promise<Response>;
|
|
18
|
-
export {};
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.47.1-alpha.
|
|
18
|
+
"version": "2.47.1-alpha.2",
|
|
19
19
|
"jsnext:source": "./src/index.ts",
|
|
20
20
|
"types": "./dist/types/index.d.ts",
|
|
21
21
|
"main": "./dist/cjs/index.js",
|
|
@@ -54,9 +54,9 @@
|
|
|
54
54
|
"hono": "^3.12.2",
|
|
55
55
|
"isbot": "3.8.0",
|
|
56
56
|
"merge-deep": "^3.0.3",
|
|
57
|
-
"@modern-js/
|
|
57
|
+
"@modern-js/utils": "2.47.0",
|
|
58
58
|
"@modern-js/runtime-utils": "2.47.0",
|
|
59
|
-
"@modern-js/
|
|
59
|
+
"@modern-js/plugin": "2.47.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/jest": "^29",
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
"jest": "^29",
|
|
67
67
|
"ts-jest": "^29.1.0",
|
|
68
68
|
"typescript": "^5",
|
|
69
|
-
"@scripts/build": "2.47.0",
|
|
70
69
|
"@modern-js/types": "2.47.0",
|
|
70
|
+
"@scripts/build": "2.47.0",
|
|
71
71
|
"@scripts/jest-config": "2.47.0"
|
|
72
72
|
},
|
|
73
73
|
"sideEffects": false,
|