webpack-dev-service 0.5.2 → 0.5.4
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/client/cjs/client.cjs +111 -109
- package/client/cjs/events.cjs +33 -32
- package/client/cjs/hot.cjs +61 -60
- package/client/cjs/index.cjs +10 -8
- package/client/cjs/main.cjs +63 -60
- package/client/cjs/ui/overlay.cjs +64 -63
- package/client/cjs/ui/progress.cjs +35 -35
- package/client/cjs/ui/utils/ansi/index.cjs +439 -413
- package/client/cjs/ui/utils/ansi/regx.cjs +8 -8
- package/client/cjs/ui/utils/ansi/utils.cjs +14 -14
- package/client/cjs/ui/utils/index.cjs +99 -99
- package/client/esm/client.js +111 -109
- package/client/esm/events.js +33 -32
- package/client/esm/hot.js +61 -60
- package/client/esm/index.js +8 -8
- package/client/esm/main.js +63 -60
- package/client/esm/ui/overlay.js +64 -63
- package/client/esm/ui/progress.js +35 -35
- package/client/esm/ui/utils/ansi/index.js +439 -413
- package/client/esm/ui/utils/ansi/regx.js +8 -8
- package/client/esm/ui/utils/ansi/utils.js +14 -14
- package/client/esm/ui/utils/index.js +99 -99
- package/package.json +11 -11
- package/server/cjs/dev.cjs +30 -36
- package/server/cjs/hot.cjs +174 -177
- package/server/cjs/index.cjs +16 -17
- package/server/esm/dev.js +28 -32
- package/server/esm/hot.js +171 -172
- package/server/esm/index.js +14 -13
- package/types/client/client.d.ts +7 -7
- package/types/client/events.d.ts +10 -10
- package/types/client/message.d.ts +25 -25
- package/types/client/ui/overlay.d.ts +12 -12
- package/types/client/ui/progress.d.ts +8 -8
- package/types/client/ui/utils/ansi/enum.d.ts +7 -7
- package/types/client/ui/utils/ansi/index.d.ts +11 -11
- package/types/client/ui/utils/ansi/interface.d.ts +46 -42
- package/types/server/dev.d.ts +4 -4
- package/types/server/hot.d.ts +5 -5
- package/types/server/index.d.ts +2 -2
package/server/cjs/hot.cjs
CHANGED
|
@@ -1,216 +1,213 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
* @package webpack-dev-service
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @version 0.5.4
|
|
5
|
+
* @author nuintun <nuintun@qq.com>
|
|
6
|
+
* @description A koa 2 middleware for webpack development and hot reloading.
|
|
7
|
+
* @see https://github.com/nuintun/webpack-dev-service#readme
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
12
|
const WebSocket = require('ws');
|
|
13
13
|
const webpack = require('webpack');
|
|
14
14
|
|
|
15
|
-
function _interopDefault(e) {
|
|
16
|
-
return e && e.__esModule ? e : { default: e };
|
|
17
|
-
}
|
|
15
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
16
|
|
|
19
|
-
const WebSocket__default = /*#__PURE__*/
|
|
20
|
-
const webpack__default = /*#__PURE__*/
|
|
17
|
+
const WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
|
|
18
|
+
const webpack__default = /*#__PURE__*/_interopDefault(webpack);
|
|
21
19
|
|
|
22
20
|
/**
|
|
23
21
|
* @module hot
|
|
24
22
|
*/
|
|
25
23
|
const WEBSOCKET_RE = /^websocket$/i;
|
|
26
24
|
function isObject(value) {
|
|
27
|
-
|
|
25
|
+
return Object.prototype.toString.call(value) === '[object Object]';
|
|
28
26
|
}
|
|
29
27
|
function resolveStatsOptions(compiler) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
const options = {
|
|
29
|
+
all: false,
|
|
30
|
+
hash: true,
|
|
31
|
+
colors: true,
|
|
32
|
+
errors: true,
|
|
33
|
+
assets: false,
|
|
34
|
+
builtAt: true,
|
|
35
|
+
warnings: true,
|
|
36
|
+
errorDetails: false
|
|
37
|
+
};
|
|
38
|
+
const { stats } = compiler.options;
|
|
39
|
+
if (isObject(stats)) {
|
|
40
|
+
const { warningsFilter } = stats;
|
|
41
|
+
if (warningsFilter !== undefined) {
|
|
42
|
+
options.warningsFilter = warningsFilter;
|
|
43
|
+
}
|
|
45
44
|
}
|
|
46
|
-
|
|
47
|
-
return options;
|
|
45
|
+
return options;
|
|
48
46
|
}
|
|
49
47
|
function normalize(path) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
48
|
+
const segments = [];
|
|
49
|
+
const parts = path.split(/[\\/]+/);
|
|
50
|
+
for (const segment of parts) {
|
|
51
|
+
switch (segment) {
|
|
52
|
+
case '.':
|
|
53
|
+
break;
|
|
54
|
+
case '..':
|
|
55
|
+
segments.pop();
|
|
56
|
+
break;
|
|
57
|
+
default:
|
|
58
|
+
segments.push(segment);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
62
61
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return pathname.startsWith('/') ? pathname : `/${pathname}`;
|
|
62
|
+
const pathname = segments.join('/');
|
|
63
|
+
return pathname.startsWith('/') ? pathname : `/${pathname}`;
|
|
66
64
|
}
|
|
67
65
|
function resolveOptions(options) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
const settings = {
|
|
67
|
+
hmr: true,
|
|
68
|
+
path: '/hot',
|
|
69
|
+
progress: true,
|
|
70
|
+
...options
|
|
71
|
+
};
|
|
72
|
+
settings.path = normalize(settings.path);
|
|
73
|
+
return settings;
|
|
76
74
|
}
|
|
77
75
|
function isUpgradable(context, detector) {
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
const { upgrade } = context.headers;
|
|
77
|
+
return !!upgrade && detector.test(upgrade.trim());
|
|
80
78
|
}
|
|
81
79
|
function hasProblems(problems) {
|
|
82
|
-
|
|
80
|
+
return !!problems && problems.length > 0;
|
|
83
81
|
}
|
|
84
82
|
class HotServer {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
setupWss() {
|
|
101
|
-
const { server, logger } = this;
|
|
102
|
-
server.on('error', error => {
|
|
103
|
-
logger.error(error.message);
|
|
104
|
-
});
|
|
105
|
-
server.on('connection', client => {
|
|
106
|
-
if (this.stats) {
|
|
107
|
-
this.broadcastStats([client], this.stats);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
setupHooks() {
|
|
112
|
-
const { compiler } = this;
|
|
113
|
-
const { hooks } = compiler;
|
|
114
|
-
const statsOptions = resolveStatsOptions(compiler);
|
|
115
|
-
hooks.done.tapAsync(this.name, (stats, next) => {
|
|
116
|
-
next();
|
|
117
|
-
this.stats = stats.toJson(statsOptions);
|
|
118
|
-
this.broadcastStats(this.clients(), this.stats);
|
|
119
|
-
});
|
|
120
|
-
hooks.invalid.tap(this.name, (path, builtAt) => {
|
|
121
|
-
this.broadcast(this.clients(), 'invalid', { path, builtAt });
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
setupPlugins() {
|
|
125
|
-
const { options, compiler } = this;
|
|
126
|
-
const plugins = [
|
|
127
|
-
new webpack__default.default.NoEmitOnErrorsPlugin(),
|
|
128
|
-
new webpack__default.default.DefinePlugin({
|
|
129
|
-
__WDS_HOT_OPTIONS__: JSON.stringify({
|
|
130
|
-
...options,
|
|
131
|
-
name: compiler.name
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
];
|
|
135
|
-
if (options.hmr) {
|
|
136
|
-
plugins.push(new webpack__default.default.HotModuleReplacementPlugin());
|
|
83
|
+
stats;
|
|
84
|
+
compiler;
|
|
85
|
+
server;
|
|
86
|
+
options;
|
|
87
|
+
name = 'webpack-hot-middleware';
|
|
88
|
+
logger;
|
|
89
|
+
constructor(compiler, options) {
|
|
90
|
+
this.compiler = compiler;
|
|
91
|
+
this.options = resolveOptions(options);
|
|
92
|
+
this.logger = compiler.getInfrastructureLogger(this.name);
|
|
93
|
+
this.server = new WebSocket.WebSocketServer({ path: this.options.path, noServer: true });
|
|
94
|
+
this.setupWss();
|
|
95
|
+
this.setupHooks();
|
|
96
|
+
this.setupPlugins();
|
|
137
97
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
case 0:
|
|
147
|
-
status = 'start';
|
|
148
|
-
message = 'end idle';
|
|
149
|
-
break;
|
|
150
|
-
case 100:
|
|
151
|
-
status = 'finish';
|
|
152
|
-
message = 'begin idle';
|
|
153
|
-
break;
|
|
98
|
+
setupWss() {
|
|
99
|
+
const { server, logger } = this;
|
|
100
|
+
server.on('error', error => {
|
|
101
|
+
logger.error(error.message);
|
|
102
|
+
});
|
|
103
|
+
server.on('connection', client => {
|
|
104
|
+
if (this.stats) {
|
|
105
|
+
this.broadcastStats([client], this.stats);
|
|
154
106
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
setupHooks() {
|
|
110
|
+
const { compiler } = this;
|
|
111
|
+
const { hooks } = compiler;
|
|
112
|
+
const statsOptions = resolveStatsOptions(compiler);
|
|
113
|
+
hooks.done.tapAsync(this.name, (stats, next) => {
|
|
114
|
+
next();
|
|
115
|
+
this.stats = stats.toJson(statsOptions);
|
|
116
|
+
this.broadcastStats(this.clients(), this.stats);
|
|
117
|
+
});
|
|
118
|
+
hooks.invalid.tap(this.name, (path, builtAt) => {
|
|
119
|
+
this.broadcast(this.clients(), 'invalid', { path, builtAt });
|
|
120
|
+
});
|
|
159
121
|
}
|
|
160
|
-
|
|
161
|
-
|
|
122
|
+
setupPlugins() {
|
|
123
|
+
const { options, compiler } = this;
|
|
124
|
+
const plugins = [
|
|
125
|
+
new webpack__default.default.NoEmitOnErrorsPlugin(),
|
|
126
|
+
new webpack__default.default.DefinePlugin({
|
|
127
|
+
__WDS_HOT_OPTIONS__: JSON.stringify({
|
|
128
|
+
...options,
|
|
129
|
+
name: compiler.name
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
];
|
|
133
|
+
if (options.hmr) {
|
|
134
|
+
plugins.push(new webpack__default.default.HotModuleReplacementPlugin());
|
|
135
|
+
}
|
|
136
|
+
if (options.progress) {
|
|
137
|
+
let value = 0;
|
|
138
|
+
plugins.push(new webpack__default.default.ProgressPlugin((percentage, status, message) => {
|
|
139
|
+
const nextValue = Math.floor(percentage * 100);
|
|
140
|
+
if (nextValue > value || nextValue === 0) {
|
|
141
|
+
value = nextValue;
|
|
142
|
+
switch (value) {
|
|
143
|
+
case 0:
|
|
144
|
+
status = 'start';
|
|
145
|
+
message = 'end idle';
|
|
146
|
+
break;
|
|
147
|
+
case 100:
|
|
148
|
+
status = 'finish';
|
|
149
|
+
message = 'begin idle';
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
this.broadcast(this.clients(), 'progress', { status, message, value });
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
for (const plugin of plugins) {
|
|
157
|
+
plugin.apply(compiler);
|
|
158
|
+
}
|
|
162
159
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return this.server.clients;
|
|
166
|
-
}
|
|
167
|
-
upgrade(context) {
|
|
168
|
-
const { server } = this;
|
|
169
|
-
const { req: request } = context;
|
|
170
|
-
if (isUpgradable(context, WEBSOCKET_RE) && server.shouldHandle(request)) {
|
|
171
|
-
context.respond = false;
|
|
172
|
-
const { socket } = context;
|
|
173
|
-
const head = Buffer.alloc(0);
|
|
174
|
-
server.handleUpgrade(request, socket, head, client => {
|
|
175
|
-
server.emit('connection', client, request);
|
|
176
|
-
});
|
|
177
|
-
return true;
|
|
160
|
+
clients() {
|
|
161
|
+
return this.server.clients;
|
|
178
162
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
163
|
+
upgrade(context) {
|
|
164
|
+
const { server } = this;
|
|
165
|
+
const { req: request } = context;
|
|
166
|
+
if (isUpgradable(context, WEBSOCKET_RE) && server.shouldHandle(request)) {
|
|
167
|
+
context.respond = false;
|
|
168
|
+
const { socket } = context;
|
|
169
|
+
const head = Buffer.alloc(0);
|
|
170
|
+
server.handleUpgrade(request, socket, head, client => {
|
|
171
|
+
server.emit('connection', client, request);
|
|
172
|
+
});
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
186
176
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
177
|
+
broadcast(clients, action, payload) {
|
|
178
|
+
for (const client of clients) {
|
|
179
|
+
if (client.readyState === WebSocket__default.default.OPEN) {
|
|
180
|
+
client.send(JSON.stringify({ action, payload }));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
broadcastStats(clients, stats) {
|
|
185
|
+
if (clients.size > 0 || clients.length > 0) {
|
|
186
|
+
const { hash, builtAt, errors, warnings } = stats;
|
|
187
|
+
this.broadcast(clients, 'hash', { hash });
|
|
188
|
+
if (hasProblems(errors) || hasProblems(warnings)) {
|
|
189
|
+
this.broadcast(clients, 'problems', { errors, warnings, builtAt });
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.broadcast(clients, 'ok', { builtAt });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
197
195
|
}
|
|
198
|
-
}
|
|
199
196
|
}
|
|
200
197
|
function hot(compiler, options = {}) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
198
|
+
const server = new HotServer(compiler, options);
|
|
199
|
+
const hotMiddleware = async (context, next) => {
|
|
200
|
+
if (!server.upgrade(context)) {
|
|
201
|
+
await next();
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
hotMiddleware.clients = () => {
|
|
205
|
+
return server.clients();
|
|
206
|
+
};
|
|
207
|
+
hotMiddleware.broadcast = (clients, action, payload) => {
|
|
208
|
+
server.broadcast(clients, action, payload);
|
|
209
|
+
};
|
|
210
|
+
return hotMiddleware;
|
|
214
211
|
}
|
|
215
212
|
|
|
216
213
|
module.exports = hot;
|
package/server/cjs/index.cjs
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
* @package webpack-dev-service
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @version 0.5.4
|
|
5
|
+
* @author nuintun <nuintun@qq.com>
|
|
6
|
+
* @description A koa 2 middleware for webpack development and hot reloading.
|
|
7
|
+
* @see https://github.com/nuintun/webpack-dev-service#readme
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
12
|
const compose = require('koa-compose');
|
|
13
13
|
const dev = require('./dev.cjs');
|
|
14
14
|
const hot = require('./hot.cjs');
|
|
15
15
|
|
|
16
|
-
function _interopDefault(e) {
|
|
17
|
-
return e && e.__esModule ? e : { default: e };
|
|
18
|
-
}
|
|
16
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
17
|
|
|
20
|
-
const compose__default = /*#__PURE__*/
|
|
18
|
+
const compose__default = /*#__PURE__*/_interopDefault(compose);
|
|
21
19
|
|
|
22
20
|
/**
|
|
23
21
|
* @module index
|
|
24
22
|
*/
|
|
25
23
|
function server(compiler, options = {}) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
const { hot: hotOptions, ...devOptions } = options;
|
|
25
|
+
const devMiddleware = dev(compiler, devOptions);
|
|
26
|
+
if (hotOptions === false)
|
|
27
|
+
return devMiddleware;
|
|
28
|
+
const hotMiddleware = hot(compiler, hotOptions);
|
|
29
|
+
return Object.assign(compose__default.default([devMiddleware, hotMiddleware]), devMiddleware, hotMiddleware);
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
module.exports = server;
|
package/server/esm/dev.js
CHANGED
|
@@ -1,42 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
* @package webpack-dev-service
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @version 0.5.4
|
|
5
|
+
* @author nuintun <nuintun@qq.com>
|
|
6
|
+
* @description A koa 2 middleware for webpack development and hot reloading.
|
|
7
|
+
* @see https://github.com/nuintun/webpack-dev-service#readme
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
10
|
import webpackDevMiddleware from 'webpack-dev-middleware';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @module dev
|
|
14
14
|
*/
|
|
15
15
|
function dev(compiler, options) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
next
|
|
37
|
-
);
|
|
38
|
-
};
|
|
39
|
-
return Object.assign(devMiddleware, middleware);
|
|
16
|
+
const middleware = webpackDevMiddleware(compiler, options);
|
|
17
|
+
const devMiddleware = async (context, next) => {
|
|
18
|
+
context.remove('Content-Type');
|
|
19
|
+
await middleware(context.req, {
|
|
20
|
+
locals: context.state,
|
|
21
|
+
send(body) {
|
|
22
|
+
context.body = body;
|
|
23
|
+
},
|
|
24
|
+
status(statusCode) {
|
|
25
|
+
context.status = statusCode;
|
|
26
|
+
},
|
|
27
|
+
set(field, value) {
|
|
28
|
+
context.response.set(field, value);
|
|
29
|
+
},
|
|
30
|
+
get(field) {
|
|
31
|
+
return context.response.get(field);
|
|
32
|
+
}
|
|
33
|
+
}, next);
|
|
34
|
+
};
|
|
35
|
+
return Object.assign(devMiddleware, middleware);
|
|
40
36
|
}
|
|
41
37
|
|
|
42
38
|
export { dev as default };
|