@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
package/CHANGELOG.md CHANGED
@@ -1,25 +1,106 @@
1
1
  # @modern-js/prod-server
2
2
 
3
- ## 1.21.5
3
+ ## 2.0.0-beta.1
4
4
 
5
- ### Patch Changes
5
+ ### Major Changes
6
+
7
+ - dda38c9: chore: v2
6
8
 
7
- - @modern-js/server-core@1.21.5
8
- - @modern-js/utils@1.21.5
9
+ ### Minor Changes
9
10
 
10
- ## 1.21.4
11
+ - c9e800d39a: feat: support React18 streaming SSR
12
+ feat: 支持 React18 流式 SSR
13
+ - 543be9558e: feat: compile server loader and support handle loader request
14
+ feat: 编译 server loader 并支持处理 loader 的请求
11
15
 
12
16
  ### Patch Changes
13
17
 
14
- - @modern-js/server-core@1.21.4
15
- - @modern-js/utils@1.21.4
18
+ - d032d49: export createHandle
19
+ 导出 createHandle 函数
20
+ - 15bf09d9c8: feat: support completely custom server, export render() api for render single page
21
+ feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
22
+ - cc971eabfc: refactor: move server plugin load logic in `@modern-js/core`
23
+ refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
24
+ - 40ed587: feat: inject css chunk into html for streaming ssr
25
+ feat: streaming ssr 返回的 html 注入 css chunk
26
+ - 102d32e4ba: feat(server): add `req` and `res` to SSR context
27
+
28
+ feat(server): 添加 `req` 和 `res` 到 SSR context 中
29
+
30
+ - 3bbea92b2a: feat: support Hook、Middleware new API
31
+ feat: 支持 Hook、Middleware 的新 API
32
+ - 73cd29dd9f: fix(server): add favicon fallback handler
33
+
34
+ fix(server): 添加 favicon 兜底处理逻辑
35
+
36
+ - 18aaf42: fix: fix server loader redirects
37
+ fix: 修复 server loader 重定向错误
38
+ - 14b712d: fix: use consistent alias type and default value across packages
39
+
40
+ fix: 在各个包中使用一致的 alias 类型定义和默认值
41
+
42
+ - Updated dependencies [15bf09d9c8]
43
+ - Updated dependencies [92f0ead]
44
+ - Updated dependencies [edd1cfb1af]
45
+ - Updated dependencies [cc971eabfc]
46
+ - Updated dependencies [5b9049f]
47
+ - Updated dependencies [92004d1]
48
+ - Updated dependencies [b8bbe036c7]
49
+ - Updated dependencies [d5a31df781]
50
+ - Updated dependencies [dda38c9]
51
+ - Updated dependencies [3bbea92b2a]
52
+ - Updated dependencies [abf3421]
53
+ - Updated dependencies [543be9558e]
54
+ - Updated dependencies [14b712d]
55
+ - @modern-js/server-core@2.0.0-beta.1
56
+ - @modern-js/utils@2.0.0-beta.1
57
+
58
+ ## 2.0.0-beta.0
16
59
 
17
- ## 1.21.3
60
+ ### Major Changes
61
+
62
+ - dda38c9: chore: v2
63
+
64
+ ### Minor Changes
65
+
66
+ - c9e800d39: feat: support React18 streaming SSR
67
+ feat: 支持 React18 流式 SSR
68
+ - 543be95: feat: compile server loader and support handle loader request
69
+ feat: 编译 server loader 并支持处理 loader 的请求
18
70
 
19
71
  ### Patch Changes
20
72
 
21
- - @modern-js/server-core@1.21.3
22
- - @modern-js/utils@1.21.3
73
+ - 15bf09d9c: feat: support completely custom server, export render() api for render single page
74
+ feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
75
+ - cc971eabf: refactor: move server plugin load logic in `@modern-js/core`
76
+ refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
77
+ - 102d32e4b: feat(server): add `req` and `res` to SSR context
78
+
79
+ feat(server): 添加 `req` 和 `res` 到 SSR context 中
80
+
81
+ - 3bbea92b2: feat: support Hook、Middleware new API
82
+ feat: 支持 Hook、Middleware 的新 API
83
+ - 73cd29dd9: fix(server): add favicon fallback handler
84
+
85
+ fix(server): 添加 favicon 兜底处理逻辑
86
+
87
+ - 14b712d: fix: use consistent alias type and default value across packages
88
+
89
+ fix: 在各个包中使用一致的 alias 类型定义和默认值
90
+
91
+ - Updated dependencies [15bf09d9c]
92
+ - Updated dependencies [edd1cfb1a]
93
+ - Updated dependencies [cc971eabf]
94
+ - Updated dependencies [5b9049f]
95
+ - Updated dependencies [b8bbe036c]
96
+ - Updated dependencies [d5a31df78]
97
+ - Updated dependencies [dda38c9]
98
+ - Updated dependencies [3bbea92b2]
99
+ - Updated dependencies [abf3421]
100
+ - Updated dependencies [543be95]
101
+ - Updated dependencies [14b712d]
102
+ - @modern-js/server-core@2.0.0-beta.0
103
+ - @modern-js/utils@2.0.0-beta.0
23
104
 
24
105
  ## 1.21.2
25
106
 
@@ -6,12 +6,10 @@ export const AGGRED_DIR = {
6
6
  lambda: 'lambda'
7
7
  };
8
8
  export let ApiServerMode;
9
-
10
9
  (function (ApiServerMode) {
11
10
  ApiServerMode["func"] = "function";
12
11
  ApiServerMode["frame"] = "framework";
13
12
  })(ApiServerMode || (ApiServerMode = {}));
14
-
15
13
  export const ERROR_DIGEST = {
16
14
  INIT: 'Server init error',
17
15
  ENOTF: 'Page could not be found',
@@ -8,7 +8,6 @@ export default (options => {
8
8
  if (options == null) {
9
9
  throw new Error('can not start mserver without options');
10
10
  }
11
-
12
11
  const server = new Server(options);
13
12
  return server.init();
14
13
  });
@@ -1,5 +1,4 @@
1
1
  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; }
2
-
3
2
  import { URL } from 'url';
4
3
  import qs from 'querystring';
5
4
  import { Buffer } from 'buffer';
@@ -18,221 +17,176 @@ export class ModernServerContext {
18
17
  /**
19
18
  * url params
20
19
  */
20
+
21
21
  get logger() {
22
22
  return this.req.logger;
23
23
  }
24
-
25
24
  get metrics() {
26
25
  return this.req.metrics;
27
26
  }
28
-
29
27
  constructor(req, res, options) {
30
28
  _defineProperty(this, "req", void 0);
31
-
32
29
  _defineProperty(this, "res", void 0);
33
-
34
30
  _defineProperty(this, "params", {});
35
-
36
31
  _defineProperty(this, "serverData", void 0);
37
-
38
32
  _defineProperty(this, "options", {});
39
-
40
33
  this.req = req;
41
34
  this.res = res;
42
35
  this.options = options || {};
43
36
  this.serverData = {};
44
37
  this.bind();
45
38
  }
46
-
47
39
  bind() {
48
40
  const {
49
41
  req,
50
42
  res
51
43
  } = this;
52
-
53
44
  req.get = key => this.getReqHeader(key);
54
-
55
45
  res.set = (key, value) => this.res.setHeader(key, value);
56
-
57
46
  res.send = body => {
58
47
  this.send(body);
59
48
  };
60
- } // compat express res.send, only support etag now
61
-
49
+ }
62
50
 
51
+ // compat express res.send, only support etag now
63
52
  send(body) {
64
53
  try {
65
54
  const generateETag = !this.res.getHeader('ETag') && this.options.etag;
66
-
67
55
  if (body !== undefined && generateETag) {
68
56
  const encoding = typeof body === 'string' ? 'utf-8' : undefined;
69
57
  const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;
70
58
  const etag = createEtag(buf, {
71
59
  weak: true
72
60
  });
73
-
74
61
  if (etag) {
75
62
  this.res.setHeader('ETag', etag);
76
63
  }
77
64
  }
78
-
79
65
  if (this.fresh) {
80
66
  this.status = 304;
81
67
  }
82
68
  } catch (e) {
83
69
  this.logger.error(e.message);
84
70
  }
85
-
86
71
  this.res.end(body);
87
72
  }
88
-
89
73
  setParams(params) {
90
74
  this.params = params;
91
75
  }
92
-
93
76
  setServerData(key, value) {
94
77
  this.serverData[key] = value;
95
78
  }
96
-
97
79
  getReqHeader(key) {
98
80
  const {
99
81
  req
100
82
  } = this;
101
83
  const field = key.toLowerCase();
102
-
103
84
  switch (field) {
104
85
  case 'referer':
105
86
  case 'referrer':
106
87
  return req.headers.referrer || req.headers.referer || '';
107
-
108
88
  default:
109
89
  return req.headers[field] || '';
110
90
  }
111
91
  }
112
-
113
92
  get fresh() {
114
93
  const {
115
94
  status,
116
95
  res,
117
96
  method
118
- } = this; // GET or HEAD for weak freshness validation only
97
+ } = this;
119
98
 
99
+ // GET or HEAD for weak freshness validation only
120
100
  if ('GET' !== method && 'HEAD' !== method) {
121
101
  return false;
122
102
  }
123
-
124
103
  if (status >= 200 && status < 300 || 304 === status) {
125
104
  return fresh(this.headers, {
126
105
  etag: res.getHeader('ETag'),
127
106
  'last-modified': res.getHeader('Last-Modified')
128
107
  });
129
108
  }
130
-
131
109
  return false;
132
110
  }
133
- /* request property */
134
-
135
111
 
112
+ /* request property */
136
113
  get headers() {
137
114
  return this.req.headers;
138
115
  }
139
-
140
116
  get method() {
141
117
  return this.req.method;
142
118
  }
143
-
144
119
  get url() {
145
120
  return this.req.url || '';
146
121
  }
147
-
148
122
  set url(val) {
149
123
  this.req.url = val;
150
124
  }
151
-
152
125
  get host() {
153
126
  let host = this.getReqHeader('X-Forwarded-Host');
154
-
155
127
  if (!host) {
156
128
  host = this.getReqHeader('Host');
157
129
  }
158
-
159
130
  return host.split(/\s*,\s*/, 1)[0] || '';
160
131
  }
161
-
162
132
  get protocol() {
163
133
  if (this.req.socket.encrypted) {
164
134
  return 'https';
165
135
  }
166
-
167
136
  const proto = this.getReqHeader('X-Forwarded-Proto');
168
137
  return proto ? proto.split(/\s*,\s*/, 1)[0] : 'http';
169
138
  }
170
-
171
139
  get origin() {
172
140
  return `${this.protocol}://${this.host}`;
173
141
  }
174
-
175
142
  get href() {
176
143
  return this.origin + this.url;
177
144
  }
178
-
179
145
  get parsedURL() {
180
146
  const url = new URL(this.req.url, this.origin);
181
147
  return url;
182
148
  }
183
-
184
149
  get path() {
185
150
  return this.parsedURL.pathname;
186
151
  }
187
-
188
152
  set path(p) {
189
- const url = new URL(this.req.url, this.origin); // this should never happened
190
-
153
+ const url = new URL(this.req.url, this.origin);
154
+ // this should never happened
191
155
  if (!url || !p) {
192
156
  return;
193
157
  }
194
-
195
158
  if (url.pathname === p) {
196
159
  return;
197
160
  }
198
-
199
161
  url.pathname = p;
200
162
  this.url = url.toString();
201
163
  }
202
-
203
164
  get querystring() {
204
165
  if (!this.req) {
205
166
  return '';
206
167
  }
207
-
208
168
  return this.parsedURL.search.replace(/^\?/, '') || '';
209
169
  }
210
-
211
170
  get query() {
212
171
  const str = this.querystring;
213
172
  return qs.parse(str);
214
173
  }
215
- /* response property */
216
-
217
174
 
175
+ /* response property */
218
176
  get status() {
219
177
  return this.res.statusCode;
220
178
  }
221
-
222
179
  set status(statusCode) {
223
180
  this.res.statusCode = statusCode;
224
181
  }
182
+
225
183
  /**
226
184
  * 判断链接是否已经关闭
227
185
  */
228
-
229
-
230
186
  resHasHandled() {
231
187
  return this.res.writableEnded;
232
188
  }
233
-
234
189
  error(dig, e = '') {
235
190
  this.logger.error(`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, this.path, headersWithoutCookie(this.headers));
236
191
  }
237
-
238
192
  }
@@ -0,0 +1,125 @@
1
+ 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; }
2
+ 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; }
3
+ 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; }
4
+ import cookie from 'cookie';
5
+ import { RouteAPI } from "./route";
6
+ import { TemplateAPI } from "./template";
7
+ class Response {
8
+ constructor(res) {
9
+ _defineProperty(this, "cookies", void 0);
10
+ _defineProperty(this, "res", void 0);
11
+ _defineProperty(this, "_cookie", void 0);
12
+ this.res = res;
13
+ this._cookie = cookie.parse(res.getHeader('set-cookie') || '');
14
+ this.cookies = {
15
+ get: this.getCookie.bind(this),
16
+ set: this.setCookie.bind(this),
17
+ delete: this.deleteCookie.bind(this),
18
+ clear: this.clearCookie.bind(this),
19
+ apply: this.applyCookie.bind(this)
20
+ };
21
+ }
22
+ get(key) {
23
+ return this.res.getHeader(key);
24
+ }
25
+ set(key, value) {
26
+ return this.res.setHeader(key, value);
27
+ }
28
+ status(code) {
29
+ this.res.statusCode = code;
30
+ }
31
+ getCookie(key) {
32
+ return this._cookie[key];
33
+ }
34
+ setCookie(key, value) {
35
+ this._cookie[key] = value;
36
+ }
37
+ deleteCookie(key) {
38
+ if (this._cookie[key]) {
39
+ delete this._cookie[key];
40
+ }
41
+ }
42
+ clearCookie() {
43
+ this._cookie = {};
44
+ }
45
+ applyCookie() {
46
+ const str = Object.entries(this._cookie).map(([key, value]) => {
47
+ return cookie.serialize(key, value);
48
+ }).join('; ');
49
+ if (str) {
50
+ this.res.setHeader('set-cookie', str);
51
+ } else {
52
+ this.res.removeHeader('set-cookie');
53
+ }
54
+ }
55
+ raw(body, {
56
+ status,
57
+ headers
58
+ }) {
59
+ Object.entries(headers).forEach(([key, value]) => {
60
+ this.res.setHeader(key, value);
61
+ });
62
+ if (status) {
63
+ this.res.statusCode = status;
64
+ }
65
+ this.res.end(body);
66
+ }
67
+ }
68
+ class Request {
69
+ constructor(ctx) {
70
+ _defineProperty(this, "host", void 0);
71
+ _defineProperty(this, "pathname", void 0);
72
+ _defineProperty(this, "query", void 0);
73
+ _defineProperty(this, "headers", void 0);
74
+ _defineProperty(this, "cookie", void 0);
75
+ _defineProperty(this, "cookies", void 0);
76
+ _defineProperty(this, "_cookie", void 0);
77
+ this.host = ctx.host;
78
+ this.pathname = ctx.path;
79
+ this.query = ctx.query;
80
+ this.headers = ctx.headers;
81
+ this.cookie = ctx.headers.cookie || '';
82
+ this._cookie = cookie.parse(this.cookie);
83
+ this.cookies = {
84
+ get: this.getCookie.bind(this)
85
+ };
86
+ }
87
+ getCookie(key) {
88
+ return this._cookie[key];
89
+ }
90
+ }
91
+ export const base = context => {
92
+ const {
93
+ res
94
+ } = context;
95
+ return {
96
+ response: new Response(res),
97
+ request: new Request(context),
98
+ logger: context.logger,
99
+ metrics: context.metrics
100
+ };
101
+ };
102
+ export const createAfterMatchContext = (context, entryName) => {
103
+ const baseContext = base(context);
104
+ return _objectSpread(_objectSpread({}, baseContext), {}, {
105
+ router: new RouteAPI(entryName)
106
+ });
107
+ };
108
+ export const createAfterRenderContext = (context, content) => {
109
+ const baseContext = base(context);
110
+ return _objectSpread(_objectSpread({}, baseContext), {}, {
111
+ template: new TemplateAPI(content)
112
+ });
113
+ };
114
+ export const createMiddlewareContext = context => {
115
+ const baseContext = base(context);
116
+ return _objectSpread(_objectSpread({}, baseContext), {}, {
117
+ response: _objectSpread(_objectSpread({}, baseContext.response), {}, {
118
+ locals: context.res.locals || {}
119
+ }),
120
+ source: {
121
+ req: context.req,
122
+ res: context.res
123
+ }
124
+ });
125
+ };
@@ -1,44 +1,21 @@
1
1
  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; }
2
-
3
- class RouteAPI {
4
- constructor(matched, router, url) {
5
- _defineProperty(this, "router", void 0);
6
-
2
+ export class RouteAPI {
3
+ constructor(entryName) {
7
4
  _defineProperty(this, "current", void 0);
8
-
5
+ _defineProperty(this, "status", void 0);
9
6
  _defineProperty(this, "url", void 0);
10
-
11
- this.current = matched;
12
- this.router = router;
13
- this.url = url;
7
+ this.current = entryName;
8
+ this.status = 200;
9
+ this.url = '';
14
10
  }
15
-
16
- cur() {
17
- return this.current.generate(this.url);
11
+ redirect(url, status = 302) {
12
+ this.url = url;
13
+ this.status = status;
18
14
  }
19
-
20
- get(entryName) {
21
- const {
22
- router
23
- } = this;
24
- const matched = router.matchEntry(entryName);
25
- return matched ? matched.generate(this.url) : null;
15
+ rewrite(entryName) {
16
+ this.current = entryName;
26
17
  }
27
-
28
18
  use(entryName) {
29
- const {
30
- router
31
- } = this;
32
- const matched = router.matchEntry(entryName);
33
-
34
- if (matched) {
35
- this.current = matched;
36
- return true;
37
- } else {
38
- return false;
39
- }
19
+ this.rewrite(entryName);
40
20
  }
41
-
42
- }
43
-
44
- export const createRouteAPI = (matched, router, url) => new RouteAPI(matched, router, url);
21
+ }
@@ -1,5 +1,5 @@
1
1
  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; }
2
-
2
+ import { Transform } from 'stream';
3
3
  const RegList = {
4
4
  before: {
5
5
  head: '<head>',
@@ -10,55 +10,78 @@ const RegList = {
10
10
  body: '</body>'
11
11
  }
12
12
  };
13
-
14
- class TemplateAPI {
13
+ export class TemplateAPI {
15
14
  constructor(content) {
16
15
  _defineProperty(this, "content", void 0);
17
-
18
16
  this.content = content;
19
17
  }
20
-
21
18
  get() {
22
19
  return this.content;
23
20
  }
24
-
25
21
  set(content) {
26
22
  this.content = content;
27
23
  }
28
-
29
24
  prependHead(fragment) {
30
25
  const {
31
26
  head
32
27
  } = RegList.before;
33
28
  return this.replace(head, `${head}${fragment}`);
34
29
  }
35
-
36
30
  appendHead(fragment) {
37
31
  const {
38
32
  head
39
33
  } = RegList.after;
40
34
  return this.replace(head, `${fragment}${head}`);
41
35
  }
42
-
43
36
  prependBody(fragment) {
44
37
  const {
45
38
  body
46
39
  } = RegList.before;
47
40
  return this.replace(body, `${body}${fragment}`);
48
41
  }
49
-
50
42
  appendBody(fragment) {
51
43
  const {
52
44
  body
53
45
  } = RegList.after;
54
46
  return this.replace(body, `${fragment}${body}`);
55
47
  }
56
-
57
48
  replace(reg, text) {
58
49
  this.content = this.content.replace(reg, text);
59
- return this;
60
50
  }
61
-
62
51
  }
63
-
64
- export const createTemplateAPI = content => new TemplateAPI(content);
52
+ export const templateInjectableStream = ({
53
+ prependHead,
54
+ appendHead,
55
+ prependBody,
56
+ appendBody
57
+ }) => new Transform({
58
+ write(chunk, _, callback) {
59
+ let chunk_str = chunk.toString();
60
+ if (prependHead) {
61
+ const {
62
+ head
63
+ } = RegList.before;
64
+ chunk_str = chunk_str.replace(head, `${head}${prependHead}`);
65
+ }
66
+ if (appendHead) {
67
+ const {
68
+ head
69
+ } = RegList.after;
70
+ chunk_str = chunk_str.replace(head, `${appendHead}${head}`);
71
+ }
72
+ if (prependBody) {
73
+ const {
74
+ body
75
+ } = RegList.before;
76
+ chunk_str = chunk_str.replace(body, `${body}${prependBody}`);
77
+ }
78
+ if (appendBody) {
79
+ const {
80
+ body
81
+ } = RegList.after;
82
+ chunk_str = chunk_str.replace(body, `${appendBody}${body}`);
83
+ }
84
+ this.push(chunk_str);
85
+ callback();
86
+ }
87
+ });