@modern-js/prod-server 2.0.0-beta.0 → 2.0.0-beta.2

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 (113) hide show
  1. package/CHANGELOG.md +110 -0
  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 +0 -31
  6. package/dist/js/modern/libs/hook-api/route.js +0 -8
  7. package/dist/js/modern/libs/hook-api/template.js +0 -16
  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 +8 -16
  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 +1 -11
  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 +5 -6
  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 +5 -6
  28. package/dist/js/modern/server/index.js +25 -52
  29. package/dist/js/modern/server/modern-server-split.js +0 -11
  30. package/dist/js/modern/server/modern-server.js +87 -167
  31. package/dist/js/modern/utils.js +12 -27
  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 +0 -42
  38. package/dist/js/node/libs/hook-api/route.js +0 -10
  39. package/dist/js/node/libs/hook-api/template.js +0 -22
  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 +8 -22
  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 +0 -17
  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 +4 -16
  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 +5 -13
  61. package/dist/js/node/server/index.js +25 -72
  62. package/dist/js/node/server/modern-server-split.js +0 -13
  63. package/dist/js/node/server/modern-server.js +87 -196
  64. package/dist/js/node/utils.js +13 -52
  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 +339 -0
  100. package/dist/js/treeshaking/server/modern-server-split.js +152 -0
  101. package/dist/js/treeshaking/server/modern-server.js +946 -0
  102. package/dist/js/treeshaking/type.js +1 -0
  103. package/dist/js/treeshaking/utils.js +90 -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/loadConfig.d.ts +0 -1
  108. package/dist/types/libs/render/cache/index.d.ts +0 -2
  109. package/dist/types/libs/render/cache/spr.d.ts +0 -2
  110. package/dist/types/server/index.d.ts +0 -3
  111. package/dist/types/utils.d.ts +2 -3
  112. package/dist/types/worker-server.d.ts +16 -0
  113. package/package.json +31 -15
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.templateInjectableStream = exports.TemplateAPI = void 0;
7
-
8
7
  var _stream = require("stream");
9
-
10
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; }
11
-
12
9
  const RegList = {
13
10
  before: {
14
11
  head: '<head>',
@@ -19,58 +16,46 @@ const RegList = {
19
16
  body: '</body>'
20
17
  }
21
18
  };
22
-
23
19
  class TemplateAPI {
24
20
  constructor(content) {
25
21
  _defineProperty(this, "content", void 0);
26
-
27
22
  this.content = content;
28
23
  }
29
-
30
24
  get() {
31
25
  return this.content;
32
26
  }
33
-
34
27
  set(content) {
35
28
  this.content = content;
36
29
  }
37
-
38
30
  prependHead(fragment) {
39
31
  const {
40
32
  head
41
33
  } = RegList.before;
42
34
  return this.replace(head, `${head}${fragment}`);
43
35
  }
44
-
45
36
  appendHead(fragment) {
46
37
  const {
47
38
  head
48
39
  } = RegList.after;
49
40
  return this.replace(head, `${fragment}${head}`);
50
41
  }
51
-
52
42
  prependBody(fragment) {
53
43
  const {
54
44
  body
55
45
  } = RegList.before;
56
46
  return this.replace(body, `${body}${fragment}`);
57
47
  }
58
-
59
48
  appendBody(fragment) {
60
49
  const {
61
50
  body
62
51
  } = RegList.after;
63
52
  return this.replace(body, `${fragment}${body}`);
64
53
  }
65
-
66
54
  replace(reg, text) {
67
55
  this.content = this.content.replace(reg, text);
68
56
  }
69
-
70
57
  }
71
-
72
58
  exports.TemplateAPI = TemplateAPI;
73
-
74
59
  const templateInjectableStream = ({
75
60
  prependHead,
76
61
  appendHead,
@@ -79,39 +64,32 @@ const templateInjectableStream = ({
79
64
  }) => new _stream.Transform({
80
65
  write(chunk, _, callback) {
81
66
  let chunk_str = chunk.toString();
82
-
83
67
  if (prependHead) {
84
68
  const {
85
69
  head
86
70
  } = RegList.before;
87
71
  chunk_str = chunk_str.replace(head, `${head}${prependHead}`);
88
72
  }
89
-
90
73
  if (appendHead) {
91
74
  const {
92
75
  head
93
76
  } = RegList.after;
94
77
  chunk_str = chunk_str.replace(head, `${appendHead}${head}`);
95
78
  }
96
-
97
79
  if (prependBody) {
98
80
  const {
99
81
  body
100
82
  } = RegList.before;
101
83
  chunk_str = chunk_str.replace(body, `${body}${prependBody}`);
102
84
  }
103
-
104
85
  if (appendBody) {
105
86
  const {
106
87
  body
107
88
  } = RegList.after;
108
89
  chunk_str = chunk_str.replace(body, `${appendBody}${body}`);
109
90
  }
110
-
111
91
  this.push(chunk_str);
112
92
  callback();
113
93
  }
114
-
115
94
  });
116
-
117
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,32 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _stream = require("stream");
9
-
10
8
  var _constants = require("../../../constants");
11
-
12
9
  var _spr = require("./spr");
13
-
14
10
  var _util = require("./util");
15
-
16
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; }
17
-
18
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; }
19
-
20
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; }
21
-
22
14
  var _default = (renderFn, ctx) => {
23
15
  const sprCache = (0, _spr.createCache)();
24
-
25
16
  const doRender = async context => {
26
17
  const cacheContext = _objectSpread({
27
18
  entry: context.entryName
28
19
  }, context.request);
29
-
30
20
  const cacheFile = await sprCache.get(cacheContext);
31
-
32
21
  async function afterRender(source, onAfterRender) {
22
+ // e.g. source is undefined when redirects occur during render
23
+ if (!source) {
24
+ return '';
25
+ }
33
26
  if (typeof source === 'string') {
34
27
  await onAfterRender(source);
35
28
  return source;
@@ -41,31 +34,28 @@ var _default = (renderFn, ctx) => {
41
34
  this.push(chunk);
42
35
  callback();
43
36
  }
44
-
45
37
  });
46
38
  cacheStream.on('close', () => onAfterRender(htmlForStream));
47
39
  return source(cacheStream);
48
40
  }
49
41
  }
50
-
51
42
  async function saveHtmlIntoCache(html) {
52
43
  const {
53
44
  cacheConfig
54
45
  } = context;
55
-
56
46
  if (html && cacheConfig) {
57
47
  await sprCache.set(cacheContext, html, cacheConfig);
58
48
  }
59
- } // no cache, render sync
60
-
49
+ }
61
50
 
51
+ // no cache, render sync
62
52
  if (!cacheFile) {
63
53
  const renderResult = await renderFn(context);
64
54
  return afterRender(renderResult, saveHtmlIntoCache);
65
55
  }
56
+ const cacheHash = cacheFile === null || cacheFile === void 0 ? void 0 : cacheFile.hash;
66
57
 
67
- const cacheHash = cacheFile === null || cacheFile === void 0 ? void 0 : cacheFile.hash; // completely expired
68
-
58
+ // completely expired
69
59
  if (cacheFile.isGarbage) {
70
60
  const renderResult = await renderFn(context);
71
61
  return afterRender(renderResult, saveHtmlIntoCache);
@@ -77,7 +67,6 @@ var _default = (renderFn, ctx) => {
77
67
  const {
78
68
  cacheConfig
79
69
  } = context;
80
-
81
70
  if (cacheConfig) {
82
71
  afterRender(res.value, async html => {
83
72
  sprCache.set(cacheContext, html, cacheConfig);
@@ -91,12 +80,9 @@ var _default = (renderFn, ctx) => {
91
80
  ctx.error(_constants.ERROR_DIGEST.ERENDER, e);
92
81
  });
93
82
  }
94
-
95
83
  ctx.res.setHeader('x-modern-spr', '1');
96
84
  return cacheFile.content;
97
85
  };
98
-
99
86
  return doRender;
100
87
  };
101
-
102
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;