@modern-js/prod-server 2.4.0 → 2.5.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/CHANGELOG.md +27 -0
- package/dist/{js/node → cjs}/constants.js +0 -0
- package/dist/{js/node → cjs}/index.js +0 -0
- package/dist/{js/node → cjs}/libs/context/context.js +0 -0
- package/dist/{js/node → cjs}/libs/context/index.js +0 -0
- package/dist/{js/node → cjs}/libs/hook-api/index.js +12 -25
- package/dist/{js/node → cjs}/libs/hook-api/route.js +0 -0
- package/dist/{js/node → cjs}/libs/hook-api/template.js +0 -0
- package/dist/{js/node → cjs}/libs/loadConfig.js +6 -21
- package/dist/cjs/libs/logger.js +122 -0
- package/dist/{js/node → cjs}/libs/metrics.js +0 -0
- package/dist/{js/node → cjs}/libs/proxy.js +6 -39
- package/dist/{js/node → cjs}/libs/render/cache/__tests__/cache.fun.test.js +12 -34
- package/dist/{js/node → cjs}/libs/render/cache/__tests__/cache.test.js +43 -78
- package/dist/{js/node → cjs}/libs/render/cache/__tests__/cacheable.js +0 -0
- package/dist/{js/node → cjs}/libs/render/cache/__tests__/error-configuration.js +0 -0
- package/dist/{js/node → cjs}/libs/render/cache/__tests__/matched-cache.js +0 -0
- package/dist/cjs/libs/render/cache/index.js +97 -0
- package/dist/cjs/libs/render/cache/page-caches/index.js +33 -0
- package/dist/{js/node → cjs}/libs/render/cache/page-caches/lru.js +0 -0
- package/dist/{js/node → cjs}/libs/render/cache/spr.js +69 -97
- package/dist/{js/node → cjs}/libs/render/cache/type.js +0 -0
- package/dist/{js/node → cjs}/libs/render/cache/util.js +19 -41
- package/dist/cjs/libs/render/index.js +93 -0
- package/dist/{js/node → cjs}/libs/render/measure.js +6 -21
- package/dist/{js/node → cjs}/libs/render/reader.js +24 -46
- package/dist/{js/node → cjs}/libs/render/ssr.js +3 -23
- package/dist/{js/node → cjs}/libs/render/static.js +22 -44
- package/dist/{js/node → cjs}/libs/render/type.js +0 -0
- package/dist/{js/node → cjs}/libs/route/index.js +0 -0
- package/dist/{js/node → cjs}/libs/route/matcher.js +0 -0
- package/dist/{js/node → cjs}/libs/route/route.js +0 -0
- package/dist/{js/node → cjs}/libs/serve-file.js +2 -22
- package/dist/{js/node → cjs}/server/index.js +56 -106
- package/dist/{js/node → cjs}/server/modern-server-split.js +9 -40
- package/dist/cjs/server/modern-server.js +490 -0
- package/dist/{js/node → cjs}/type.js +0 -0
- package/dist/{js/node → cjs}/utils.js +1 -15
- package/dist/{js/node → cjs}/worker-server.js +51 -35
- package/dist/{js/treeshaking → esm}/constants.js +0 -0
- package/dist/{js/treeshaking → esm}/index.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/context/context.js +2 -2
- package/dist/{js/treeshaking → esm}/libs/context/index.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/hook-api/index.js +1 -1
- package/dist/{js/treeshaking → esm}/libs/hook-api/route.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/hook-api/template.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/loadConfig.js +0 -0
- package/dist/esm/libs/logger.js +205 -0
- package/dist/{js/treeshaking → esm}/libs/metrics.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/proxy.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/__tests__/cache.fun.test.js +3 -3
- package/dist/{js/treeshaking → esm}/libs/render/cache/__tests__/cache.test.js +2 -2
- package/dist/{js/treeshaking → esm}/libs/render/cache/__tests__/cacheable.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/__tests__/error-configuration.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/__tests__/matched-cache.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/index.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/page-caches/index.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/page-caches/lru.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/spr.js +8 -8
- package/dist/{js/treeshaking → esm}/libs/render/cache/type.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/cache/util.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/index.js +4 -3
- package/dist/{js/treeshaking → esm}/libs/render/measure.js +2 -2
- package/dist/{js/treeshaking → esm}/libs/render/reader.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/ssr.js +3 -3
- package/dist/{js/treeshaking → esm}/libs/render/static.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/render/type.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/route/index.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/route/matcher.js +2 -2
- package/dist/{js/treeshaking → esm}/libs/route/route.js +0 -0
- package/dist/{js/treeshaking → esm}/libs/serve-file.js +2 -2
- package/dist/{js/treeshaking → esm}/server/index.js +3 -3
- package/dist/{js/treeshaking → esm}/server/modern-server-split.js +0 -0
- package/dist/{js/treeshaking → esm}/server/modern-server.js +21 -15
- package/dist/{js/treeshaking → esm}/type.js +0 -0
- package/dist/{js/treeshaking → esm}/utils.js +1 -1
- package/dist/{js/treeshaking → esm}/worker-server.js +64 -8
- package/dist/{js/modern → esm-node}/constants.js +0 -0
- package/dist/{js/modern → esm-node}/index.js +0 -0
- package/dist/{js/modern → esm-node}/libs/context/context.js +0 -0
- package/dist/{js/modern → esm-node}/libs/context/index.js +0 -0
- package/dist/{js/modern → esm-node}/libs/hook-api/index.js +12 -27
- package/dist/{js/modern → esm-node}/libs/hook-api/route.js +0 -0
- package/dist/{js/modern → esm-node}/libs/hook-api/template.js +0 -0
- package/dist/esm-node/libs/loadConfig.js +45 -0
- package/dist/esm-node/libs/logger.js +98 -0
- package/dist/{js/modern → esm-node}/libs/metrics.js +0 -0
- package/dist/{js/modern → esm-node}/libs/proxy.js +6 -41
- package/dist/esm-node/libs/render/cache/__tests__/cache.fun.test.js +83 -0
- package/dist/esm-node/libs/render/cache/__tests__/cache.test.js +210 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/__tests__/cacheable.js +0 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/__tests__/error-configuration.js +0 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/__tests__/matched-cache.js +0 -0
- package/dist/esm-node/libs/render/cache/index.js +76 -0
- package/dist/esm-node/libs/render/cache/page-caches/index.js +10 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/page-caches/lru.js +0 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/spr.js +69 -97
- package/dist/{js/modern → esm-node}/libs/render/cache/type.js +0 -0
- package/dist/{js/modern → esm-node}/libs/render/cache/util.js +19 -41
- package/dist/esm-node/libs/render/index.js +64 -0
- package/dist/{js/modern → esm-node}/libs/render/measure.js +6 -23
- package/dist/esm-node/libs/render/reader.js +85 -0
- package/dist/{js/modern → esm-node}/libs/render/ssr.js +3 -23
- package/dist/esm-node/libs/render/static.js +38 -0
- package/dist/{js/modern → esm-node}/libs/render/type.js +0 -0
- package/dist/{js/modern → esm-node}/libs/route/index.js +0 -0
- package/dist/{js/modern → esm-node}/libs/route/matcher.js +0 -0
- package/dist/{js/modern → esm-node}/libs/route/route.js +0 -0
- package/dist/{js/modern → esm-node}/libs/serve-file.js +2 -22
- package/dist/esm-node/server/index.js +156 -0
- package/dist/esm-node/server/modern-server-split.js +43 -0
- package/dist/esm-node/server/modern-server.js +483 -0
- package/dist/{js/modern → esm-node}/type.js +0 -0
- package/dist/{js/modern → esm-node}/utils.js +1 -17
- package/dist/esm-node/worker-server.js +69 -0
- package/dist/types/libs/context/context.d.ts +1 -1
- package/dist/types/libs/logger.d.ts +63 -0
- package/dist/types/libs/render/index.d.ts +3 -1
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/worker-server.d.ts +2 -1
- package/package.json +15 -16
- package/dist/js/modern/libs/loadConfig.js +0 -62
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -114
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -254
- package/dist/js/modern/libs/render/cache/index.js +0 -115
- package/dist/js/modern/libs/render/cache/page-caches/index.js +0 -32
- package/dist/js/modern/libs/render/index.js +0 -84
- package/dist/js/modern/libs/render/reader.js +0 -107
- package/dist/js/modern/libs/render/static.js +0 -60
- package/dist/js/modern/server/index.js +0 -208
- package/dist/js/modern/server/modern-server-split.js +0 -74
- package/dist/js/modern/server/modern-server.js +0 -548
- package/dist/js/modern/worker-server.js +0 -54
- package/dist/js/node/libs/render/cache/index.js +0 -134
- package/dist/js/node/libs/render/cache/page-caches/index.js +0 -55
- package/dist/js/node/libs/render/index.js +0 -113
- package/dist/js/node/server/modern-server.js +0 -553
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { fs } from "@modern-js/utils";
|
|
2
|
+
import LRU from "lru-cache";
|
|
3
|
+
const Byte = 1;
|
|
4
|
+
const KB = 1024 * Byte;
|
|
5
|
+
const MB = 1024 * KB;
|
|
6
|
+
const getContentLength = (cache) => cache.content.length;
|
|
7
|
+
const createCacheItem = async (filepath, mtime) => {
|
|
8
|
+
const content = await fs.readFile(filepath);
|
|
9
|
+
return {
|
|
10
|
+
content,
|
|
11
|
+
mtime
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
class LruReader {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.cache = new LRU({
|
|
17
|
+
max: 256 * MB,
|
|
18
|
+
length: getContentLength,
|
|
19
|
+
maxAge: 5 * 60 * 5e3
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
init() {
|
|
23
|
+
}
|
|
24
|
+
close() {
|
|
25
|
+
}
|
|
26
|
+
async read(filepath) {
|
|
27
|
+
if (this.cache.has(filepath)) {
|
|
28
|
+
const { content } = this.cache.get(filepath);
|
|
29
|
+
return { content };
|
|
30
|
+
}
|
|
31
|
+
if (!fs.existsSync(filepath)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const stat = fs.statSync(filepath);
|
|
35
|
+
if (stat.isDirectory()) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (stat.size > 20 * MB) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const item = await createCacheItem(filepath, stat.mtime);
|
|
42
|
+
this.cache.set(filepath, item);
|
|
43
|
+
return item;
|
|
44
|
+
}
|
|
45
|
+
update() {
|
|
46
|
+
const { cache } = this;
|
|
47
|
+
const files = cache.keys();
|
|
48
|
+
for (const filepath of files) {
|
|
49
|
+
if (!fs.existsSync(filepath)) {
|
|
50
|
+
cache.del(filepath);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const item = cache.get(filepath);
|
|
54
|
+
const stat = fs.statSync(filepath);
|
|
55
|
+
const { mtime } = stat;
|
|
56
|
+
if (item.mtime < mtime) {
|
|
57
|
+
cache.del(filepath);
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {
|
|
60
|
+
cache.del(filepath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const reader = new LruReader();
|
|
66
|
+
const readFile = async (filepath) => {
|
|
67
|
+
const file = await reader.read(filepath);
|
|
68
|
+
return file == null ? void 0 : file.content;
|
|
69
|
+
};
|
|
70
|
+
const updateFile = () => {
|
|
71
|
+
reader.update();
|
|
72
|
+
};
|
|
73
|
+
const init = () => {
|
|
74
|
+
reader.init();
|
|
75
|
+
};
|
|
76
|
+
const close = () => {
|
|
77
|
+
reader.close();
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
LruReader,
|
|
81
|
+
close,
|
|
82
|
+
init,
|
|
83
|
+
readFile,
|
|
84
|
+
updateFile
|
|
85
|
+
};
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
var __async = (__this, __arguments, generator) => {
|
|
2
|
-
return new Promise((resolve, reject) => {
|
|
3
|
-
var fulfilled = (value) => {
|
|
4
|
-
try {
|
|
5
|
-
step(generator.next(value));
|
|
6
|
-
} catch (e) {
|
|
7
|
-
reject(e);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var rejected = (value) => {
|
|
11
|
-
try {
|
|
12
|
-
step(generator.throw(value));
|
|
13
|
-
} catch (e) {
|
|
14
|
-
reject(e);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
1
|
import path from "path";
|
|
22
2
|
import {
|
|
23
3
|
fs,
|
|
@@ -29,7 +9,7 @@ import {
|
|
|
29
9
|
import cookie from "cookie";
|
|
30
10
|
import cache from "./cache";
|
|
31
11
|
import { createLogger, createMetrics } from "./measure";
|
|
32
|
-
const render = (ctx, renderOptions, runner) =>
|
|
12
|
+
const render = async (ctx, renderOptions, runner) => {
|
|
33
13
|
var _a;
|
|
34
14
|
const { urlPath, bundle, distDir, template, entryName, staticGenerate } = renderOptions;
|
|
35
15
|
const bundleJS = path.join(distDir, bundle);
|
|
@@ -72,7 +52,7 @@ const render = (ctx, renderOptions, runner) => __async(void 0, null, function* (
|
|
|
72
52
|
context.metrics = createMetrics(context, ctx.metrics);
|
|
73
53
|
runner.extendSSRContext(context);
|
|
74
54
|
const serverRender = require(bundleJS)[SERVER_RENDER_FUNCTION_NAME];
|
|
75
|
-
const content =
|
|
55
|
+
const content = await cache(serverRender, ctx)(context);
|
|
76
56
|
const { url, status = 302 } = context.redirection;
|
|
77
57
|
if (url) {
|
|
78
58
|
return {
|
|
@@ -94,7 +74,7 @@ const render = (ctx, renderOptions, runner) => __async(void 0, null, function* (
|
|
|
94
74
|
contentType: mime.contentType("html")
|
|
95
75
|
};
|
|
96
76
|
}
|
|
97
|
-
}
|
|
77
|
+
};
|
|
98
78
|
export {
|
|
99
79
|
render
|
|
100
80
|
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { mime } from "@modern-js/utils";
|
|
3
|
+
import { readFile } from "./reader";
|
|
4
|
+
async function handleDirectory(ctx, entryPath, urlPath) {
|
|
5
|
+
const { path: pathname } = ctx;
|
|
6
|
+
const filepath = path.join(entryPath, trimLeft(pathname, urlPath));
|
|
7
|
+
let content = await readFile(filepath);
|
|
8
|
+
let contentType = mime.contentType(path.extname(filepath) || "");
|
|
9
|
+
if (!content) {
|
|
10
|
+
if (pathname.endsWith("/")) {
|
|
11
|
+
content = await readFile(`${filepath}index.html`);
|
|
12
|
+
} else if (!pathname.includes(".")) {
|
|
13
|
+
content = await readFile(`${filepath}.html`);
|
|
14
|
+
if (!content) {
|
|
15
|
+
content = await readFile(`${filepath}/index.html`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (content) {
|
|
19
|
+
contentType = mime.contentType("html");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (!content) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
content,
|
|
27
|
+
contentType: contentType || ""
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const trimLeft = (str, prefix) => {
|
|
31
|
+
if (str.startsWith(prefix)) {
|
|
32
|
+
return str.substring(prefix.length);
|
|
33
|
+
}
|
|
34
|
+
return str;
|
|
35
|
+
};
|
|
36
|
+
export {
|
|
37
|
+
handleDirectory
|
|
38
|
+
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
var __async = (__this, __arguments, generator) => {
|
|
2
|
-
return new Promise((resolve, reject) => {
|
|
3
|
-
var fulfilled = (value) => {
|
|
4
|
-
try {
|
|
5
|
-
step(generator.next(value));
|
|
6
|
-
} catch (e) {
|
|
7
|
-
reject(e);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var rejected = (value) => {
|
|
11
|
-
try {
|
|
12
|
-
step(generator.throw(value));
|
|
13
|
-
} catch (e) {
|
|
14
|
-
reject(e);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
1
|
import serve from "serve-static";
|
|
22
2
|
import { isString, isRegExp } from "@modern-js/utils";
|
|
23
3
|
import { useLocalPrefix } from "../utils";
|
|
@@ -40,7 +20,7 @@ const faviconFallbackHandler = (context, next) => {
|
|
|
40
20
|
next();
|
|
41
21
|
}
|
|
42
22
|
};
|
|
43
|
-
const createStaticFileHandler = (rules, output = {}) => (context, next) =>
|
|
23
|
+
const createStaticFileHandler = (rules, output = {}) => async (context, next) => {
|
|
44
24
|
const { url: requestUrl, req, res } = context;
|
|
45
25
|
const { assetPrefix = "/" } = output;
|
|
46
26
|
const hitRule = rules.find((item) => {
|
|
@@ -60,7 +40,7 @@ const createStaticFileHandler = (rules, output = {}) => (context, next) => __asy
|
|
|
60
40
|
} else {
|
|
61
41
|
return next();
|
|
62
42
|
}
|
|
63
|
-
}
|
|
43
|
+
};
|
|
64
44
|
export {
|
|
65
45
|
createStaticFileHandler,
|
|
66
46
|
faviconFallbackHandler
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import {
|
|
4
|
+
Logger,
|
|
5
|
+
SHARED_DIR,
|
|
6
|
+
OUTPUT_CONFIG_FILE,
|
|
7
|
+
dotenv,
|
|
8
|
+
dotenvExpand,
|
|
9
|
+
INTERNAL_SERVER_PLUGINS
|
|
10
|
+
} from "@modern-js/utils";
|
|
11
|
+
import {
|
|
12
|
+
serverManager,
|
|
13
|
+
AppContext,
|
|
14
|
+
ConfigContext,
|
|
15
|
+
loadPlugins
|
|
16
|
+
} from "@modern-js/server-core";
|
|
17
|
+
import { metrics as defaultMetrics } from "../libs/metrics";
|
|
18
|
+
import {
|
|
19
|
+
loadConfig,
|
|
20
|
+
getServerConfigPath,
|
|
21
|
+
requireConfig
|
|
22
|
+
} from "../libs/loadConfig";
|
|
23
|
+
import { debug } from "../utils";
|
|
24
|
+
import { createProdServer } from "./modern-server-split";
|
|
25
|
+
class Server {
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.serverImpl = createProdServer;
|
|
28
|
+
options.logger = options.logger || new Logger({
|
|
29
|
+
level: "warn"
|
|
30
|
+
});
|
|
31
|
+
options.metrics = options.metrics || defaultMetrics;
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.serverConfig = {};
|
|
34
|
+
}
|
|
35
|
+
async init() {
|
|
36
|
+
const { options } = this;
|
|
37
|
+
this.loadServerEnv(options);
|
|
38
|
+
this.initServerConfig(options);
|
|
39
|
+
await this.injectContext(this.runner, options);
|
|
40
|
+
this.runner = await this.createHookRunner();
|
|
41
|
+
await this.initConfig(this.runner, options);
|
|
42
|
+
await this.injectContext(this.runner, options);
|
|
43
|
+
this.server = this.serverImpl(options);
|
|
44
|
+
await this.runPrepareHook(this.runner);
|
|
45
|
+
this.app = await this.server.createHTTPServer(this.getRequestHandler());
|
|
46
|
+
await this.server.onInit(this.runner, this.app);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
runConfigHook(runner, serverConfig) {
|
|
50
|
+
const newServerConfig = runner.config(serverConfig || {});
|
|
51
|
+
return newServerConfig;
|
|
52
|
+
}
|
|
53
|
+
async runPrepareHook(runner) {
|
|
54
|
+
runner.prepare();
|
|
55
|
+
}
|
|
56
|
+
initServerConfig(options) {
|
|
57
|
+
const { pwd, serverConfigFile } = options;
|
|
58
|
+
const distDirectory = path.join(pwd, options.config.output.path || "dist");
|
|
59
|
+
const serverConfigPath = getServerConfigPath(
|
|
60
|
+
distDirectory,
|
|
61
|
+
serverConfigFile
|
|
62
|
+
);
|
|
63
|
+
const serverConfig = requireConfig(serverConfigPath);
|
|
64
|
+
this.serverConfig = serverConfig;
|
|
65
|
+
}
|
|
66
|
+
async initConfig(runner, options) {
|
|
67
|
+
const { pwd, config } = options;
|
|
68
|
+
const { serverConfig } = this;
|
|
69
|
+
const finalServerConfig = this.runConfigHook(runner, serverConfig);
|
|
70
|
+
const resolvedConfigPath = path.join(
|
|
71
|
+
pwd,
|
|
72
|
+
config.output.path || "dist",
|
|
73
|
+
OUTPUT_CONFIG_FILE
|
|
74
|
+
);
|
|
75
|
+
options.config = loadConfig({
|
|
76
|
+
cliConfig: config,
|
|
77
|
+
serverConfig: finalServerConfig,
|
|
78
|
+
resolvedConfigPath
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async close() {
|
|
82
|
+
this.app.close();
|
|
83
|
+
}
|
|
84
|
+
listen(options, listener) {
|
|
85
|
+
const callback = () => {
|
|
86
|
+
listener == null ? void 0 : listener();
|
|
87
|
+
};
|
|
88
|
+
if (typeof options === "object") {
|
|
89
|
+
this.app.listen(options, callback);
|
|
90
|
+
} else {
|
|
91
|
+
this.app.listen(process.env.PORT || options || 8080, callback);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getRequestHandler() {
|
|
95
|
+
return (req, res, next) => {
|
|
96
|
+
const requestHandler = this.server.getRequestHandler();
|
|
97
|
+
return requestHandler(req, res, next);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async render(req, res, url) {
|
|
101
|
+
return this.server.render(req, res, url);
|
|
102
|
+
}
|
|
103
|
+
async createHookRunner() {
|
|
104
|
+
serverManager.clear();
|
|
105
|
+
const { options } = this;
|
|
106
|
+
const {
|
|
107
|
+
internalPlugins = INTERNAL_SERVER_PLUGINS,
|
|
108
|
+
pwd,
|
|
109
|
+
plugins = []
|
|
110
|
+
} = options;
|
|
111
|
+
const serverPlugins = this.serverConfig.plugins || [];
|
|
112
|
+
const loadedPlugins = loadPlugins(pwd, [...serverPlugins, ...plugins], {
|
|
113
|
+
internalPlugins
|
|
114
|
+
});
|
|
115
|
+
debug("plugins", loadedPlugins);
|
|
116
|
+
loadedPlugins.forEach((p) => {
|
|
117
|
+
serverManager.usePlugin(p);
|
|
118
|
+
});
|
|
119
|
+
const hooksRunner = await serverManager.init();
|
|
120
|
+
return hooksRunner;
|
|
121
|
+
}
|
|
122
|
+
async injectContext(runner, options) {
|
|
123
|
+
const appContext = this.initAppContext();
|
|
124
|
+
const { config, pwd } = options;
|
|
125
|
+
ConfigContext.set(config);
|
|
126
|
+
AppContext.set({
|
|
127
|
+
...appContext,
|
|
128
|
+
distDirectory: path.join(pwd, config.output.path || "dist")
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
initAppContext() {
|
|
132
|
+
const { options } = this;
|
|
133
|
+
const { pwd: appDirectory, plugins = [], config } = options;
|
|
134
|
+
const serverPlugins = plugins.map((p) => ({
|
|
135
|
+
server: p
|
|
136
|
+
}));
|
|
137
|
+
return {
|
|
138
|
+
appDirectory,
|
|
139
|
+
distDirectory: path.join(appDirectory, config.output.path || "dist"),
|
|
140
|
+
sharedDirectory: path.resolve(appDirectory, SHARED_DIR),
|
|
141
|
+
plugins: serverPlugins
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
loadServerEnv(options) {
|
|
145
|
+
const { pwd: appDirectory } = options;
|
|
146
|
+
const serverEnv = process.env.MODERN_ENV;
|
|
147
|
+
const serverEnvPath = path.resolve(appDirectory, `.env.${serverEnv}`);
|
|
148
|
+
if (serverEnv && fs.existsSync(serverEnvPath) && !fs.statSync(serverEnvPath).isDirectory()) {
|
|
149
|
+
const envConfig = dotenv.config({ path: serverEnvPath });
|
|
150
|
+
dotenvExpand(envConfig);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
Server
|
|
156
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ModernServer } from "./modern-server";
|
|
2
|
+
class ModernSSRServer extends ModernServer {
|
|
3
|
+
prepareAPIHandler(_) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
async handleAPI(context) {
|
|
7
|
+
return this.render404(context);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class ModernAPIServer extends ModernServer {
|
|
11
|
+
prepareWebHandler(_) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
filterRoutes(routes) {
|
|
15
|
+
return routes.filter((route) => route.isApi);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
class ModernWebServer extends ModernServer {
|
|
19
|
+
async warmupSSRBundle() {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
async handleAPI(context) {
|
|
23
|
+
return this.render404(context);
|
|
24
|
+
}
|
|
25
|
+
async handleWeb(context, route) {
|
|
26
|
+
route.isSSR = false;
|
|
27
|
+
return super.handleWeb(context, route);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const createProdServer = (options) => {
|
|
31
|
+
if (options.apiOnly) {
|
|
32
|
+
return new ModernAPIServer(options);
|
|
33
|
+
} else if (options.ssrOnly) {
|
|
34
|
+
return new ModernSSRServer(options);
|
|
35
|
+
} else if (options.webOnly) {
|
|
36
|
+
return new ModernWebServer(options);
|
|
37
|
+
} else {
|
|
38
|
+
return new ModernServer(options);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
createProdServer
|
|
43
|
+
};
|