@modern-js/prod-server 1.2.1 → 1.16.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @modern-js/prod-server
2
2
 
3
+ ## 1.16.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 81c66e4a4: fix: compatibility issues of dev server in iOS 10
8
+
9
+ fix: 修复 dev server 代码在 iOS 10 下的兼容性问题
10
+
11
+ - Updated dependencies [641592f52]
12
+ - Updated dependencies [3904b30a5]
13
+ - Updated dependencies [1100dd58c]
14
+ - Updated dependencies [e04e6e76a]
15
+ - Updated dependencies [81c66e4a4]
16
+ - Updated dependencies [2c305b6f5]
17
+ - @modern-js/utils@1.16.0
18
+ - @modern-js/server-core@1.16.0
19
+
20
+ ## 1.15.0
21
+
22
+ ### Patch Changes
23
+
24
+ - c087148: chore: remove cookie in error log
25
+ chore: 删除错误日志中的 cookie 信息
26
+ - Updated dependencies [8658a78]
27
+ - Updated dependencies [05d4a4f]
28
+ - Updated dependencies [ad05af9]
29
+ - Updated dependencies [5d53d1c]
30
+ - Updated dependencies [37cd159]
31
+ - @modern-js/utils@1.15.0
32
+ - @modern-js/server-core@1.15.0
33
+
34
+ ## 1.2.2
35
+
36
+ ### Patch Changes
37
+
38
+ - 0e28456: fix assets prefix bug in prod env
39
+ - 44e3bb1: feat: support response headers
40
+ feat: 支持设置响应头
41
+ - @modern-js/server-core@1.4.1
42
+ - @modern-js/utils@1.8.0
43
+
3
44
  ## 1.2.1
4
45
 
5
46
  ### Patch Changes
@@ -2,6 +2,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
2
2
 
3
3
  import { URL } from 'url';
4
4
  import qs from 'querystring';
5
+ import { headersWithoutCookie } from "../../utils";
5
6
  export class ModernServerContext {
6
7
  /**
7
8
  * http request
@@ -173,7 +174,7 @@ export class ModernServerContext {
173
174
  }
174
175
 
175
176
  error(dig, e = '') {
176
- 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, this.headers);
177
+ 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));
177
178
  }
178
179
 
179
180
  }
@@ -1,6 +1,36 @@
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
+
3
+ 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; }
4
+
5
+ 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; }
6
+
1
7
  import { createProxyMiddleware } from 'http-proxy-middleware';
2
- import { formatProxyOptions } from '@modern-js/utils';
3
8
  import { debug } from "../utils";
9
+ export function formatProxyOptions(proxyOptions) {
10
+ const formattedProxy = [];
11
+
12
+ if (!Array.isArray(proxyOptions)) {
13
+ if ('target' in proxyOptions) {
14
+ formattedProxy.push(proxyOptions);
15
+ } else {
16
+ Array.prototype.push.apply(formattedProxy, Object.keys(proxyOptions).reduce((total, source) => {
17
+ const option = proxyOptions[source];
18
+ total.push(_objectSpread({
19
+ context: source,
20
+ changeOrigin: true,
21
+ logLevel: 'warn'
22
+ }, typeof option === 'string' ? {
23
+ target: option
24
+ } : option));
25
+ return total;
26
+ }, []));
27
+ }
28
+ } else {
29
+ formattedProxy.push(...proxyOptions);
30
+ }
31
+
32
+ return formattedProxy;
33
+ }
4
34
  export const createProxyHandler = proxyOptions => {
5
35
  debug('createProxyHandler', proxyOptions);
6
36
 
@@ -4,6 +4,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
 
5
5
  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; }
6
6
 
7
+ import { headersWithoutCookie } from "../../utils";
7
8
  export const createMetrics = (context, metrics) => {
8
9
  const {
9
10
  entryName: entry,
@@ -48,7 +49,7 @@ export const createLogger = (serverContext, logger) => {
48
49
  };
49
50
 
50
51
  const error = (message, e) => {
51
- logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, headers);
52
+ logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, headersWithoutCookie(headers));
52
53
  };
53
54
 
54
55
  return {
@@ -22,6 +22,8 @@ export class ModernRoute {
22
22
 
23
23
  _defineProperty(this, "params", {});
24
24
 
25
+ _defineProperty(this, "responseHeaders", void 0);
26
+
25
27
  this.entryName = routeSpec.entryName || '';
26
28
  this.urlPath = routeSpec.urlPath;
27
29
  this.entryPath = routeSpec.entryPath || '';
@@ -30,6 +32,7 @@ export class ModernRoute {
30
32
  this.isApi = routeSpec.isApi || false;
31
33
  this.bundle = routeSpec.bundle || '';
32
34
  this.enableModernMode = (_routeSpec$enableMode = routeSpec.enableModernMode) !== null && _routeSpec$enableMode !== void 0 ? _routeSpec$enableMode : false;
35
+ this.responseHeaders = routeSpec.responseHeaders;
33
36
  }
34
37
 
35
38
  }
@@ -1,13 +1,30 @@
1
1
  // Todo 看看是不是能 fork 一份,即使命中也返回
2
2
  import serve from 'serve-static';
3
3
  import { isString, isRegExp } from '@modern-js/utils';
4
- export const createStaticFileHandler = rules => // eslint-disable-next-line consistent-return
4
+ import { useLocalPrefix } from "../utils";
5
+
6
+ const removedPrefix = (req, prefix) => {
7
+ if (useLocalPrefix(prefix)) {
8
+ req.url = req.url.slice(prefix.length);
9
+ return () => {
10
+ req.url = prefix + req.url;
11
+ };
12
+ } else {
13
+ return () => {// emptyy
14
+ };
15
+ }
16
+ };
17
+
18
+ export const createStaticFileHandler = (rules, output = {}) => // eslint-disable-next-line consistent-return
5
19
  async (context, next) => {
6
20
  const {
7
21
  url: requestUrl,
8
22
  req,
9
23
  res
10
24
  } = context;
25
+ const {
26
+ assetPrefix = '/'
27
+ } = output;
11
28
  const hitRule = rules.find(item => {
12
29
  if (isString(item.path) && requestUrl.startsWith(item.path)) {
13
30
  return true;
@@ -19,7 +36,9 @@ async (context, next) => {
19
36
  });
20
37
 
21
38
  if (hitRule) {
39
+ const resume = removedPrefix(req, assetPrefix);
22
40
  serve(hitRule.target)(req, res, () => {
41
+ resume();
23
42
  next();
24
43
  });
25
44
  } else {
@@ -136,7 +136,7 @@ export class ModernServer {
136
136
  this.staticFileHandler = createStaticFileHandler([{
137
137
  path: staticPathRegExp,
138
138
  target: distDir
139
- }]);
139
+ }], this.conf.output);
140
140
  this.routeRenderHandler = createRenderHandler({
141
141
  distDir,
142
142
  staticGenerate
@@ -415,6 +415,16 @@ export class ModernServer {
415
415
  return;
416
416
  }
417
417
 
418
+ if (route.responseHeaders) {
419
+ Object.keys(route.responseHeaders).forEach(key => {
420
+ const value = route.responseHeaders[key];
421
+
422
+ if (value) {
423
+ context.res.setHeader(key, value);
424
+ }
425
+ });
426
+ }
427
+
418
428
  if (route.entryName) {
419
429
  await this.emitRouteHook('beforeRender', {
420
430
  context
@@ -541,7 +551,11 @@ export class ModernServer {
541
551
  this._handler = (context, next) => {
542
552
  let i = 0;
543
553
 
544
- const dispatch = () => {
554
+ const dispatch = error => {
555
+ if (error) {
556
+ return this.onError(context, error);
557
+ }
558
+
545
559
  const handler = handlers[i++];
546
560
 
547
561
  if (!handler) {
@@ -1,5 +1,11 @@
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
+
3
+ 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; }
4
+
5
+ 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; }
6
+
1
7
  import { compile } from 'path-to-regexp';
2
- import { createDebugger } from '@modern-js/utils';
8
+ import { createDebugger, isProd } from '@modern-js/utils';
3
9
  export const debug = createDebugger('prod-server');
4
10
  export const mergeExtension = users => {
5
11
  const output = [];
@@ -71,17 +77,25 @@ export const toPath = (reg, params) => {
71
77
  });
72
78
  return fn(params);
73
79
  };
80
+ export const useLocalPrefix = url => {
81
+ return isProd() && !url.includes('.');
82
+ };
74
83
  export const getStaticReg = (output = {}) => {
75
84
  const {
76
85
  favicon,
77
86
  faviconByEntries,
78
87
  cssPath,
79
88
  jsPath,
80
- mediaPath
89
+ mediaPath,
90
+ assetPrefix = '/'
81
91
  } = output;
92
+ const prefix = useLocalPrefix(assetPrefix) ? assetPrefix : '';
82
93
  const favicons = prepareFavicons(favicon, faviconByEntries);
83
94
  const staticFiles = [cssPath, jsPath, mediaPath].filter(v => Boolean(v));
84
- const staticPathRegExp = new RegExp(`^/(static/|upload/|favicon.ico|icon.png${favicons.length > 0 ? `|${favicons.join('|')}` : ''}${staticFiles.length > 0 ? `|${staticFiles.join('|')}` : ''})`);
95
+ const staticReg = ['static/', 'upload/', ...staticFiles];
96
+ const iconReg = ['favicon.ico', 'icon.png', ...favicons];
97
+ const regPrefix = prefix === '/' ? '' : prefix;
98
+ const staticPathRegExp = new RegExp(`^${regPrefix}/(${[...staticReg, ...iconReg].join('|')})`);
85
99
  return staticPathRegExp;
86
100
  };
87
101
  export const prepareFavicons = (favicon, faviconByEntries) => {
@@ -102,4 +116,14 @@ export const prepareFavicons = (favicon, faviconByEntries) => {
102
116
  }
103
117
 
104
118
  return faviconNames;
119
+ };
120
+ export const headersWithoutCookie = headers => {
121
+ if (typeof headers.cookie !== 'undefined') {
122
+ const safeHeaders = _objectSpread({}, headers);
123
+
124
+ delete safeHeaders.cookie;
125
+ return safeHeaders;
126
+ }
127
+
128
+ return headers;
105
129
  };
@@ -9,6 +9,8 @@ var _url = require("url");
9
9
 
10
10
  var _querystring = _interopRequireDefault(require("querystring"));
11
11
 
12
+ var _utils = require("../../utils");
13
+
12
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
15
 
14
16
  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; }
@@ -184,7 +186,7 @@ class ModernServerContext {
184
186
  }
185
187
 
186
188
  error(dig, e = '') {
187
- 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, this.headers);
189
+ 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, (0, _utils.headersWithoutCookie)(this.headers));
188
190
  }
189
191
 
190
192
  }
@@ -4,15 +4,46 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createProxyHandler = void 0;
7
+ exports.formatProxyOptions = formatProxyOptions;
7
8
 
8
9
  var _httpProxyMiddleware = require("http-proxy-middleware");
9
10
 
10
- var _utils = require("@modern-js/utils");
11
+ var _utils = require("../utils");
11
12
 
12
- var _utils2 = require("../utils");
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; }
14
+
15
+ 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
+ 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
+ function formatProxyOptions(proxyOptions) {
20
+ const formattedProxy = [];
21
+
22
+ if (!Array.isArray(proxyOptions)) {
23
+ if ('target' in proxyOptions) {
24
+ formattedProxy.push(proxyOptions);
25
+ } else {
26
+ Array.prototype.push.apply(formattedProxy, Object.keys(proxyOptions).reduce((total, source) => {
27
+ const option = proxyOptions[source];
28
+ total.push(_objectSpread({
29
+ context: source,
30
+ changeOrigin: true,
31
+ logLevel: 'warn'
32
+ }, typeof option === 'string' ? {
33
+ target: option
34
+ } : option));
35
+ return total;
36
+ }, []));
37
+ }
38
+ } else {
39
+ formattedProxy.push(...proxyOptions);
40
+ }
41
+
42
+ return formattedProxy;
43
+ }
13
44
 
14
45
  const createProxyHandler = proxyOptions => {
15
- (0, _utils2.debug)('createProxyHandler', proxyOptions);
46
+ (0, _utils.debug)('createProxyHandler', proxyOptions);
16
47
 
17
48
  if (!proxyOptions) {
18
49
  return null;
@@ -20,7 +51,7 @@ const createProxyHandler = proxyOptions => {
20
51
  // or an object in the form of { source: ProxyDetail }
21
52
 
22
53
 
23
- const formattedProxy = (0, _utils.formatProxyOptions)(proxyOptions);
54
+ const formattedProxy = formatProxyOptions(proxyOptions);
24
55
  const middlewares = formattedProxy.map(option => {
25
56
  const middleware = (0, _httpProxyMiddleware.createProxyMiddleware)(option.context, option); // eslint-disable-next-line consistent-return
26
57
 
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createMetrics = exports.createLogger = void 0;
7
7
 
8
+ var _utils = require("../../utils");
9
+
8
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; }
9
11
 
10
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; }
@@ -58,7 +60,7 @@ const createLogger = (serverContext, logger) => {
58
60
  };
59
61
 
60
62
  const error = (message, e) => {
61
- logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, headers);
63
+ logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, (0, _utils.headersWithoutCookie)(headers));
62
64
  };
63
65
 
64
66
  return {
@@ -29,6 +29,8 @@ class ModernRoute {
29
29
 
30
30
  _defineProperty(this, "params", {});
31
31
 
32
+ _defineProperty(this, "responseHeaders", void 0);
33
+
32
34
  this.entryName = routeSpec.entryName || '';
33
35
  this.urlPath = routeSpec.urlPath;
34
36
  this.entryPath = routeSpec.entryPath || '';
@@ -37,6 +39,7 @@ class ModernRoute {
37
39
  this.isApi = routeSpec.isApi || false;
38
40
  this.bundle = routeSpec.bundle || '';
39
41
  this.enableModernMode = (_routeSpec$enableMode = routeSpec.enableModernMode) !== null && _routeSpec$enableMode !== void 0 ? _routeSpec$enableMode : false;
42
+ this.responseHeaders = routeSpec.responseHeaders;
40
43
  }
41
44
 
42
45
  }
@@ -9,16 +9,33 @@ var _serveStatic = _interopRequireDefault(require("serve-static"));
9
9
 
10
10
  var _utils = require("@modern-js/utils");
11
11
 
12
+ var _utils2 = require("../utils");
13
+
12
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
15
 
14
16
  // Todo 看看是不是能 fork 一份,即使命中也返回
15
- const createStaticFileHandler = rules => // eslint-disable-next-line consistent-return
17
+ const removedPrefix = (req, prefix) => {
18
+ if ((0, _utils2.useLocalPrefix)(prefix)) {
19
+ req.url = req.url.slice(prefix.length);
20
+ return () => {
21
+ req.url = prefix + req.url;
22
+ };
23
+ } else {
24
+ return () => {// emptyy
25
+ };
26
+ }
27
+ };
28
+
29
+ const createStaticFileHandler = (rules, output = {}) => // eslint-disable-next-line consistent-return
16
30
  async (context, next) => {
17
31
  const {
18
32
  url: requestUrl,
19
33
  req,
20
34
  res
21
35
  } = context;
36
+ const {
37
+ assetPrefix = '/'
38
+ } = output;
22
39
  const hitRule = rules.find(item => {
23
40
  if ((0, _utils.isString)(item.path) && requestUrl.startsWith(item.path)) {
24
41
  return true;
@@ -30,7 +47,9 @@ async (context, next) => {
30
47
  });
31
48
 
32
49
  if (hitRule) {
50
+ const resume = removedPrefix(req, assetPrefix);
33
51
  (0, _serveStatic.default)(hitRule.target)(req, res, () => {
52
+ resume();
34
53
  next();
35
54
  });
36
55
  } else {
@@ -165,7 +165,7 @@ class ModernServer {
165
165
  this.staticFileHandler = (0, _serveFile.createStaticFileHandler)([{
166
166
  path: staticPathRegExp,
167
167
  target: distDir
168
- }]);
168
+ }], this.conf.output);
169
169
  this.routeRenderHandler = (0, _render.createRenderHandler)({
170
170
  distDir,
171
171
  staticGenerate
@@ -452,6 +452,16 @@ class ModernServer {
452
452
  return;
453
453
  }
454
454
 
455
+ if (route.responseHeaders) {
456
+ Object.keys(route.responseHeaders).forEach(key => {
457
+ const value = route.responseHeaders[key];
458
+
459
+ if (value) {
460
+ context.res.setHeader(key, value);
461
+ }
462
+ });
463
+ }
464
+
455
465
  if (route.entryName) {
456
466
  await this.emitRouteHook('beforeRender', {
457
467
  context
@@ -578,7 +588,11 @@ class ModernServer {
578
588
  this._handler = (context, next) => {
579
589
  let i = 0;
580
590
 
581
- const dispatch = () => {
591
+ const dispatch = error => {
592
+ if (error) {
593
+ return this.onError(context, error);
594
+ }
595
+
582
596
  const handler = handlers[i++];
583
597
 
584
598
  if (!handler) {
@@ -3,12 +3,18 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.toPath = exports.prepareFavicons = exports.noop = exports.mergeExtension = exports.getStaticReg = exports.debug = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
6
+ exports.useLocalPrefix = exports.toPath = exports.prepareFavicons = exports.noop = exports.mergeExtension = exports.headersWithoutCookie = exports.getStaticReg = exports.debug = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
7
7
 
8
8
  var _pathToRegexp = require("path-to-regexp");
9
9
 
10
10
  var _utils = require("@modern-js/utils");
11
11
 
12
+ 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; }
13
+
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; }
15
+
16
+ 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; }
17
+
12
18
  const debug = (0, _utils.createDebugger)('prod-server');
13
19
  exports.debug = debug;
14
20
 
@@ -97,17 +103,28 @@ const toPath = (reg, params) => {
97
103
 
98
104
  exports.toPath = toPath;
99
105
 
106
+ const useLocalPrefix = url => {
107
+ return (0, _utils.isProd)() && !url.includes('.');
108
+ };
109
+
110
+ exports.useLocalPrefix = useLocalPrefix;
111
+
100
112
  const getStaticReg = (output = {}) => {
101
113
  const {
102
114
  favicon,
103
115
  faviconByEntries,
104
116
  cssPath,
105
117
  jsPath,
106
- mediaPath
118
+ mediaPath,
119
+ assetPrefix = '/'
107
120
  } = output;
121
+ const prefix = useLocalPrefix(assetPrefix) ? assetPrefix : '';
108
122
  const favicons = prepareFavicons(favicon, faviconByEntries);
109
123
  const staticFiles = [cssPath, jsPath, mediaPath].filter(v => Boolean(v));
110
- const staticPathRegExp = new RegExp(`^/(static/|upload/|favicon.ico|icon.png${favicons.length > 0 ? `|${favicons.join('|')}` : ''}${staticFiles.length > 0 ? `|${staticFiles.join('|')}` : ''})`);
124
+ const staticReg = ['static/', 'upload/', ...staticFiles];
125
+ const iconReg = ['favicon.ico', 'icon.png', ...favicons];
126
+ const regPrefix = prefix === '/' ? '' : prefix;
127
+ const staticPathRegExp = new RegExp(`^${regPrefix}/(${[...staticReg, ...iconReg].join('|')})`);
111
128
  return staticPathRegExp;
112
129
  };
113
130
 
@@ -133,4 +150,17 @@ const prepareFavicons = (favicon, faviconByEntries) => {
133
150
  return faviconNames;
134
151
  };
135
152
 
136
- exports.prepareFavicons = prepareFavicons;
153
+ exports.prepareFavicons = prepareFavicons;
154
+
155
+ const headersWithoutCookie = headers => {
156
+ if (typeof headers.cookie !== 'undefined') {
157
+ const safeHeaders = _objectSpread({}, headers);
158
+
159
+ delete safeHeaders.cookie;
160
+ return safeHeaders;
161
+ }
162
+
163
+ return headers;
164
+ };
165
+
166
+ exports.headersWithoutCookie = headersWithoutCookie;
@@ -1,4 +1,5 @@
1
- import { NextFunction, BffProxyOptions } from '@modern-js/types';
1
+ import { ProxyDetail, NextFunction, BffProxyOptions } from '@modern-js/types';
2
2
  import { ModernServerContext } from './context';
3
3
  export type { BffProxyOptions };
4
+ export declare function formatProxyOptions(proxyOptions: BffProxyOptions): ProxyDetail[];
4
5
  export declare const createProxyHandler: (proxyOptions?: BffProxyOptions) => ((ctx: ModernServerContext, next: NextFunction) => Promise<void>)[] | null;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { BaseSSRServerContext } from '@modern-js/types/server';
2
3
  declare type MetaKeyMap = {
3
4
  header?: string[];
@@ -10,5 +10,6 @@ export declare class ModernRoute implements ModernRouteInterface {
10
10
  isSPA: boolean;
11
11
  enableModernMode?: boolean;
12
12
  params: Record<string, any>;
13
+ responseHeaders?: Record<string, any>;
13
14
  constructor(routeSpec: ModernRouteInterface);
14
15
  }
@@ -1,8 +1,9 @@
1
+ import { NormalizedConfig } from '@modern-js/core';
1
2
  import { NextFunction } from '../type';
2
3
  import { ModernServerContext } from './context';
3
4
  declare type Rule = {
4
5
  path: string | RegExp;
5
6
  target: string;
6
7
  };
7
- export declare const createStaticFileHandler: (rules: Rule[]) => (context: ModernServerContext, next: NextFunction) => Promise<void>;
8
+ export declare const createStaticFileHandler: (rules: Rule[], output?: NormalizedConfig['output']) => (context: ModernServerContext, next: NextFunction) => Promise<void>;
8
9
  export {};
@@ -1,3 +1,7 @@
1
+ /// <reference path="type.d.ts" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node/http" />
4
+ import { IncomingMessage } from 'http';
1
5
  import type { NormalizedConfig } from '@modern-js/core';
2
6
  export declare const debug: any;
3
7
  export declare const mergeExtension: (users: any[]) => {
@@ -15,5 +19,7 @@ export declare const createMiddlewareCollecter: () => {
15
19
  addAPIMiddleware: (input: any) => void;
16
20
  };
17
21
  export declare const toPath: (reg: string, params: Record<string, any>) => string;
22
+ export declare const useLocalPrefix: (url: string) => boolean;
18
23
  export declare const getStaticReg: (output?: NormalizedConfig['output']) => RegExp;
19
- export declare const prepareFavicons: (favicon: string | undefined, faviconByEntries?: Record<string, string | undefined>) => string[];
24
+ export declare const prepareFavicons: (favicon: string | undefined, faviconByEntries?: Record<string, string | undefined>) => string[];
25
+ export declare const headersWithoutCookie: (headers: IncomingMessage['headers']) => import("http").IncomingHttpHeaders;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.2.1",
14
+ "version": "1.16.0",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -28,9 +28,9 @@
28
28
  }
29
29
  },
30
30
  "dependencies": {
31
- "@modern-js/utils": "^1.8.0",
31
+ "@modern-js/utils": "1.16.0",
32
32
  "@babel/compat-data": "^7.17.10",
33
- "@modern-js/server-core": "^1.4.1",
33
+ "@modern-js/server-core": "1.16.0",
34
34
  "axios": "^0.24.0",
35
35
  "compare-versions": "^3.6.0",
36
36
  "cookie": "^0.4.2",
@@ -43,10 +43,10 @@
43
43
  "ua-parser-js": "^0.7.28"
44
44
  },
45
45
  "devDependencies": {
46
- "@modern-js/types": "1.6.0",
47
- "@modern-js/core": "1.13.1",
48
- "@scripts/jest-config": "0.0.0",
49
- "@scripts/build": "0.0.0",
46
+ "@modern-js/types": "1.16.0",
47
+ "@modern-js/core": "1.16.0",
48
+ "@scripts/jest-config": "1.15.0",
49
+ "@scripts/build": "1.15.0",
50
50
  "@types/cookie": "^0.4.1",
51
51
  "@types/jest": "^27",
52
52
  "@types/lru-cache": "^5.1.1",