@modern-js/prod-server 1.21.5 → 2.0.0-beta.1

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 (120) hide show
  1. package/CHANGELOG.md +91 -10
  2. package/dist/js/modern/constants.js +0 -2
  3. package/dist/js/modern/index.js +0 -1
  4. package/dist/js/modern/libs/context/context.js +10 -56
  5. package/dist/js/modern/libs/hook-api/index.js +125 -0
  6. package/dist/js/modern/libs/hook-api/route.js +13 -36
  7. package/dist/js/modern/libs/hook-api/template.js +38 -15
  8. package/dist/js/modern/libs/loadConfig.js +3 -10
  9. package/dist/js/modern/libs/metrics.js +6 -6
  10. package/dist/js/modern/libs/proxy.js +7 -12
  11. package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -1
  12. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -9
  13. package/dist/js/modern/libs/render/cache/index.js +37 -28
  14. package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -10
  15. package/dist/js/modern/libs/render/cache/spr.js +12 -62
  16. package/dist/js/modern/libs/render/cache/util.js +0 -6
  17. package/dist/js/modern/libs/render/index.js +6 -11
  18. package/dist/js/modern/libs/render/measure.js +7 -10
  19. package/dist/js/modern/libs/render/modern/index.js +2 -13
  20. package/dist/js/modern/libs/render/reader.js +13 -24
  21. package/dist/js/modern/libs/render/ssr.js +24 -12
  22. package/dist/js/modern/libs/render/static.js +6 -9
  23. package/dist/js/modern/libs/render/type.js +0 -1
  24. package/dist/js/modern/libs/route/index.js +8 -19
  25. package/dist/js/modern/libs/route/matcher.js +21 -29
  26. package/dist/js/modern/libs/route/route.js +0 -13
  27. package/dist/js/modern/libs/serve-file.js +13 -6
  28. package/dist/js/modern/server/index.js +27 -43
  29. package/dist/js/modern/server/modern-server-split.js +5 -55
  30. package/dist/js/modern/server/modern-server.js +179 -250
  31. package/dist/js/modern/utils.js +2 -21
  32. package/dist/js/modern/worker-server.js +34 -0
  33. package/dist/js/node/constants.js +0 -2
  34. package/dist/js/node/index.js +0 -10
  35. package/dist/js/node/libs/context/context.js +10 -65
  36. package/dist/js/node/libs/context/index.js +0 -3
  37. package/dist/js/node/libs/hook-api/index.js +136 -0
  38. package/dist/js/node/libs/hook-api/route.js +13 -38
  39. package/dist/js/node/libs/hook-api/template.js +40 -18
  40. package/dist/js/node/libs/loadConfig.js +3 -22
  41. package/dist/js/node/libs/metrics.js +6 -6
  42. package/dist/js/node/libs/proxy.js +7 -17
  43. package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -5
  44. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -12
  45. package/dist/js/node/libs/render/cache/index.js +37 -33
  46. package/dist/js/node/libs/render/cache/page-caches/index.js +0 -2
  47. package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -14
  48. package/dist/js/node/libs/render/cache/spr.js +12 -71
  49. package/dist/js/node/libs/render/cache/util.js +0 -18
  50. package/dist/js/node/libs/render/index.js +6 -26
  51. package/dist/js/node/libs/render/measure.js +5 -15
  52. package/dist/js/node/libs/render/modern/index.js +2 -20
  53. package/dist/js/node/libs/render/reader.js +12 -39
  54. package/dist/js/node/libs/render/ssr.js +23 -22
  55. package/dist/js/node/libs/render/static.js +6 -18
  56. package/dist/js/node/libs/render/type.js +0 -1
  57. package/dist/js/node/libs/route/index.js +8 -22
  58. package/dist/js/node/libs/route/matcher.js +18 -34
  59. package/dist/js/node/libs/route/route.js +0 -15
  60. package/dist/js/node/libs/serve-file.js +15 -12
  61. package/dist/js/node/server/index.js +26 -62
  62. package/dist/js/node/server/modern-server-split.js +5 -58
  63. package/dist/js/node/server/modern-server.js +178 -280
  64. package/dist/js/node/utils.js +3 -46
  65. package/dist/js/node/worker-server.js +41 -0
  66. package/dist/js/treeshaking/constants.js +28 -0
  67. package/dist/js/treeshaking/index.js +13 -0
  68. package/dist/js/treeshaking/libs/context/context.js +243 -0
  69. package/dist/js/treeshaking/libs/context/index.js +5 -0
  70. package/dist/js/treeshaking/libs/hook-api/index.js +157 -0
  71. package/dist/js/treeshaking/libs/hook-api/route.js +33 -0
  72. package/dist/js/treeshaking/libs/hook-api/template.js +91 -0
  73. package/dist/js/treeshaking/libs/loadConfig.js +39 -0
  74. package/dist/js/treeshaking/libs/metrics.js +12 -0
  75. package/dist/js/treeshaking/libs/proxy.js +80 -0
  76. package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +124 -0
  77. package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +464 -0
  78. package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +53 -0
  79. package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +35 -0
  80. package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +121 -0
  81. package/dist/js/treeshaking/libs/render/cache/index.js +184 -0
  82. package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +30 -0
  83. package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +46 -0
  84. package/dist/js/treeshaking/libs/render/cache/spr.js +362 -0
  85. package/dist/js/treeshaking/libs/render/cache/type.js +1 -0
  86. package/dist/js/treeshaking/libs/render/cache/util.js +101 -0
  87. package/dist/js/treeshaking/libs/render/index.js +100 -0
  88. package/dist/js/treeshaking/libs/render/measure.js +61 -0
  89. package/dist/js/treeshaking/libs/render/modern/browser-list.js +7 -0
  90. package/dist/js/treeshaking/libs/render/modern/index.js +39 -0
  91. package/dist/js/treeshaking/libs/render/reader.js +191 -0
  92. package/dist/js/treeshaking/libs/render/ssr.js +98 -0
  93. package/dist/js/treeshaking/libs/render/static.js +84 -0
  94. package/dist/js/treeshaking/libs/render/type.js +6 -0
  95. package/dist/js/treeshaking/libs/route/index.js +94 -0
  96. package/dist/js/treeshaking/libs/route/matcher.js +113 -0
  97. package/dist/js/treeshaking/libs/route/route.js +26 -0
  98. package/dist/js/treeshaking/libs/serve-file.js +75 -0
  99. package/dist/js/treeshaking/server/index.js +343 -0
  100. package/dist/js/treeshaking/server/modern-server-split.js +152 -0
  101. package/dist/js/treeshaking/server/modern-server.js +945 -0
  102. package/dist/js/treeshaking/type.js +1 -0
  103. package/dist/js/treeshaking/utils.js +87 -0
  104. package/dist/js/treeshaking/worker-server.js +56 -0
  105. package/dist/types/index.d.ts +0 -2
  106. package/dist/types/libs/context/context.d.ts +0 -3
  107. package/dist/types/libs/hook-api/index.d.ts +5 -0
  108. package/dist/types/libs/hook-api/route.d.ts +9 -14
  109. package/dist/types/libs/hook-api/template.d.ts +19 -9
  110. package/dist/types/libs/loadConfig.d.ts +0 -1
  111. package/dist/types/libs/render/cache/index.d.ts +4 -4
  112. package/dist/types/libs/render/cache/spr.d.ts +0 -2
  113. package/dist/types/libs/render/type.d.ts +3 -1
  114. package/dist/types/libs/serve-file.d.ts +2 -1
  115. package/dist/types/server/index.d.ts +2 -3
  116. package/dist/types/server/modern-server.d.ts +11 -11
  117. package/dist/types/type.d.ts +8 -10
  118. package/dist/types/utils.d.ts +0 -1
  119. package/dist/types/worker-server.d.ts +16 -0
  120. package/package.json +28 -35
@@ -3,10 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.createTemplateAPI = void 0;
7
-
6
+ exports.templateInjectableStream = exports.TemplateAPI = void 0;
7
+ var _stream = require("stream");
8
8
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
-
10
9
  const RegList = {
11
10
  before: {
12
11
  head: '<head>',
@@ -17,57 +16,80 @@ const RegList = {
17
16
  body: '</body>'
18
17
  }
19
18
  };
20
-
21
19
  class TemplateAPI {
22
20
  constructor(content) {
23
21
  _defineProperty(this, "content", void 0);
24
-
25
22
  this.content = content;
26
23
  }
27
-
28
24
  get() {
29
25
  return this.content;
30
26
  }
31
-
32
27
  set(content) {
33
28
  this.content = content;
34
29
  }
35
-
36
30
  prependHead(fragment) {
37
31
  const {
38
32
  head
39
33
  } = RegList.before;
40
34
  return this.replace(head, `${head}${fragment}`);
41
35
  }
42
-
43
36
  appendHead(fragment) {
44
37
  const {
45
38
  head
46
39
  } = RegList.after;
47
40
  return this.replace(head, `${fragment}${head}`);
48
41
  }
49
-
50
42
  prependBody(fragment) {
51
43
  const {
52
44
  body
53
45
  } = RegList.before;
54
46
  return this.replace(body, `${body}${fragment}`);
55
47
  }
56
-
57
48
  appendBody(fragment) {
58
49
  const {
59
50
  body
60
51
  } = RegList.after;
61
52
  return this.replace(body, `${fragment}${body}`);
62
53
  }
63
-
64
54
  replace(reg, text) {
65
55
  this.content = this.content.replace(reg, text);
66
- return this;
67
56
  }
68
-
69
57
  }
70
-
71
- const createTemplateAPI = content => new TemplateAPI(content);
72
-
73
- exports.createTemplateAPI = createTemplateAPI;
58
+ exports.TemplateAPI = TemplateAPI;
59
+ const templateInjectableStream = ({
60
+ prependHead,
61
+ appendHead,
62
+ prependBody,
63
+ appendBody
64
+ }) => new _stream.Transform({
65
+ write(chunk, _, callback) {
66
+ let chunk_str = chunk.toString();
67
+ if (prependHead) {
68
+ const {
69
+ head
70
+ } = RegList.before;
71
+ chunk_str = chunk_str.replace(head, `${head}${prependHead}`);
72
+ }
73
+ if (appendHead) {
74
+ const {
75
+ head
76
+ } = RegList.after;
77
+ chunk_str = chunk_str.replace(head, `${appendHead}${head}`);
78
+ }
79
+ if (prependBody) {
80
+ const {
81
+ body
82
+ } = RegList.before;
83
+ chunk_str = chunk_str.replace(body, `${body}${prependBody}`);
84
+ }
85
+ if (appendBody) {
86
+ const {
87
+ body
88
+ } = RegList.after;
89
+ chunk_str = chunk_str.replace(body, `${appendBody}${body}`);
90
+ }
91
+ this.push(chunk_str);
92
+ callback();
93
+ }
94
+ });
95
+ exports.templateInjectableStream = templateInjectableStream;
@@ -4,69 +4,50 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.requireConfig = exports.loadConfig = exports.getServerConfigPath = void 0;
7
-
8
7
  var path = _interopRequireWildcard(require("path"));
9
-
10
8
  var _utils = require("@modern-js/utils");
11
-
12
9
  var _mergeDeep = _interopRequireDefault(require("merge-deep"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
-
18
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
-
20
13
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
-
22
14
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
-
24
15
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
-
26
16
  const getServerConfigPath = (distDirectory, serverConfigFile = _utils.DEFAULT_SERVER_CONFIG) => {
27
17
  const serverConfigPath = path.join(distDirectory, serverConfigFile);
28
18
  return `${serverConfigPath}.js`;
29
19
  };
30
-
31
20
  exports.getServerConfigPath = getServerConfigPath;
32
-
33
21
  const requireConfig = serverConfigPath => {
34
22
  if (_utils.fs.pathExistsSync(serverConfigPath)) {
35
23
  return (0, _utils.compatRequire)(serverConfigPath);
36
24
  }
37
-
38
25
  return {};
39
26
  };
27
+
40
28
  /**
41
29
  * 对配置进行合并,开发环境下,cliConfig 与 serverConfig 进行深合并
42
30
  * 生产环境下,resolvedConfig 与 serverConfig 进行深合并
43
31
  * resolvedConfigPath: 构建序列化后的 modern.config.js 文件路径
44
32
  */
45
-
46
-
47
33
  exports.requireConfig = requireConfig;
48
-
49
34
  const loadConfig = ({
50
35
  cliConfig,
51
36
  serverConfig,
52
37
  resolvedConfigPath
53
38
  }) => {
54
39
  let config = null;
55
-
56
40
  if (process.env.NODE_ENV === 'production') {
57
- const resolvedConfig = requireConfig(resolvedConfigPath); // cli config has a higher priority,because it's an argument passed in.
58
-
41
+ const resolvedConfig = requireConfig(resolvedConfigPath);
42
+ // cli config has a higher priority,because it's an argument passed in.
59
43
  config = (0, _mergeDeep.default)(_objectSpread(_objectSpread({}, resolvedConfig), {}, {
60
44
  plugins: [] // filter cli plugins
61
-
62
45
  }), serverConfig, cliConfig);
63
46
  } else {
64
47
  config = (0, _mergeDeep.default)(_objectSpread(_objectSpread({}, cliConfig), {}, {
65
48
  plugins: []
66
49
  }), serverConfig);
67
50
  }
68
-
69
51
  return config;
70
52
  };
71
-
72
53
  exports.loadConfig = loadConfig;
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.metrics = void 0;
7
7
  const metrics = {
8
- gauges() {// no impl
8
+ gauges() {
9
+ // no impl
9
10
  },
10
-
11
- emitCounter() {// no impl
11
+ emitCounter() {
12
+ // no impl
12
13
  },
13
-
14
- emitTimer() {// no impl
14
+ emitTimer() {
15
+ // no impl
15
16
  }
16
-
17
17
  };
18
18
  exports.metrics = metrics;
@@ -5,20 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createProxyHandler = void 0;
7
7
  exports.formatProxyOptions = formatProxyOptions;
8
-
9
8
  var _httpProxyMiddleware = require("http-proxy-middleware");
10
-
11
9
  var _utils = require("../utils");
12
-
13
10
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
14
-
15
11
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16
-
17
12
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
-
19
13
  function formatProxyOptions(proxyOptions) {
20
14
  const formattedProxy = [];
21
-
22
15
  if (!Array.isArray(proxyOptions)) {
23
16
  if ('target' in proxyOptions) {
24
17
  formattedProxy.push(proxyOptions);
@@ -38,30 +31,29 @@ function formatProxyOptions(proxyOptions) {
38
31
  } else {
39
32
  formattedProxy.push(...proxyOptions);
40
33
  }
41
-
42
34
  return formattedProxy;
43
35
  }
44
-
45
36
  const createProxyHandler = proxyOptions => {
46
37
  (0, _utils.debug)('createProxyHandler', proxyOptions);
47
-
48
38
  if (!proxyOptions) {
49
39
  return null;
50
- } // If it is not an array, it may be an object that uses the context attribute
51
- // or an object in the form of { source: ProxyDetail }
52
-
40
+ }
53
41
 
42
+ // If it is not an array, it may be an object that uses the context attribute
43
+ // or an object in the form of { source: ProxyDetail }
54
44
  const formattedProxy = formatProxyOptions(proxyOptions);
55
45
  const middlewares = formattedProxy.map(option => {
56
- const middleware = (0, _httpProxyMiddleware.createProxyMiddleware)(option.context, option); // eslint-disable-next-line consistent-return
46
+ const middleware = (0, _httpProxyMiddleware.createProxyMiddleware)(option.context, option);
57
47
 
48
+ // eslint-disable-next-line consistent-return
58
49
  return async (ctx, next) => {
59
50
  const {
60
51
  req,
61
52
  res
62
53
  } = ctx;
63
- const bypassUrl = typeof option.bypass === 'function' ? option.bypass(req, res, option) : null; // only false, no true
54
+ const bypassUrl = typeof option.bypass === 'function' ? option.bypass(req, res, option) : null;
64
55
 
56
+ // only false, no true
65
57
  if (typeof bypassUrl === 'boolean') {
66
58
  ctx.status = 404;
67
59
  return next();
@@ -69,11 +61,9 @@ const createProxyHandler = proxyOptions => {
69
61
  ctx.url = bypassUrl;
70
62
  return next();
71
63
  }
72
-
73
64
  middleware(req, res, next);
74
65
  };
75
66
  });
76
67
  return middlewares;
77
68
  };
78
-
79
69
  exports.createProxyHandler = createProxyHandler;
@@ -1,13 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  var _url = _interopRequireDefault(require("url"));
4
-
5
4
  var _spr = require("../spr");
6
-
7
5
  var _util = require("../util");
8
-
9
6
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
-
11
7
  describe('test spr util functions', () => {
12
8
  it('should return value correctly', () => {
13
9
  expect((0, _util.connectFactor)('bar', 'foo')).toBe('bar-foo');
@@ -25,7 +21,6 @@ describe('test spr util functions', () => {
25
21
  });
26
22
  it('should return function correctly', () => {
27
23
  const urlParams = (() => new _url.default.URLSearchParams())();
28
-
29
24
  urlParams.set('name', 'modern');
30
25
  const getParam = (0, _util.valueFactory)(urlParams);
31
26
  expect(getParam('name')).toBe('modern');
@@ -1,19 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  var _spr = require("../spr");
4
-
5
4
  var _errorConfiguration = require("./error-configuration");
6
-
7
5
  var _cacheable = require("./cacheable");
8
-
9
6
  var _matchedCache = require("./matched-cache");
10
-
11
7
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
12
-
13
8
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
-
15
9
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
-
17
10
  const createCacheConfig = (config = {}) => _objectSpread({
18
11
  excludes: null,
19
12
  includes: null,
@@ -23,7 +16,6 @@ const createCacheConfig = (config = {}) => _objectSpread({
23
16
  fallback: false,
24
17
  matches: null
25
18
  }, config);
26
-
27
19
  jest.setTimeout(60000);
28
20
  describe('cache', () => {
29
21
  it('should cache correctly', async () => {
@@ -60,7 +52,6 @@ describe('cache', () => {
60
52
  (0, _spr.destroyCache)();
61
53
  const cache = (0, _spr.createCache)();
62
54
  const content = 'hello';
63
-
64
55
  for (const config of _errorConfiguration.errorConfiguration) {
65
56
  const cacheConfig = createCacheConfig(config);
66
57
  const tmpEntry = Math.random().toString();
@@ -131,7 +122,6 @@ describe('cache', () => {
131
122
  it('should get cache correctly', async () => {
132
123
  (0, _spr.destroyCache)();
133
124
  const cache = (0, _spr.createCache)();
134
-
135
125
  for (const cacheable of _cacheable.cacheabelAry) {
136
126
  const context = {
137
127
  entry: '',
@@ -148,7 +138,6 @@ describe('cache', () => {
148
138
  it('should match cache correctly', async () => {
149
139
  (0, _spr.destroyCache)();
150
140
  const cache = (0, _spr.createCache)();
151
-
152
141
  for (const cacheable of _matchedCache.matchedCacheableAry) {
153
142
  const [baseCacheable, matchOne, ...other] = cacheable;
154
143
  const {
@@ -171,7 +160,6 @@ describe('cache', () => {
171
160
  };
172
161
  const cacheResult = await cache.get(matchContext);
173
162
  expect(cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.content).toBe(content);
174
-
175
163
  for (const notMatch of other) {
176
164
  const notMatchContext = {
177
165
  entry: '',
@@ -4,66 +4,73 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
7
+ var _stream = require("stream");
8
8
  var _constants = require("../../../constants");
9
-
10
9
  var _spr = require("./spr");
11
-
12
10
  var _util = require("./util");
13
-
14
11
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
-
16
12
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17
-
18
13
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
-
20
14
  var _default = (renderFn, ctx) => {
21
15
  const sprCache = (0, _spr.createCache)();
22
-
23
16
  const doRender = async context => {
24
17
  const cacheContext = _objectSpread({
25
18
  entry: context.entryName
26
19
  }, context.request);
27
-
28
- const cacheFile = await sprCache.get(cacheContext); // no cache, render sync
29
-
30
- if (!cacheFile) {
31
- const html = await renderFn(context);
20
+ const cacheFile = await sprCache.get(cacheContext);
21
+ async function afterRender(source, onAfterRender) {
22
+ // e.g. source is undefined when redirects occur during render
23
+ if (!source) {
24
+ return '';
25
+ }
26
+ if (typeof source === 'string') {
27
+ await onAfterRender(source);
28
+ return source;
29
+ } else {
30
+ let htmlForStream = '';
31
+ const cacheStream = new _stream.Transform({
32
+ write(chunk, _, callback) {
33
+ htmlForStream += chunk.toString();
34
+ this.push(chunk);
35
+ callback();
36
+ }
37
+ });
38
+ cacheStream.on('close', () => onAfterRender(htmlForStream));
39
+ return source(cacheStream);
40
+ }
41
+ }
42
+ async function saveHtmlIntoCache(html) {
32
43
  const {
33
44
  cacheConfig
34
45
  } = context;
35
-
36
46
  if (html && cacheConfig) {
37
47
  await sprCache.set(cacheContext, html, cacheConfig);
38
48
  }
39
-
40
- return html;
41
49
  }
42
50
 
43
- const cacheHash = cacheFile === null || cacheFile === void 0 ? void 0 : cacheFile.hash; // completely expired
51
+ // no cache, render sync
52
+ if (!cacheFile) {
53
+ const renderResult = await renderFn(context);
54
+ return afterRender(renderResult, saveHtmlIntoCache);
55
+ }
56
+ const cacheHash = cacheFile === null || cacheFile === void 0 ? void 0 : cacheFile.hash;
44
57
 
58
+ // completely expired
45
59
  if (cacheFile.isGarbage) {
46
- const html = await renderFn(context);
47
- const {
48
- cacheConfig
49
- } = context;
50
-
51
- if (html && cacheConfig) {
52
- await sprCache.set(cacheContext, html, cacheConfig);
53
- }
54
-
55
- return html;
60
+ const renderResult = await renderFn(context);
61
+ return afterRender(renderResult, saveHtmlIntoCache);
56
62
  } else if (cacheFile.isStale) {
57
63
  // if file is stale, request async
58
64
  const render = (0, _util.withCoalescedInvoke)(() => renderFn(context)).bind(null, (0, _util.namespaceHash)('render', cacheFile.hash), []);
59
- render().then(res => {
65
+ render().then(async res => {
60
66
  if (res.value && res.isOrigin) {
61
67
  const {
62
68
  cacheConfig
63
69
  } = context;
64
-
65
70
  if (cacheConfig) {
66
- sprCache.set(cacheContext, res.value, cacheConfig);
71
+ afterRender(res.value, async html => {
72
+ sprCache.set(cacheContext, html, cacheConfig);
73
+ });
67
74
  } else {
68
75
  sprCache.del(cacheContext, cacheHash);
69
76
  }
@@ -73,12 +80,9 @@ var _default = (renderFn, ctx) => {
73
80
  ctx.error(_constants.ERROR_DIGEST.ERENDER, e);
74
81
  });
75
82
  }
76
-
77
83
  ctx.res.setHeader('x-modern-spr', '1');
78
84
  return cacheFile.content;
79
85
  };
80
-
81
86
  return doRender;
82
87
  };
83
-
84
88
  exports.default = _default;
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createPageCaches = createPageCaches;
7
-
8
7
  var _lru = require("./lru");
9
-
10
8
  async function createPageCaches(max) {
11
9
  const constructorOptions = {
12
10
  max
@@ -4,48 +4,34 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.LRUCaches = void 0;
7
-
8
7
  var _lruCache = _interopRequireDefault(require("lru-cache"));
9
-
10
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
-
12
9
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
-
14
10
  class LRUCaches {
15
11
  constructor(options) {
16
12
  _defineProperty(this, "caches", void 0);
17
-
18
13
  _defineProperty(this, "max", void 0);
19
-
20
14
  this.max = options.max;
21
15
  this.caches = new _lruCache.default(this.max);
22
16
  }
23
-
24
17
  init() {
25
18
  return Promise.resolve();
26
19
  }
27
-
28
20
  keys() {
29
21
  return this.caches.keys();
30
22
  }
31
-
32
23
  get(key) {
33
24
  return Promise.resolve(this.caches.get(key) || null);
34
25
  }
35
-
36
26
  peek(key) {
37
27
  return this.caches.peek(key) || null;
38
28
  }
39
-
40
29
  set(key, cache) {
41
30
  this.caches.set(key, cache);
42
31
  return Promise.resolve();
43
32
  }
44
-
45
33
  del(key) {
46
34
  this.caches.del(key);
47
35
  }
48
-
49
36
  }
50
-
51
37
  exports.LRUCaches = LRUCaches;