@modern-js/prod-server 2.9.0 → 2.10.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.
@@ -219,8 +219,7 @@ var __generator = this && this.__generator || function(thisArg, body) {
219
219
  }
220
220
  };
221
221
  import path from "path";
222
- import fs from "fs";
223
- import { Logger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS } from "@modern-js/utils";
222
+ import { fs, Logger, SHARED_DIR, OUTPUT_CONFIG_FILE, dotenv, dotenvExpand, INTERNAL_SERVER_PLUGINS } from "@modern-js/utils";
224
223
  import { serverManager, AppContext, ConfigContext, loadPlugins } from "@modern-js/server-core";
225
224
  import { metrics as defaultMetrics } from "../libs/metrics";
226
225
  import { loadConfig, getServerConfigPath, requireConfig } from "../libs/loadConfig";
@@ -267,50 +266,55 @@ var Server = /*#__PURE__*/ function() {
267
266
  switch(_state.label){
268
267
  case 0:
269
268
  options = _this.options;
270
- _this.loadServerEnv(options);
269
+ return [
270
+ 4,
271
+ _this.loadServerEnv(options)
272
+ ];
273
+ case 1:
274
+ _state.sent();
271
275
  _this.initServerConfig(options);
272
276
  return [
273
277
  4,
274
278
  _this.injectContext(_this.runner, options)
275
279
  ];
276
- case 1:
280
+ case 2:
277
281
  _state.sent();
278
282
  return [
279
283
  4,
280
284
  _this.createHookRunner()
281
285
  ];
282
- case 2:
286
+ case 3:
283
287
  _this.runner = _state.sent();
284
288
  return [
285
289
  4,
286
290
  _this.initConfig(_this.runner, options)
287
291
  ];
288
- case 3:
292
+ case 4:
289
293
  _state.sent();
290
294
  return [
291
295
  4,
292
296
  _this.injectContext(_this.runner, options)
293
297
  ];
294
- case 4:
298
+ case 5:
295
299
  _state.sent();
296
300
  _this.server = _this.serverImpl(options);
297
301
  return [
298
302
  4,
299
303
  _this.runPrepareHook(_this.runner)
300
304
  ];
301
- case 5:
305
+ case 6:
302
306
  _state.sent();
303
307
  return [
304
308
  4,
305
309
  _this.server.createHTTPServer(_this.getRequestHandler())
306
310
  ];
307
- case 6:
311
+ case 7:
308
312
  _this.app = _state.sent();
309
313
  return [
310
314
  4,
311
315
  _this.server.onInit(_this.runner, _this.app)
312
316
  ];
313
- case 7:
317
+ case 8:
314
318
  _state.sent();
315
319
  return [
316
320
  2,
@@ -515,15 +519,64 @@ var Server = /*#__PURE__*/ function() {
515
519
  {
516
520
  key: "loadServerEnv",
517
521
  value: function loadServerEnv(options) {
518
- var appDirectory = options.pwd;
519
- var serverEnv = process.env.MODERN_ENV;
520
- var serverEnvPath = path.resolve(appDirectory, ".env.".concat(serverEnv));
521
- if (serverEnv && fs.existsSync(serverEnvPath) && !fs.statSync(serverEnvPath).isDirectory()) {
522
- var envConfig = dotenv.config({
523
- path: serverEnvPath
522
+ return _asyncToGenerator(function() {
523
+ var appDirectory, serverEnv, defaultEnvPath, serverEnvPath, _i, _iter, envPath, _tmp, envConfig;
524
+ return __generator(this, function(_state) {
525
+ switch(_state.label){
526
+ case 0:
527
+ appDirectory = options.pwd;
528
+ serverEnv = process.env.MODERN_ENV;
529
+ defaultEnvPath = path.resolve(appDirectory, ".env");
530
+ serverEnvPath = path.resolve(appDirectory, ".env.".concat(serverEnv));
531
+ _i = 0, _iter = [
532
+ serverEnvPath,
533
+ defaultEnvPath
534
+ ];
535
+ _state.label = 1;
536
+ case 1:
537
+ if (!(_i < _iter.length)) return [
538
+ 3,
539
+ 6
540
+ ];
541
+ envPath = _iter[_i];
542
+ return [
543
+ 4,
544
+ fs.pathExists(envPath)
545
+ ];
546
+ case 2:
547
+ _tmp = _state.sent();
548
+ if (!_tmp) return [
549
+ 3,
550
+ 4
551
+ ];
552
+ return [
553
+ 4,
554
+ fs.stat(envPath)
555
+ ];
556
+ case 3:
557
+ _tmp = !_state.sent().isDirectory();
558
+ _state.label = 4;
559
+ case 4:
560
+ if (_tmp) {
561
+ envConfig = dotenv.config({
562
+ path: envPath
563
+ });
564
+ dotenvExpand(envConfig);
565
+ }
566
+ _state.label = 5;
567
+ case 5:
568
+ _i++;
569
+ return [
570
+ 3,
571
+ 1
572
+ ];
573
+ case 6:
574
+ return [
575
+ 2
576
+ ];
577
+ }
524
578
  });
525
- dotenvExpand(envConfig);
526
- }
579
+ })();
527
580
  }
528
581
  }
529
582
  ]);
@@ -111,13 +111,13 @@ var __generator = this && this.__generator || function(thisArg, body) {
111
111
  trys: [],
112
112
  ops: []
113
113
  };
114
- return(g = {
114
+ return g = {
115
115
  next: verb(0),
116
116
  "throw": verb(1),
117
117
  "return": verb(2)
118
118
  }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
119
119
  return this;
120
- }), g);
120
+ }), g;
121
121
  function verb(n) {
122
122
  return function(v) {
123
123
  return step([
@@ -206,7 +206,6 @@ import { createErrorDocument, createMiddlewareCollecter, getStaticReg, mergeExte
206
206
  import * as reader from "../libs/render/reader";
207
207
  import { createProxyHandler } from "../libs/proxy";
208
208
  import { createContext } from "../libs/context";
209
- import { templateInjectableStream } from "../libs/hook-api/template";
210
209
  import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE } from "../constants";
211
210
  import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
212
211
  var SERVER_DIR = "./server";
@@ -232,7 +231,7 @@ var ModernServer = /*#__PURE__*/ function() {
232
231
  _defineProperty(this, "reader", reader);
233
232
  _defineProperty(this, "proxyTarget", void 0);
234
233
  _defineProperty(this, "routeRenderHandler", void 0);
235
- _defineProperty(this, "beforeRouteHandler", null);
234
+ _defineProperty(this, "loaderHandler", null);
236
235
  _defineProperty(this, "frameWebHandler", null);
237
236
  _defineProperty(this, "frameAPIHandler", null);
238
237
  _defineProperty(this, "proxyHandler", null);
@@ -287,7 +286,7 @@ var ModernServer = /*#__PURE__*/ function() {
287
286
  _state.sent();
288
287
  return [
289
288
  4,
290
- _this.prepareBeforeRouteHandler(usageRoutes, distDir)
289
+ _this.prepareLoaderHandler(usageRoutes, distDir)
291
290
  ];
292
291
  case 2:
293
292
  _state.sent();
@@ -306,7 +305,6 @@ var ModernServer = /*#__PURE__*/ function() {
306
305
  _state.sent();
307
306
  _this.addHandler(_this.setupStaticMiddleware((_this_conf_output = _this.conf.output) === null || _this_conf_output === void 0 ? void 0 : _this_conf_output.assetPrefix));
308
307
  _this.addHandler(faviconFallbackHandler);
309
- _this.addBeforeRouteHandler();
310
308
  _this.addHandler(_this.routeHandler.bind(_this));
311
309
  _this.compose();
312
310
  return [
@@ -322,45 +320,6 @@ var ModernServer = /*#__PURE__*/ function() {
322
320
  key: "onRepack",
323
321
  value: function onRepack(_) {}
324
322
  },
325
- {
326
- key: "addBeforeRouteHandler",
327
- value: function addBeforeRouteHandler() {
328
- var _this = this;
329
- this.addHandler(function() {
330
- var _ref = _asyncToGenerator(function(context, next) {
331
- return __generator(this, function(_state) {
332
- switch(_state.label){
333
- case 0:
334
- if (!_this.beforeRouteHandler) return [
335
- 3,
336
- 2
337
- ];
338
- return [
339
- 4,
340
- _this.beforeRouteHandler(context)
341
- ];
342
- case 1:
343
- _state.sent();
344
- if (_this.isSend(context.res)) {
345
- return [
346
- 2
347
- ];
348
- }
349
- _state.label = 2;
350
- case 2:
351
- return [
352
- 2,
353
- next()
354
- ];
355
- }
356
- });
357
- });
358
- return function(context, next) {
359
- return _ref.apply(this, arguments);
360
- };
361
- }());
362
- }
363
- },
364
323
  {
365
324
  key: "onServerChange",
366
325
  value: function onServerChange(param) {
@@ -416,6 +375,12 @@ var ModernServer = /*#__PURE__*/ function() {
416
375
  null
417
376
  ];
418
377
  }
378
+ if (result.contentStream) {
379
+ return [
380
+ 2,
381
+ result.contentStream
382
+ ];
383
+ }
419
384
  return [
420
385
  2,
421
386
  result.content.toString()
@@ -470,8 +435,8 @@ var ModernServer = /*#__PURE__*/ function() {
470
435
  }
471
436
  },
472
437
  {
473
- key: "prepareBeforeRouteHandler",
474
- value: function prepareBeforeRouteHandler(specs, distDir) {
438
+ key: "prepareLoaderHandler",
439
+ value: function prepareLoaderHandler(specs, distDir) {
475
440
  var _this = this;
476
441
  return _asyncToGenerator(function() {
477
442
  var runner, handler;
@@ -481,7 +446,7 @@ var ModernServer = /*#__PURE__*/ function() {
481
446
  runner = _this.runner;
482
447
  return [
483
448
  4,
484
- runner.preparebeforeRouteHandler({
449
+ runner.prepareLoaderHandler({
485
450
  serverRoutes: specs,
486
451
  distDir: distDir
487
452
  }, {
@@ -492,7 +457,7 @@ var ModernServer = /*#__PURE__*/ function() {
492
457
  ];
493
458
  case 1:
494
459
  handler = _state.sent();
495
- _this.beforeRouteHandler = handler;
460
+ _this.loaderHandler = handler;
496
461
  return [
497
462
  2
498
463
  ];
@@ -718,15 +683,78 @@ var ModernServer = /*#__PURE__*/ function() {
718
683
  value: function handleWeb(context, route) {
719
684
  var _this = this;
720
685
  return _asyncToGenerator(function() {
686
+ var res, renderResult;
721
687
  return __generator(this, function(_state) {
722
- return [
723
- 2,
724
- _this.routeRenderHandler({
725
- ctx: context,
726
- route: route,
727
- runner: _this.runner
728
- })
729
- ];
688
+ switch(_state.label){
689
+ case 0:
690
+ res = context.res;
691
+ if (!_this.loaderHandler) return [
692
+ 3,
693
+ 2
694
+ ];
695
+ return [
696
+ 4,
697
+ _this.loaderHandler(context)
698
+ ];
699
+ case 1:
700
+ _state.sent();
701
+ if (_this.isSend(res)) {
702
+ return [
703
+ 2,
704
+ null
705
+ ];
706
+ }
707
+ _state.label = 2;
708
+ case 2:
709
+ context.setParams(route.params);
710
+ context.setServerData("router", {
711
+ baseUrl: route.urlPath,
712
+ params: route.params
713
+ });
714
+ if (route.responseHeaders) {
715
+ Object.keys(route.responseHeaders).forEach(function(key) {
716
+ var value = route.responseHeaders[key];
717
+ if (value) {
718
+ context.res.setHeader(key, value);
719
+ }
720
+ });
721
+ }
722
+ return [
723
+ 4,
724
+ _this.routeRenderHandler({
725
+ ctx: context,
726
+ route: route,
727
+ runner: _this.runner
728
+ })
729
+ ];
730
+ case 3:
731
+ renderResult = _state.sent();
732
+ if (!renderResult) {
733
+ _this.render404(context);
734
+ return [
735
+ 2,
736
+ null
737
+ ];
738
+ }
739
+ if (renderResult.redirect) {
740
+ _this.redirect(res, renderResult.content, renderResult.statusCode);
741
+ return [
742
+ 2,
743
+ null
744
+ ];
745
+ }
746
+ if (_this.isSend(res)) {
747
+ return [
748
+ 2,
749
+ null
750
+ ];
751
+ }
752
+ res.setHeader("content-type", renderResult.contentType);
753
+ return [
754
+ 2,
755
+ renderResult
756
+ ];
757
+ }
730
758
  });
731
759
  })();
732
760
  }
@@ -771,7 +799,7 @@ var ModernServer = /*#__PURE__*/ function() {
771
799
  function routeHandler(context) {
772
800
  var _this = this;
773
801
  return _asyncToGenerator(function() {
774
- var res, matched, route, afterMatchContext, _afterMatchContext_router, current, url, status, matched2, middlewareContext, renderResult, contentStream, response, afterRenderContext;
802
+ var res, matched, route, afterMatchContext, _afterMatchContext_router, current, url, status, matched2, middlewareContext, renderResult, responseStream, response, afterRenderContext;
775
803
  return __generator(this, function(_state) {
776
804
  switch(_state.label){
777
805
  case 0:
@@ -798,6 +826,10 @@ var ModernServer = /*#__PURE__*/ function() {
798
826
  2
799
827
  ];
800
828
  case 2:
829
+ if (!route.entryName) return [
830
+ 3,
831
+ 5
832
+ ];
801
833
  afterMatchContext = createAfterMatchContext(context, route.entryName);
802
834
  if (!(_this.runMode === RUN_MODE.FULL)) return [
803
835
  3,
@@ -835,14 +867,11 @@ var ModernServer = /*#__PURE__*/ function() {
835
867
  }
836
868
  route = matched2.generate(context.url);
837
869
  }
838
- context.setParams(route.params);
839
- context.setServerData("router", {
840
- baseUrl: route.urlPath,
841
- params: route.params
842
- });
870
+ _state.label = 5;
871
+ case 5:
843
872
  if (!_this.frameWebHandler) return [
844
873
  3,
845
- 6
874
+ 7
846
875
  ];
847
876
  res.locals = res.locals || {};
848
877
  middlewareContext = createMiddlewareContext(context);
@@ -850,66 +879,43 @@ var ModernServer = /*#__PURE__*/ function() {
850
879
  4,
851
880
  _this.frameWebHandler(middlewareContext)
852
881
  ];
853
- case 5:
882
+ case 6:
854
883
  _state.sent();
855
884
  res.locals = _objectSpread({}, res.locals, middlewareContext.response.locals);
856
- _state.label = 6;
857
- case 6:
858
885
  if (_this.isSend(res)) {
859
886
  return [
860
887
  2
861
888
  ];
862
889
  }
863
- if (route.responseHeaders) {
864
- Object.keys(route.responseHeaders).forEach(function(key) {
865
- var value = route.responseHeaders[key];
866
- if (value) {
867
- context.res.setHeader(key, value);
868
- }
869
- });
870
- }
890
+ _state.label = 7;
891
+ case 7:
871
892
  return [
872
893
  4,
873
894
  _this.handleWeb(context, route)
874
895
  ];
875
- case 7:
896
+ case 8:
876
897
  renderResult = _state.sent();
877
898
  if (!renderResult) {
878
- _this.render404(context);
879
- return [
880
- 2
881
- ];
882
- }
883
- if (renderResult.redirect) {
884
- _this.redirect(res, renderResult.content, renderResult.statusCode);
885
899
  return [
886
900
  2
887
901
  ];
888
902
  }
889
- if (_this.isSend(res)) {
890
- return [
891
- 2
892
- ];
893
- }
894
- res.setHeader("content-type", renderResult.contentType);
895
- contentStream = renderResult.contentStream;
896
- if (contentStream) {
897
- contentStream.pipe(templateInjectableStream({
898
- prependHead: route.entryName ? "<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>") : void 0
899
- })).pipe(res);
903
+ responseStream = renderResult.contentStream;
904
+ response = renderResult.content;
905
+ if (route.entryName && responseStream) {
906
+ responseStream.pipe(res);
900
907
  return [
901
908
  2
902
909
  ];
903
910
  }
904
- response = renderResult.content;
905
911
  if (!route.entryName) return [
906
912
  3,
907
- 10
913
+ 11
908
914
  ];
909
915
  afterRenderContext = createAfterRenderContext(context, response.toString());
910
916
  if (!(_this.runMode === RUN_MODE.FULL)) return [
911
917
  3,
912
- 9
918
+ 10
913
919
  ];
914
920
  return [
915
921
  4,
@@ -917,19 +923,18 @@ var ModernServer = /*#__PURE__*/ function() {
917
923
  onLast: noop
918
924
  })
919
925
  ];
920
- case 8:
921
- _state.sent();
922
- _state.label = 9;
923
926
  case 9:
927
+ _state.sent();
928
+ _state.label = 10;
929
+ case 10:
924
930
  if (_this.isSend(res)) {
925
931
  return [
926
932
  2
927
933
  ];
928
934
  }
929
- afterRenderContext.template.prependHead("<script>window._SERVER_DATA=".concat(JSON.stringify(context.serverData), "</script>"));
930
935
  response = afterRenderContext.template.get();
931
- _state.label = 10;
932
- case 10:
936
+ _state.label = 11;
937
+ case 11:
933
938
  res.end(response);
934
939
  return [
935
940
  2
@@ -4,13 +4,9 @@ import { TemplateAPI } from "./template";
4
4
  class Response {
5
5
  constructor(res) {
6
6
  this.res = res;
7
- this._cookie = cookie.parse(res.getHeader("set-cookie") || "");
8
7
  this.cookies = {
9
- get: this.getCookie.bind(this),
10
8
  set: this.setCookie.bind(this),
11
- delete: this.deleteCookie.bind(this),
12
- clear: this.clearCookie.bind(this),
13
- apply: this.applyCookie.bind(this)
9
+ clear: this.clearCookie.bind(this)
14
10
  };
15
11
  }
16
12
  get(key) {
@@ -22,29 +18,14 @@ class Response {
22
18
  status(code) {
23
19
  this.res.statusCode = code;
24
20
  }
25
- getCookie(key) {
26
- return this._cookie[key];
27
- }
28
- setCookie(key, value) {
29
- this._cookie[key] = value;
30
- }
31
- deleteCookie(key) {
32
- if (this._cookie[key]) {
33
- delete this._cookie[key];
34
- }
21
+ setCookie(key, value, options) {
22
+ const cookieValue = this.res.getHeader("set-cookie");
23
+ const fmt = Array.isArray(cookieValue) ? cookieValue : [cookieValue].filter(Boolean);
24
+ fmt.push(cookie.serialize(key, value, options));
25
+ this.res.setHeader("set-cookie", fmt.length === 1 ? fmt[0] : fmt);
35
26
  }
36
27
  clearCookie() {
37
- this._cookie = {};
38
- }
39
- applyCookie() {
40
- const str = Object.entries(this._cookie).map(([key, value]) => {
41
- return cookie.serialize(key, value);
42
- }).join("; ");
43
- if (str) {
44
- this.res.setHeader("set-cookie", str);
45
- } else {
46
- this.res.removeHeader("set-cookie");
47
- }
28
+ this.res.removeHeader("set-cookie");
48
29
  }
49
30
  raw(body, options) {
50
31
  const { status, headers = {} } = options || {};
@@ -4,6 +4,7 @@ import { ERROR_DIGEST } from "../../constants";
4
4
  import { handleDirectory } from "./static";
5
5
  import { readFile } from "./reader";
6
6
  import * as ssr from "./ssr";
7
+ import { injectSeverData } from "./utils";
7
8
  const createRenderHandler = ({
8
9
  distDir,
9
10
  staticGenerate,
@@ -55,7 +56,7 @@ const createRenderHandler = ({
55
56
  }
56
57
  }
57
58
  return {
58
- content,
59
+ content: route.entryName ? injectSeverData(content.toString(), ctx) : content,
59
60
  contentType: mime.contentType(path.extname(templatePath))
60
61
  };
61
62
  };
@@ -8,6 +8,7 @@ import {
8
8
  } from "@modern-js/utils";
9
9
  import cache from "./cache";
10
10
  import { createLogger, createMetrics } from "./measure";
11
+ import { injectServerDataStream, injectSeverData } from "./utils";
11
12
  const render = async (ctx, renderOptions, runner) => {
12
13
  var _a;
13
14
  const {
@@ -72,13 +73,13 @@ const render = async (ctx, renderOptions, runner) => {
72
73
  }
73
74
  if (typeof content === "string") {
74
75
  return {
75
- content,
76
+ content: injectSeverData(content, ctx),
76
77
  contentType: mime.contentType("html")
77
78
  };
78
79
  } else {
79
80
  return {
80
81
  content: "",
81
- contentStream: content,
82
+ contentStream: injectServerDataStream(content, ctx),
82
83
  contentType: mime.contentType("html")
83
84
  };
84
85
  }
@@ -0,0 +1,23 @@
1
+ import { TemplateAPI, templateInjectableStream } from "../hook-api/template";
2
+ const injectSeverData = (content, context) => {
3
+ const template = new TemplateAPI(content);
4
+ template.prependHead(
5
+ `<script>window._SERVER_DATA=${JSON.stringify(
6
+ context.serverData
7
+ )}</script>`
8
+ );
9
+ return template.get();
10
+ };
11
+ const injectServerDataStream = (content, context) => {
12
+ return content.pipe(
13
+ templateInjectableStream({
14
+ prependHead: `<script>window._SERVER_DATA=${JSON.stringify(
15
+ context.serverData
16
+ )}</script>`
17
+ })
18
+ );
19
+ };
20
+ export {
21
+ injectServerDataStream,
22
+ injectSeverData
23
+ };
@@ -1,6 +1,6 @@
1
1
  import path from "path";
2
- import fs from "fs";
3
2
  import {
3
+ fs,
4
4
  Logger,
5
5
  SHARED_DIR,
6
6
  OUTPUT_CONFIG_FILE,
@@ -48,7 +48,7 @@ class Server {
48
48
  */
49
49
  async init() {
50
50
  const { options } = this;
51
- this.loadServerEnv(options);
51
+ await this.loadServerEnv(options);
52
52
  this.initServerConfig(options);
53
53
  await this.injectContext(this.runner, options);
54
54
  this.runner = await this.createHookRunner();
@@ -169,13 +169,16 @@ class Server {
169
169
  plugins: serverPlugins
170
170
  };
171
171
  }
172
- loadServerEnv(options) {
172
+ async loadServerEnv(options) {
173
173
  const { pwd: appDirectory } = options;
174
174
  const serverEnv = process.env.MODERN_ENV;
175
+ const defaultEnvPath = path.resolve(appDirectory, `.env`);
175
176
  const serverEnvPath = path.resolve(appDirectory, `.env.${serverEnv}`);
176
- if (serverEnv && fs.existsSync(serverEnvPath) && !fs.statSync(serverEnvPath).isDirectory()) {
177
- const envConfig = dotenv.config({ path: serverEnvPath });
178
- dotenvExpand(envConfig);
177
+ for (const envPath of [serverEnvPath, defaultEnvPath]) {
178
+ if (await fs.pathExists(envPath) && !(await fs.stat(envPath)).isDirectory()) {
179
+ const envConfig = dotenv.config({ path: envPath });
180
+ dotenvExpand(envConfig);
181
+ }
179
182
  }
180
183
  }
181
184
  }