@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 +41 -0
- package/dist/js/modern/libs/context/context.js +2 -1
- package/dist/js/modern/libs/proxy.js +31 -1
- package/dist/js/modern/libs/render/measure.js +2 -1
- package/dist/js/modern/libs/route/route.js +3 -0
- package/dist/js/modern/libs/serve-file.js +20 -1
- package/dist/js/modern/server/modern-server.js +16 -2
- package/dist/js/modern/utils.js +27 -3
- package/dist/js/node/libs/context/context.js +3 -1
- package/dist/js/node/libs/proxy.js +35 -4
- package/dist/js/node/libs/render/measure.js +3 -1
- package/dist/js/node/libs/route/route.js +3 -0
- package/dist/js/node/libs/serve-file.js +20 -1
- package/dist/js/node/server/modern-server.js +16 -2
- package/dist/js/node/utils.js +34 -4
- package/dist/types/libs/proxy.d.ts +2 -1
- package/dist/types/libs/render/type.d.ts +1 -0
- package/dist/types/libs/route/route.d.ts +1 -0
- package/dist/types/libs/serve-file.d.ts +2 -1
- package/dist/types/utils.d.ts +7 -1
- package/package.json +7 -7
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
|
-
|
|
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) {
|
package/dist/js/modern/utils.js
CHANGED
|
@@ -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
|
|
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("
|
|
11
|
+
var _utils = require("../utils");
|
|
11
12
|
|
|
12
|
-
var
|
|
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,
|
|
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 =
|
|
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
|
|
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) {
|
package/dist/js/node/utils.js
CHANGED
|
@@ -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
|
|
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,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 {};
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -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.
|
|
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": "
|
|
31
|
+
"@modern-js/utils": "1.16.0",
|
|
32
32
|
"@babel/compat-data": "^7.17.10",
|
|
33
|
-
"@modern-js/server-core": "
|
|
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.
|
|
47
|
-
"@modern-js/core": "1.
|
|
48
|
-
"@scripts/jest-config": "
|
|
49
|
-
"@scripts/build": "
|
|
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",
|