@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.
- package/CHANGELOG.md +110 -0
- package/dist/js/modern/constants.js +0 -2
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/libs/context/context.js +10 -56
- package/dist/js/modern/libs/hook-api/index.js +0 -31
- package/dist/js/modern/libs/hook-api/route.js +0 -8
- package/dist/js/modern/libs/hook-api/template.js +0 -16
- package/dist/js/modern/libs/loadConfig.js +3 -10
- package/dist/js/modern/libs/metrics.js +6 -6
- package/dist/js/modern/libs/proxy.js +7 -12
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -1
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -9
- package/dist/js/modern/libs/render/cache/index.js +8 -16
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -10
- package/dist/js/modern/libs/render/cache/spr.js +12 -62
- package/dist/js/modern/libs/render/cache/util.js +0 -6
- package/dist/js/modern/libs/render/index.js +6 -11
- package/dist/js/modern/libs/render/measure.js +1 -11
- package/dist/js/modern/libs/render/modern/index.js +2 -13
- package/dist/js/modern/libs/render/reader.js +13 -24
- package/dist/js/modern/libs/render/ssr.js +5 -6
- package/dist/js/modern/libs/render/static.js +6 -9
- package/dist/js/modern/libs/render/type.js +0 -1
- package/dist/js/modern/libs/route/index.js +8 -19
- package/dist/js/modern/libs/route/matcher.js +21 -29
- package/dist/js/modern/libs/route/route.js +0 -13
- package/dist/js/modern/libs/serve-file.js +5 -6
- package/dist/js/modern/server/index.js +25 -52
- package/dist/js/modern/server/modern-server-split.js +0 -11
- package/dist/js/modern/server/modern-server.js +87 -167
- package/dist/js/modern/utils.js +12 -27
- package/dist/js/modern/worker-server.js +34 -0
- package/dist/js/node/constants.js +0 -2
- package/dist/js/node/index.js +0 -10
- package/dist/js/node/libs/context/context.js +10 -65
- package/dist/js/node/libs/context/index.js +0 -3
- package/dist/js/node/libs/hook-api/index.js +0 -42
- package/dist/js/node/libs/hook-api/route.js +0 -10
- package/dist/js/node/libs/hook-api/template.js +0 -22
- package/dist/js/node/libs/loadConfig.js +3 -22
- package/dist/js/node/libs/metrics.js +6 -6
- package/dist/js/node/libs/proxy.js +7 -17
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -5
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -12
- package/dist/js/node/libs/render/cache/index.js +8 -22
- package/dist/js/node/libs/render/cache/page-caches/index.js +0 -2
- package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -14
- package/dist/js/node/libs/render/cache/spr.js +12 -71
- package/dist/js/node/libs/render/cache/util.js +0 -18
- package/dist/js/node/libs/render/index.js +6 -26
- package/dist/js/node/libs/render/measure.js +0 -17
- package/dist/js/node/libs/render/modern/index.js +2 -20
- package/dist/js/node/libs/render/reader.js +12 -39
- package/dist/js/node/libs/render/ssr.js +4 -16
- package/dist/js/node/libs/render/static.js +6 -18
- package/dist/js/node/libs/render/type.js +0 -1
- package/dist/js/node/libs/route/index.js +8 -22
- package/dist/js/node/libs/route/matcher.js +18 -34
- package/dist/js/node/libs/route/route.js +0 -15
- package/dist/js/node/libs/serve-file.js +5 -13
- package/dist/js/node/server/index.js +25 -72
- package/dist/js/node/server/modern-server-split.js +0 -13
- package/dist/js/node/server/modern-server.js +87 -196
- package/dist/js/node/utils.js +13 -52
- package/dist/js/node/worker-server.js +41 -0
- package/dist/js/treeshaking/constants.js +28 -0
- package/dist/js/treeshaking/index.js +13 -0
- package/dist/js/treeshaking/libs/context/context.js +243 -0
- package/dist/js/treeshaking/libs/context/index.js +5 -0
- package/dist/js/treeshaking/libs/hook-api/index.js +157 -0
- package/dist/js/treeshaking/libs/hook-api/route.js +33 -0
- package/dist/js/treeshaking/libs/hook-api/template.js +91 -0
- package/dist/js/treeshaking/libs/loadConfig.js +39 -0
- package/dist/js/treeshaking/libs/metrics.js +12 -0
- package/dist/js/treeshaking/libs/proxy.js +80 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +124 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +464 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +53 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +35 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +121 -0
- package/dist/js/treeshaking/libs/render/cache/index.js +184 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +30 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +46 -0
- package/dist/js/treeshaking/libs/render/cache/spr.js +362 -0
- package/dist/js/treeshaking/libs/render/cache/type.js +1 -0
- package/dist/js/treeshaking/libs/render/cache/util.js +101 -0
- package/dist/js/treeshaking/libs/render/index.js +100 -0
- package/dist/js/treeshaking/libs/render/measure.js +61 -0
- package/dist/js/treeshaking/libs/render/modern/browser-list.js +7 -0
- package/dist/js/treeshaking/libs/render/modern/index.js +39 -0
- package/dist/js/treeshaking/libs/render/reader.js +191 -0
- package/dist/js/treeshaking/libs/render/ssr.js +98 -0
- package/dist/js/treeshaking/libs/render/static.js +84 -0
- package/dist/js/treeshaking/libs/render/type.js +6 -0
- package/dist/js/treeshaking/libs/route/index.js +94 -0
- package/dist/js/treeshaking/libs/route/matcher.js +113 -0
- package/dist/js/treeshaking/libs/route/route.js +26 -0
- package/dist/js/treeshaking/libs/serve-file.js +75 -0
- package/dist/js/treeshaking/server/index.js +339 -0
- package/dist/js/treeshaking/server/modern-server-split.js +152 -0
- package/dist/js/treeshaking/server/modern-server.js +946 -0
- package/dist/js/treeshaking/type.js +1 -0
- package/dist/js/treeshaking/utils.js +90 -0
- package/dist/js/treeshaking/worker-server.js +56 -0
- package/dist/types/index.d.ts +0 -2
- package/dist/types/libs/context/context.d.ts +0 -3
- package/dist/types/libs/loadConfig.d.ts +0 -1
- package/dist/types/libs/render/cache/index.d.ts +0 -2
- package/dist/types/libs/render/cache/spr.d.ts +0 -2
- package/dist/types/server/index.d.ts +0 -3
- package/dist/types/utils.d.ts +2 -3
- package/dist/types/worker-server.d.ts +16 -0
- package/package.json +31 -15
|
@@ -4,21 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.updateFile = exports.readFile = exports.init = exports.close = exports.LruReader = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@modern-js/utils");
|
|
9
|
-
|
|
10
8
|
var _lruCache = _interopRequireDefault(require("lru-cache"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
10
|
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; }
|
|
15
|
-
|
|
16
11
|
const Byte = 1;
|
|
17
12
|
const KB = 1024 * Byte;
|
|
18
13
|
const MB = 1024 * KB;
|
|
19
|
-
|
|
20
14
|
const getContentLength = cache => cache.content.length;
|
|
21
|
-
|
|
22
15
|
const createCacheItem = async (filepath, mtime) => {
|
|
23
16
|
const content = await _utils.fs.readFile(filepath);
|
|
24
17
|
return {
|
|
@@ -26,28 +19,26 @@ const createCacheItem = async (filepath, mtime) => {
|
|
|
26
19
|
mtime
|
|
27
20
|
};
|
|
28
21
|
};
|
|
29
|
-
|
|
30
22
|
class LruReader {
|
|
31
23
|
// private timer?: NodeJS.Timeout;
|
|
24
|
+
|
|
32
25
|
constructor() {
|
|
33
26
|
_defineProperty(this, "cache", void 0);
|
|
34
|
-
|
|
35
27
|
this.cache = new _lruCache.default({
|
|
36
28
|
max: 256 * MB,
|
|
37
29
|
length: getContentLength,
|
|
38
30
|
maxAge: 5 * 60 * 5000 // 60s
|
|
39
|
-
|
|
40
31
|
});
|
|
41
32
|
}
|
|
42
33
|
|
|
43
|
-
init() {
|
|
34
|
+
init() {
|
|
35
|
+
// this.timeTask();
|
|
44
36
|
}
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
close() {
|
|
38
|
+
// if (this.timer) {
|
|
47
39
|
// clearInterval(this.timer);
|
|
48
40
|
// }
|
|
49
41
|
}
|
|
50
|
-
|
|
51
42
|
async read(filepath) {
|
|
52
43
|
if (this.cache.has(filepath)) {
|
|
53
44
|
const {
|
|
@@ -57,47 +48,38 @@ class LruReader {
|
|
|
57
48
|
content
|
|
58
49
|
};
|
|
59
50
|
}
|
|
60
|
-
|
|
61
51
|
if (!_utils.fs.existsSync(filepath)) {
|
|
62
52
|
return null;
|
|
63
53
|
}
|
|
64
|
-
|
|
65
54
|
const stat = _utils.fs.statSync(filepath);
|
|
66
|
-
|
|
67
55
|
if (stat.isDirectory()) {
|
|
68
56
|
return null;
|
|
69
|
-
}
|
|
70
|
-
|
|
57
|
+
}
|
|
71
58
|
|
|
59
|
+
// if file more than 20 MB
|
|
72
60
|
if (stat.size > 20 * MB) {
|
|
73
61
|
return null;
|
|
74
62
|
}
|
|
75
|
-
|
|
76
63
|
const item = await createCacheItem(filepath, stat.mtime);
|
|
77
64
|
this.cache.set(filepath, item);
|
|
78
65
|
return item;
|
|
79
66
|
}
|
|
80
|
-
|
|
81
67
|
update() {
|
|
82
68
|
const {
|
|
83
69
|
cache
|
|
84
70
|
} = this;
|
|
85
71
|
const files = cache.keys();
|
|
86
|
-
|
|
87
72
|
for (const filepath of files) {
|
|
88
73
|
if (!_utils.fs.existsSync(filepath)) {
|
|
89
74
|
cache.del(filepath);
|
|
90
75
|
}
|
|
91
|
-
|
|
92
76
|
try {
|
|
93
77
|
const item = cache.get(filepath);
|
|
94
|
-
|
|
95
78
|
const stat = _utils.fs.statSync(filepath);
|
|
96
|
-
|
|
97
79
|
const {
|
|
98
80
|
mtime
|
|
99
|
-
} = stat;
|
|
100
|
-
|
|
81
|
+
} = stat;
|
|
82
|
+
// file is modify
|
|
101
83
|
if (item.mtime < mtime) {
|
|
102
84
|
cache.del(filepath);
|
|
103
85
|
}
|
|
@@ -106,37 +88,28 @@ class LruReader {
|
|
|
106
88
|
cache.del(filepath);
|
|
107
89
|
}
|
|
108
90
|
}
|
|
109
|
-
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// private timeTask() {
|
|
110
94
|
// this.timer = setInterval(() => this.update, 5 * 60 * 1000).unref();
|
|
111
95
|
// }
|
|
112
|
-
|
|
113
|
-
|
|
114
96
|
}
|
|
115
|
-
|
|
116
97
|
exports.LruReader = LruReader;
|
|
117
98
|
const reader = new LruReader();
|
|
118
|
-
|
|
119
99
|
const readFile = async filepath => {
|
|
120
100
|
const file = await reader.read(filepath);
|
|
121
101
|
return file === null || file === void 0 ? void 0 : file.content;
|
|
122
102
|
};
|
|
123
|
-
|
|
124
103
|
exports.readFile = readFile;
|
|
125
|
-
|
|
126
104
|
const updateFile = () => {
|
|
127
105
|
reader.update();
|
|
128
106
|
};
|
|
129
|
-
|
|
130
107
|
exports.updateFile = updateFile;
|
|
131
|
-
|
|
132
108
|
const init = () => {
|
|
133
109
|
reader.init();
|
|
134
110
|
};
|
|
135
|
-
|
|
136
111
|
exports.init = init;
|
|
137
|
-
|
|
138
112
|
const close = () => {
|
|
139
113
|
reader.close();
|
|
140
114
|
};
|
|
141
|
-
|
|
142
115
|
exports.close = close;
|
|
@@ -4,22 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.render = void 0;
|
|
7
|
-
|
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _cookie = _interopRequireDefault(require("cookie"));
|
|
13
|
-
|
|
14
10
|
var _cache = _interopRequireDefault(require("./cache"));
|
|
15
|
-
|
|
16
11
|
var _measure = require("./measure");
|
|
17
|
-
|
|
18
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
13
|
const render = async (ctx, renderOptions, runner) => {
|
|
21
14
|
var _ctx$res;
|
|
22
|
-
|
|
23
15
|
const {
|
|
24
16
|
urlPath,
|
|
25
17
|
bundle,
|
|
@@ -28,12 +20,11 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
28
20
|
entryName,
|
|
29
21
|
staticGenerate
|
|
30
22
|
} = renderOptions;
|
|
31
|
-
|
|
32
23
|
const bundleJS = _path.default.join(distDir, bundle);
|
|
33
|
-
|
|
34
24
|
const loadableUri = _path.default.join(distDir, _utils.LOADABLE_STATS_FILE);
|
|
35
|
-
|
|
36
25
|
const loadableStats = _utils.fs.existsSync(loadableUri) ? require(loadableUri) : '';
|
|
26
|
+
const routesManifestUri = _path.default.join(distDir, _utils.ROUTE_MINIFEST_FILE);
|
|
27
|
+
const routeManifest = _utils.fs.existsSync(routesManifestUri) ? require(routesManifestUri) : undefined;
|
|
37
28
|
const context = {
|
|
38
29
|
request: {
|
|
39
30
|
baseUrl: urlPath,
|
|
@@ -57,6 +48,8 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
57
48
|
redirection: {},
|
|
58
49
|
template,
|
|
59
50
|
loadableStats,
|
|
51
|
+
routeManifest,
|
|
52
|
+
// for streaming ssr
|
|
60
53
|
entryName,
|
|
61
54
|
staticGenerate,
|
|
62
55
|
logger: undefined,
|
|
@@ -67,15 +60,12 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
67
60
|
context.logger = (0, _measure.createLogger)(context, ctx.logger);
|
|
68
61
|
context.metrics = (0, _measure.createMetrics)(context, ctx.metrics);
|
|
69
62
|
runner.extendSSRContext(context);
|
|
70
|
-
|
|
71
63
|
const serverRender = require(bundleJS)[_utils.SERVER_RENDER_FUNCTION_NAME];
|
|
72
|
-
|
|
73
64
|
const content = await (0, _cache.default)(serverRender, ctx)(context);
|
|
74
65
|
const {
|
|
75
66
|
url,
|
|
76
67
|
status = 302
|
|
77
68
|
} = context.redirection;
|
|
78
|
-
|
|
79
69
|
if (url) {
|
|
80
70
|
return {
|
|
81
71
|
content: url,
|
|
@@ -84,7 +74,6 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
84
74
|
redirect: true
|
|
85
75
|
};
|
|
86
76
|
}
|
|
87
|
-
|
|
88
77
|
if (typeof content === 'string') {
|
|
89
78
|
return {
|
|
90
79
|
content,
|
|
@@ -98,5 +87,4 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
98
87
|
};
|
|
99
88
|
}
|
|
100
89
|
};
|
|
101
|
-
|
|
102
90
|
exports.render = render;
|
|
@@ -4,59 +4,47 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.handleDirectory = handleDirectory;
|
|
7
|
-
|
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _reader = require("./reader");
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
11
|
async function handleDirectory(ctx, entryPath, urlPath) {
|
|
17
12
|
const {
|
|
18
13
|
path: pathname
|
|
19
14
|
} = ctx;
|
|
15
|
+
const filepath = _path.default.join(entryPath, trimLeft(pathname, urlPath));
|
|
20
16
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
// If can match accurately, always return the one that matches accurately
|
|
24
18
|
let content = await (0, _reader.readFile)(filepath);
|
|
19
|
+
let contentType = _utils.mime.contentType(_path.default.extname(filepath) || '');
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
// automatic addressing
|
|
29
22
|
if (!content) {
|
|
30
23
|
if (pathname.endsWith('/')) {
|
|
31
24
|
content = await (0, _reader.readFile)(`${filepath}index.html`);
|
|
32
25
|
} else if (!pathname.includes('.')) {
|
|
33
26
|
content = await (0, _reader.readFile)(`${filepath}.html`);
|
|
34
|
-
|
|
35
27
|
if (!content) {
|
|
36
28
|
content = await (0, _reader.readFile)(`${filepath}/index.html`);
|
|
37
29
|
}
|
|
38
|
-
}
|
|
39
|
-
|
|
30
|
+
}
|
|
40
31
|
|
|
32
|
+
// set content-type as html
|
|
41
33
|
if (content) {
|
|
42
34
|
contentType = _utils.mime.contentType('html');
|
|
43
35
|
}
|
|
44
36
|
}
|
|
45
|
-
|
|
46
37
|
if (!content) {
|
|
47
38
|
return null;
|
|
48
39
|
}
|
|
49
|
-
|
|
50
40
|
return {
|
|
51
41
|
content,
|
|
52
42
|
contentType: contentType || ''
|
|
53
43
|
};
|
|
54
44
|
}
|
|
55
|
-
|
|
56
45
|
const trimLeft = (str, prefix) => {
|
|
57
46
|
if (str.startsWith(prefix)) {
|
|
58
47
|
return str.substring(prefix.length);
|
|
59
48
|
}
|
|
60
|
-
|
|
61
49
|
return str;
|
|
62
50
|
};
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.RenderLevel = void 0;
|
|
7
7
|
let RenderLevel;
|
|
8
8
|
exports.RenderLevel = RenderLevel;
|
|
9
|
-
|
|
10
9
|
(function (RenderLevel) {
|
|
11
10
|
RenderLevel[RenderLevel["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
|
|
12
11
|
RenderLevel[RenderLevel["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
|
|
@@ -10,53 +10,43 @@ Object.defineProperty(exports, "RouteMatcher", {
|
|
|
10
10
|
return _matcher.RouteMatcher;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
-
|
|
14
13
|
var _matcher = require("./matcher");
|
|
15
|
-
|
|
16
14
|
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
|
-
|
|
18
15
|
class RouteMatchManager {
|
|
19
16
|
constructor() {
|
|
20
17
|
_defineProperty(this, "matchers", void 0);
|
|
21
|
-
|
|
22
18
|
_defineProperty(this, "specs", []);
|
|
23
|
-
|
|
24
19
|
this.matchers = [];
|
|
25
|
-
}
|
|
26
|
-
|
|
20
|
+
}
|
|
27
21
|
|
|
22
|
+
// get all routes matches pathname
|
|
28
23
|
filter(pathname) {
|
|
29
24
|
return this.matchers.reduce((matches, matcher) => {
|
|
30
25
|
if (matcher.matchUrlPath(pathname)) {
|
|
31
26
|
matches.push(matcher);
|
|
32
27
|
}
|
|
33
|
-
|
|
34
28
|
return matches;
|
|
35
29
|
}, []);
|
|
36
|
-
}
|
|
37
|
-
|
|
30
|
+
}
|
|
38
31
|
|
|
32
|
+
// get best match from a set of matches
|
|
39
33
|
best(pathname, matches) {
|
|
40
34
|
let best;
|
|
41
35
|
let matchedLen = 0;
|
|
42
|
-
|
|
43
36
|
for (const match of matches) {
|
|
44
37
|
const len = match.matchLength(pathname);
|
|
45
|
-
|
|
46
38
|
if (len === null) {
|
|
47
39
|
continue;
|
|
48
40
|
}
|
|
49
|
-
|
|
50
41
|
if (len > matchedLen) {
|
|
51
42
|
best = match;
|
|
52
43
|
matchedLen = len;
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
|
-
|
|
56
46
|
return best;
|
|
57
|
-
}
|
|
58
|
-
|
|
47
|
+
}
|
|
59
48
|
|
|
49
|
+
// reset routes matcher
|
|
60
50
|
reset(specs) {
|
|
61
51
|
this.specs = specs;
|
|
62
52
|
const matchers = specs.reduce((ms, spec) => {
|
|
@@ -64,24 +54,20 @@ class RouteMatchManager {
|
|
|
64
54
|
return ms;
|
|
65
55
|
}, []);
|
|
66
56
|
this.matchers = matchers;
|
|
67
|
-
}
|
|
68
|
-
|
|
57
|
+
}
|
|
69
58
|
|
|
59
|
+
// get best match from all matcher in manager
|
|
70
60
|
match(pathname) {
|
|
71
61
|
const matches = this.filter(pathname);
|
|
72
62
|
const best = this.best(pathname, matches);
|
|
73
63
|
return best;
|
|
74
64
|
}
|
|
75
|
-
|
|
76
65
|
matchEntry(entryname) {
|
|
77
66
|
return this.matchers.find(matcher => matcher.matchEntry(entryname));
|
|
78
67
|
}
|
|
79
|
-
|
|
80
68
|
getBundles() {
|
|
81
69
|
const bundles = this.specs.filter(route => route.isSSR).map(route => route.bundle);
|
|
82
70
|
return bundles;
|
|
83
71
|
}
|
|
84
|
-
|
|
85
72
|
}
|
|
86
|
-
|
|
87
73
|
exports.RouteMatchManager = RouteMatchManager;
|
|
@@ -4,47 +4,40 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.RouteMatcher = void 0;
|
|
7
|
-
|
|
8
|
-
var _utils = require("@modern-js/utils");
|
|
9
|
-
|
|
10
7
|
var _pathToRegexp = require("path-to-regexp");
|
|
11
|
-
|
|
12
|
-
var _utils2 = require("../../utils");
|
|
13
|
-
|
|
14
8
|
var _route = require("./route");
|
|
15
|
-
|
|
16
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; }
|
|
10
|
+
// avoid import @modern-js/utils
|
|
11
|
+
const removeTailSlash = s => s.replace(/\/+$/, '');
|
|
12
|
+
const toPath = (reg, params) => {
|
|
13
|
+
const fn = (0, _pathToRegexp.compile)(reg, {
|
|
14
|
+
encode: encodeURIComponent
|
|
15
|
+
});
|
|
16
|
+
return fn(params);
|
|
17
|
+
};
|
|
17
18
|
|
|
18
19
|
// eslint-disable-next-line no-useless-escape
|
|
19
20
|
const regCharsDetector = /[^a-zA-Z\-_0-9\/\.]/;
|
|
20
|
-
|
|
21
21
|
class RouteMatcher {
|
|
22
22
|
constructor(spec) {
|
|
23
23
|
_defineProperty(this, "spec", void 0);
|
|
24
|
-
|
|
25
24
|
_defineProperty(this, "urlPath", '');
|
|
26
|
-
|
|
27
25
|
_defineProperty(this, "urlMatcher", void 0);
|
|
28
|
-
|
|
29
26
|
_defineProperty(this, "urlReg", void 0);
|
|
30
|
-
|
|
31
27
|
this.spec = spec;
|
|
32
28
|
this.setupUrlPath();
|
|
33
|
-
}
|
|
34
|
-
|
|
29
|
+
}
|
|
35
30
|
|
|
31
|
+
// generate modern route object
|
|
36
32
|
generate(url) {
|
|
37
33
|
const route = new _route.ModernRoute(this.spec);
|
|
38
|
-
|
|
39
34
|
if (this.urlPath) {
|
|
40
35
|
const params = this.parseURLParams(url);
|
|
41
|
-
route.urlPath =
|
|
36
|
+
route.urlPath = toPath(route.urlPath, params);
|
|
42
37
|
route.params = params;
|
|
43
38
|
}
|
|
44
|
-
|
|
45
39
|
return route;
|
|
46
40
|
}
|
|
47
|
-
|
|
48
41
|
parseURLParams(pathname) {
|
|
49
42
|
if (!this.urlMatcher) {
|
|
50
43
|
return {};
|
|
@@ -52,28 +45,25 @@ class RouteMatcher {
|
|
|
52
45
|
const matchResult = this.urlMatcher(pathname);
|
|
53
46
|
return matchResult.params;
|
|
54
47
|
}
|
|
55
|
-
}
|
|
56
|
-
|
|
48
|
+
}
|
|
57
49
|
|
|
50
|
+
// get match url length
|
|
58
51
|
matchLength(pathname) {
|
|
59
52
|
if (!this.urlReg) {
|
|
60
53
|
return this.urlPath.length;
|
|
61
54
|
} else {
|
|
62
55
|
var _result$;
|
|
63
|
-
|
|
64
56
|
const result = this.urlReg.exec(pathname);
|
|
65
57
|
return (result === null || result === void 0 ? void 0 : (_result$ = result[0]) === null || _result$ === void 0 ? void 0 : _result$.length) || null;
|
|
66
58
|
}
|
|
67
|
-
}
|
|
68
|
-
|
|
59
|
+
}
|
|
69
60
|
|
|
61
|
+
// if match url path
|
|
70
62
|
matchUrlPath(requestUrl) {
|
|
71
63
|
let urlWithoutSlash = requestUrl.endsWith('/') && requestUrl !== '/' ? requestUrl.slice(0, -1) : requestUrl;
|
|
72
|
-
|
|
73
64
|
if (urlWithoutSlash.endsWith('.html')) {
|
|
74
65
|
urlWithoutSlash = urlWithoutSlash.slice(0, -5);
|
|
75
66
|
}
|
|
76
|
-
|
|
77
67
|
if (this.urlMatcher) {
|
|
78
68
|
return Boolean(this.urlMatcher(urlWithoutSlash));
|
|
79
69
|
} else {
|
|
@@ -82,26 +72,22 @@ class RouteMatcher {
|
|
|
82
72
|
if (this.urlPath !== '/' && urlWithoutSlash.length > this.urlPath.length && !urlWithoutSlash.startsWith(`${this.urlPath}/`)) {
|
|
83
73
|
return false;
|
|
84
74
|
}
|
|
85
|
-
|
|
86
75
|
return true;
|
|
87
76
|
}
|
|
88
|
-
|
|
89
77
|
return false;
|
|
90
78
|
}
|
|
91
79
|
}
|
|
92
|
-
|
|
93
80
|
matchEntry(entryName) {
|
|
94
81
|
return this.spec.entryName === entryName;
|
|
95
|
-
}
|
|
96
|
-
|
|
82
|
+
}
|
|
97
83
|
|
|
84
|
+
// compiler urlPath to regexp if necessary
|
|
98
85
|
setupUrlPath() {
|
|
99
86
|
const {
|
|
100
87
|
urlPath
|
|
101
88
|
} = this.spec;
|
|
102
|
-
this.urlPath = urlPath === '/' ? urlPath :
|
|
89
|
+
this.urlPath = urlPath === '/' ? urlPath : removeTailSlash(urlPath);
|
|
103
90
|
const useReg = regCharsDetector.test(urlPath);
|
|
104
|
-
|
|
105
91
|
if (useReg) {
|
|
106
92
|
this.urlMatcher = (0, _pathToRegexp.match)(urlPath, {
|
|
107
93
|
end: false,
|
|
@@ -112,7 +98,5 @@ class RouteMatcher {
|
|
|
112
98
|
});
|
|
113
99
|
}
|
|
114
100
|
}
|
|
115
|
-
|
|
116
101
|
}
|
|
117
|
-
|
|
118
102
|
exports.RouteMatcher = RouteMatcher;
|
|
@@ -4,33 +4,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ModernRoute = void 0;
|
|
7
|
-
|
|
8
7
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
|
-
|
|
10
8
|
class ModernRoute {
|
|
11
9
|
constructor(routeSpec) {
|
|
12
10
|
var _routeSpec$enableMode;
|
|
13
|
-
|
|
14
11
|
_defineProperty(this, "entryName", void 0);
|
|
15
|
-
|
|
16
12
|
_defineProperty(this, "urlPath", void 0);
|
|
17
|
-
|
|
18
13
|
_defineProperty(this, "entryPath", void 0);
|
|
19
|
-
|
|
20
14
|
_defineProperty(this, "bundle", void 0);
|
|
21
|
-
|
|
22
15
|
_defineProperty(this, "isApi", void 0);
|
|
23
|
-
|
|
24
16
|
_defineProperty(this, "isSSR", void 0);
|
|
25
|
-
|
|
26
17
|
_defineProperty(this, "isSPA", void 0);
|
|
27
|
-
|
|
28
18
|
_defineProperty(this, "enableModernMode", void 0);
|
|
29
|
-
|
|
30
19
|
_defineProperty(this, "params", {});
|
|
31
|
-
|
|
32
20
|
_defineProperty(this, "responseHeaders", void 0);
|
|
33
|
-
|
|
34
21
|
this.entryName = routeSpec.entryName || '';
|
|
35
22
|
this.urlPath = routeSpec.urlPath;
|
|
36
23
|
this.entryPath = routeSpec.entryPath || '';
|
|
@@ -41,7 +28,5 @@ class ModernRoute {
|
|
|
41
28
|
this.enableModernMode = (_routeSpec$enableMode = routeSpec.enableModernMode) !== null && _routeSpec$enableMode !== void 0 ? _routeSpec$enableMode : false;
|
|
42
29
|
this.responseHeaders = routeSpec.responseHeaders;
|
|
43
30
|
}
|
|
44
|
-
|
|
45
31
|
}
|
|
46
|
-
|
|
47
32
|
exports.ModernRoute = ModernRoute;
|
|
@@ -4,16 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.faviconFallbackHandler = exports.createStaticFileHandler = void 0;
|
|
7
|
-
|
|
8
7
|
var _serveStatic = _interopRequireDefault(require("serve-static"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _utils2 = require("../utils");
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
11
|
// Todo 看看是不是能 fork 一份,即使命中也返回
|
|
12
|
+
|
|
17
13
|
const removedPrefix = (req, prefix) => {
|
|
18
14
|
if ((0, _utils2.useLocalPrefix)(prefix)) {
|
|
19
15
|
req.url = req.url.slice(prefix.length);
|
|
@@ -21,11 +17,11 @@ const removedPrefix = (req, prefix) => {
|
|
|
21
17
|
req.url = prefix + req.url;
|
|
22
18
|
};
|
|
23
19
|
} else {
|
|
24
|
-
return () => {
|
|
20
|
+
return () => {
|
|
21
|
+
// emptyy
|
|
25
22
|
};
|
|
26
23
|
}
|
|
27
24
|
};
|
|
28
|
-
|
|
29
25
|
const faviconFallbackHandler = (context, next) => {
|
|
30
26
|
if (context.url === '/favicon.ico') {
|
|
31
27
|
context.res.statusCode = 204;
|
|
@@ -34,10 +30,9 @@ const faviconFallbackHandler = (context, next) => {
|
|
|
34
30
|
next();
|
|
35
31
|
}
|
|
36
32
|
};
|
|
37
|
-
|
|
38
33
|
exports.faviconFallbackHandler = faviconFallbackHandler;
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
const createStaticFileHandler = (rules, output = {}) =>
|
|
35
|
+
// eslint-disable-next-line consistent-return
|
|
41
36
|
async (context, next) => {
|
|
42
37
|
const {
|
|
43
38
|
url: requestUrl,
|
|
@@ -53,10 +48,8 @@ async (context, next) => {
|
|
|
53
48
|
} else if ((0, _utils.isRegExp)(item.path) && item.path.test(requestUrl)) {
|
|
54
49
|
return true;
|
|
55
50
|
}
|
|
56
|
-
|
|
57
51
|
return false;
|
|
58
52
|
});
|
|
59
|
-
|
|
60
53
|
if (hitRule) {
|
|
61
54
|
const resume = removedPrefix(req, assetPrefix);
|
|
62
55
|
(0, _serveStatic.default)(hitRule.target)(req, res, () => {
|
|
@@ -67,5 +60,4 @@ async (context, next) => {
|
|
|
67
60
|
return next();
|
|
68
61
|
}
|
|
69
62
|
};
|
|
70
|
-
|
|
71
63
|
exports.createStaticFileHandler = createStaticFileHandler;
|