@modern-js/server 2.42.2 → 2.44.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.
Files changed (38) hide show
  1. package/dist/cjs/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
  2. package/dist/cjs/dev-tools/dev-middleware/index.js +2 -3
  3. package/dist/cjs/dev-tools/dev-middleware/socketServer.js +2 -3
  4. package/dist/cjs/dev-tools/watcher/index.js +2 -3
  5. package/dist/cjs/index.js +3 -1
  6. package/dist/cjs/server/devServer.js +96 -144
  7. package/dist/cjs/server/devServerOld.js +352 -0
  8. package/dist/cjs/server/index.js +14 -3
  9. package/dist/cjs/server/workerSSRRender.js +1 -1
  10. package/dist/esm/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
  11. package/dist/esm/dev-tools/dev-middleware/index.js +1 -2
  12. package/dist/esm/dev-tools/dev-middleware/socketServer.js +1 -2
  13. package/dist/esm/dev-tools/watcher/index.js +1 -2
  14. package/dist/esm/index.js +2 -1
  15. package/dist/esm/server/devServer.js +195 -268
  16. package/dist/esm/server/devServerOld.js +579 -0
  17. package/dist/esm/server/index.js +21 -2
  18. package/dist/esm/server/workerSSRRender.js +1 -1
  19. package/dist/esm-node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +1 -1
  20. package/dist/esm-node/dev-tools/dev-middleware/index.js +2 -3
  21. package/dist/esm-node/dev-tools/dev-middleware/socketServer.js +2 -3
  22. package/dist/esm-node/dev-tools/watcher/index.js +2 -3
  23. package/dist/esm-node/index.js +2 -1
  24. package/dist/esm-node/server/devServer.js +97 -145
  25. package/dist/esm-node/server/devServerOld.js +318 -0
  26. package/dist/esm-node/server/index.js +12 -2
  27. package/dist/esm-node/server/workerSSRRender.js +1 -1
  28. package/dist/types/dev-tools/dev-middleware/index.d.ts +2 -0
  29. package/dist/types/dev-tools/dev-middleware/socketServer.d.ts +2 -0
  30. package/dist/types/dev-tools/https/index.d.ts +1 -0
  31. package/dist/types/dev-tools/mock/getMockData.d.ts +2 -0
  32. package/dist/types/index.d.ts +4 -4
  33. package/dist/types/server/devServer.d.ts +10 -8
  34. package/dist/types/server/devServerOld.d.ts +37 -0
  35. package/dist/types/server/index.d.ts +4 -1
  36. package/dist/types/server/workerSSRRender.d.ts +2 -1
  37. package/dist/types/types.d.ts +10 -0
  38. package/package.json +12 -10
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var devServerOld_exports = {};
30
+ __export(devServerOld_exports, {
31
+ ModernDevServer: () => ModernDevServer
32
+ });
33
+ module.exports = __toCommonJS(devServerOld_exports);
34
+ var import_define_property = require("@swc/helpers/_/_define_property");
35
+ var import_http = require("http");
36
+ var import_path = __toESM(require("path"));
37
+ var import_https = require("https");
38
+ var import_utils = require("@modern-js/utils");
39
+ var import_prod_server = require("@modern-js/prod-server");
40
+ var import_lodash = require("@modern-js/utils/lodash");
41
+ var import_fileReader = require("@modern-js/runtime-utils/fileReader");
42
+ var import_constants = require("../constants");
43
+ var import_mock = require("../dev-tools/mock");
44
+ var import_register = require("../dev-tools/register");
45
+ var import_watcher = __toESM(require("../dev-tools/watcher"));
46
+ var import_dev_middleware = __toESM(require("../dev-tools/dev-middleware"));
47
+ var import_workerSSRRender = require("./workerSSRRender");
48
+ class ModernDevServer extends import_prod_server.ModernServer {
49
+ getDevOptions(options) {
50
+ const devOptions = typeof options.dev === "boolean" ? {} : options.dev;
51
+ const defaultOptions = (0, import_constants.getDefaultDevOptions)();
52
+ return (0, import_lodash.merge)(defaultOptions, devOptions);
53
+ }
54
+ addMiddlewareHandler(handlers) {
55
+ handlers.forEach((handler) => {
56
+ this.addHandler((ctx, next) => {
57
+ const { req, res } = ctx;
58
+ return handler(req, res, next);
59
+ });
60
+ });
61
+ }
62
+ applySetupMiddlewares() {
63
+ const setupMiddlewares = this.dev.setupMiddlewares || [];
64
+ const serverOptions = {
65
+ sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
66
+ };
67
+ const befores = [];
68
+ const afters = [];
69
+ setupMiddlewares.forEach((handler) => {
70
+ handler({
71
+ unshift: (...handlers) => befores.unshift(...handlers),
72
+ push: (...handlers) => afters.push(...handlers)
73
+ }, serverOptions);
74
+ });
75
+ return {
76
+ befores,
77
+ afters
78
+ };
79
+ }
80
+ // Complete the preparation of services
81
+ async onInit(runner, app) {
82
+ this.runner = runner;
83
+ const { dev } = this;
84
+ const { befores, afters } = this.applySetupMiddlewares();
85
+ const beforeHandlers = this.dev.before || [];
86
+ this.addMiddlewareHandler([
87
+ ...beforeHandlers,
88
+ ...befores
89
+ ]);
90
+ await this.applyDefaultMiddlewares(app);
91
+ const afterHandlers = this.dev.after || [];
92
+ this.addMiddlewareHandler([
93
+ ...afters,
94
+ ...afterHandlers
95
+ ]);
96
+ this.initFileReader();
97
+ await super.onInit(runner, app);
98
+ if (dev.watch) {
99
+ this.startWatcher();
100
+ app.on("close", async () => {
101
+ var _this_watcher;
102
+ await ((_this_watcher = this.watcher) === null || _this_watcher === void 0 ? void 0 : _this_watcher.close());
103
+ });
104
+ }
105
+ }
106
+ // override the ModernServer renderHandler logic
107
+ getRenderHandler() {
108
+ if (this.useWorkerSSR) {
109
+ var _this_conf_server, _conf_security;
110
+ const { distDir, staticGenerate, conf, metaName } = this;
111
+ const ssrConfig = (_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.ssr;
112
+ const forceCSR = typeof ssrConfig === "object" ? ssrConfig.forceCSR : false;
113
+ return (0, import_prod_server.createRenderHandler)({
114
+ ssrRender: import_workerSSRRender.workerSSRRender,
115
+ distDir,
116
+ staticGenerate,
117
+ conf,
118
+ forceCSR,
119
+ nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
120
+ metaName
121
+ });
122
+ }
123
+ return super.getRenderHandler();
124
+ }
125
+ initFileReader() {
126
+ var _this_dev_devMiddleware, _this_dev;
127
+ let isInit = false;
128
+ 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) {
129
+ this.addHandler((ctx, next) => {
130
+ var _ctx_res_locals;
131
+ if (isInit) {
132
+ return next();
133
+ }
134
+ isInit = true;
135
+ if (!((_ctx_res_locals = ctx.res.locals) === null || _ctx_res_locals === void 0 ? void 0 : _ctx_res_locals.webpack)) {
136
+ import_fileReader.fileReader.reset();
137
+ return next();
138
+ }
139
+ const { devMiddleware: webpackDevMid } = ctx.res.locals.webpack;
140
+ const { outputFileSystem } = webpackDevMid;
141
+ if (outputFileSystem) {
142
+ import_fileReader.fileReader.reset(outputFileSystem);
143
+ } else {
144
+ import_fileReader.fileReader.reset();
145
+ }
146
+ return next();
147
+ });
148
+ }
149
+ }
150
+ async applyDefaultMiddlewares(app) {
151
+ const { pwd, dev, devMiddleware, conf } = this;
152
+ const isUseStreamingSSR = (routes) => routes === null || routes === void 0 ? void 0 : routes.some((r) => r.isStream === true);
153
+ const isUseSSRPreload = () => {
154
+ const { server: { ssr, ssrByEntries } } = conf;
155
+ const checkUsePreload = (ssr2) => typeof ssr2 === "object" && Boolean(ssr2.preload);
156
+ return checkUsePreload(ssr) || Object.values(ssrByEntries || {}).some((ssr2) => checkUsePreload(ssr2));
157
+ };
158
+ if (!isUseStreamingSSR(this.getRoutes()) && !isUseSSRPreload() && dev.compress) {
159
+ const { default: compression } = await Promise.resolve().then(() => __toESM(require("http-compression")));
160
+ this.addHandler((ctx, next) => {
161
+ compression({
162
+ gzip: true,
163
+ brotli: false
164
+ })(ctx.req, ctx.res, next);
165
+ });
166
+ }
167
+ this.addHandler((ctx, next) => {
168
+ ctx.res.setHeader("Access-Control-Allow-Origin", "*");
169
+ if (ctx.path.includes("hot-update")) {
170
+ ctx.res.setHeader("Access-Control-Allow-Credentials", "false");
171
+ }
172
+ const confHeaders = dev.headers;
173
+ if (confHeaders) {
174
+ for (const [key, value] of Object.entries(confHeaders)) {
175
+ ctx.res.setHeader(key, value);
176
+ }
177
+ }
178
+ next();
179
+ });
180
+ this.mockHandler = (0, import_mock.createMockHandler)({
181
+ pwd
182
+ });
183
+ this.addHandler((ctx, next) => {
184
+ if (this.mockHandler) {
185
+ this.mockHandler(ctx, next);
186
+ } else {
187
+ next();
188
+ }
189
+ });
190
+ if (dev.proxy) {
191
+ const { handlers, handleUpgrade } = (0, import_prod_server.createProxyHandler)(dev.proxy);
192
+ app && handleUpgrade(app);
193
+ handlers.forEach((handler) => {
194
+ this.addHandler(handler);
195
+ });
196
+ }
197
+ devMiddleware.init(app);
198
+ devMiddleware.on("change", (stats) => {
199
+ if (stats.toJson({
200
+ all: false
201
+ }).name !== "server") {
202
+ this.onRepack({
203
+ routes: this.getRoutes()
204
+ });
205
+ }
206
+ });
207
+ this.addHandler((ctx, next) => {
208
+ const { req, res } = ctx;
209
+ if (devMiddleware.middleware) {
210
+ devMiddleware.middleware(req, res, next);
211
+ } else {
212
+ next();
213
+ }
214
+ });
215
+ if (dev.historyApiFallback) {
216
+ const { default: connectHistoryApiFallback } = await Promise.resolve().then(() => __toESM(require("connect-history-api-fallback")));
217
+ const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === "boolean" ? {} : dev.historyApiFallback);
218
+ this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
219
+ }
220
+ }
221
+ onRepack(options = {}) {
222
+ if (Array.isArray(options.routes)) {
223
+ this.router.reset(this.filterRoutes(options.routes));
224
+ }
225
+ this.cleanSSRCache();
226
+ import_fileReader.fileReader.reset();
227
+ this.runner.repack();
228
+ super.onRepack(options);
229
+ }
230
+ async createHTTPServer(handler) {
231
+ const { dev } = this;
232
+ const devHttpsOption = typeof dev === "object" && dev.https;
233
+ if (devHttpsOption) {
234
+ const { genHttpsOptions } = require("../dev-tools/https");
235
+ const httpsOptions = await genHttpsOptions(devHttpsOption, this.pwd);
236
+ return (0, import_https.createServer)(httpsOptions, handler);
237
+ } else {
238
+ return (0, import_http.createServer)(handler);
239
+ }
240
+ }
241
+ warmupSSRBundle() {
242
+ }
243
+ async onServerChange({ filepath, event }) {
244
+ const { pwd } = this;
245
+ const { mock } = import_prod_server.AGGRED_DIR;
246
+ const mockPath = import_path.default.normalize(import_path.default.join(pwd, mock));
247
+ this.runner.reset();
248
+ if (filepath.startsWith(mockPath)) {
249
+ this.mockHandler = (0, import_mock.createMockHandler)({
250
+ pwd
251
+ });
252
+ } else {
253
+ try {
254
+ const success = this.runner.onApiChange([
255
+ {
256
+ filename: filepath,
257
+ event
258
+ }
259
+ ]);
260
+ if (success !== true) {
261
+ await super.onServerChange({
262
+ filepath
263
+ });
264
+ }
265
+ } catch (e) {
266
+ this.logger.error(e);
267
+ }
268
+ }
269
+ }
270
+ createContext(req, res) {
271
+ return super.createContext(req, res, {
272
+ etag: true,
273
+ metaName: this.metaName
274
+ });
275
+ }
276
+ setupStaticMiddleware(_) {
277
+ return async (context, next) => {
278
+ return next();
279
+ };
280
+ }
281
+ cleanSSRCache() {
282
+ const { distDir } = this;
283
+ const bundles = this.router.getBundles();
284
+ bundles.forEach((bundle) => {
285
+ const filepath = import_path.default.join(distDir, bundle);
286
+ if (require.cache[filepath]) {
287
+ delete require.cache[filepath];
288
+ }
289
+ });
290
+ const loadable = import_path.default.join(distDir, import_utils.LOADABLE_STATS_FILE);
291
+ if (require.cache[loadable]) {
292
+ delete require.cache[loadable];
293
+ }
294
+ }
295
+ startWatcher() {
296
+ var _this_conf_server;
297
+ const { pwd, distDir, appContext } = this;
298
+ const { mock } = import_prod_server.AGGRED_DIR;
299
+ const apiDir = (appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory) || import_utils.API_DIR;
300
+ const sharedDir = (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || import_utils.SHARED_DIR;
301
+ const defaultWatched = [
302
+ `${mock}/**/*`,
303
+ `${import_utils.SERVER_DIR}/**/*`,
304
+ `${apiDir}/**`,
305
+ `${sharedDir}/**/*`,
306
+ `${distDir}/${import_utils.SERVER_BUNDLE_DIRECTORY}/*-server-loaders.js`
307
+ ];
308
+ const watchOptions = (0, import_watcher.mergeWatchOptions)((_this_conf_server = this.conf.server) === null || _this_conf_server === void 0 ? void 0 : _this_conf_server.watchOptions);
309
+ const defaultWatchedPaths = defaultWatched.map((p) => {
310
+ const finalPath = import_path.default.isAbsolute(p) ? p : import_path.default.join(pwd, p);
311
+ return import_path.default.normalize(finalPath);
312
+ });
313
+ const watcher = new import_watcher.default();
314
+ watcher.createDepTree();
315
+ watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
316
+ if (filepath.includes("-server-loaders.js")) {
317
+ delete require.cache[filepath];
318
+ return;
319
+ } else {
320
+ watcher.updateDepTree();
321
+ watcher.cleanDepCache(filepath);
322
+ }
323
+ this.onServerChange({
324
+ filepath,
325
+ event
326
+ });
327
+ });
328
+ this.watcher = watcher;
329
+ }
330
+ constructor(options) {
331
+ super(options);
332
+ (0, import_define_property._)(this, "mockHandler", null);
333
+ (0, import_define_property._)(this, "dev", void 0);
334
+ (0, import_define_property._)(this, "useWorkerSSR", void 0);
335
+ (0, import_define_property._)(this, "appContext", void 0);
336
+ (0, import_define_property._)(this, "devMiddleware", void 0);
337
+ (0, import_define_property._)(this, "watcher", void 0);
338
+ this.appContext = options.appContext;
339
+ this.workDir = this.pwd;
340
+ this.useWorkerSSR = Boolean(options.useWorkerSSR);
341
+ this.dev = this.getDevOptions(options);
342
+ this.devMiddleware = new import_dev_middleware.default({
343
+ dev: this.dev,
344
+ devMiddleware: options.devMiddleware
345
+ });
346
+ (0, import_register.enableRegister)(this.pwd, this.conf);
347
+ }
348
+ }
349
+ // Annotate the CommonJS export names for ESM import in node:
350
+ 0 && (module.exports = {
351
+ ModernDevServer
352
+ });
@@ -18,13 +18,15 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var server_exports = {};
20
20
  __export(server_exports, {
21
- DevServer: () => DevServer
21
+ DevServer: () => DevServer,
22
+ DevServerForRsbuild: () => DevServerForRsbuild
22
23
  });
23
24
  module.exports = __toCommonJS(server_exports);
24
25
  var import_prod_server = require("@modern-js/prod-server");
26
+ var import_devServerOld = require("./devServerOld");
25
27
  var import_devServer = require("./devServer");
26
28
  const createDevServer = (options) => {
27
- return new import_devServer.ModernDevServer(options);
29
+ return new import_devServerOld.ModernDevServer(options);
28
30
  };
29
31
  class DevServer extends import_prod_server.Server {
30
32
  constructor(options) {
@@ -34,7 +36,16 @@ class DevServer extends import_prod_server.Server {
34
36
  }
35
37
  }
36
38
  }
39
+ class DevServerForRsbuild extends import_prod_server.Server {
40
+ constructor(options) {
41
+ super(options);
42
+ if (options.dev) {
43
+ this.serverImpl = (options2) => new import_devServer.ModernDevServer(options2);
44
+ }
45
+ }
46
+ }
37
47
  // Annotate the CommonJS export names for ESM import in node:
38
48
  0 && (module.exports = {
39
- DevServer
49
+ DevServer,
50
+ DevServerForRsbuild
40
51
  });
@@ -36,7 +36,7 @@ var import_utils = require("@modern-js/utils");
36
36
  const PORT = 9230;
37
37
  async function workerSSRRender(ctx, renderOptions, _runner) {
38
38
  const { headers, params } = ctx;
39
- const { urlPath } = renderOptions;
39
+ const { urlPath } = renderOptions.route;
40
40
  const url = `http://0.0.0.0:${PORT}/${urlPath}`;
41
41
  const resposne = await import_axios.default.get(url, {
42
42
  timeout: 5e3,
@@ -28,7 +28,7 @@ function createSocketUrl(resourceQuery) {
28
28
  }
29
29
  function formatURL(param) {
30
30
  var port = param.port, protocol = param.protocol, hostname = param.hostname, pathname = param.pathname;
31
- if (window.URL) {
31
+ if (typeof URL !== "undefined") {
32
32
  var url = new URL("http://localhost");
33
33
  url.port = port;
34
34
  url.hostname = hostname;
@@ -19,8 +19,7 @@ function getHMRClientPath(client) {
19
19
  var clientEntry = "".concat(require.resolve("@modern-js/server/hmr-client"), "?").concat(host).concat(path).concat(port).concat(protocol);
20
20
  return clientEntry;
21
21
  }
22
- var DevMiddleware;
23
- DevMiddleware = /* @__PURE__ */ function(EventEmitter2) {
22
+ var DevMiddleware = /* @__PURE__ */ function(EventEmitter2) {
24
23
  "use strict";
25
24
  _inherits(DevMiddleware2, EventEmitter2);
26
25
  var _super = _create_super(DevMiddleware2);
@@ -3,8 +3,7 @@ import { _ as _create_class } from "@swc/helpers/_/_create_class";
3
3
  import { _ as _define_property } from "@swc/helpers/_/_define_property";
4
4
  import ws from "ws";
5
5
  import { logger } from "@modern-js/utils";
6
- var SocketServer;
7
- SocketServer = /* @__PURE__ */ function() {
6
+ var SocketServer = /* @__PURE__ */ function() {
8
7
  "use strict";
9
8
  function SocketServer2(options) {
10
9
  _class_call_check(this, SocketServer2);
@@ -38,8 +38,7 @@ var mergeWatchOptions = function(options) {
38
38
  var finalWatchOptions = _object_spread({}, defaultWatchOptions, watchOptions);
39
39
  return finalWatchOptions;
40
40
  };
41
- var Watcher;
42
- Watcher = /* @__PURE__ */ function() {
41
+ var Watcher = /* @__PURE__ */ function() {
43
42
  "use strict";
44
43
  function Watcher2() {
45
44
  _class_call_check(this, Watcher2);
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { DevServer as Server } from "./server";
1
+ import { DevServer as Server, DevServerForRsbuild as ServerForRsbuild } from "./server";
2
2
  function src_default(options) {
3
3
  if (options == null) {
4
4
  throw new Error("can not start server without options");
@@ -9,5 +9,6 @@ function src_default(options) {
9
9
  ;
10
10
  export {
11
11
  Server,
12
+ ServerForRsbuild,
12
13
  src_default as default
13
14
  };