@modern-js/server 0.0.0-nightly-20231213170638 → 0.0.0-nightly-20231215170639
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/index.js +3 -1
- package/dist/cjs/server/devServer.js +70 -118
- package/dist/cjs/server/devServerOld.js +351 -0
- package/dist/cjs/server/index.js +14 -3
- package/dist/esm/index.js +2 -1
- package/dist/esm/server/devServer.js +166 -238
- package/dist/esm/server/devServerOld.js +579 -0
- package/dist/esm/server/index.js +21 -2
- package/dist/esm-node/index.js +2 -1
- package/dist/esm-node/server/devServer.js +71 -119
- package/dist/esm-node/server/devServerOld.js +317 -0
- package/dist/esm-node/server/index.js +12 -2
- package/dist/types/dev-tools/dev-middleware/index.d.ts +2 -0
- package/dist/types/dev-tools/dev-middleware/socketServer.d.ts +2 -0
- package/dist/types/dev-tools/https/index.d.ts +1 -0
- package/dist/types/dev-tools/mock/getMockData.d.ts +2 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/server/devServer.d.ts +9 -7
- package/dist/types/server/devServerOld.d.ts +37 -0
- package/dist/types/server/index.d.ts +4 -1
- package/dist/types/types.d.ts +10 -0
- package/package.json +12 -10
|
@@ -3,14 +3,38 @@ import { createServer } from "http";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { createServer as createHttpsServer } from "https";
|
|
5
5
|
import { API_DIR, SERVER_BUNDLE_DIRECTORY, SERVER_DIR, SHARED_DIR, LOADABLE_STATS_FILE } from "@modern-js/utils";
|
|
6
|
-
import {
|
|
6
|
+
import { ModernServer, AGGRED_DIR, createRenderHandler } from "@modern-js/prod-server";
|
|
7
7
|
import { merge as deepMerge } from "@modern-js/utils/lodash";
|
|
8
8
|
import { getDefaultDevOptions } from "../constants";
|
|
9
9
|
import { createMockHandler } from "../dev-tools/mock";
|
|
10
10
|
import { enableRegister } from "../dev-tools/register";
|
|
11
11
|
import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
12
|
-
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
13
12
|
import { workerSSRRender } from "./workerSSRRender";
|
|
13
|
+
const transformToRsbuildServerOptions = (dev) => {
|
|
14
|
+
var _dev_devMiddleware, _dev_before, _dev_after;
|
|
15
|
+
const rsbuildOptions = {
|
|
16
|
+
hmr: Boolean(dev.hot),
|
|
17
|
+
client: dev.client,
|
|
18
|
+
writeToDisk: (_dev_devMiddleware = dev.devMiddleware) === null || _dev_devMiddleware === void 0 ? void 0 : _dev_devMiddleware.writeToDisk,
|
|
19
|
+
compress: dev.compress,
|
|
20
|
+
headers: dev.headers,
|
|
21
|
+
historyApiFallback: dev.historyApiFallback,
|
|
22
|
+
proxy: dev.proxy,
|
|
23
|
+
publicDir: false
|
|
24
|
+
};
|
|
25
|
+
if (((_dev_before = dev.before) === null || _dev_before === void 0 ? void 0 : _dev_before.length) || ((_dev_after = dev.after) === null || _dev_after === void 0 ? void 0 : _dev_after.length)) {
|
|
26
|
+
rsbuildOptions.setupMiddlewares = [
|
|
27
|
+
...dev.setupMiddlewares || [],
|
|
28
|
+
(middlewares) => {
|
|
29
|
+
middlewares.unshift(...dev.before || []);
|
|
30
|
+
middlewares.push(...dev.after || []);
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
} else if (dev.setupMiddlewares) {
|
|
34
|
+
rsbuildOptions.setupMiddlewares = dev.setupMiddlewares;
|
|
35
|
+
}
|
|
36
|
+
return rsbuildOptions;
|
|
37
|
+
};
|
|
14
38
|
class ModernDevServer extends ModernServer {
|
|
15
39
|
getDevOptions(options) {
|
|
16
40
|
const devOptions = typeof options.dev === "boolean" ? {} : options.dev;
|
|
@@ -25,40 +49,38 @@ class ModernDevServer extends ModernServer {
|
|
|
25
49
|
});
|
|
26
50
|
});
|
|
27
51
|
}
|
|
28
|
-
applySetupMiddlewares() {
|
|
29
|
-
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
30
|
-
const serverOptions = {
|
|
31
|
-
sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
|
|
32
|
-
};
|
|
33
|
-
const befores = [];
|
|
34
|
-
const afters = [];
|
|
35
|
-
setupMiddlewares.forEach((handler) => {
|
|
36
|
-
handler({
|
|
37
|
-
unshift: (...handlers) => befores.unshift(...handlers),
|
|
38
|
-
push: (...handlers) => afters.push(...handlers)
|
|
39
|
-
}, serverOptions);
|
|
40
|
-
});
|
|
41
|
-
return {
|
|
42
|
-
befores,
|
|
43
|
-
afters
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
52
|
// Complete the preparation of services
|
|
47
53
|
async onInit(runner, app) {
|
|
48
54
|
this.runner = runner;
|
|
49
|
-
const { dev } = this;
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
const { dev, conf } = this;
|
|
56
|
+
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
57
|
+
const isUseSSRPreload = () => {
|
|
58
|
+
const { server: { ssr, ssrByEntries } } = conf;
|
|
59
|
+
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
60
|
+
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
61
|
+
};
|
|
62
|
+
const { middlewares: rsbuildMiddlewares, close, onUpgrade } = (
|
|
63
|
+
// https://github.com/web-infra-dev/rsbuild/blob/32fbb85e22158d5c4655505ce75e3452ce22dbb1/packages/shared/src/types/server.ts#L112
|
|
64
|
+
await this.getMiddlewares({
|
|
65
|
+
...transformToRsbuildServerOptions(this.dev),
|
|
66
|
+
compress: !isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress,
|
|
67
|
+
htmlFallback: false,
|
|
68
|
+
publicDir: false
|
|
69
|
+
})
|
|
70
|
+
);
|
|
71
|
+
app.on("upgrade", onUpgrade);
|
|
72
|
+
this.rsbuild.onDevCompileDone(({ stats }) => {
|
|
73
|
+
if (stats.toJson({
|
|
74
|
+
all: false
|
|
75
|
+
}).name !== "server") {
|
|
76
|
+
this.onRepack({
|
|
77
|
+
routes: this.getRoutes()
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
await this.applyDefaultMiddlewares();
|
|
82
|
+
this.addMiddlewareHandler(rsbuildMiddlewares);
|
|
83
|
+
this.closeCb.push(close);
|
|
62
84
|
await super.onInit(runner, app);
|
|
63
85
|
if (dev.watch) {
|
|
64
86
|
this.startWatcher();
|
|
@@ -68,6 +90,11 @@ class ModernDevServer extends ModernServer {
|
|
|
68
90
|
});
|
|
69
91
|
}
|
|
70
92
|
}
|
|
93
|
+
async close() {
|
|
94
|
+
for (const cb of this.closeCb) {
|
|
95
|
+
await cb();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
71
98
|
// override the ModernServer renderHandler logic
|
|
72
99
|
getRenderHandler() {
|
|
73
100
|
if (this.useWorkerSSR) {
|
|
@@ -87,36 +114,8 @@ class ModernDevServer extends ModernServer {
|
|
|
87
114
|
}
|
|
88
115
|
return super.getRenderHandler();
|
|
89
116
|
}
|
|
90
|
-
async applyDefaultMiddlewares(
|
|
91
|
-
const { pwd
|
|
92
|
-
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
93
|
-
const isUseSSRPreload = () => {
|
|
94
|
-
const { server: { ssr, ssrByEntries } } = conf;
|
|
95
|
-
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
96
|
-
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
97
|
-
};
|
|
98
|
-
if (!isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress) {
|
|
99
|
-
const { default: compression } = await import("http-compression");
|
|
100
|
-
this.addHandler((ctx, next) => {
|
|
101
|
-
compression({
|
|
102
|
-
gzip: true,
|
|
103
|
-
brotli: false
|
|
104
|
-
})(ctx.req, ctx.res, next);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
this.addHandler((ctx, next) => {
|
|
108
|
-
ctx.res.setHeader("Access-Control-Allow-Origin", "*");
|
|
109
|
-
if (ctx.path.includes("hot-update")) {
|
|
110
|
-
ctx.res.setHeader("Access-Control-Allow-Credentials", "false");
|
|
111
|
-
}
|
|
112
|
-
const confHeaders = dev.headers;
|
|
113
|
-
if (confHeaders) {
|
|
114
|
-
for (const [key, value] of Object.entries(confHeaders)) {
|
|
115
|
-
ctx.res.setHeader(key, value);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
next();
|
|
119
|
-
});
|
|
117
|
+
async applyDefaultMiddlewares() {
|
|
118
|
+
const { pwd } = this;
|
|
120
119
|
this.mockHandler = createMockHandler({
|
|
121
120
|
pwd
|
|
122
121
|
});
|
|
@@ -127,36 +126,6 @@ class ModernDevServer extends ModernServer {
|
|
|
127
126
|
next();
|
|
128
127
|
}
|
|
129
128
|
});
|
|
130
|
-
if (dev.proxy) {
|
|
131
|
-
const { handlers, handleUpgrade } = createProxyHandler(dev.proxy);
|
|
132
|
-
app && handleUpgrade(app);
|
|
133
|
-
handlers.forEach((handler) => {
|
|
134
|
-
this.addHandler(handler);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
devMiddleware.init(app);
|
|
138
|
-
devMiddleware.on("change", (stats) => {
|
|
139
|
-
if (stats.toJson({
|
|
140
|
-
all: false
|
|
141
|
-
}).name !== "server") {
|
|
142
|
-
this.onRepack({
|
|
143
|
-
routes: this.getRoutes()
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
this.addHandler((ctx, next) => {
|
|
148
|
-
const { req, res } = ctx;
|
|
149
|
-
if (devMiddleware.middleware) {
|
|
150
|
-
devMiddleware.middleware(req, res, next);
|
|
151
|
-
} else {
|
|
152
|
-
next();
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
if (dev.historyApiFallback) {
|
|
156
|
-
const { default: connectHistoryApiFallback } = await import("connect-history-api-fallback");
|
|
157
|
-
const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === "boolean" ? {} : dev.historyApiFallback);
|
|
158
|
-
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
159
|
-
}
|
|
160
129
|
}
|
|
161
130
|
onRepack(options = {}) {
|
|
162
131
|
if (Array.isArray(options.routes)) {
|
|
@@ -183,13 +152,14 @@ class ModernDevServer extends ModernServer {
|
|
|
183
152
|
initReader() {
|
|
184
153
|
var _this_dev_devMiddleware, _this_dev;
|
|
185
154
|
let isInit = false;
|
|
186
|
-
if (
|
|
155
|
+
if (((_this_dev = this.dev) === null || _this_dev === void 0 ? void 0 : (_this_dev_devMiddleware = _this_dev.devMiddleware) === null || _this_dev_devMiddleware === void 0 ? void 0 : _this_dev_devMiddleware.writeToDisk) === false) {
|
|
187
156
|
this.addHandler((ctx, next) => {
|
|
157
|
+
var _ctx_res_locals;
|
|
188
158
|
if (isInit) {
|
|
189
159
|
return next();
|
|
190
160
|
}
|
|
191
161
|
isInit = true;
|
|
192
|
-
if (!ctx.res.locals.webpack) {
|
|
162
|
+
if (!((_ctx_res_locals = ctx.res.locals) === null || _ctx_res_locals === void 0 ? void 0 : _ctx_res_locals.webpack)) {
|
|
193
163
|
this.reader.init();
|
|
194
164
|
return next();
|
|
195
165
|
}
|
|
@@ -240,28 +210,10 @@ class ModernDevServer extends ModernServer {
|
|
|
240
210
|
});
|
|
241
211
|
}
|
|
242
212
|
setupStaticMiddleware(_) {
|
|
243
|
-
return async (
|
|
213
|
+
return async (_context, next) => {
|
|
244
214
|
return next();
|
|
245
215
|
};
|
|
246
216
|
}
|
|
247
|
-
async setupBeforeDevMiddleware() {
|
|
248
|
-
const { runner, conf, dev } = this;
|
|
249
|
-
const setupMids = dev.before || [];
|
|
250
|
-
const pluginMids = await runner.beforeDevServer(conf);
|
|
251
|
-
return [
|
|
252
|
-
...setupMids,
|
|
253
|
-
...pluginMids
|
|
254
|
-
].flat();
|
|
255
|
-
}
|
|
256
|
-
async setupAfterDevMiddleware() {
|
|
257
|
-
const { runner, conf, dev } = this;
|
|
258
|
-
const setupMids = dev.after || [];
|
|
259
|
-
const pluginMids = await runner.afterDevServer(conf);
|
|
260
|
-
return [
|
|
261
|
-
...pluginMids,
|
|
262
|
-
...setupMids
|
|
263
|
-
].flat();
|
|
264
|
-
}
|
|
265
217
|
cleanSSRCache() {
|
|
266
218
|
const { distDir } = this;
|
|
267
219
|
const bundles = this.router.getBundles();
|
|
@@ -317,16 +269,16 @@ class ModernDevServer extends ModernServer {
|
|
|
317
269
|
_define_property(this, "dev", void 0);
|
|
318
270
|
_define_property(this, "useWorkerSSR", void 0);
|
|
319
271
|
_define_property(this, "appContext", void 0);
|
|
320
|
-
_define_property(this, "
|
|
272
|
+
_define_property(this, "getMiddlewares", void 0);
|
|
273
|
+
_define_property(this, "rsbuild", void 0);
|
|
321
274
|
_define_property(this, "watcher", void 0);
|
|
275
|
+
_define_property(this, "closeCb", []);
|
|
322
276
|
this.appContext = options.appContext;
|
|
323
277
|
this.workDir = this.pwd;
|
|
324
278
|
this.useWorkerSSR = Boolean(options.useWorkerSSR);
|
|
325
279
|
this.dev = this.getDevOptions(options);
|
|
326
|
-
this.
|
|
327
|
-
|
|
328
|
-
devMiddleware: options.devMiddleware
|
|
329
|
-
});
|
|
280
|
+
this.getMiddlewares = options.getMiddlewares;
|
|
281
|
+
this.rsbuild = options.rsbuild;
|
|
330
282
|
enableRegister(this.pwd, this.conf);
|
|
331
283
|
}
|
|
332
284
|
}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
+
import { createServer } from "http";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { createServer as createHttpsServer } from "https";
|
|
5
|
+
import { API_DIR, SERVER_BUNDLE_DIRECTORY, SERVER_DIR, SHARED_DIR, LOADABLE_STATS_FILE } from "@modern-js/utils";
|
|
6
|
+
import { createProxyHandler, ModernServer, AGGRED_DIR, createRenderHandler } from "@modern-js/prod-server";
|
|
7
|
+
import { merge as deepMerge } from "@modern-js/utils/lodash";
|
|
8
|
+
import { getDefaultDevOptions } from "../constants";
|
|
9
|
+
import { createMockHandler } from "../dev-tools/mock";
|
|
10
|
+
import { enableRegister } from "../dev-tools/register";
|
|
11
|
+
import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
12
|
+
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
13
|
+
import { workerSSRRender } from "./workerSSRRender";
|
|
14
|
+
class ModernDevServer extends ModernServer {
|
|
15
|
+
getDevOptions(options) {
|
|
16
|
+
const devOptions = typeof options.dev === "boolean" ? {} : options.dev;
|
|
17
|
+
const defaultOptions = getDefaultDevOptions();
|
|
18
|
+
return deepMerge(defaultOptions, devOptions);
|
|
19
|
+
}
|
|
20
|
+
addMiddlewareHandler(handlers) {
|
|
21
|
+
handlers.forEach((handler) => {
|
|
22
|
+
this.addHandler((ctx, next) => {
|
|
23
|
+
const { req, res } = ctx;
|
|
24
|
+
return handler(req, res, next);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
applySetupMiddlewares() {
|
|
29
|
+
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
30
|
+
const serverOptions = {
|
|
31
|
+
sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
|
|
32
|
+
};
|
|
33
|
+
const befores = [];
|
|
34
|
+
const afters = [];
|
|
35
|
+
setupMiddlewares.forEach((handler) => {
|
|
36
|
+
handler({
|
|
37
|
+
unshift: (...handlers) => befores.unshift(...handlers),
|
|
38
|
+
push: (...handlers) => afters.push(...handlers)
|
|
39
|
+
}, serverOptions);
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
befores,
|
|
43
|
+
afters
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Complete the preparation of services
|
|
47
|
+
async onInit(runner, app) {
|
|
48
|
+
this.runner = runner;
|
|
49
|
+
const { dev } = this;
|
|
50
|
+
const { befores, afters } = this.applySetupMiddlewares();
|
|
51
|
+
const beforeHandlers = this.dev.before || [];
|
|
52
|
+
this.addMiddlewareHandler([
|
|
53
|
+
...beforeHandlers,
|
|
54
|
+
...befores
|
|
55
|
+
]);
|
|
56
|
+
await this.applyDefaultMiddlewares(app);
|
|
57
|
+
const afterHandlers = this.dev.after || [];
|
|
58
|
+
this.addMiddlewareHandler([
|
|
59
|
+
...afters,
|
|
60
|
+
...afterHandlers
|
|
61
|
+
]);
|
|
62
|
+
await super.onInit(runner, app);
|
|
63
|
+
if (dev.watch) {
|
|
64
|
+
this.startWatcher();
|
|
65
|
+
app.on("close", async () => {
|
|
66
|
+
var _this_watcher;
|
|
67
|
+
await ((_this_watcher = this.watcher) === null || _this_watcher === void 0 ? void 0 : _this_watcher.close());
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// override the ModernServer renderHandler logic
|
|
72
|
+
getRenderHandler() {
|
|
73
|
+
if (this.useWorkerSSR) {
|
|
74
|
+
var _this_conf_server, _conf_security;
|
|
75
|
+
const { distDir, staticGenerate, conf, metaName } = this;
|
|
76
|
+
const ssrConfig = (_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.ssr;
|
|
77
|
+
const forceCSR = typeof ssrConfig === "object" ? ssrConfig.forceCSR : false;
|
|
78
|
+
return createRenderHandler({
|
|
79
|
+
ssrRender: workerSSRRender,
|
|
80
|
+
distDir,
|
|
81
|
+
staticGenerate,
|
|
82
|
+
conf,
|
|
83
|
+
forceCSR,
|
|
84
|
+
nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
|
|
85
|
+
metaName
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return super.getRenderHandler();
|
|
89
|
+
}
|
|
90
|
+
async applyDefaultMiddlewares(app) {
|
|
91
|
+
const { pwd, dev, devMiddleware, conf } = this;
|
|
92
|
+
const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
|
|
93
|
+
const isUseSSRPreload = () => {
|
|
94
|
+
const { server: { ssr, ssrByEntries } } = conf;
|
|
95
|
+
const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
|
|
96
|
+
return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
|
|
97
|
+
};
|
|
98
|
+
if (!isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress) {
|
|
99
|
+
const { default: compression } = await import("http-compression");
|
|
100
|
+
this.addHandler((ctx, next) => {
|
|
101
|
+
compression({
|
|
102
|
+
gzip: true,
|
|
103
|
+
brotli: false
|
|
104
|
+
})(ctx.req, ctx.res, next);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this.addHandler((ctx, next) => {
|
|
108
|
+
ctx.res.setHeader("Access-Control-Allow-Origin", "*");
|
|
109
|
+
if (ctx.path.includes("hot-update")) {
|
|
110
|
+
ctx.res.setHeader("Access-Control-Allow-Credentials", "false");
|
|
111
|
+
}
|
|
112
|
+
const confHeaders = dev.headers;
|
|
113
|
+
if (confHeaders) {
|
|
114
|
+
for (const [key, value] of Object.entries(confHeaders)) {
|
|
115
|
+
ctx.res.setHeader(key, value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
next();
|
|
119
|
+
});
|
|
120
|
+
this.mockHandler = createMockHandler({
|
|
121
|
+
pwd
|
|
122
|
+
});
|
|
123
|
+
this.addHandler((ctx, next) => {
|
|
124
|
+
if (this.mockHandler) {
|
|
125
|
+
this.mockHandler(ctx, next);
|
|
126
|
+
} else {
|
|
127
|
+
next();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
if (dev.proxy) {
|
|
131
|
+
const { handlers, handleUpgrade } = createProxyHandler(dev.proxy);
|
|
132
|
+
app && handleUpgrade(app);
|
|
133
|
+
handlers.forEach((handler) => {
|
|
134
|
+
this.addHandler(handler);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
devMiddleware.init(app);
|
|
138
|
+
devMiddleware.on("change", (stats) => {
|
|
139
|
+
if (stats.toJson({
|
|
140
|
+
all: false
|
|
141
|
+
}).name !== "server") {
|
|
142
|
+
this.onRepack({
|
|
143
|
+
routes: this.getRoutes()
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
this.addHandler((ctx, next) => {
|
|
148
|
+
const { req, res } = ctx;
|
|
149
|
+
if (devMiddleware.middleware) {
|
|
150
|
+
devMiddleware.middleware(req, res, next);
|
|
151
|
+
} else {
|
|
152
|
+
next();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
if (dev.historyApiFallback) {
|
|
156
|
+
const { default: connectHistoryApiFallback } = await import("connect-history-api-fallback");
|
|
157
|
+
const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === "boolean" ? {} : dev.historyApiFallback);
|
|
158
|
+
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
onRepack(options = {}) {
|
|
162
|
+
if (Array.isArray(options.routes)) {
|
|
163
|
+
this.router.reset(this.filterRoutes(options.routes));
|
|
164
|
+
}
|
|
165
|
+
this.cleanSSRCache();
|
|
166
|
+
this.reader.updateFile();
|
|
167
|
+
this.runner.repack();
|
|
168
|
+
super.onRepack(options);
|
|
169
|
+
}
|
|
170
|
+
async createHTTPServer(handler) {
|
|
171
|
+
const { dev } = this;
|
|
172
|
+
const devHttpsOption = typeof dev === "object" && dev.https;
|
|
173
|
+
if (devHttpsOption) {
|
|
174
|
+
const { genHttpsOptions } = require("../dev-tools/https");
|
|
175
|
+
const httpsOptions = await genHttpsOptions(devHttpsOption, this.pwd);
|
|
176
|
+
return createHttpsServer(httpsOptions, handler);
|
|
177
|
+
} else {
|
|
178
|
+
return createServer(handler);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
warmupSSRBundle() {
|
|
182
|
+
}
|
|
183
|
+
initReader() {
|
|
184
|
+
var _this_dev_devMiddleware, _this_dev;
|
|
185
|
+
let isInit = false;
|
|
186
|
+
if (this.devMiddleware && ((_this_dev = this.dev) === null || _this_dev === void 0 ? void 0 : (_this_dev_devMiddleware = _this_dev.devMiddleware) === null || _this_dev_devMiddleware === void 0 ? void 0 : _this_dev_devMiddleware.writeToDisk) === false) {
|
|
187
|
+
this.addHandler((ctx, next) => {
|
|
188
|
+
if (isInit) {
|
|
189
|
+
return next();
|
|
190
|
+
}
|
|
191
|
+
isInit = true;
|
|
192
|
+
if (!ctx.res.locals.webpack) {
|
|
193
|
+
this.reader.init();
|
|
194
|
+
return next();
|
|
195
|
+
}
|
|
196
|
+
const { devMiddleware: webpackDevMid } = ctx.res.locals.webpack;
|
|
197
|
+
const { outputFileSystem } = webpackDevMid;
|
|
198
|
+
if (outputFileSystem) {
|
|
199
|
+
this.reader.init(outputFileSystem);
|
|
200
|
+
} else {
|
|
201
|
+
this.reader.init();
|
|
202
|
+
}
|
|
203
|
+
return next();
|
|
204
|
+
});
|
|
205
|
+
} else {
|
|
206
|
+
super.initReader();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async onServerChange({ filepath, event }) {
|
|
210
|
+
const { pwd } = this;
|
|
211
|
+
const { mock } = AGGRED_DIR;
|
|
212
|
+
const mockPath = path.normalize(path.join(pwd, mock));
|
|
213
|
+
this.runner.reset();
|
|
214
|
+
if (filepath.startsWith(mockPath)) {
|
|
215
|
+
this.mockHandler = createMockHandler({
|
|
216
|
+
pwd
|
|
217
|
+
});
|
|
218
|
+
} else {
|
|
219
|
+
try {
|
|
220
|
+
const success = this.runner.onApiChange([
|
|
221
|
+
{
|
|
222
|
+
filename: filepath,
|
|
223
|
+
event
|
|
224
|
+
}
|
|
225
|
+
]);
|
|
226
|
+
if (success !== true) {
|
|
227
|
+
await super.onServerChange({
|
|
228
|
+
filepath
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
} catch (e) {
|
|
232
|
+
this.logger.error(e);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
createContext(req, res) {
|
|
237
|
+
return super.createContext(req, res, {
|
|
238
|
+
etag: true,
|
|
239
|
+
metaName: this.metaName
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
setupStaticMiddleware(_) {
|
|
243
|
+
return async (context, next) => {
|
|
244
|
+
return next();
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
cleanSSRCache() {
|
|
248
|
+
const { distDir } = this;
|
|
249
|
+
const bundles = this.router.getBundles();
|
|
250
|
+
bundles.forEach((bundle) => {
|
|
251
|
+
const filepath = path.join(distDir, bundle);
|
|
252
|
+
if (require.cache[filepath]) {
|
|
253
|
+
delete require.cache[filepath];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
const loadable = path.join(distDir, LOADABLE_STATS_FILE);
|
|
257
|
+
if (require.cache[loadable]) {
|
|
258
|
+
delete require.cache[loadable];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
startWatcher() {
|
|
262
|
+
var _this_conf_server;
|
|
263
|
+
const { pwd, distDir, appContext } = this;
|
|
264
|
+
const { mock } = AGGRED_DIR;
|
|
265
|
+
const apiDir = (appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory) || API_DIR;
|
|
266
|
+
const sharedDir = (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || SHARED_DIR;
|
|
267
|
+
const defaultWatched = [
|
|
268
|
+
`${mock}/**/*`,
|
|
269
|
+
`${SERVER_DIR}/**/*`,
|
|
270
|
+
`${apiDir}/**`,
|
|
271
|
+
`${sharedDir}/**/*`,
|
|
272
|
+
`${distDir}/${SERVER_BUNDLE_DIRECTORY}/*-server-loaders.js`
|
|
273
|
+
];
|
|
274
|
+
const watchOptions = mergeWatchOptions((_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.watchOptions);
|
|
275
|
+
const defaultWatchedPaths = defaultWatched.map((p) => {
|
|
276
|
+
const finalPath = path.isAbsolute(p) ? p : path.join(pwd, p);
|
|
277
|
+
return path.normalize(finalPath);
|
|
278
|
+
});
|
|
279
|
+
const watcher = new Watcher();
|
|
280
|
+
watcher.createDepTree();
|
|
281
|
+
watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
|
|
282
|
+
if (filepath.includes("-server-loaders.js")) {
|
|
283
|
+
delete require.cache[filepath];
|
|
284
|
+
return;
|
|
285
|
+
} else {
|
|
286
|
+
watcher.updateDepTree();
|
|
287
|
+
watcher.cleanDepCache(filepath);
|
|
288
|
+
}
|
|
289
|
+
this.onServerChange({
|
|
290
|
+
filepath,
|
|
291
|
+
event
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
this.watcher = watcher;
|
|
295
|
+
}
|
|
296
|
+
constructor(options) {
|
|
297
|
+
super(options);
|
|
298
|
+
_define_property(this, "mockHandler", null);
|
|
299
|
+
_define_property(this, "dev", void 0);
|
|
300
|
+
_define_property(this, "useWorkerSSR", void 0);
|
|
301
|
+
_define_property(this, "appContext", void 0);
|
|
302
|
+
_define_property(this, "devMiddleware", void 0);
|
|
303
|
+
_define_property(this, "watcher", void 0);
|
|
304
|
+
this.appContext = options.appContext;
|
|
305
|
+
this.workDir = this.pwd;
|
|
306
|
+
this.useWorkerSSR = Boolean(options.useWorkerSSR);
|
|
307
|
+
this.dev = this.getDevOptions(options);
|
|
308
|
+
this.devMiddleware = new DevMiddleware({
|
|
309
|
+
dev: this.dev,
|
|
310
|
+
devMiddleware: options.devMiddleware
|
|
311
|
+
});
|
|
312
|
+
enableRegister(this.pwd, this.conf);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export {
|
|
316
|
+
ModernDevServer
|
|
317
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Server } from "@modern-js/prod-server";
|
|
2
|
-
import { ModernDevServer } from "./
|
|
2
|
+
import { ModernDevServer } from "./devServerOld";
|
|
3
|
+
import { ModernDevServer as ModernDevServerForRsbuild } from "./devServer";
|
|
3
4
|
const createDevServer = (options) => {
|
|
4
5
|
return new ModernDevServer(options);
|
|
5
6
|
};
|
|
@@ -11,6 +12,15 @@ class DevServer extends Server {
|
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
class DevServerForRsbuild extends Server {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super(options);
|
|
18
|
+
if (options.dev) {
|
|
19
|
+
this.serverImpl = (options2) => new ModernDevServerForRsbuild(options2);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
14
23
|
export {
|
|
15
|
-
DevServer
|
|
24
|
+
DevServer,
|
|
25
|
+
DevServerForRsbuild
|
|
16
26
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node/http" />
|
|
4
|
+
/// <reference types="@modern-js/prod-server/src/type" />
|
|
3
5
|
import { Server } from 'http';
|
|
4
6
|
import { EventEmitter } from 'events';
|
|
5
7
|
import { DevServerOptions, DevMiddlewareAPI, DevMiddleware as CustomDevMiddleware } from '../../types';
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node/http" />
|
|
3
|
+
/// <reference types="@modern-js/prod-server/src/type" />
|
|
2
4
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
5
|
import type { ModernServerContext, NextFunction } from '@modern-js/types';
|
|
4
6
|
export type MockConfig = Record<string, {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DevServer as Server } from './server';
|
|
1
|
+
import { DevServer as Server, DevServerForRsbuild as ServerForRsbuild } from './server';
|
|
2
2
|
import type { ModernDevServerOptions } from './types';
|
|
3
|
-
export { Server };
|
|
3
|
+
export { Server, ServerForRsbuild };
|
|
4
4
|
export type { ModernDevServerOptions };
|
|
5
5
|
declare const _default: (options: ModernDevServerOptions) => Promise<Server>;
|
|
6
6
|
export default _default;
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node/http" />
|
|
4
|
+
/// <reference types="@modern-js/prod-server/src/type" />
|
|
3
5
|
import { IncomingMessage, Server, ServerResponse } from 'http';
|
|
4
6
|
import { NextFunction, ServerHookRunner, ModernServer, BuildOptions } from '@modern-js/prod-server';
|
|
5
7
|
import type { ModernServerContext } from '@modern-js/types';
|
|
6
8
|
import { RenderHandler } from '@modern-js/prod-server/src/libs/render';
|
|
7
9
|
import { WatchEvent } from '../dev-tools/watcher';
|
|
8
|
-
import type {
|
|
10
|
+
import type { ModernDevServerOptionsNew } from '../types';
|
|
9
11
|
export declare class ModernDevServer extends ModernServer {
|
|
10
12
|
private mockHandler;
|
|
11
13
|
private readonly dev;
|
|
12
14
|
private readonly useWorkerSSR;
|
|
13
15
|
private readonly appContext;
|
|
14
|
-
private
|
|
16
|
+
private getMiddlewares;
|
|
17
|
+
private rsbuild;
|
|
15
18
|
private watcher?;
|
|
16
|
-
|
|
19
|
+
private closeCb;
|
|
20
|
+
constructor(options: ModernDevServerOptionsNew);
|
|
17
21
|
private getDevOptions;
|
|
18
22
|
private addMiddlewareHandler;
|
|
19
|
-
private applySetupMiddlewares;
|
|
20
23
|
onInit(runner: ServerHookRunner, app: Server): Promise<void>;
|
|
24
|
+
close(): Promise<void>;
|
|
21
25
|
getRenderHandler(): RenderHandler;
|
|
22
26
|
private applyDefaultMiddlewares;
|
|
23
27
|
onRepack(options?: BuildOptions): void;
|
|
@@ -29,9 +33,7 @@ export declare class ModernDevServer extends ModernServer {
|
|
|
29
33
|
event: WatchEvent;
|
|
30
34
|
}): Promise<void>;
|
|
31
35
|
protected createContext(req: IncomingMessage, res: ServerResponse): import("@modern-js/prod-server/src/libs/context").ModernServerContext;
|
|
32
|
-
protected setupStaticMiddleware(_: string): (
|
|
33
|
-
private setupBeforeDevMiddleware;
|
|
34
|
-
private setupAfterDevMiddleware;
|
|
36
|
+
protected setupStaticMiddleware(_: string): (_context: ModernServerContext, next: NextFunction) => Promise<void>;
|
|
35
37
|
private cleanSSRCache;
|
|
36
38
|
private startWatcher;
|
|
37
39
|
}
|