@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.
- package/CHANGELOG.md +95 -0
- package/dist/js/modern/dev-tools/dev-middleware/dev-server-plugin.js +4 -9
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -5
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/index.js +43 -50
- package/dist/js/modern/dev-tools/dev-middleware/index.js +14 -32
- package/dist/js/modern/dev-tools/dev-middleware/socket-server.js +18 -43
- package/dist/js/modern/dev-tools/https/index.js +0 -2
- package/dist/js/modern/dev-tools/mock/getMockData.js +4 -23
- package/dist/js/modern/dev-tools/mock/index.js +0 -8
- package/dist/js/modern/dev-tools/register/index.js +5 -20
- package/dist/js/modern/dev-tools/watcher/dependency-tree.js +5 -15
- package/dist/js/modern/dev-tools/watcher/index.js +0 -18
- package/dist/js/modern/dev-tools/watcher/stats-cache.js +0 -16
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/server/dev-server.js +38 -56
- package/dist/js/modern/server/index.js +0 -4
- package/dist/js/node/constants.js +0 -3
- package/dist/js/node/dev-tools/dev-middleware/dev-server-plugin.js +4 -11
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -8
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/index.js +41 -53
- package/dist/js/node/dev-tools/dev-middleware/index.js +14 -38
- package/dist/js/node/dev-tools/dev-middleware/socket-server.js +18 -48
- package/dist/js/node/dev-tools/https/index.js +0 -7
- package/dist/js/node/dev-tools/mock/getMockData.js +4 -29
- package/dist/js/node/dev-tools/mock/index.js +0 -17
- package/dist/js/node/dev-tools/register/index.js +5 -29
- package/dist/js/node/dev-tools/watcher/dependency-tree.js +5 -19
- package/dist/js/node/dev-tools/watcher/index.js +0 -32
- package/dist/js/node/dev-tools/watcher/stats-cache.js +0 -23
- package/dist/js/node/index.js +0 -4
- package/dist/js/node/server/dev-server.js +38 -75
- package/dist/js/node/server/index.js +0 -7
- package/dist/types/dev-tools/mock/getMockData.d.ts +0 -2
- package/dist/types/dev-tools/watcher/dependency-tree.d.ts +0 -2
- package/dist/types/index.d.ts +0 -2
- 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
|
-
}
|
|
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
|
-
});
|
|
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(() => {
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
148
|
-
|
|
127
|
+
}
|
|
149
128
|
|
|
129
|
+
// determine what message should send by stats
|
|
150
130
|
sendStats(force = false) {
|
|
151
|
-
const stats = this.getStats();
|
|
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
|
-
}
|
|
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'];
|
|
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
|
-
}
|
|
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
|
-
|
|
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 = (
|
|
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();
|
|
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
|
-
});
|
|
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
|
}
|