@modern-js/server 1.3.0 → 1.4.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/js/modern/dev-tools/babel/register.js +1 -0
  3. package/dist/js/modern/dev-tools/dev-server-plugin.js +1 -2
  4. package/dist/js/modern/dev-tools/mock/getMockData.js +24 -1
  5. package/dist/js/modern/dev-tools/mock/index.js +1 -26
  6. package/dist/js/modern/dev-tools/socket-server.js +4 -2
  7. package/dist/js/modern/dev-tools/watcher/index.js +6 -9
  8. package/dist/js/modern/dev-tools/watcher/stats-cache.js +32 -20
  9. package/dist/js/modern/libs/context/context.js +6 -0
  10. package/dist/js/modern/libs/hook-api/route.js +6 -4
  11. package/dist/js/modern/libs/render/index.js +1 -0
  12. package/dist/js/modern/libs/render/ssr.js +7 -2
  13. package/dist/js/modern/libs/route/index.js +0 -1
  14. package/dist/js/modern/libs/route/matcher.js +15 -3
  15. package/dist/js/modern/libs/route/route.js +1 -0
  16. package/dist/js/modern/server/dev-server/dev-server.js +18 -5
  17. package/dist/js/modern/server/index.js +5 -4
  18. package/dist/js/modern/server/modern-server-split.js +1 -1
  19. package/dist/js/modern/server/modern-server.js +9 -5
  20. package/dist/js/modern/utils.js +7 -0
  21. package/dist/js/node/dev-tools/babel/register.js +1 -0
  22. package/dist/js/node/dev-tools/dev-server-plugin.js +1 -2
  23. package/dist/js/node/dev-tools/mock/getMockData.js +29 -2
  24. package/dist/js/node/dev-tools/mock/index.js +5 -26
  25. package/dist/js/node/dev-tools/socket-server.js +4 -2
  26. package/dist/js/node/dev-tools/watcher/index.js +9 -7
  27. package/dist/js/node/dev-tools/watcher/stats-cache.js +33 -20
  28. package/dist/js/node/libs/context/context.js +6 -0
  29. package/dist/js/node/libs/hook-api/route.js +6 -4
  30. package/dist/js/node/libs/render/index.js +1 -0
  31. package/dist/js/node/libs/render/ssr.js +8 -2
  32. package/dist/js/node/libs/route/index.js +0 -1
  33. package/dist/js/node/libs/route/matcher.js +16 -3
  34. package/dist/js/node/libs/route/route.js +1 -0
  35. package/dist/js/node/server/dev-server/dev-server.js +20 -5
  36. package/dist/js/node/server/index.js +9 -6
  37. package/dist/js/node/server/modern-server-split.js +1 -1
  38. package/dist/js/node/server/modern-server.js +9 -5
  39. package/dist/js/node/utils.js +13 -2
  40. package/dist/types/dev-tools/mock/getMockData.d.ts +2 -1
  41. package/dist/types/dev-tools/socket-server.d.ts +1 -2
  42. package/dist/types/dev-tools/watcher/index.d.ts +3 -1
  43. package/dist/types/dev-tools/watcher/stats-cache.d.ts +3 -2
  44. package/dist/types/libs/context/context.d.ts +2 -0
  45. package/dist/types/libs/hook-api/route.d.ts +3 -2
  46. package/dist/types/libs/render/ssr.d.ts +1 -0
  47. package/dist/types/libs/route/matcher.d.ts +1 -1
  48. package/dist/types/libs/route/route.d.ts +1 -0
  49. package/dist/types/server/dev-server/dev-server-split.d.ts +3 -3
  50. package/dist/types/server/modern-server-split.d.ts +3 -3
  51. package/dist/types/server/modern-server.d.ts +1 -1
  52. package/dist/types/type.d.ts +6 -4
  53. package/dist/types/utils.d.ts +2 -1
  54. package/jest.config.js +1 -0
  55. package/package.json +12 -10
  56. package/tests/context.test.ts +12 -1
  57. package/tests/dev.test.ts +306 -7
  58. package/tests/fixtures/mock/exist/config/mock/index.ts +11 -0
  59. package/tests/fixtures/mock/zero/config/mock/index.ts +1 -0
  60. package/tests/fixtures/pure/tsconfig.json +0 -1
  61. package/tests/fixtures/route-spec/dynamic.json +13 -0
  62. package/tests/fixtures/ssr/bundle.js +5 -0
  63. package/tests/fixtures/watch/a.ts +3 -0
  64. package/tests/fixtures/watch/index.ts +5 -0
  65. package/tests/fixtures/watch/stats.txt +1 -0
  66. package/tests/hook.test.ts +1 -1
  67. package/tests/route.test.ts +26 -3
  68. package/tests/server.test.ts +19 -0
  69. package/tests/ssr.test.ts +34 -0
  70. package/tests/utils.test.ts +6 -0
  71. package/tests/watcher.test.ts +98 -0
  72. package/src/constants.ts +0 -26
  73. package/src/dev-tools/babel/register.ts +0 -37
  74. package/src/dev-tools/dev-server-plugin.ts +0 -48
  75. package/src/dev-tools/https/global.d.ts +0 -3
  76. package/src/dev-tools/https/index.ts +0 -12
  77. package/src/dev-tools/launch-editor/index.ts +0 -29
  78. package/src/dev-tools/mock/getMockData.ts +0 -109
  79. package/src/dev-tools/mock/index.ts +0 -63
  80. package/src/dev-tools/socket-server.ts +0 -192
  81. package/src/dev-tools/watcher/dependency-tree.ts +0 -94
  82. package/src/dev-tools/watcher/index.ts +0 -77
  83. package/src/dev-tools/watcher/stats-cache.ts +0 -53
  84. package/src/index.ts +0 -16
  85. package/src/libs/context/context.ts +0 -176
  86. package/src/libs/context/index.ts +0 -7
  87. package/src/libs/hook-api/route.ts +0 -38
  88. package/src/libs/hook-api/template.ts +0 -53
  89. package/src/libs/metrics.ts +0 -15
  90. package/src/libs/proxy.ts +0 -85
  91. package/src/libs/render/cache/__tests__/cache.fun.test.ts +0 -94
  92. package/src/libs/render/cache/__tests__/cache.test.ts +0 -240
  93. package/src/libs/render/cache/__tests__/cacheable.ts +0 -44
  94. package/src/libs/render/cache/__tests__/error-configuration.ts +0 -34
  95. package/src/libs/render/cache/__tests__/matched-cache.ts +0 -88
  96. package/src/libs/render/cache/index.ts +0 -75
  97. package/src/libs/render/cache/page-caches/index.ts +0 -11
  98. package/src/libs/render/cache/page-caches/lru.ts +0 -38
  99. package/src/libs/render/cache/spr.ts +0 -301
  100. package/src/libs/render/cache/type.ts +0 -59
  101. package/src/libs/render/cache/util.ts +0 -97
  102. package/src/libs/render/index.ts +0 -78
  103. package/src/libs/render/modern/browser-list.ts +0 -7
  104. package/src/libs/render/modern/index.ts +0 -41
  105. package/src/libs/render/modern/module.d.ts +0 -4
  106. package/src/libs/render/reader.ts +0 -119
  107. package/src/libs/render/ssr.ts +0 -62
  108. package/src/libs/render/static.ts +0 -52
  109. package/src/libs/render/type.ts +0 -38
  110. package/src/libs/route/index.ts +0 -77
  111. package/src/libs/route/matcher.ts +0 -93
  112. package/src/libs/route/route.ts +0 -32
  113. package/src/libs/serve-file.ts +0 -34
  114. package/src/server/dev-server/dev-server-split.ts +0 -41
  115. package/src/server/dev-server/dev-server.ts +0 -284
  116. package/src/server/dev-server/index.ts +0 -2
  117. package/src/server/index.ts +0 -163
  118. package/src/server/modern-server-split.ts +0 -97
  119. package/src/server/modern-server.ts +0 -636
  120. package/src/type.ts +0 -88
  121. package/src/utils.ts +0 -79
@@ -9,36 +9,15 @@ var _path = _interopRequireDefault(require("path"));
9
9
 
10
10
  var _utils = require("@modern-js/utils");
11
11
 
12
- var _pathToRegexp = require("path-to-regexp");
13
-
14
12
  var _constants = require("../../constants");
15
13
 
16
- var _getMockData = _interopRequireDefault(require("./getMockData"));
14
+ var _getMockData = _interopRequireWildcard(require("./getMockData"));
17
15
 
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
17
 
20
- const getMatched = (context, mockApiList) => {
21
- const {
22
- path: targetPathname,
23
- method: targetMethod
24
- } = context;
25
- const matched = mockApiList.find(mockApi => {
26
- const {
27
- method,
28
- path: pathname
29
- } = mockApi;
30
-
31
- if (method.toLowerCase() === targetMethod.toLowerCase()) {
32
- return (0, _pathToRegexp.match)(pathname, {
33
- encode: encodeURI,
34
- decode: decodeURIComponent
35
- })(targetPathname);
36
- }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
19
 
38
- return false;
39
- });
40
- return matched;
41
- };
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
21
 
43
22
  const createMockHandler = ({
44
23
  pwd
@@ -69,7 +48,7 @@ const createMockHandler = ({
69
48
  const {
70
49
  res
71
50
  } = context;
72
- const matched = getMatched(context, apiList);
51
+ const matched = (0, _getMockData.getMatched)(context, apiList);
73
52
 
74
53
  if (!matched) {
75
54
  return next();
@@ -118,8 +118,10 @@ class SocketServer {
118
118
  });
119
119
  }
120
120
 
121
- close(connection) {
122
- connection.close();
121
+ close() {
122
+ this.sockets.forEach(socket => {
123
+ socket.close();
124
+ });
123
125
  } // get standard stats
124
126
 
125
127
 
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.getWatchedFiles = exports.default = void 0;
7
+
8
+ var _path = _interopRequireDefault(require("path"));
7
9
 
8
10
  var _chokidar = _interopRequireDefault(require("chokidar"));
9
11
 
@@ -18,26 +20,26 @@ const getWatchedFiles = watcher => {
18
20
  const files = [];
19
21
  Object.keys(watched).forEach(dir => {
20
22
  watched[dir].forEach(fileName => {
21
- files.push(`${dir}/${fileName}`);
23
+ files.push(_path.default.join(dir, fileName));
22
24
  });
23
25
  });
24
26
  return files;
25
27
  };
26
28
 
29
+ exports.getWatchedFiles = getWatchedFiles;
30
+
27
31
  class Watcher {
28
32
  constructor() {
29
33
  this.dependencyTree = null;
30
34
  this.watcher = void 0;
31
35
  }
32
36
 
33
- listen(files, callback) {
37
+ listen(files, options, callback) {
34
38
  const watched = files.filter(Boolean);
39
+ const filenames = watched.map(filename => filename.replace(/\\/g, '/'));
35
40
  const cache = new _statsCache.StatsCache();
36
41
 
37
- const watcher = _chokidar.default.watch(watched, {
38
- // 初始化的时候不触发 add、addDir 事件
39
- ignoreInitial: true
40
- });
42
+ const watcher = _chokidar.default.watch(filenames, options);
41
43
 
42
44
  watcher.on('ready', () => {
43
45
  cache.add(getWatchedFiles(watcher));
@@ -7,24 +7,29 @@ exports.StatsCache = void 0;
7
7
 
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
9
 
10
+ var _crypto = _interopRequireDefault(require("crypto"));
11
+
10
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
13
 
12
14
  class StatsCache {
13
15
  constructor() {
14
- this.cachedStats = {};
16
+ this.cachedHash = {};
17
+ this.cachedSize = {};
15
18
  }
16
19
 
17
20
  add(files) {
18
21
  const {
19
- cachedStats
22
+ cachedHash,
23
+ cachedSize
20
24
  } = this;
21
25
 
22
26
  for (const filename of files) {
23
27
  if (_fs.default.existsSync(filename)) {
24
- const stat = _fs.default.statSync(filename);
28
+ const stats = _fs.default.statSync(filename);
25
29
 
26
- if (stat.isFile() && !cachedStats[filename]) {
27
- cachedStats[filename] = this.sign(stat);
30
+ if (stats.isFile() && !cachedHash[filename]) {
31
+ cachedHash[filename] = this.hash(stats, filename);
32
+ cachedSize[filename] = stats.size;
28
33
  }
29
34
  }
30
35
  }
@@ -32,34 +37,43 @@ class StatsCache {
32
37
 
33
38
  refresh(filename) {
34
39
  const {
35
- cachedStats
40
+ cachedHash,
41
+ cachedSize
36
42
  } = this;
37
43
 
38
44
  if (_fs.default.existsSync(filename)) {
39
- const stat = _fs.default.statSync(filename);
45
+ const stats = _fs.default.statSync(filename);
40
46
 
41
- if (stat.isFile()) {
42
- cachedStats[filename] = this.sign(stat);
47
+ if (stats.isFile()) {
48
+ cachedHash[filename] = this.hash(stats, filename);
49
+ cachedSize[filename] = stats.size;
43
50
  }
44
51
  }
45
52
  }
46
53
 
47
54
  del(filename) {
48
- if (this.cachedStats[filename]) {
49
- delete this.cachedStats[filename];
55
+ if (this.cachedHash[filename]) {
56
+ delete this.cachedHash[filename];
57
+ delete this.cachedSize[filename];
50
58
  }
51
59
  }
52
60
 
53
61
  isDiff(filename) {
54
62
  const {
55
- cachedStats
63
+ cachedHash,
64
+ cachedSize
56
65
  } = this;
57
66
 
58
- const stat = _fs.default.statSync(filename);
67
+ const stats = _fs.default.statSync(filename);
68
+
69
+ const hash = cachedHash[filename];
70
+ const size = cachedSize[filename];
59
71
 
60
- const cachedStat = cachedStats[filename];
72
+ if (stats.size !== size) {
73
+ return true;
74
+ }
61
75
 
62
- if (this.sign(stat) !== cachedStat) {
76
+ if (this.hash(stats, filename) !== hash) {
63
77
  return true;
64
78
  }
65
79
 
@@ -67,12 +81,11 @@ class StatsCache {
67
81
  }
68
82
 
69
83
  has(filename) {
70
- return Boolean(this.cachedStats[filename]);
71
- } // Todo size 其实有点问题,修改单个字符会导致触发不了 change
72
-
84
+ return Boolean(this.cachedHash[filename]);
85
+ }
73
86
 
74
- sign(stat) {
75
- return stat.size;
87
+ hash(stats, filename) {
88
+ return _crypto.default.createHash('md5').update(_fs.default.readFileSync(filename)).digest('hex');
76
89
  }
77
90
 
78
91
  }
@@ -31,10 +31,12 @@ class ModernServerContext {
31
31
  this.params = {};
32
32
  this.logger = void 0;
33
33
  this.metrics = void 0;
34
+ this.serverData = void 0;
34
35
  this.req = req;
35
36
  this.res = res;
36
37
  this.logger = req.logger;
37
38
  this.metrics = req.metrics;
39
+ this.serverData = {};
38
40
  this.bind();
39
41
  }
40
42
 
@@ -53,6 +55,10 @@ class ModernServerContext {
53
55
  this.params = params;
54
56
  }
55
57
 
58
+ setServerData(key, value) {
59
+ this.serverData[key] = value;
60
+ }
61
+
56
62
  getReqHeader(key) {
57
63
  const {
58
64
  req
@@ -6,15 +6,17 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.createRouteAPI = void 0;
7
7
 
8
8
  class RouteAPI {
9
- constructor(matched, router) {
9
+ constructor(matched, router, url) {
10
10
  this.router = void 0;
11
11
  this.current = void 0;
12
+ this.url = void 0;
12
13
  this.current = matched;
13
14
  this.router = router;
15
+ this.url = url;
14
16
  }
15
17
 
16
18
  cur() {
17
- return this.current.generate();
19
+ return this.current.generate(this.url);
18
20
  }
19
21
 
20
22
  get(entryName) {
@@ -22,7 +24,7 @@ class RouteAPI {
22
24
  router
23
25
  } = this;
24
26
  const matched = router.matchEntry(entryName);
25
- return matched ? matched.generate() : null;
27
+ return matched ? matched.generate(this.url) : null;
26
28
  }
27
29
 
28
30
  use(entryName) {
@@ -41,6 +43,6 @@ class RouteAPI {
41
43
 
42
44
  }
43
45
 
44
- const createRouteAPI = (matched, router) => new RouteAPI(matched, router);
46
+ const createRouteAPI = (matched, router, url) => new RouteAPI(matched, router, url);
45
47
 
46
48
  exports.createRouteAPI = createRouteAPI;
@@ -64,6 +64,7 @@ const createRenderHandler = ({
64
64
  const result = await ssr.render(ctx, {
65
65
  distDir,
66
66
  entryName: route.entryName,
67
+ urlPath: route.urlPath,
67
68
  bundle: route.bundle,
68
69
  template: templateHTML,
69
70
  staticGenerate
@@ -11,12 +11,15 @@ var _utils = require("@modern-js/utils");
11
11
 
12
12
  var _mimeTypes = _interopRequireDefault(require("mime-types"));
13
13
 
14
+ var _cookie = _interopRequireDefault(require("cookie"));
15
+
14
16
  var _cache = _interopRequireDefault(require("./cache"));
15
17
 
16
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
19
 
18
20
  const render = async (ctx, renderOptions, runner) => {
19
21
  const {
22
+ urlPath,
20
23
  bundle,
21
24
  distDir,
22
25
  template,
@@ -28,11 +31,14 @@ const render = async (ctx, renderOptions, runner) => {
28
31
 
29
32
  const context = {
30
33
  request: {
34
+ baseUrl: urlPath,
31
35
  params: ctx.params,
32
36
  pathname: ctx.path,
37
+ host: ctx.host,
33
38
  query: ctx.query,
34
- headers: ctx.headers,
35
- cookie: ctx.headers.cookie
39
+ url: ctx.href,
40
+ cookieMap: _cookie.default.parse(ctx.headers.cookie || ''),
41
+ headers: ctx.headers
36
42
  },
37
43
  redirection: {},
38
44
  template,
@@ -23,7 +23,6 @@ class RouteMatchManager {
23
23
 
24
24
  filter(pathname) {
25
25
  return this.matchers.reduce((matches, matcher) => {
26
- // 非网关来的,或网关匹配上之后,内部再进行一次自己的匹配
27
26
  if (matcher.matchUrlPath(pathname)) {
28
27
  matches.push(matcher);
29
28
  }
@@ -9,6 +9,8 @@ var _utils = require("@modern-js/utils");
9
9
 
10
10
  var _pathToRegexp = require("path-to-regexp");
11
11
 
12
+ var _utils2 = require("../../utils");
13
+
12
14
  var _route = require("./route");
13
15
 
14
16
  // eslint-disable-next-line no-useless-escape
@@ -25,8 +27,16 @@ class RouteMatcher {
25
27
  } // generate modern route object
26
28
 
27
29
 
28
- generate() {
29
- return new _route.ModernRoute(this.spec);
30
+ generate(url) {
31
+ const route = new _route.ModernRoute(this.spec);
32
+
33
+ if (this.urlPath) {
34
+ const params = this.parseURLParams(url);
35
+ route.urlPath = (0, _utils2.toPath)(route.urlPath, params);
36
+ route.params = params;
37
+ }
38
+
39
+ return route;
30
40
  }
31
41
 
32
42
  parseURLParams(pathname) {
@@ -84,9 +94,12 @@ class RouteMatcher {
84
94
 
85
95
  if (useReg) {
86
96
  this.urlMatcher = (0, _pathToRegexp.match)(urlPath, {
97
+ end: false,
87
98
  decode: decodeURIComponent
88
99
  });
89
- this.urlReg = (0, _pathToRegexp.pathToRegexp)(urlPath);
100
+ this.urlReg = (0, _pathToRegexp.pathToRegexp)(urlPath, [], {
101
+ end: false
102
+ });
90
103
  }
91
104
  }
92
105
 
@@ -17,6 +17,7 @@ class ModernRoute {
17
17
  this.isSSR = void 0;
18
18
  this.isSPA = void 0;
19
19
  this.enableModernMode = void 0;
20
+ this.params = {};
20
21
  this.entryName = routeSpec.entryName || '';
21
22
  this.urlPath = routeSpec.urlPath;
22
23
  this.entryPath = routeSpec.entryPath || '';
@@ -147,13 +147,20 @@ class ModernDevServer extends _modernServer.ModernServer {
147
147
  }
148
148
 
149
149
  async close() {
150
+ var _this$socketServer2;
151
+
150
152
  super.close();
151
153
  await this.watcher.close();
152
154
  await new Promise(resolve => {
153
- this.devMiddleware.close(() => {
155
+ if (this.devMiddleware) {
156
+ this.devMiddleware.close(() => {
157
+ resolve();
158
+ });
159
+ } else {
154
160
  resolve();
155
- });
161
+ }
156
162
  });
163
+ (_this$socketServer2 = this.socketServer) === null || _this$socketServer2 === void 0 ? void 0 : _this$socketServer2.close();
157
164
  }
158
165
 
159
166
  async createHTTPServer(handler) {
@@ -268,16 +275,24 @@ class ModernDevServer extends _modernServer.ModernServer {
268
275
  const {
269
276
  mock
270
277
  } = _constants.AGGRED_DIR;
271
- const defaultWatched = [`${pwd}/${mock}/**/*`, `${pwd}/${_utils.SERVER_DIR}/**/*`, `${pwd}/${_utils.API_DIR}/!(typings)/**`, `${pwd}/${_utils.SHARED_DIR}/**/*`];
278
+ const defaultWatched = [`${mock}/**/*`, `${_utils.SERVER_DIR}/**/*`, `${_utils.API_DIR}/**`, `${_utils.SHARED_DIR}/**/*`];
279
+ const defaultWatchedPaths = defaultWatched.map(p => _path.default.normalize(_path.default.join(pwd, p)));
280
+
281
+ const mockPath = _path.default.normalize(_path.default.join(pwd, mock));
282
+
272
283
  const watcher = new _watcher.default();
273
284
  watcher.createDepTree(); // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
274
285
 
275
- watcher.listen(defaultWatched, filepath => {
286
+ watcher.listen(defaultWatchedPaths, {
287
+ // 初始化的时候不触发 add、addDir 事件
288
+ ignoreInitial: true,
289
+ ignored: /api\/typings\/.*/
290
+ }, filepath => {
276
291
  watcher.updateDepTree();
277
292
  watcher.cleanDepCache(filepath);
278
293
  this.runner.reset();
279
294
 
280
- if (filepath.startsWith(`${pwd}/${mock}`)) {
295
+ if (filepath.startsWith(mockPath)) {
281
296
  this.mockHandler = (0, _mock.createMockHandler)({
282
297
  pwd
283
298
  });
@@ -7,7 +7,7 @@ exports.Server = void 0;
7
7
 
8
8
  var _path = _interopRequireDefault(require("path"));
9
9
 
10
- var _serverPlugin = require("@modern-js/server-plugin");
10
+ var _serverCore = require("@modern-js/server-core");
11
11
 
12
12
  var _utils = require("@modern-js/utils");
13
13
 
@@ -131,22 +131,25 @@ class Server {
131
131
  const {
132
132
  options
133
133
  } = this;
134
+
135
+ _serverCore.serverManager.clear();
136
+
134
137
  (_options$plugins = options.plugins) === null || _options$plugins === void 0 ? void 0 : _options$plugins.forEach(p => {
135
- _serverPlugin.serverManager.usePlugin(p);
138
+ _serverCore.serverManager.usePlugin((0, _utils.compatRequire)(p.pluginPath));
136
139
  });
137
140
  const appContext = await this.initAppContext();
138
141
 
139
- _serverPlugin.serverManager.run(() => {
142
+ _serverCore.serverManager.run(() => {
140
143
  var _options$config$outpu;
141
144
 
142
- _core.ConfigContext.set(this.options.config);
145
+ _serverCore.ConfigContext.set(this.options.config);
143
146
 
144
- _core.AppContext.set(_objectSpread(_objectSpread({}, appContext), {}, {
147
+ _serverCore.AppContext.set(_objectSpread(_objectSpread({}, appContext), {}, {
145
148
  distDirectory: _path.default.join(options.pwd, ((_options$config$outpu = options.config.output) === null || _options$config$outpu === void 0 ? void 0 : _options$config$outpu.path) || 'dist')
146
149
  }));
147
150
  });
148
151
 
149
- return _serverPlugin.serverManager.init({});
152
+ return _serverCore.serverManager.init({});
150
153
  }
151
154
 
152
155
  async initAppContext() {
@@ -13,7 +13,7 @@ class ModernSSRServer extends _modernServer.ModernServer {
13
13
  }
14
14
 
15
15
  verifyMatch(context, matched) {
16
- if (matched.generate().isApi) {
16
+ if (matched.generate(context.url).isApi) {
17
17
  this.render404(context);
18
18
  }
19
19
  }
@@ -388,7 +388,7 @@ class ModernServer {
388
388
  return;
389
389
  }
390
390
 
391
- const routeAPI = (0, _route2.createRouteAPI)(matched, this.router);
391
+ const routeAPI = (0, _route2.createRouteAPI)(matched, this.router, context.url);
392
392
  await this.emitRouteHook('afterMatch', {
393
393
  context,
394
394
  routeAPI
@@ -401,9 +401,12 @@ class ModernServer {
401
401
  const {
402
402
  current
403
403
  } = routeAPI;
404
- const route = current.generate();
405
- const params = current.parseURLParams(context.url);
406
- context.setParams(params); // route is api service
404
+ const route = current.generate(context.url);
405
+ context.setParams(route.params);
406
+ context.setServerData('router', {
407
+ baseUrl: route.urlPath,
408
+ params: route.params
409
+ }); // route is api service
407
410
 
408
411
  if (route.isApi) {
409
412
  this.handleAPI(context);
@@ -448,6 +451,7 @@ class ModernServer {
448
451
  templateAPI
449
452
  });
450
453
  await this.injectMicroFE(context, templateAPI);
454
+ templateAPI.appendHead(`<script>window._SERVER_DATA=${JSON.stringify(context.serverData)}</script>`);
451
455
  response = templateAPI.get();
452
456
  }
453
457
 
@@ -590,7 +594,7 @@ class ModernServer {
590
594
  const matched = this.router.match(statusPage) || this.router.match(customErrorPage); // if no custom status page find
591
595
 
592
596
  if (matched) {
593
- const route = matched.generate();
597
+ const route = matched.generate(context.url);
594
598
  const {
595
599
  entryName
596
600
  } = route; // check entryName, aviod matched '/' route
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.toMessage = exports.noop = exports.mergeExtension = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
6
+ exports.toPath = exports.toMessage = exports.noop = exports.mergeExtension = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
7
+
8
+ var _pathToRegexp = require("path-to-regexp");
7
9
 
8
10
  const mergeExtension = users => {
9
11
  const output = [];
@@ -91,4 +93,13 @@ const createMiddlewareCollecter = () => {
91
93
  };
92
94
  };
93
95
 
94
- exports.createMiddlewareCollecter = createMiddlewareCollecter;
96
+ exports.createMiddlewareCollecter = createMiddlewareCollecter;
97
+
98
+ const toPath = (reg, params) => {
99
+ const fn = (0, _pathToRegexp.compile)(reg, {
100
+ encode: encodeURIComponent
101
+ });
102
+ return fn(params);
103
+ };
104
+
105
+ exports.toPath = toPath;
@@ -15,4 +15,5 @@ declare const createStaticDataHandler: (method: string, handler: Record<string,
15
15
 
16
16
  declare const _default: (filepath: string) => MockApi[];
17
17
 
18
- export default _default;
18
+ export default _default;
19
+ export declare const getMatched: (context: ModernServerContext, mockApiList: MockApi[]) => MockApi | undefined;
@@ -1,6 +1,5 @@
1
1
  /// <reference types="node" />
2
2
  import { Server } from 'http';
3
- import ws from 'ws';
4
3
  import type { Stats } from 'webpack';
5
4
  import { DevServerOptions } from '../type';
6
5
  export default class SocketServer {
@@ -13,7 +12,7 @@ export default class SocketServer {
13
12
  prepare(app: Server): void;
14
13
  updateStats(stats: Stats): void;
15
14
  sockWrite(type: string, data?: Record<string, any> | string | boolean): void;
16
- close(connection: ws): void;
15
+ close(): void;
17
16
  private getStats;
18
17
  private sendStats;
19
18
  private send;
@@ -1,7 +1,9 @@
1
+ import chokidar, { FSWatcher, WatchOptions } from 'chokidar';
2
+ export declare const getWatchedFiles: (watcher: chokidar.FSWatcher) => string[];
1
3
  export default class Watcher {
2
4
  private dependencyTree;
3
5
  private watcher;
4
- listen(files: string[], callback: (changed: string) => void): void;
6
+ listen(files: string[], options: WatchOptions, callback: (changed: string) => void): void;
5
7
  createDepTree(): void;
6
8
  updateDepTree(): void;
7
9
  cleanDepCache(filepath: string): void;
@@ -1,9 +1,10 @@
1
1
  export declare class StatsCache {
2
- private readonly cachedStats;
2
+ private readonly cachedHash;
3
+ private readonly cachedSize;
3
4
  add(files: string[]): void;
4
5
  refresh(filename: string): void;
5
6
  del(filename: string): void;
6
7
  isDiff(filename: string): boolean;
7
8
  has(filename: string): boolean;
8
- private sign;
9
+ private hash;
9
10
  }
@@ -26,9 +26,11 @@ export declare class ModernServerContext implements ModernServerContextInterface
26
26
  params: Record<string, string>;
27
27
  logger: Logger;
28
28
  metrics?: Metrics;
29
+ serverData: Record<string, any>;
29
30
  constructor(req: IncomingMessage, res: ServerResponse);
30
31
  private bind;
31
32
  setParams(params: Record<string, string>): void;
33
+ setServerData(key: string, value: any): void;
32
34
  getReqHeader(key: string): string | string[];
33
35
  get headers(): import("http").IncomingHttpHeaders;
34
36
  get method(): string;
@@ -3,11 +3,12 @@ import { RouteMatchManager, RouteMatcher } from '../route';
3
3
  declare class RouteAPI {
4
4
  private readonly router;
5
5
  private current;
6
- constructor(matched: RouteMatcher, router: RouteMatchManager);
6
+ private readonly url;
7
+ constructor(matched: RouteMatcher, router: RouteMatchManager, url: string);
7
8
  cur(): import("../route").ModernRoute;
8
9
  get(entryName: string): import("../route").ModernRoute | null;
9
10
  use(entryName: string): boolean;
10
11
  }
11
12
 
12
- export declare const createRouteAPI: (matched: RouteMatcher, router: RouteMatchManager) => RouteAPI;
13
+ export declare const createRouteAPI: (matched: RouteMatcher, router: RouteMatchManager, url: string) => RouteAPI;
13
14
  export {};
@@ -3,6 +3,7 @@ import { RenderResult, ServerHookRunner } from '../../type';
3
3
  export declare const render: (ctx: ModernServerContext, renderOptions: {
4
4
  distDir: string;
5
5
  bundle: string;
6
+ urlPath: string;
6
7
  template: string;
7
8
  entryName: string;
8
9
  staticGenerate: boolean;
@@ -6,7 +6,7 @@ export declare class RouteMatcher {
6
6
  urlMatcher?: MatchFunction;
7
7
  urlReg?: RegExp;
8
8
  constructor(spec: ModernRouteInterface);
9
- generate(): ModernRoute;
9
+ generate(url: string): ModernRoute;
10
10
  parseURLParams(pathname: string): Record<string, string>;
11
11
  matchLength(pathname: string): number | null;
12
12
  matchUrlPath(requestUrl: string): boolean;
@@ -9,5 +9,6 @@ export declare class ModernRoute implements ModernRouteInterface {
9
9
  isSSR: boolean;
10
10
  isSPA: boolean;
11
11
  enableModernMode?: boolean;
12
+ params: Record<string, any>;
12
13
  constructor(routeSpec: ModernRouteInterface);
13
14
  }