@modern-js/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.
Files changed (36) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/dist/js/modern/dev-tools/dev-middleware/dev-server-plugin.js +4 -9
  3. package/dist/js/modern/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -5
  4. package/dist/js/modern/dev-tools/dev-middleware/hmr-client/index.js +43 -50
  5. package/dist/js/modern/dev-tools/dev-middleware/index.js +14 -32
  6. package/dist/js/modern/dev-tools/dev-middleware/socket-server.js +18 -43
  7. package/dist/js/modern/dev-tools/https/index.js +0 -2
  8. package/dist/js/modern/dev-tools/mock/getMockData.js +4 -23
  9. package/dist/js/modern/dev-tools/mock/index.js +0 -8
  10. package/dist/js/modern/dev-tools/register/index.js +5 -20
  11. package/dist/js/modern/dev-tools/watcher/dependency-tree.js +5 -15
  12. package/dist/js/modern/dev-tools/watcher/index.js +0 -18
  13. package/dist/js/modern/dev-tools/watcher/stats-cache.js +0 -16
  14. package/dist/js/modern/index.js +0 -1
  15. package/dist/js/modern/server/dev-server.js +38 -56
  16. package/dist/js/modern/server/index.js +0 -4
  17. package/dist/js/node/constants.js +0 -3
  18. package/dist/js/node/dev-tools/dev-middleware/dev-server-plugin.js +4 -11
  19. package/dist/js/node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -8
  20. package/dist/js/node/dev-tools/dev-middleware/hmr-client/index.js +41 -53
  21. package/dist/js/node/dev-tools/dev-middleware/index.js +14 -38
  22. package/dist/js/node/dev-tools/dev-middleware/socket-server.js +18 -48
  23. package/dist/js/node/dev-tools/https/index.js +0 -7
  24. package/dist/js/node/dev-tools/mock/getMockData.js +4 -29
  25. package/dist/js/node/dev-tools/mock/index.js +0 -17
  26. package/dist/js/node/dev-tools/register/index.js +5 -29
  27. package/dist/js/node/dev-tools/watcher/dependency-tree.js +5 -19
  28. package/dist/js/node/dev-tools/watcher/index.js +0 -32
  29. package/dist/js/node/dev-tools/watcher/stats-cache.js +0 -23
  30. package/dist/js/node/index.js +0 -4
  31. package/dist/js/node/server/dev-server.js +38 -75
  32. package/dist/js/node/server/index.js +0 -7
  33. package/dist/types/dev-tools/mock/getMockData.d.ts +0 -2
  34. package/dist/types/dev-tools/watcher/dependency-tree.d.ts +0 -2
  35. package/dist/types/index.d.ts +0 -2
  36. package/package.json +13 -14
@@ -1,39 +1,31 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  import ws from 'ws';
4
3
  import { logger } from '@modern-js/utils';
5
4
  export default class SocketServer {
6
5
  constructor(options) {
7
6
  _defineProperty(this, "wsServer", void 0);
8
-
9
7
  _defineProperty(this, "sockets", []);
10
-
11
8
  _defineProperty(this, "options", void 0);
12
-
13
9
  _defineProperty(this, "app", void 0);
14
-
15
10
  _defineProperty(this, "stats", void 0);
16
-
17
11
  _defineProperty(this, "timer", null);
18
-
19
12
  this.options = options;
20
- } // create socket, install socket handler, bind socket event
21
-
13
+ }
22
14
 
15
+ // create socket, install socket handler, bind socket event
23
16
  prepare(app) {
24
17
  var _this$options$client;
25
-
26
18
  this.app = app;
27
19
  this.wsServer = new ws.Server({
28
20
  noServer: true,
29
21
  path: (_this$options$client = this.options.client) === null || _this$options$client === void 0 ? void 0 : _this$options$client.path
30
- }); // listen upgrade event to handle socket
22
+ });
31
23
 
24
+ // listen upgrade event to handle socket
32
25
  this.app.on('upgrade', (req, sock, head) => {
33
26
  if (!this.wsServer.shouldHandle(req)) {
34
27
  return;
35
28
  }
36
-
37
29
  this.wsServer.handleUpgrade(req, sock, head, connection => {
38
30
  this.wsServer.emit('connection', connection, req);
39
31
  });
@@ -45,12 +37,12 @@ export default class SocketServer {
45
37
  this.timer = setInterval(() => {
46
38
  this.wsServer.clients.forEach(socket => {
47
39
  const extWs = socket;
48
-
49
40
  if (!extWs.isAlive) {
50
41
  extWs.terminate();
51
42
  } else {
52
43
  extWs.isAlive = false;
53
- extWs.ping(() => {// empty
44
+ extWs.ping(() => {
45
+ // empty
54
46
  });
55
47
  }
56
48
  });
@@ -59,13 +51,12 @@ export default class SocketServer {
59
51
  this.onConnect(socket);
60
52
  });
61
53
  }
62
-
63
54
  updateStats(stats) {
64
55
  this.stats = stats;
65
56
  this.sendStats();
66
- } // write message to each socket
67
-
57
+ }
68
58
 
59
+ // write message to each socket
69
60
  sockWrite(type, data) {
70
61
  this.sockets.forEach(socket => {
71
62
  this.send(socket, JSON.stringify({
@@ -74,67 +65,56 @@ export default class SocketServer {
74
65
  }));
75
66
  });
76
67
  }
77
-
78
68
  singleWrite(socket, type, data) {
79
69
  this.send(socket, JSON.stringify({
80
70
  type,
81
71
  data
82
72
  }));
83
73
  }
84
-
85
74
  close() {
86
75
  this.sockets.forEach(socket => {
87
76
  socket.close();
88
77
  });
89
-
90
78
  if (this.timer) {
91
79
  clearInterval(this.timer);
92
80
  this.timer = null;
93
81
  }
94
82
  }
95
-
96
83
  onConnect(socket) {
97
84
  const connection = socket;
98
85
  connection.isAlive = true;
99
86
  connection.on('pong', () => {
100
87
  connection.isAlive = true;
101
88
  });
102
-
103
89
  if (!connection) {
104
90
  return;
105
91
  }
106
-
107
92
  this.sockets.push(connection);
108
93
  connection.on('close', () => {
109
94
  const idx = this.sockets.indexOf(connection);
110
-
111
95
  if (idx >= 0) {
112
96
  this.sockets.splice(idx, 1);
113
97
  }
114
98
  });
115
-
116
99
  if (this.options.hot || this.options.hot === 'only') {
117
100
  this.singleWrite(connection, 'hot');
118
101
  }
119
-
120
102
  if (this.options.liveReload) {
121
103
  this.singleWrite(connection, 'liveReload');
122
- } // send first stats to active client sock if stats exist
123
-
104
+ }
124
105
 
106
+ // send first stats to active client sock if stats exist
125
107
  if (this.stats) {
126
108
  this.sendStats(true);
127
109
  }
128
- } // get standard stats
129
-
110
+ }
130
111
 
112
+ // get standard stats
131
113
  getStats() {
132
114
  const curStats = this.stats;
133
-
134
115
  if (!curStats) {
135
116
  return null;
136
117
  }
137
-
138
118
  const defaultStats = {
139
119
  all: false,
140
120
  hash: true,
@@ -144,24 +124,21 @@ export default class SocketServer {
144
124
  errorDetails: false
145
125
  };
146
126
  return curStats.toJson(defaultStats);
147
- } // determine what message should send by stats
148
-
127
+ }
149
128
 
129
+ // determine what message should send by stats
150
130
  sendStats(force = false) {
151
- const stats = this.getStats(); // this should never happened
131
+ const stats = this.getStats();
152
132
 
133
+ // this should never happened
153
134
  if (!stats) {
154
135
  return null;
155
136
  }
156
-
157
137
  const shouldEmit = !force && stats && (!stats.errors || stats.errors.length === 0) && stats.assets && stats.assets.every(asset => !asset.emitted);
158
-
159
138
  if (shouldEmit) {
160
139
  return this.sockWrite('still-ok');
161
140
  }
162
-
163
141
  this.sockWrite('hash', stats.hash);
164
-
165
142
  if (stats.errors && stats.errors.length > 0) {
166
143
  return this.sockWrite('errors', stats.errors);
167
144
  } else if (stats.warnings && stats.warnings.length > 0) {
@@ -169,15 +146,13 @@ export default class SocketServer {
169
146
  } else {
170
147
  return this.sockWrite('ok');
171
148
  }
172
- } // send message to connecting socket
173
-
149
+ }
174
150
 
151
+ // send message to connecting socket
175
152
  send(connection, message) {
176
153
  if (connection.readyState !== 1) {
177
154
  return;
178
155
  }
179
-
180
156
  connection.send(message);
181
157
  }
182
-
183
158
  }
@@ -1,11 +1,9 @@
1
1
  import * as devcert from 'devcert';
2
2
  export const genHttpsOptions = async userOptions => {
3
3
  const httpsOptions = typeof userOptions === 'boolean' ? {} : userOptions;
4
-
5
4
  if (!httpsOptions.key || !httpsOptions.cert) {
6
5
  const selfsign = await devcert.certificateFor(['localhost']);
7
6
  return selfsign;
8
7
  }
9
-
10
8
  return httpsOptions;
11
9
  };
@@ -1,16 +1,12 @@
1
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
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import { compatRequire } from '@modern-js/utils';
8
5
  import { match } from 'path-to-regexp';
9
6
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
- const VALID_METHODS = ['get', 'post', 'put', 'delete', 'patch']; // eslint-disable-next-line @typescript-eslint/no-unused-vars
11
-
7
+ const VALID_METHODS = ['get', 'post', 'put', 'delete', 'patch'];
8
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
9
  const BODY_PARSED_METHODS = ['post', 'put', 'delete', 'patch'];
13
-
14
10
  const createFunctionDataHandler = (method, handler) => async (context, next) => {
15
11
  const {
16
12
  req,
@@ -18,7 +14,6 @@ const createFunctionDataHandler = (method, handler) => async (context, next) =>
18
14
  } = context;
19
15
  return handler(req, res, next);
20
16
  };
21
-
22
17
  const createStaticDataHandler = (method, handler) => context => {
23
18
  const {
24
19
  res
@@ -26,19 +21,14 @@ const createStaticDataHandler = (method, handler) => context => {
26
21
  res.setHeader('Content-Type', 'application/json');
27
22
  res.end(JSON.stringify(handler));
28
23
  };
29
-
30
24
  const allowTypes = ['object', 'function'];
31
-
32
25
  const normalizeConfig = mockConfig => Object.keys(mockConfig).reduce((acc, key) => {
33
26
  const handler = mockConfig[key];
34
27
  const type = typeof handler;
35
-
36
28
  if (!allowTypes.includes(type)) {
37
29
  throw new Error(`mock value of ${key} should be object or function, but got ${type}`);
38
30
  }
39
-
40
31
  const meta = parseKey(key);
41
-
42
32
  if (type === 'object') {
43
33
  acc.push(_objectSpread(_objectSpread({}, meta), {}, {
44
34
  handler: createStaticDataHandler(meta.method, handler)
@@ -48,38 +38,31 @@ const normalizeConfig = mockConfig => Object.keys(mockConfig).reduce((acc, key)
48
38
  handler: createFunctionDataHandler(meta.method, handler)
49
39
  }));
50
40
  }
51
-
52
41
  return acc;
53
42
  }, []);
54
-
55
43
  const _blank = ' ';
56
-
57
44
  const parseKey = key => {
58
45
  // 'Method /pathname' | '/pathname'
59
46
  const splitted = key.split(_blank).filter(Boolean);
60
-
61
47
  if (splitted.length > 1) {
62
48
  const [method, pathname] = splitted;
63
49
  return {
64
50
  method: method.toLowerCase(),
65
51
  path: pathname
66
52
  };
67
- } // default return get method
68
-
53
+ }
69
54
 
55
+ // default return get method
70
56
  return {
71
57
  method: 'get',
72
58
  path: key
73
59
  };
74
60
  };
75
-
76
61
  export default (filepath => {
77
62
  const mockModule = compatRequire(filepath);
78
-
79
63
  if (!mockModule) {
80
64
  throw new Error(`Mock file ${filepath} parsed failed!`);
81
65
  }
82
-
83
66
  const data = normalizeConfig(mockModule);
84
67
  return data;
85
68
  });
@@ -93,14 +76,12 @@ export const getMatched = (context, mockApiList) => {
93
76
  method,
94
77
  path: pathname
95
78
  } = mockApi;
96
-
97
79
  if (method.toLowerCase() === targetMethod.toLowerCase()) {
98
80
  return match(pathname, {
99
81
  encode: encodeURI,
100
82
  decode: decodeURIComponent
101
83
  })(targetPathname);
102
84
  }
103
-
104
85
  return false;
105
86
  });
106
87
  return matched;
@@ -7,36 +7,28 @@ export const createMockHandler = ({
7
7
  }) => {
8
8
  const exts = ['.ts', '.js'];
9
9
  let filepath = '';
10
-
11
10
  for (const ext of exts) {
12
11
  const maybeMatch = path.join(pwd, `${AGGRED_DIR.mock}/index${ext}`);
13
-
14
12
  if (fs.existsSync(maybeMatch)) {
15
13
  filepath = maybeMatch;
16
14
  break;
17
15
  }
18
16
  }
19
-
20
17
  if (!filepath) {
21
18
  return null;
22
19
  }
23
-
24
20
  const apiList = getMockData(filepath);
25
-
26
21
  if (!apiList || apiList.length === 0) {
27
22
  return null;
28
23
  }
29
-
30
24
  return async (context, next) => {
31
25
  const {
32
26
  res
33
27
  } = context;
34
28
  const matched = getMatched(context, apiList);
35
-
36
29
  if (!matched) {
37
30
  return next();
38
31
  }
39
-
40
32
  res.setHeader('Access-Control-Allow-Origin', '*');
41
33
  return matched.handler(context, next);
42
34
  };
@@ -1,27 +1,21 @@
1
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
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import path from 'path';
8
5
  import { resolveBabelConfig } from '@modern-js/server-utils';
9
6
  import { fs, getAliasConfig, createDebugger } from '@modern-js/utils';
10
7
  const debug = createDebugger('server');
11
-
12
8
  const checkDep = (depName, paths) => {
13
9
  let packagePath = '';
14
-
15
10
  try {
16
11
  packagePath = require.resolve(depName, {
17
12
  paths
18
13
  });
19
14
  } catch (error) {}
20
-
21
15
  return Boolean(packagePath);
22
16
  };
23
-
24
- export const enableRegister = (projectRoot, config // eslint-disable-next-line consistent-return
17
+ export const enableRegister = (projectRoot, config
18
+ // eslint-disable-next-line consistent-return
25
19
  ) => {
26
20
  const registerDirs = ['./api', './server', './config/mock', './shared'];
27
21
  const TS_CONFIG_FILENAME = `tsconfig.json`;
@@ -29,17 +23,12 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
29
23
  const isTsProject = fs.existsSync(tsconfigPath);
30
24
  const existTsNode = checkDep('ts-node', [projectRoot]);
31
25
  const existTsConfigPaths = checkDep('tsconfig-paths', [projectRoot]);
32
-
33
26
  if (isTsProject && existTsNode && existTsConfigPaths) {
34
- var _config$output;
35
-
27
+ var _config$output$distPa;
36
28
  debug('use ts-node');
37
- const distPath = (config === null || config === void 0 ? void 0 : (_config$output = config.output) === null || _config$output === void 0 ? void 0 : _config$output.path) || 'dist';
38
-
29
+ const distPath = ((_config$output$distPa = config.output.distPath) === null || _config$output$distPa === void 0 ? void 0 : _config$output$distPa.root) || 'dist';
39
30
  const tsNode = require('ts-node');
40
-
41
31
  const tsConfigPaths = require('tsconfig-paths');
42
-
43
32
  const {
44
33
  alias
45
34
  } = config.source;
@@ -53,15 +42,12 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
53
42
  } = aliasConfig;
54
43
  const tsPaths = Object.keys(paths).reduce((o, key) => {
55
44
  let tsPath = paths[key];
56
-
57
45
  if (typeof tsPath === 'string' && path.isAbsolute(tsPath)) {
58
46
  tsPath = path.relative(absoluteBaseUrl, tsPath);
59
47
  }
60
-
61
48
  if (typeof tsPath === 'string') {
62
49
  tsPath = [tsPath];
63
50
  }
64
-
65
51
  return _objectSpread(_objectSpread({}, o), {}, {
66
52
  [`${key}`]: tsPath
67
53
  });
@@ -79,11 +65,11 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
79
65
  });
80
66
  } else {
81
67
  var _config$tools, _config$server;
82
-
83
68
  debug('use @babel/register');
84
69
  const babelConfig = resolveBabelConfig(projectRoot, _objectSpread(_objectSpread({}, config.source), {}, {
85
70
  babelConfig: (_config$tools = config.tools) === null || _config$tools === void 0 ? void 0 : _config$tools.babel,
86
71
  server: {
72
+ // FIXME: the compiler config from ??
87
73
  compiler: (_config$server = config.server) === null || _config$server === void 0 ? void 0 : _config$server.compiler
88
74
  }
89
75
  }), {
@@ -98,7 +84,6 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
98
84
  if (filePath.includes(`node_modules${path.sep}.modern-js`)) {
99
85
  return true;
100
86
  }
101
-
102
87
  return registerDirs.some(registerDir => filePath.startsWith(path.join(projectRoot, registerDir)));
103
88
  }],
104
89
  extensions: ['.js', '.ts'],
@@ -1,8 +1,6 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  import minimatch from 'minimatch';
4
3
  export const defaultIgnores = ['**/bower_components/**', '**/coverage/**', '**/node_modules/**', '**/.*/**', '**/*.d.ts', '**/*.log'];
5
-
6
4
  /**
7
5
  * `require.cache` already is a dependency tree, however require cache's
8
6
  * `module.parent` is the module that first required. so we have to implement
@@ -11,26 +9,23 @@ export const defaultIgnores = ['**/bower_components/**', '**/coverage/**', '**/n
11
9
  export class DependencyTree {
12
10
  constructor() {
13
11
  _defineProperty(this, "tree", void 0);
14
-
15
12
  _defineProperty(this, "ignore", void 0);
16
-
17
13
  this.tree = new Map();
18
14
  this.ignore = [...defaultIgnores];
19
15
  }
20
-
21
16
  getNode(path) {
22
17
  return this.tree.get(path);
23
18
  }
19
+
24
20
  /**
25
21
  * update dependency tree
26
22
  *
27
23
  * @param cache
28
24
  */
29
-
30
-
31
25
  update(cache) {
32
- this.tree.clear(); // insert all module that not ignored
26
+ this.tree.clear();
33
27
 
28
+ // insert all module that not ignored
34
29
  Object.keys(cache).forEach(path => {
35
30
  if (!this.shouldIgnore(path)) {
36
31
  const module = cache[path];
@@ -40,8 +35,9 @@ export class DependencyTree {
40
35
  children: new Set()
41
36
  });
42
37
  }
43
- }); // update treeNode parent and children
38
+ });
44
39
 
40
+ // update treeNode parent and children
45
41
  for (const treeNode of this.tree.values()) {
46
42
  const {
47
43
  parent
@@ -49,19 +45,15 @@ export class DependencyTree {
49
45
  const {
50
46
  children
51
47
  } = treeNode.module;
52
-
53
48
  if (parent && !this.shouldIgnore(parent.filename)) {
54
49
  const parentTreeNode = this.tree.get(parent.filename);
55
-
56
50
  if (parentTreeNode) {
57
51
  treeNode.parent.add(parentTreeNode);
58
52
  }
59
53
  }
60
-
61
54
  children.forEach(child => {
62
55
  if (!this.shouldIgnore(child.filename)) {
63
56
  const childTreeNode = this.tree.get(child.filename);
64
-
65
57
  if (childTreeNode) {
66
58
  treeNode.children.add(childTreeNode);
67
59
  childTreeNode.parent.add(treeNode);
@@ -70,9 +62,7 @@ export class DependencyTree {
70
62
  });
71
63
  }
72
64
  }
73
-
74
65
  shouldIgnore(path) {
75
66
  return !path || Boolean(this.ignore.find(rule => minimatch.match([path], rule).length > 0));
76
67
  }
77
-
78
68
  }
@@ -1,9 +1,6 @@
1
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
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import path from 'path';
8
5
  import { fs, chokidar } from '@modern-js/utils';
9
6
  import { DependencyTree } from "./dependency-tree";
@@ -25,29 +22,23 @@ export const getWatchedFiles = watcher => {
25
22
  };
26
23
  export const mergeWatchOptions = options => {
27
24
  const watchOptions = _objectSpread({}, options);
28
-
29
25
  if (watchOptions) {
30
26
  const {
31
27
  ignored
32
28
  } = watchOptions;
33
29
  const finalIgnored = ignored ? [defaultWatchOptions.ignored, ...(Array.isArray(ignored) ? ignored : [ignored])] : ignored;
34
-
35
30
  if (finalIgnored) {
36
31
  watchOptions.ignored = finalIgnored;
37
32
  }
38
33
  }
39
-
40
34
  const finalWatchOptions = _objectSpread(_objectSpread({}, defaultWatchOptions), watchOptions);
41
-
42
35
  return finalWatchOptions;
43
36
  };
44
37
  export default class Watcher {
45
38
  constructor() {
46
39
  _defineProperty(this, "dependencyTree", null);
47
-
48
40
  _defineProperty(this, "watcher", void 0);
49
41
  }
50
-
51
42
  listen(files, options, callback) {
52
43
  const watched = files.filter(Boolean);
53
44
  const filenames = watched.map(filename => filename.replace(/\\/g, '/'));
@@ -74,33 +65,24 @@ export default class Watcher {
74
65
  });
75
66
  this.watcher = watcher;
76
67
  }
77
-
78
68
  createDepTree() {
79
69
  this.dependencyTree = new DependencyTree();
80
70
  }
81
-
82
71
  updateDepTree() {
83
72
  var _this$dependencyTree;
84
-
85
73
  (_this$dependencyTree = this.dependencyTree) === null || _this$dependencyTree === void 0 ? void 0 : _this$dependencyTree.update(require.cache);
86
74
  }
87
-
88
75
  cleanDepCache(filepath) {
89
76
  var _this$dependencyTree2;
90
-
91
77
  const node = (_this$dependencyTree2 = this.dependencyTree) === null || _this$dependencyTree2 === void 0 ? void 0 : _this$dependencyTree2.getNode(filepath);
92
-
93
78
  if (node && require.cache[filepath]) {
94
79
  delete require.cache[filepath];
95
-
96
80
  for (const parentNode of node.parent.values()) {
97
81
  this.cleanDepCache(parentNode.module.filename);
98
82
  }
99
83
  }
100
84
  }
101
-
102
85
  close() {
103
86
  return this.watcher.close();
104
87
  }
105
-
106
88
  }
@@ -1,24 +1,19 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  import fs from 'fs';
4
3
  import crypto from 'crypto';
5
4
  export class StatsCache {
6
5
  constructor() {
7
6
  _defineProperty(this, "cachedHash", {});
8
-
9
7
  _defineProperty(this, "cachedSize", {});
10
8
  }
11
-
12
9
  add(files) {
13
10
  const {
14
11
  cachedHash,
15
12
  cachedSize
16
13
  } = this;
17
-
18
14
  for (const filename of files) {
19
15
  if (fs.existsSync(filename)) {
20
16
  const stats = fs.statSync(filename);
21
-
22
17
  if (stats.isFile() && !cachedHash[filename]) {
23
18
  cachedHash[filename] = this.hash(stats, filename);
24
19
  cachedSize[filename] = stats.size;
@@ -26,30 +21,25 @@ export class StatsCache {
26
21
  }
27
22
  }
28
23
  }
29
-
30
24
  refresh(filename) {
31
25
  const {
32
26
  cachedHash,
33
27
  cachedSize
34
28
  } = this;
35
-
36
29
  if (fs.existsSync(filename)) {
37
30
  const stats = fs.statSync(filename);
38
-
39
31
  if (stats.isFile()) {
40
32
  cachedHash[filename] = this.hash(stats, filename);
41
33
  cachedSize[filename] = stats.size;
42
34
  }
43
35
  }
44
36
  }
45
-
46
37
  del(filename) {
47
38
  if (this.cachedHash[filename]) {
48
39
  delete this.cachedHash[filename];
49
40
  delete this.cachedSize[filename];
50
41
  }
51
42
  }
52
-
53
43
  isDiff(filename) {
54
44
  const {
55
45
  cachedHash,
@@ -58,24 +48,18 @@ export class StatsCache {
58
48
  const stats = fs.statSync(filename);
59
49
  const hash = cachedHash[filename];
60
50
  const size = cachedSize[filename];
61
-
62
51
  if (stats.size !== size) {
63
52
  return true;
64
53
  }
65
-
66
54
  if (this.hash(stats, filename) !== hash) {
67
55
  return true;
68
56
  }
69
-
70
57
  return false;
71
58
  }
72
-
73
59
  has(filename) {
74
60
  return Boolean(this.cachedHash[filename]);
75
61
  }
76
-
77
62
  hash(stats, filename) {
78
63
  return crypto.createHash('md5').update(fs.readFileSync(filename)).digest('hex');
79
64
  }
80
-
81
65
  }
@@ -4,7 +4,6 @@ export default (options => {
4
4
  if (options == null) {
5
5
  throw new Error('can not start mserver without options');
6
6
  }
7
-
8
7
  const server = new Server(options);
9
8
  return server.init();
10
9
  });