@modern-js/prod-server 2.35.0 → 2.36.0
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/constants.js +33 -27
- package/dist/cjs/index.js +41 -33
- package/dist/cjs/libs/context/context.js +86 -36
- package/dist/cjs/libs/context/index.js +27 -17
- package/dist/cjs/libs/hook-api/base.js +49 -30
- package/dist/cjs/libs/hook-api/index.js +36 -28
- package/dist/cjs/libs/hook-api/index.worker.js +39 -31
- package/dist/cjs/libs/hook-api/route.js +28 -11
- package/dist/cjs/libs/hook-api/template.js +27 -17
- package/dist/cjs/libs/hook-api/templateForStream.js +31 -14
- package/dist/cjs/libs/loadConfig.js +46 -29
- package/dist/cjs/libs/metrics.js +24 -7
- package/dist/cjs/libs/preload/flushServerHeader.js +30 -13
- package/dist/cjs/libs/preload/index.js +22 -5
- package/dist/cjs/libs/preload/parseLinks.js +54 -30
- package/dist/cjs/libs/preload/shouldFlushServerHeader.js +25 -15
- package/dist/cjs/libs/preload/transformLinks2String.js +27 -11
- package/dist/cjs/libs/proxy.js +29 -19
- package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +40 -22
- package/dist/cjs/libs/render/cache/__tests__/cache.test.js +33 -41
- package/dist/cjs/libs/render/cache/__tests__/cacheable.js +24 -7
- package/dist/cjs/libs/render/cache/__tests__/error-configuration.js +24 -7
- package/dist/cjs/libs/render/cache/__tests__/matched-cache.js +24 -7
- package/dist/cjs/libs/render/cache/index.js +30 -18
- package/dist/cjs/libs/render/cache/page-caches/index.js +26 -9
- package/dist/cjs/libs/render/cache/page-caches/lru.js +39 -13
- package/dist/cjs/libs/render/cache/spr.js +62 -44
- package/dist/cjs/libs/render/cache/type.js +15 -3
- package/dist/cjs/libs/render/cache/util.js +49 -36
- package/dist/cjs/libs/render/index.js +56 -30
- package/dist/cjs/libs/render/measure.js +27 -17
- package/dist/cjs/libs/render/reader.js +50 -35
- package/dist/cjs/libs/render/ssr.js +52 -26
- package/dist/cjs/libs/render/static.js +44 -18
- package/dist/cjs/libs/render/type.js +24 -7
- package/dist/cjs/libs/render/utils.js +29 -19
- package/dist/cjs/libs/reporter.js +24 -7
- package/dist/cjs/libs/route/index.js +30 -20
- package/dist/cjs/libs/route/matcher.js +37 -20
- package/dist/cjs/libs/route/route.js +34 -17
- package/dist/cjs/libs/serveFile.js +40 -21
- package/dist/cjs/libs/serverTiming.js +27 -10
- package/dist/cjs/renderHtml.js +17 -20
- package/dist/cjs/server/index.js +74 -50
- package/dist/cjs/server/modernServer.js +136 -113
- package/dist/cjs/server/modernServerSplit.js +29 -12
- package/dist/cjs/type.js +15 -3
- package/dist/cjs/utils.js +41 -38
- package/dist/cjs/workerServer.js +48 -39
- package/dist/esm/constants.js +14 -6
- package/dist/esm/index.js +11 -5
- package/dist/esm/libs/context/context.js +33 -6
- package/dist/esm/libs/context/index.js +5 -2
- package/dist/esm/libs/hook-api/base.js +6 -2
- package/dist/esm/libs/hook-api/index.js +11 -5
- package/dist/esm/libs/hook-api/index.worker.js +16 -10
- package/dist/esm/libs/hook-api/route.js +4 -1
- package/dist/esm/libs/hook-api/template.js +6 -2
- package/dist/esm/libs/hook-api/templateForStream.js +4 -1
- package/dist/esm/libs/loadConfig.js +8 -3
- package/dist/esm/libs/metrics.js +3 -1
- package/dist/esm/libs/preload/flushServerHeader.js +9 -6
- package/dist/esm/libs/preload/parseLinks.js +13 -11
- package/dist/esm/libs/preload/shouldFlushServerHeader.js +6 -2
- package/dist/esm/libs/preload/transformLinks2String.js +5 -3
- package/dist/esm/libs/proxy.js +9 -5
- package/dist/esm/libs/render/cache/__tests__/cache.test.js +12 -12
- package/dist/esm/libs/render/cache/__tests__/cacheable.js +4 -1
- package/dist/esm/libs/render/cache/__tests__/error-configuration.js +4 -1
- package/dist/esm/libs/render/cache/__tests__/matched-cache.js +4 -1
- package/dist/esm/libs/render/cache/index.js +6 -3
- package/dist/esm/libs/render/cache/page-caches/index.js +5 -2
- package/dist/esm/libs/render/cache/page-caches/lru.js +4 -1
- package/dist/esm/libs/render/cache/spr.js +13 -9
- package/dist/esm/libs/render/cache/type.js +0 -1
- package/dist/esm/libs/render/cache/util.js +18 -8
- package/dist/esm/libs/render/index.js +17 -11
- package/dist/esm/libs/render/measure.js +15 -11
- package/dist/esm/libs/render/reader.js +17 -10
- package/dist/esm/libs/render/ssr.js +11 -8
- package/dist/esm/libs/render/static.js +5 -2
- package/dist/esm/libs/render/type.js +4 -1
- package/dist/esm/libs/render/utils.js +6 -2
- package/dist/esm/libs/reporter.js +4 -1
- package/dist/esm/libs/route/index.js +5 -2
- package/dist/esm/libs/route/matcher.js +6 -3
- package/dist/esm/libs/route/route.js +4 -1
- package/dist/esm/libs/serveFile.js +6 -2
- package/dist/esm/libs/serverTiming.js +4 -1
- package/dist/esm/renderHtml.js +133 -124
- package/dist/esm/server/index.js +14 -13
- package/dist/esm/server/modernServer.js +39 -47
- package/dist/esm/server/modernServerSplit.js +4 -1
- package/dist/esm/type.js +0 -1
- package/dist/esm/utils.js +23 -12
- package/dist/esm/workerServer.js +25 -22
- package/dist/esm-node/constants.js +14 -6
- package/dist/esm-node/index.js +11 -5
- package/dist/esm-node/libs/context/context.js +33 -6
- package/dist/esm-node/libs/context/index.js +5 -2
- package/dist/esm-node/libs/hook-api/base.js +6 -2
- package/dist/esm-node/libs/hook-api/index.js +10 -4
- package/dist/esm-node/libs/hook-api/index.worker.js +10 -4
- package/dist/esm-node/libs/hook-api/route.js +4 -1
- package/dist/esm-node/libs/hook-api/template.js +6 -2
- package/dist/esm-node/libs/hook-api/templateForStream.js +4 -1
- package/dist/esm-node/libs/loadConfig.js +8 -3
- package/dist/esm-node/libs/metrics.js +3 -1
- package/dist/esm-node/libs/preload/flushServerHeader.js +6 -3
- package/dist/esm-node/libs/preload/parseLinks.js +11 -9
- package/dist/esm-node/libs/preload/shouldFlushServerHeader.js +6 -2
- package/dist/esm-node/libs/preload/transformLinks2String.js +5 -3
- package/dist/esm-node/libs/proxy.js +6 -2
- package/dist/esm-node/libs/render/cache/__tests__/cache.test.js +7 -12
- package/dist/esm-node/libs/render/cache/__tests__/cacheable.js +4 -1
- package/dist/esm-node/libs/render/cache/__tests__/error-configuration.js +4 -1
- package/dist/esm-node/libs/render/cache/__tests__/matched-cache.js +4 -1
- package/dist/esm-node/libs/render/cache/index.js +5 -3
- package/dist/esm-node/libs/render/cache/page-caches/index.js +4 -1
- package/dist/esm-node/libs/render/cache/page-caches/lru.js +4 -1
- package/dist/esm-node/libs/render/cache/spr.js +7 -4
- package/dist/esm-node/libs/render/cache/type.js +0 -1
- package/dist/esm-node/libs/render/cache/util.js +18 -8
- package/dist/esm-node/libs/render/index.js +7 -3
- package/dist/esm-node/libs/render/measure.js +6 -2
- package/dist/esm-node/libs/render/reader.js +13 -7
- package/dist/esm-node/libs/render/ssr.js +4 -1
- package/dist/esm-node/libs/render/static.js +4 -1
- package/dist/esm-node/libs/render/type.js +4 -1
- package/dist/esm-node/libs/render/utils.js +6 -2
- package/dist/esm-node/libs/reporter.js +4 -1
- package/dist/esm-node/libs/route/index.js +5 -2
- package/dist/esm-node/libs/route/matcher.js +6 -3
- package/dist/esm-node/libs/route/route.js +4 -1
- package/dist/esm-node/libs/serveFile.js +6 -2
- package/dist/esm-node/libs/serverTiming.js +4 -1
- package/dist/esm-node/renderHtml.js +72 -63
- package/dist/esm-node/server/index.js +11 -10
- package/dist/esm-node/server/modernServer.js +29 -28
- package/dist/esm-node/server/modernServerSplit.js +4 -1
- package/dist/esm-node/type.js +0 -1
- package/dist/esm-node/utils.js +20 -9
- package/dist/esm-node/workerServer.js +12 -9
- package/dist/types/libs/context/context.d.ts +2 -1
- package/dist/types/type.d.ts +1 -0
- package/dist/types/utils.d.ts +1 -1
- package/package.json +9 -8
- package/dist/cjs/libs/logger.js +0 -123
- package/dist/esm/libs/logger.js +0 -125
- package/dist/esm-node/libs/logger.js +0 -106
- package/dist/types/libs/logger.d.ts +0 -61
|
@@ -6,7 +6,8 @@ import { handleDirectory } from "./static";
|
|
|
6
6
|
import { readFile } from "./reader";
|
|
7
7
|
import * as ssr from "./ssr";
|
|
8
8
|
import { injectServerData } from "./utils";
|
|
9
|
-
|
|
9
|
+
const calcFallback = (metaName) => `x-${cutNameByHyphen(metaName)}-ssr-fallback`;
|
|
10
|
+
const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, nonce, ssrRender, metaName = "modern-js" }) => async function render({ ctx, route, runner }) {
|
|
10
11
|
if (ctx.resHasHandled()) {
|
|
11
12
|
return null;
|
|
12
13
|
}
|
|
@@ -21,7 +22,7 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
|
|
|
21
22
|
if (!content) {
|
|
22
23
|
return null;
|
|
23
24
|
}
|
|
24
|
-
const useCSR = forceCSR && (ctx.query.csr || ctx.headers[
|
|
25
|
+
const useCSR = forceCSR && (ctx.query.csr || ctx.headers[calcFallback(metaName)]);
|
|
25
26
|
if (route.isSSR && !useCSR) {
|
|
26
27
|
try {
|
|
27
28
|
const userAgent = ctx.getReqHeader("User-Agent");
|
|
@@ -59,7 +60,7 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
|
|
|
59
60
|
return result;
|
|
60
61
|
} catch (err) {
|
|
61
62
|
ctx.error(ERROR_DIGEST.ERENDER, err.stack || err.message);
|
|
62
|
-
ctx.res.set(
|
|
63
|
+
ctx.res.set(calcFallback(metaName), "1");
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
return {
|
|
@@ -67,3 +68,6 @@ export const createRenderHandler = ({ distDir, staticGenerate, conf, forceCSR, n
|
|
|
67
68
|
contentType: mime.contentType(path.extname(templatePath))
|
|
68
69
|
};
|
|
69
70
|
};
|
|
71
|
+
export {
|
|
72
|
+
createRenderHandler
|
|
73
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { headersWithoutCookie } from "../../utils";
|
|
2
|
-
|
|
2
|
+
const createMetrics = (context, metrics) => {
|
|
3
3
|
const { entryName: entry, request } = context;
|
|
4
4
|
const { pathname = "" } = request || {};
|
|
5
5
|
const emitTimer = (name, cost, tags = {}) => {
|
|
@@ -21,7 +21,7 @@ export const createMetrics = (context, metrics) => {
|
|
|
21
21
|
emitCounter
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
|
-
|
|
24
|
+
const createLogger = (serverContext, logger) => {
|
|
25
25
|
const request = serverContext.request || {};
|
|
26
26
|
const { headers = {}, pathname = "" } = request;
|
|
27
27
|
const debug = (message, ...args) => {
|
|
@@ -43,3 +43,7 @@ export const createLogger = (serverContext, logger) => {
|
|
|
43
43
|
debug
|
|
44
44
|
};
|
|
45
45
|
};
|
|
46
|
+
export {
|
|
47
|
+
createLogger,
|
|
48
|
+
createMetrics
|
|
49
|
+
};
|
|
@@ -11,7 +11,7 @@ const createCacheItem = async (content, mtime) => {
|
|
|
11
11
|
mtime
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
class LruReader {
|
|
15
15
|
init(fs) {
|
|
16
16
|
this.fs = fs || extraFS;
|
|
17
17
|
}
|
|
@@ -71,17 +71,23 @@ export class LruReader {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
const reader = new LruReader();
|
|
74
|
-
|
|
75
|
-
var _file;
|
|
74
|
+
const readFile = async (filepath) => {
|
|
76
75
|
const file = await reader.read(filepath);
|
|
77
|
-
return
|
|
76
|
+
return file === null || file === void 0 ? void 0 : file.content;
|
|
78
77
|
};
|
|
79
|
-
|
|
78
|
+
const updateFile = () => {
|
|
80
79
|
reader.update();
|
|
81
80
|
};
|
|
82
|
-
|
|
81
|
+
const init = (fs) => {
|
|
83
82
|
reader.init(fs);
|
|
84
83
|
};
|
|
85
|
-
|
|
84
|
+
const close = () => {
|
|
86
85
|
reader.close();
|
|
87
86
|
};
|
|
87
|
+
export {
|
|
88
|
+
LruReader,
|
|
89
|
+
close,
|
|
90
|
+
init,
|
|
91
|
+
readFile,
|
|
92
|
+
updateFile
|
|
93
|
+
};
|
|
@@ -3,7 +3,7 @@ import { fs, mime, LOADABLE_STATS_FILE, ROUTE_MANIFEST_FILE, SERVER_RENDER_FUNCT
|
|
|
3
3
|
import cache from "./cache";
|
|
4
4
|
import { createLogger, createMetrics } from "./measure";
|
|
5
5
|
import { injectServerDataStream, injectServerData } from "./utils";
|
|
6
|
-
|
|
6
|
+
const render = async (ctx, renderOptions, runner) => {
|
|
7
7
|
var _ctx_res;
|
|
8
8
|
const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false, nonce } = renderOptions;
|
|
9
9
|
const bundleJS = path.join(distDir, bundle);
|
|
@@ -73,3 +73,6 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
|
+
export {
|
|
77
|
+
render
|
|
78
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import { mime } from "@modern-js/utils";
|
|
3
3
|
import { readFile } from "./reader";
|
|
4
|
-
|
|
4
|
+
async function handleDirectory(ctx, entryPath, urlPath) {
|
|
5
5
|
const { path: pathname } = ctx;
|
|
6
6
|
const filepath = path.join(entryPath, trimLeft(pathname, urlPath));
|
|
7
7
|
let content = await readFile(filepath);
|
|
@@ -33,3 +33,6 @@ const trimLeft = (str, prefix) => {
|
|
|
33
33
|
}
|
|
34
34
|
return str;
|
|
35
35
|
};
|
|
36
|
+
export {
|
|
37
|
+
handleDirectory
|
|
38
|
+
};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
var RenderLevel;
|
|
2
2
|
(function(RenderLevel2) {
|
|
3
3
|
RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
|
|
4
4
|
RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
|
|
5
5
|
RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
|
|
6
6
|
})(RenderLevel || (RenderLevel = {}));
|
|
7
|
+
export {
|
|
8
|
+
RenderLevel
|
|
9
|
+
};
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { TemplateAPI } from "../hook-api/template";
|
|
2
2
|
import { templateInjectableStream } from "../hook-api/templateForStream";
|
|
3
|
-
|
|
3
|
+
const injectServerData = (content, context) => {
|
|
4
4
|
const template = new TemplateAPI(content);
|
|
5
5
|
template.prependHead(`<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(context.serverData)}</script>`);
|
|
6
6
|
return template.get();
|
|
7
7
|
};
|
|
8
|
-
|
|
8
|
+
const injectServerDataStream = (content, context) => {
|
|
9
9
|
return content.pipe(templateInjectableStream({
|
|
10
10
|
prependHead: `<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(context.serverData)}</script>`
|
|
11
11
|
}));
|
|
12
12
|
};
|
|
13
|
+
export {
|
|
14
|
+
injectServerData,
|
|
15
|
+
injectServerDataStream
|
|
16
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
2
|
import { RouteMatcher } from "./matcher";
|
|
3
|
-
|
|
3
|
+
class RouteMatchManager {
|
|
4
4
|
// get all routes matches pathname
|
|
5
5
|
filter(pathname) {
|
|
6
6
|
return this.matchers.reduce((matches, matcher) => {
|
|
@@ -54,4 +54,7 @@ export class RouteMatchManager {
|
|
|
54
54
|
this.matchers = [];
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
export {
|
|
57
|
+
export {
|
|
58
|
+
RouteMatchManager,
|
|
59
|
+
RouteMatcher
|
|
60
|
+
};
|
|
@@ -15,7 +15,7 @@ const toPath = (reg, params) => {
|
|
|
15
15
|
return fn(params);
|
|
16
16
|
};
|
|
17
17
|
const regCharsDetector = /[^a-zA-Z\-_0-9\/\.]/;
|
|
18
|
-
|
|
18
|
+
class RouteMatcher {
|
|
19
19
|
// generate modern route object
|
|
20
20
|
generate(url) {
|
|
21
21
|
const route = new ModernRoute(this.spec);
|
|
@@ -39,9 +39,9 @@ export class RouteMatcher {
|
|
|
39
39
|
if (!this.urlReg) {
|
|
40
40
|
return this.urlPath.length;
|
|
41
41
|
} else {
|
|
42
|
-
var _result_
|
|
42
|
+
var _result_;
|
|
43
43
|
const result = this.urlReg.exec(pathname);
|
|
44
|
-
return (
|
|
44
|
+
return (result === null || result === void 0 ? void 0 : (_result_ = result[0]) === null || _result_ === void 0 ? void 0 : _result_.length) || null;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
// if match url path
|
|
@@ -88,3 +88,6 @@ export class RouteMatcher {
|
|
|
88
88
|
this.setupUrlPath();
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
export {
|
|
92
|
+
RouteMatcher
|
|
93
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
-
|
|
2
|
+
class ModernRoute {
|
|
3
3
|
constructor(routeSpec) {
|
|
4
4
|
_define_property(this, "entryName", void 0);
|
|
5
5
|
_define_property(this, "urlPath", void 0);
|
|
@@ -20,3 +20,6 @@ export class ModernRoute {
|
|
|
20
20
|
this.responseHeaders = routeSpec.responseHeaders;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
export {
|
|
24
|
+
ModernRoute
|
|
25
|
+
};
|
|
@@ -12,7 +12,7 @@ const removedPrefix = (req, prefix) => {
|
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
};
|
|
15
|
-
|
|
15
|
+
const faviconFallbackHandler = (context, next) => {
|
|
16
16
|
if (context.url === "/favicon.ico") {
|
|
17
17
|
context.res.statusCode = 204;
|
|
18
18
|
context.res.end();
|
|
@@ -20,7 +20,7 @@ export const faviconFallbackHandler = (context, next) => {
|
|
|
20
20
|
next();
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
|
|
23
|
+
const createStaticFileHandler = (rules, assetPrefix = "/") => (
|
|
24
24
|
// eslint-disable-next-line consistent-return
|
|
25
25
|
async (context, next) => {
|
|
26
26
|
const { url: requestUrl, req, res } = context;
|
|
@@ -43,3 +43,7 @@ export const createStaticFileHandler = (rules, assetPrefix = "/") => (
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
);
|
|
46
|
+
export {
|
|
47
|
+
createStaticFileHandler,
|
|
48
|
+
faviconFallbackHandler
|
|
49
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
2
|
const SERVER_TIMING = "Server-Timing";
|
|
3
|
-
|
|
3
|
+
class ServerTiming {
|
|
4
4
|
addServeTiming(name, dur, desc) {
|
|
5
5
|
const _name = `bd-${this.meta}-${name}`;
|
|
6
6
|
const serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
|
|
@@ -15,3 +15,6 @@ export class ServerTiming {
|
|
|
15
15
|
this.res = res;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
export {
|
|
19
|
+
ServerTiming
|
|
20
|
+
};
|
|
@@ -1,71 +1,80 @@
|
|
|
1
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
4
|
+
};
|
|
1
5
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
6
|
import { OutgoingMessage } from "http";
|
|
3
7
|
import { Readable } from "stream";
|
|
4
8
|
import { Socket } from "net";
|
|
5
9
|
import { Server } from "./server";
|
|
6
10
|
import { isRedirect } from "./utils";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
method,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
49
|
-
if (body) {
|
|
50
|
-
req.push(body);
|
|
51
|
-
req.push(null);
|
|
52
|
-
}
|
|
53
|
-
const res = new ServerResponseLike();
|
|
54
|
-
const customServer = new CustomServer(serverOptions);
|
|
55
|
-
await customServer.init({
|
|
56
|
-
disableHttpServer: true
|
|
57
|
-
});
|
|
58
|
-
customServer.render(req, res);
|
|
59
|
-
return new Promise((resolve) => {
|
|
60
|
-
res.addListener("finish", () => {
|
|
61
|
-
resolve({
|
|
62
|
-
headers: res.getHeaders(),
|
|
63
|
-
redirected: isRedirect(res.statusCode),
|
|
64
|
-
status: res.statusCode,
|
|
11
|
+
var require_renderHtml = __commonJS({
|
|
12
|
+
"src/renderHtml.ts"(exports, module) {
|
|
13
|
+
class IncomingMessageLike extends Readable {
|
|
14
|
+
constructor({ method, url, headers }) {
|
|
15
|
+
super();
|
|
16
|
+
_define_property(this, "headers", void 0);
|
|
17
|
+
_define_property(this, "method", void 0);
|
|
18
|
+
_define_property(this, "url", void 0);
|
|
19
|
+
_define_property(this, "socket", void 0);
|
|
20
|
+
this.socket = new Socket();
|
|
21
|
+
this.headers = headers || {};
|
|
22
|
+
this.headers.host = "localhost:8080";
|
|
23
|
+
this.method = method || "get";
|
|
24
|
+
this.url = url;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
class ServerResponseLike extends OutgoingMessage {
|
|
28
|
+
end(chunk, _encoding, cb) {
|
|
29
|
+
this.data.push(chunk.toString());
|
|
30
|
+
cb && cb();
|
|
31
|
+
this.emit("finish");
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
constructor() {
|
|
35
|
+
super();
|
|
36
|
+
_define_property(this, "statusCode", void 0);
|
|
37
|
+
_define_property(this, "data", void 0);
|
|
38
|
+
this.statusCode = 200;
|
|
39
|
+
this.data = [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
class CustomServer extends Server {
|
|
43
|
+
async render(req, res, _url) {
|
|
44
|
+
const handler = this.getRequestHandler();
|
|
45
|
+
handler(req, res);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function renderHtml({ url, method, headers, body, serverOptions }) {
|
|
50
|
+
const req = new IncomingMessageLike({
|
|
51
|
+
method,
|
|
65
52
|
url,
|
|
66
|
-
|
|
53
|
+
headers
|
|
54
|
+
});
|
|
55
|
+
if (body) {
|
|
56
|
+
req.push(body);
|
|
57
|
+
req.push(null);
|
|
58
|
+
}
|
|
59
|
+
const res = new ServerResponseLike();
|
|
60
|
+
const customServer = new CustomServer(serverOptions);
|
|
61
|
+
await customServer.init({
|
|
62
|
+
disableHttpServer: true
|
|
67
63
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
customServer.render(req, res);
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
res.addListener("finish", () => {
|
|
67
|
+
resolve({
|
|
68
|
+
headers: res.getHeaders(),
|
|
69
|
+
redirected: isRedirect(res.statusCode),
|
|
70
|
+
status: res.statusCode,
|
|
71
|
+
url,
|
|
72
|
+
body: res.data.join()
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
module.exports = renderHtml;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
export default require_renderHtml();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import { fs,
|
|
3
|
+
import { fs, createLogger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS, ensureAbsolutePath } from "@modern-js/utils";
|
|
4
4
|
import { serverManager, AppContext, ConfigContext, loadPlugins } from "@modern-js/server-core";
|
|
5
5
|
import { metrics as defaultMetrics } from "../libs/metrics";
|
|
6
6
|
import { loadConfig, getServerConfigPath, requireConfig } from "../libs/loadConfig";
|
|
7
7
|
import { debug } from "../utils";
|
|
8
8
|
import { createProdServer } from "./modernServerSplit";
|
|
9
|
-
|
|
9
|
+
class Server {
|
|
10
10
|
/**
|
|
11
11
|
* 初始化顺序
|
|
12
12
|
* - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
|
|
@@ -80,7 +80,7 @@ export class Server {
|
|
|
80
80
|
const { pwd, config } = options;
|
|
81
81
|
const { serverConfig } = this;
|
|
82
82
|
const finalServerConfig = this.runConfigHook(runner, serverConfig);
|
|
83
|
-
const resolvedConfigPath = path.join(
|
|
83
|
+
const resolvedConfigPath = ensureAbsolutePath(pwd, path.join(config.output.path || "dist", OUTPUT_CONFIG_FILE));
|
|
84
84
|
options.config = loadConfig({
|
|
85
85
|
cliConfig: config,
|
|
86
86
|
serverConfig: finalServerConfig,
|
|
@@ -92,8 +92,7 @@ export class Server {
|
|
|
92
92
|
}
|
|
93
93
|
listen(options, listener) {
|
|
94
94
|
const callback = () => {
|
|
95
|
-
|
|
96
|
-
(_listener = listener) === null || _listener === void 0 ? void 0 : _listener();
|
|
95
|
+
listener === null || listener === void 0 ? void 0 : listener();
|
|
97
96
|
};
|
|
98
97
|
if (typeof options === "object") {
|
|
99
98
|
if (process.env.PORT) {
|
|
@@ -143,7 +142,6 @@ export class Server {
|
|
|
143
142
|
});
|
|
144
143
|
}
|
|
145
144
|
initAppContext() {
|
|
146
|
-
var _appContext, _appContext1, _appContext2;
|
|
147
145
|
const { options } = this;
|
|
148
146
|
const { pwd: appDirectory, plugins = [], config, appContext } = options;
|
|
149
147
|
const serverPlugins = plugins.map((p) => ({
|
|
@@ -151,9 +149,9 @@ export class Server {
|
|
|
151
149
|
}));
|
|
152
150
|
return {
|
|
153
151
|
appDirectory,
|
|
154
|
-
apiDirectory:
|
|
155
|
-
lambdaDirectory:
|
|
156
|
-
sharedDirectory: (
|
|
152
|
+
apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
|
|
153
|
+
lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
|
|
154
|
+
sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
|
|
157
155
|
distDirectory: path.join(appDirectory, config.output.path || "dist"),
|
|
158
156
|
plugins: serverPlugins
|
|
159
157
|
};
|
|
@@ -182,7 +180,7 @@ export class Server {
|
|
|
182
180
|
_define_property(this, "app", void 0);
|
|
183
181
|
_define_property(this, "runner", void 0);
|
|
184
182
|
_define_property(this, "serverConfig", void 0);
|
|
185
|
-
options.logger = options.logger ||
|
|
183
|
+
options.logger = options.logger || createLogger({
|
|
186
184
|
level: "warn"
|
|
187
185
|
});
|
|
188
186
|
options.metrics = options.metrics || defaultMetrics;
|
|
@@ -190,3 +188,6 @@ export class Server {
|
|
|
190
188
|
this.serverConfig = {};
|
|
191
189
|
}
|
|
192
190
|
}
|
|
191
|
+
export {
|
|
192
|
+
Server
|
|
193
|
+
};
|
|
@@ -2,7 +2,7 @@ import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
|
2
2
|
import { createServer } from "http";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { fs, isPromise, isWebOnly, mime, ROUTE_SPEC_FILE } from "@modern-js/utils";
|
|
5
|
-
import { time } from "@modern-js/utils/
|
|
5
|
+
import { time } from "@modern-js/runtime-utils/time";
|
|
6
6
|
import { RouteMatchManager } from "../libs/route";
|
|
7
7
|
import { createRenderHandler } from "../libs/render";
|
|
8
8
|
import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serveFile";
|
|
@@ -13,10 +13,10 @@ import { createContext } from "../libs/context";
|
|
|
13
13
|
import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE, ServerReportTimings } from "../constants";
|
|
14
14
|
import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
|
|
15
15
|
const SERVER_DIR = "./server";
|
|
16
|
-
|
|
16
|
+
class ModernServer {
|
|
17
17
|
// server prepare
|
|
18
18
|
async onInit(runner, app) {
|
|
19
|
-
var _conf_bff,
|
|
19
|
+
var _conf_bff, _this_conf_output;
|
|
20
20
|
this.runner = runner;
|
|
21
21
|
const { distDir, conf } = this;
|
|
22
22
|
this.initReader();
|
|
@@ -28,7 +28,7 @@ export class ModernServer {
|
|
|
28
28
|
this.addHandler(handler);
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
app === null || app === void 0 ? void 0 : app.on("close", () => {
|
|
32
32
|
this.reader.close();
|
|
33
33
|
});
|
|
34
34
|
const usageRoutes = this.filterRoutes(this.getRoutes());
|
|
@@ -164,10 +164,9 @@ export class ModernServer {
|
|
|
164
164
|
return handler;
|
|
165
165
|
}
|
|
166
166
|
async prepareAPIHandler(extension) {
|
|
167
|
-
var _bff, _bff1;
|
|
168
167
|
const { workDir, runner, conf } = this;
|
|
169
168
|
const { bff } = conf;
|
|
170
|
-
const prefix = (
|
|
169
|
+
const prefix = (bff === null || bff === void 0 ? void 0 : bff.prefix) || "/api";
|
|
171
170
|
const webOnly = await isWebOnly();
|
|
172
171
|
if (webOnly && process.env.NODE_ENV === "development") {
|
|
173
172
|
return (req, res) => {
|
|
@@ -179,7 +178,7 @@ export class ModernServer {
|
|
|
179
178
|
pwd: workDir,
|
|
180
179
|
config: extension,
|
|
181
180
|
prefix: Array.isArray(prefix) ? prefix[0] : prefix,
|
|
182
|
-
httpMethodDecider:
|
|
181
|
+
httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
|
|
183
182
|
render: this.render.bind(this)
|
|
184
183
|
}, {
|
|
185
184
|
onLast: () => null
|
|
@@ -290,16 +289,14 @@ export class ModernServer {
|
|
|
290
289
|
await this.handleAPI(context);
|
|
291
290
|
return;
|
|
292
291
|
}
|
|
293
|
-
if (route.entryName) {
|
|
292
|
+
if (route.entryName && this.runMode === RUN_MODE.FULL) {
|
|
294
293
|
const afterMatchContext = createAfterMatchContext(context, route.entryName);
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
|
|
302
|
-
}
|
|
294
|
+
const end2 = time();
|
|
295
|
+
await this.runner.afterMatch(afterMatchContext, {
|
|
296
|
+
onLast: noop
|
|
297
|
+
});
|
|
298
|
+
const cost = end2();
|
|
299
|
+
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
|
|
303
300
|
if (this.isSend(res)) {
|
|
304
301
|
return;
|
|
305
302
|
}
|
|
@@ -342,16 +339,14 @@ export class ModernServer {
|
|
|
342
339
|
responseStream.pipe(res);
|
|
343
340
|
return;
|
|
344
341
|
}
|
|
345
|
-
if (route.entryName) {
|
|
342
|
+
if (route.entryName && this.runMode === RUN_MODE.FULL) {
|
|
346
343
|
const afterRenderContext = createAfterRenderContext(context, response.toString());
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
|
|
354
|
-
}
|
|
344
|
+
const end2 = time();
|
|
345
|
+
await this.runner.afterRender(afterRenderContext, {
|
|
346
|
+
onLast: noop
|
|
347
|
+
});
|
|
348
|
+
const cost = end2();
|
|
349
|
+
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
|
|
355
350
|
if (this.isSend(res)) {
|
|
356
351
|
return;
|
|
357
352
|
}
|
|
@@ -360,7 +355,11 @@ export class ModernServer {
|
|
|
360
355
|
res.end(response);
|
|
361
356
|
}
|
|
362
357
|
isSend(res) {
|
|
363
|
-
if (res.
|
|
358
|
+
if (res.modernFlushedHeaders) {
|
|
359
|
+
if (res.writableFinished) {
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
} else if (res.headersSent) {
|
|
364
363
|
return true;
|
|
365
364
|
}
|
|
366
365
|
if (res.getHeader("Location") && isRedirect(res.statusCode)) {
|
|
@@ -465,7 +464,6 @@ export class ModernServer {
|
|
|
465
464
|
context.res.end(createErrorDocument(status, text));
|
|
466
465
|
}
|
|
467
466
|
constructor({ pwd, config, routes, staticGenerate, logger, metrics, runMode, proxyTarget, appContext }) {
|
|
468
|
-
var _appContext;
|
|
469
467
|
_define_property(this, "pwd", void 0);
|
|
470
468
|
_define_property(this, "distDir", void 0);
|
|
471
469
|
_define_property(this, "workDir", void 0);
|
|
@@ -499,6 +497,9 @@ export class ModernServer {
|
|
|
499
497
|
this.proxyTarget = proxyTarget;
|
|
500
498
|
this.staticGenerate = staticGenerate || false;
|
|
501
499
|
this.runMode = runMode || RUN_MODE.FULL;
|
|
502
|
-
this.metaName =
|
|
500
|
+
this.metaName = appContext === null || appContext === void 0 ? void 0 : appContext.metaName;
|
|
503
501
|
}
|
|
504
502
|
}
|
|
503
|
+
export {
|
|
504
|
+
ModernServer
|
|
505
|
+
};
|
|
@@ -27,7 +27,7 @@ class ModernWebServer extends ModernServer {
|
|
|
27
27
|
return super.handleWeb(context, route);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
const createProdServer = (options) => {
|
|
31
31
|
if (options.apiOnly) {
|
|
32
32
|
return new ModernAPIServer(options);
|
|
33
33
|
} else if (options.ssrOnly) {
|
|
@@ -38,3 +38,6 @@ export const createProdServer = (options) => {
|
|
|
38
38
|
return new ModernServer(options);
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
|
+
export {
|
|
42
|
+
createProdServer
|
|
43
|
+
};
|
package/dist/esm-node/type.js
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|